diff --git a/Final_Delivery/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties b/Final_Delivery/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties new file mode 100644 index 00000000000..96423dfbcba --- /dev/null +++ b/Final_Delivery/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties @@ -0,0 +1,1488 @@ +manage2Sail=Manage2Sail +raceCommitteeApp=Race Manager 应用 +tracTracEvents=TracTrac 活动 +swissTimingEvents=SwissTiming 活动 +trackedBefore=已跟踪活动的历史记录 +general=常规 +listRaces=比赛轮次清单 +listRegattas=比赛清单 +wind=风力 +maneuverType=操作 +windPanelLabel=这是风力面板,目前完全空白。 +refresh=刷新 +remove=移除 +windSource=风源 +dampeningInterval=阻尼间隔 +map=地图 +race=比赛轮次 +races=比赛轮次 +tracked=跟踪 +linkedRaces=链接的比赛轮次 +time=时间 +timeTooltip=参赛队在此航段航行的时间。 第一航段的时间从参赛队越过起航线算起。 +playSpeed=播放速度 +playSpeedHelp=使用 "1" 以正常回放速度播放,"2" 以倍速回放等 +playModeLive=实时 +playModeReplay=重放模式 +timeDelay=延迟 +timeDelayHelp=要在任意时间重播,则留空;输入导入实况数据前延迟的秒数(例如“60”表示一分钟或“0”表示无) +speedInKnots=速度 (kn) +fromDeg=自(度) +noRacesYet=暂无比赛轮次。 +total=Σ +carry=累积 +competitor=参赛队 +competitors=参赛队 +competitorsSelected=已选择{0}/{1}支参赛队。 +noSuchLeaderboard=没有积分榜 +leaderboardConfiguration=积分榜配置 +newDotDotDot=新建... +editScores=编辑得分... +columnNamesInSelectedLeaderboard=所选积分榜中的比赛轮次名称 +addDotDotDot=添加... +renameDotDotDot=重命名... +trackedRaceConnectedToSelectedRaceName=跟踪的比赛轮次已连接到所选的比赛轮次名称 +linkToColumn=链接到列 +unlink=取消链接 +leaderboardName=积分榜名称 +cancel=取消 +pleaseEnterAName=请输入名称 +pleaseEnterABoatClass=请输入船只级别 +discardRacesFromHowManyStartedRacesOn=从已开始的比赛轮次数开始再放弃一个比赛轮次 +leaderboardWithThisNameAlreadyExists=具有此名称的积分榜已存在 +discardThresholdsMustBeNumeric=放弃临界值必须为数字 +discardThresholdsMustBeAscending=放弃临界值必须递增 +discarding=放弃 +startingFromNumberOfRaces=从比赛轮次数开始 +renameLeaderboard=重命名积分榜 +addColumnToLeaderboard=向列添加积分榜 +pleaseEnterNameForNewRaceColumn=请输入新比赛轮次列的名称 +ok=确定 +medalRace=奖牌轮 +renameRace=重命名比赛轮次 +openSelectedLeaderboard=打开选择的积分榜 +rank=名次 +rankTooltip=参赛队在比赛轮次中的名次 +regattaRank=比赛名次 +regattaRankTooltip=参赛队在比赛中的名次 +overallRank=总名次 +overallRankTooltip=参赛队在系列赛中的名次 +totalRegattaRank=比赛名次 +collapse=- +expand=+ +leg=L +distanceInMeters=距离 +averageSpeedInKnots=∅ 速度 +averageSpeedInKnotsTooltip=此航段的平均实际速度,\n通过航行的距离除以所需的时间计算得出。 +raceAverageSpeedInKnotsTooltip=此比赛轮次的平均实际速度,\n通过航行的距离除以所需的时间计算得出。 +rankGain=名次进阶 +rankGainTooltip=当前和先前航段的位置差异。 +sapSailingAnalytics=Sailing Analytics +leaderboard=积分榜 +leaderboards=积分榜 +leaderboardSettings=积分榜设置 +settings=设置 +selectAtLeastOneLegDetail=至少选择一个航段详情 +currentSpeedOverGroundInKnots=SOG +currentSpeedOverGroundInKnotsTooltip=当前实际速度。 +estimatedTimeToNextWaypointInSeconds=ETA +estimatedTimeToNextWaypointInSecondsTooltip=考虑到实际风向,参赛队以当前沿计划航线上的航速到达下个航路点所需要的预计时间。 +gapToLeaderInSeconds=与第一名的差距 +gapToLeaderInSecondsTooltip=根据当前航段的平均沿计划航线上的航速 (VMG) 和同等于比赛轮次第一名在后续航段的成绩,预计到达最前方船只当前位置的(计算)时间。\n此差距表明参赛队必须超前于其目前的航行状况才能以预计时间到达最前方船只当前位置取得与比赛轮次第一名相同的名次。 +velocityMadeGoodInKnots=VMG +velocityMadeGoodInKnotsTooltip=沿计划航线上的航速分别指迎/顺风航段时的上风/下风速度,或横风航段的沿轨道航行速度。 +windwardDistanceToGoInMeters=离开上风距离 +windwardDistanceToGoInMetersTooltip=参赛队的当前位置分别与迎/顺风航段终点的上风/下风距离,或横风航段的沿轨道航行距离。 +windwardDistanceToCompetitorFarthestAheadInMeters=差距 +windwardDistanceToCompetitorFarthestAheadInMetersTooltip=迎/顺风航段中参赛队分别与比赛轮次中最前方参赛队的上风/下风距离,或横风航段的沿轨道航行距离。\n请注意,如果设定差点排名,最前方的参赛队并不一定是比赛轮次的领先者。 +name=名称 +leaveEmptyForDefault=针对默认值留空 +trackNewEvent=跟踪新活动 +trackableRaces=可跟踪的比赛轮次 +trackWind=跟踪风力 +regattaName=比赛名称 +eventName=活动名称 +event=活动 +startTime=开始时间 +startOfTracking=开始跟踪 +endOfTracking=结束跟踪 +regatta=比赛 +regattas=比赛 +startTracking=开始跟踪 +stopTracking=停止跟踪 +connections=连接 +historyOfConnections=连接历史记录 +defineNewConnection=定义新连接 +trackedRaces=跟踪的比赛轮次 +canSendRequests=可以发送申请 +connectAndReadRaces=连接并读取比赛轮次 +ports=端口 +liveData=实况数据 +storedData=存储的数据 +uris=URI +jsonUrl=JSON URL +livePort=端口实况数据 +storedPort=端口存储的数据 +liveUri=实况 URI +storedUri=存储的 URI +eventsConnectedTo=当前跟踪的活动 +hostname=主机名 +declinationCheckbox=通过偏角更正风方位 +raceStartTrackingColumn=开始的跟踪 +pauseAutomaticRefresh=暂停自动刷新 +autoRefresh=自动刷新 +delayInSeconds=延迟 (s) +delayBetweenAutoAdvances=自动刷新之间的延迟(秒): +delayMustBeNonNegative=延迟必须大于零 +chooseUpdateIntervalOfAtLeastOneSecond=选择至少一秒的更新间隔 +errorSettingWindForRace=设置比赛轮次的风力出错 +errorFetchingWindInformationForRace=获取比赛轮次的风力信息出错 +errorWhileTryingToSetWindSourceForRace=尝试设置“开始迎风”旗标出错 +inEvent=活动中 +to=至 +toSide=至 +showEstimatedWind=显示预计风力 +timing=定时 +raceDetailsToShow=比赛轮次详情 +overallDetailsToShow=总体详情 +legDetailsToShow=航段详情 +columnMoveUp=向上 +columnMoveDown=向下 +port=端口 +raceStartTimeColumn=比赛轮次开始时间 +showOnlySelectedCompetitors=仅显示选择的参赛队 +showSelectedCompetitorsInfo=显示所选参赛队的信息框 +tailLength=尾流线长度 (s) +selectedRaces=要显示哪个比赛轮次? +lengthInSeconds=长度 (s) +stressTest=压力测试 +numberOfManeuvers=操作 +numberOfManeuversTooltip=本航段操作数量。 +numberOfManeuversInRaceTooltip=本比赛轮次操作数量。 +tacks=迎风转向 +jibes=顺风转向 +penaltyCircles=惩罚转圈 +medalRaceIsNull=不允许奖牌轮值 +configuration=配置 +maneuverTypes=操作 +chooseChart=选择记录 +distanceTraveled=航行距离 +distanceTraveledTooltip=如果航段没有结束,从航段起点到终点\n或当前时间点航行的距离。 +raceDistanceTraveledTooltip=如果航段没有结束,从比赛轮次开始到结束\n或当前时间点航行的距离。 +velocityMadeGoodLong=沿计划航线上的航速 +speedOverGroundLong=实际速度 +gapToLeaderLong=与第一名的差距 +pointsToLoad=得分 +speed=速度 +distance=距离 +in=于 +secondsUnit=s +secondsPerNauticalMileUnit=s/NM +metersUnit=m +degreesUnit=° +close=关闭 +compareCompetitors=比较参赛队 +description=描述 +sailNumber=帆号 +country=国家/地区 +no3LetterCodes=无法找到 IOC 3 个字母的代码。 +add=添加 +delete=删除 +showCharts=显示记录 +raceWithThisNameAlreadyExists=具有此名称的比赛轮次已存在。 +raceWithThisNameAlreadyExistsInRegatta=具有此名称的比赛轮次在比赛中已存在。 +headUp=顶风行驶 +bearAway=顺偏行驶 +tack=迎风转向 +tackTooltip=本比赛轮次的迎风转向次数。 +jibe=顺风转向 +jibeTooltip=本比赛轮次的顺风转向次数。 +penaltyCircle=惩罚转圈 +penaltyCircleTooltip=本比赛轮次的惩罚圈数。 +markPassing=绕标 +mark=标志 +otherManeuver=未知操作 +douglasPeuckerPoints=道格拉斯-普克得分 +filterRacesByName=按名称筛选比赛轮次 +filterMediaByName=按名称筛选媒体 +trackSettings=跟踪设置 +actionEdit=编辑 +actionEditCompetitors=编辑参赛队 +actionEditScores=编辑得分 +actionOpenBrowser=在浏览器中打开 +actionRemove=移除 +actionEditSeries=编辑系列 +actionRaceEdit=编辑或重命名比赛轮次 +actionRaceUnlink=取消链接比赛轮次 +actionRaceRemove=移除比赛轮次 +actionExportXML=以 XML 格式导出 +actionOpenDashboard=打开教练仪表盘 +filterLeaderboardsByName=按名称筛选积分榜 +actions=操作 +islinked=已链接 +yes=是 +no=否 +hoverOverAPoint=将鼠标移到得分,查看详情 +noSelection=无选择 +raceIsKnownToStartUpwind=比赛轮次从迎风航段开始 +events=活动 +settingsForComponent={0}设置 +noEventsFound=未找到活动 +noEventSelected=未选择活动 +noLeaderboardsFound=未找到积分榜 +searchEvents=搜索活动 +location=地点 +from=从 +until=至 +onlyLiveEvents=仅实况活动 +locationNotAvailable=地点不可用 +startDateNotAvailable=开始日期不可用 +startDate=开始日期 +endDate=结束日期 +unknownManeuver=未知操作 +tailLengthMustBePositive=尾流线长度必须是大于零的数字。 +failedToLoadRaceInformation=加载比赛轮次信息失败: {0} +competitorPassedMarkAtDate={0}于{2}越过{1} +valueForCompetitorAt={0}(于{1}): {2} +reallyRemoveRace=是否确定移除比赛轮次 "{0}"? 注意: 此比赛轮次的所有比赛轮次日志也将永久移除! +showDetails=显示详情 +hideLeaderboard=隐藏积分榜 +hideLeaderboards=隐藏积分榜 +showLeaderboard=显示积分榜 +hideRaces=隐藏比赛轮次 +showMap=显示地图 +hideMap=隐藏地图 +noLeaderboardSelected=未选择积分榜 +leaderboardGroups=积分榜分组 +filterLeaderboardGroupsByName=按名称筛选积分榜分组 +createNewLeaderboardGroup=创建积分榜分组 +leaderboardGroupConfiguration=积分榜分组配置 +legs=航段 +currentLeg=当前航段 +currentLegTooltip=参赛队目前所处的航段编号,从 1 开始 +leaderboardGroup=积分榜分组 +pleaseEnterNonEmptyDescription=请输入非空描述 +groupWithThisNameAlreadyExists=具有此名称的积分榜分组已存在。 +detailsOfLeaderboardGroup=积分榜分组详情 +edit=编辑 +save=保存 +abort=中止 +noLeaderboardGroupWithNameFound=未找到名称为{0}的积分榜分组 +overview=总览 +welcomeToSailingAnalytics=欢迎使用 SAP Sailing Analytics +welcomeToSailingAnalyticsBody=SAP 使船赛粉丝得以近距离直击水上运动,史无前例。\\u5B9E况积分榜让粉丝全程了解最新排名、船速和输赢差距。 使用 SAP 关注每场比赛轮次,绝不错过任何一个操作。\\u4E0D论您身在何地,这都是观看实况帆船比赛的简单方式。 +home=主页 +clickAndDragToZoomIn=单击并拖动绘图区以放大 +windSpeed=风速 (kts) +allTimesInUTC=所有时间均为 UTC 格式 +autoZoomTo=自动放大/缩小 +autoZoomToBoats=船只 +autoZoomToBuoys=浮标 +autoZoomToWindSensors=风力感应器 +autoZoomOff=关 +autoZoomToTails=尾流线 +autoZoomSelectedCompetitors=仅缩放所选的参赛队 +bearing=航向角 +zoom=放大/缩小 +stepSizeMustBeGreaterThanNull=步长必须大于 0 +stepSizeInSeconds=步长(秒) +refreshInterval=刷新间隔 (s) +refreshIntervalMustBeGreaterThanXSeconds=刷新间隔必须大于{0}秒 +competitorCharts=参赛队记录 +selectAtLeastOneCompetitor=要显示参赛队记录,至少选择一支参赛队 +selectAtLeastOneCompetitorForInvitation=要发送邀请电子邮件,至少选择一支参赛队 +directionChange=风向变化 +speedChange=速度变化 +degreesShort=deg +untracked=取消跟踪 +delayForLiveMode=实况模式延迟: +notAvailable=不可用 +details=详情 +noGroupSelected=未选择分组 +combinedWindSourceTypeName=组合 +courseBasedWindSourceTypeName=场地设置 +trackBasedEstimationWindSourceTypeName=估算 +windSensorWindSourceTypeName=测量 +webWindSourceTypeName=手动 +raceCommitteeWindSourceTypeName=竞赛委员会 +clickChartToSetTime=点击记录设置时间 +position=位置 +windSourcesUsed=使用的风源 +errorTryingToUpdateWindSourcesToExclude=尝试更新风源以针对比赛轮次{0}排除出错: {1} +feedback=反馈 +startStopPlaying=开始/停止播放 +backToLive=跳回到实况时间点 +slowPlaySpeedDown=减慢播放速度,甚至倒放 +speedPlaySpeedUp=加快播放速度或重新继续播放 +showHideComponent=显示/隐藏{0} +degreesBoatToTheWind=风夹角 +racesInLeaderboard=积分榜中的比赛轮次 +leaderboardsInGroup=分组中的积分榜 +replication=复制 +errorFetchingReplicaData=获取重复数据出错: {0} +averageAbsoluteCrossTrackErrorInMeters=∅ XTE +averageAbsoluteCrossTrackErrorInMetersTooltip=连接航段起点和终点的大圆弧的平均交叉轨道误差 +averageSignedCrossTrackErrorInMeters=∅ XTE +/- +averageSignedCrossTrackErrorInMetersTooltip=赛场中的平均位置 - 从场地中线开始计算的符号距离;0 代表场地中线;负数代表左侧,正数代表右侧。 +raceAverageAbsoluteCrossTrackErrorInMetersTooltip=所有比赛轮次中迎风航段连接航段起点和终点的大圆弧的平均绝对交叉轨道误差,忽略参赛队所在的场地中线 +raceAverageSignedCrossTrackErrorInMetersTooltip=所有比赛轮次中迎风航段连接航段起点和终点的大圆弧的符号平均交叉轨道误差;负数代表场地中线的左侧,正数代表右侧。 +enterMaster=主实例的主机名称 +errorStartingReplication=从主机{0}/交换机{1}开始复制出错: {2} +helpLines=辅助线 +startLine=起航线 +finishLine=终点线 +advantageLine=优势航线 +courseMiddleLine=场地中线 +messagingPortNumber=消息传送端口编号(默认为 0) +servletPortNumber=Servlet 端口编号 +registeredAt=注册日期{0} +replicatingFromMaster=正在从主服务器{0}:{2}、消息传送端口{3}:{1}、交换机{4}复制 +showWindSpeedSeries=显示风速数据 +showWindDirectionSeries=显示风向数据 +fleet=船队 +boatClass=船只级别 +setDelayToLive=设置实况延迟 +pleaseEnterNonEmptyVenue=请输入场地。 +pleaseEnterStartAndEndDate=请输入开始日期和结束日期。 +startDateMustBeforeEndDate=开始日期必须早于结束日期。 +eventWithThisNameAlreadyExists=具有此名称的活动已存在。 +venue=场地 +pleaseSelectABoatClass=请选择船只级别。 +regattaWithThisNameAlreadyExists=具有此名称的比赛已存在。 +seriesWithThisNameAlreadyExists=具有此名称的序列已存在。 +fleetWithThisNameAlreadyExists=具有此名称的船队已存在。 +fleets=船队 +series=系列 +splitFleet=船队区分 +color=颜色 +medalSeries=奖牌轮系列 +noColor=没有颜色 +pleaseSelectARegatta=请选择比赛。 +addFleet=添加船队 +doYouReallyWantToRemoveRegatta=是否确定移除比赛 "{0}"? 还将移除此比赛的所有积分榜! +errorLoadingScoreCorrectionProviders=加载得分更正机构出错: {0} +selectResultListToImportFrom=选择从中导入的结果清单 +of=/ +errorObtainingScoreCorrections=从机构{0}获取于{3}公布的船只级别{2}活动{1}的得分更正出错: {4} +assignRaceNumbersToRaceColumns=向积分榜比赛轮次列分配官方结果的比赛轮次数 +importOfficialResults=导入官方结果... +selectAll=全选 +apply=应用 +successfullyUpdatedScores=已成功更新得分 +errorUpdatingScoresForLeaderboard=更新积分榜{0}的得分出错: {1} +maneuverTypesToShowWhenCompetitorIsClicked=点击参赛队时显示的操作类型 +simulateAsLiveRace=模拟实况比赛轮次 +simulateWithOffset=起航前的偏移(分钟): +boatClassDoesNotMatchSelectedRegatta=所选的比赛轮次包含不同于所选比赛船只级别 "{0}" 的船只级别。 将不加载比赛轮次。 +regattaExistForSelectedBoatClass=所选船只级别至少有一场比赛。是否确定为这些比赛轮次创建默认比赛? +reload=重新加载 +addRegatta=添加比赛... +importRegattas=导入比赛... +exchangeName=交换机名称 +course=场地 +courseLayout=场地设置 +buoy=浮标 +gate=门标 +buoys=浮标 +waypoint=航路点 +showAllCompetitors=显示所有参赛队 +boatTails=船只尾流线 +startFirstMarkTriangle=起航线与第一个标志形成的三角形 +resultImportUrls=结果导入 URL +errorRefreshingResultImportUrlList=刷新结果导入 URL 清单出错: {0} +successfullyUpdatedResultImportUrls=已成功更新结果导入 URL 清单 +errorRemovingResultImportUrls=移除结果导入 URL 出错: {0} +pleaseEnterNonEmptyUrl=请输入 URL。 +addResultImportUrl=添加结果导入 URL +errorAddingResultImportUrl=添加结果导入 URL 出错: {0} +remoteServerInstances=远程服务器实例 +localServer=本地服务器 +errorRefreshingSailingServers=刷新 SailingServer 实例出错: {0} +successfullyUpdatedSailingServers=已成功更新 SailingServer 实例 +errorRemovingSailingServers=移除 SailingServer 实例出错: {0} +addSailingServer=添加 SailingServer 实例 +errorAddingSailingServer=添加 SailingServer 实例出错: {0} +errorTryingToObtainLeaderboardContents=尝试获取积分榜内容出错: {0} +lastScoreUpdate=上次得分更新 +warningBrowserUnsupported=此网站未针对您的浏览器实施优化。请切换为更新浏览器,例如 Firefox 或 Chrome。 +newMark=新标志 +controlPoint=标志/门标 +errorUpdatingRaceCourse=更新比赛轮次场地出错: {0} +successfullyUpdatedCourse=已成功更新比赛轮次场地 +selectTwoMarksForGate=选择两个标志,以创建门标 +errorTryingToObtainTheMarksOfTheRace=尝试获取比赛轮次场地的标志出错: {0} +errorTryingToObtainRaceCourse=尝试获取比赛轮次场地出错: {0} +insertWaypointBeforeSelected=选择前插入航路点 +insertWaypointAfterSelected=选择后插入航路点 +addGate=添加门标 +scoringSchemeLowPointSystem=低分系统 +scoringSchemeHighPointSystem=高分系统 +scoringSchemeHighPointEssOverall=高分系统 - 总体极限帆船系列赛 (10) +scoringSchemeHighPointEssOverall12=高分系统 - 总体极限帆船系列赛 (12) +scoringSchemeHighPointEssOverall12Description=得分。 分站赛获胜者得 12 分、第 2 名 11 分、.... 在总体极限帆船系列赛中如有平局,以获得最多分站赛名次的参赛队取得胜利。 如果仍有平局,就以最后一个分站赛的名次打破平局。 +scoringSchemeHighPointLastBreaksTie=高分系统,最后一轮打破平局 +scoringSchemeLowPointWinnerGetsZero=低分系统,获胜者得零分 +scoringSchemeWinnerGetsFive=高分系统,获胜者得 5 分 +scoringSchemeWinnerGetsSix=高分系统,获胜者得 6 分 +scoringSchemeWinnerGetsEight=高分系统,获胜者得 8 分 +scoringSchemeWinnerGetsEightAndInterpolation=高分系统,获胜者 8 分,内插 +scoringSchemeLowPointWithEliminationsAndRoundsWinnerGets07=采用多轮淘汰制的低分系统,获胜者得 0.7 分 +scoringSchemeLowPointWithEliminationsAndRoundsWinnerGets07Description=低分记分系统的一种,采用多轮淘汰制。\n每一轮应作为比赛系列,船队顺序\n从第一轮的最高数向后计。\n如果有最终一支舰队和最终败者,则使用 1 和 2 排序。 半决赛从第 3 位开始。 +scoringSchemeLowPointForLeagueOverallLeaderboard=低分,分站赛得分总和,否则采用最后一个分站赛的得分打破平局 +scoringSchemeLowPointForLeagueOverallLeaderboardDescription=与用于低分记分系统打破平局的常规倒算系统不同,对于总得分相同的参赛队,比较其在所有分站赛中的得分总和。 如果仍有平局,则以最后一个分站赛的得分打破平局。 +scoringSchemeHighPointFirstGetsOne=高分,获胜者得 1 分 +scoringSchemeHighPointFirstGetsTen=高分,获胜者得 10 分 +scoringSchemeHighPointFirstGetsTenOrEight=高分,获胜者得 10 分(或 8 分) +scoringSchemeHighPointFirstGetsTenOrEightDescription=得分。 获胜者得 10 分、第 2 名 9 分、.... 以赢得最多比赛轮次的参赛队取得胜利,如果仍有平局,则以最后一个比赛轮次的名次打破平局。 +scoringSchemeHighPointFirstGetsTwelveOrEight=高分,获胜者得 12 分(或 8 分) +scoringSchemeHighPointFirstGetsTwelveOrEightDescription=得分。 获胜者得 12 分、第 2 名 11 分、.... 以赢得最多比赛轮次的参赛队取得胜利,如果仍有平局,则以最后一个比赛轮次的名次打破平局。 +scoringSystem=记分系统 +createFlexibleLeaderboard=创建灵活的积分榜 +createRegattaLeaderboard=创建比赛积分榜 +createDefaultRegattaLeaderboard=创建默认的比赛积分榜 +editFlexibleLeaderboard=编辑灵活的积分榜 +editRegattaLeaderboard=编辑比赛积分榜 +defaultRegatta=默认的比赛 +useOverallLeaderboard=使用总积分榜 +overallStandings=总排名 +type=类型 +actionAddRaces=添加比赛轮次 +racesWithNamePrefix=具有名称前缀的比赛轮次 +maximumSpeedOverGroundInKnots=最大实际速度 +maximumSpeedOverGroundInKnotsTooltip=比赛中参赛队的最大实际速度。 +totalTimeSailedDownwindInSeconds=顺风总时间 +totalTimeSailedDownwindInSecondsTooltip=参赛队在比赛中顺风航行的总时间。 +totalTimeSailedUpwindInSeconds=迎风总时间 +totalTimeSailedUpwindInSecondsTooltip=参赛队在比赛中迎风航行的总时间。 +totalTimeSailedReachingInSeconds=横风总时间 +totalTimeSailedReachingInSecondsTooltip=参赛队在比赛中的横风航段航行的总时间。 +totalTimeSailedInSeconds=总时间 +totalTimeSailedInSecondsTooltip=从比赛轮次开始时间算起,参赛队在比赛中航行的总时间。 +totalDistanceTraveled=总距离 +totalDistanceTraveledTooltip=比赛中航行的总距离。 +totalAverageSpeedOverGround=∅ 实际速度 +totalAverageSpeedOverGroundTooltip=比赛中的平均实际速度。 +hhmmssUnit=hh:mm:ss +actionAddWindData=添加风力数据 +valueMustBeBetweenMinMax="{0}" 的值必须在{1}与{2}之间。 +valueMustBeGreaterThan="{0}" 的值必须大于{1}。 +optional=可选 +pleaseEnterAValue=请输入值。 +latitude=纬度 +longitude=经度 +actionAddEvent=添加活动 +publicationUrl=出版 URL +suppress=禁止 +isPublic=公开 +unsuppress=取消禁止 +suppressedCompetitors=禁止的参赛队 +mediaPanel=音频和视频 +url=URL +mimeType=MIME 类型 +title=标题 +duration=持续时间 (h:mm:ss.ms) +addMediaTrack=添加音频/视频 +addYoutubeTrack=添加 Youtube +youtubeId=Youtube 编号 +reallyRemoveMediaTrack=是否确定移除媒体轨道 "{0}"? +pleaseSelectASeries=请选择系列 +pleaseSelectARace=请选择比赛轮次 +displayGroupsInReverseOrder=以相反的顺序显示分组 +actionConfigureUrl=配置 URL +configureLeaderboardUrlDescription=配置积分榜,并从链接获取生成的 URL +embedded=嵌入式 +additionalUrlSettings=附加 URL 设置 +restrictToSingleSelectedRace=限制为单个选择的比赛轮次 +expandSelectedRace=展开选择的比赛轮次 +showRaceDetails=允许比赛轮次详情 +numberOfRaces=比赛轮次数 +numberOfRacesMustBeNonNegativeNumber=请输入要显示的最后比赛轮次的数量 +chooseTheWayYouSelectRaces=选择选取比赛轮次的方式 +selectFromAllRaces=从所有比赛轮次中选择 +selectANumberOfRaces=选择一定量的比赛轮次 +numberOfLastNRaces=待显示的最新比赛轮次的数量 +expandLastRace=始终展开显示的最后比赛轮次 +factor=系数 +errorUpdatingIsMedalRace=更新奖牌轮设置出错: {0} +maneuverLoss=操作损失 +averageManeuverLossInMeters=∅ 操作损失 +averageManeuverLossInMetersTooltip=任何操作中的平均距离损失。 +averageTackLossInMeters=∅ 迎风转向损失 +averageTackLossInMetersTooltip=迎风转向中的平均距离损失。 +averageJibeLossInMeters=∅ 顺风转向损失 +averageJibeLossInMetersTooltip=顺风转向中的平均距离损失。 +shape=形状 +pattern=模式 +legend=图例 +live=实况 +swissTimingArchiveConnector=SwissTiming 归档的活动 +errorFetchingChartData=获取记录数据出错: {0} +loadingCompetitorData=正在加载参赛队数据... +competitorRegattaDataAfterRaceN={0} 比赛轮次后 {1} +rankChart=排名 +totalPoints=总分 +raceTotalPointsTooltip=参赛队在本轮次比赛中的总分 +regattaTotalPointsTooltip=参赛队在比赛中的总分 +showRankChart=显示排名记录 +overallLeaderboardSelection=总积分榜 +errorTryingToObtainOverallLeaderboards=尝试获取总积分榜出错: {0} +finished=已完成 +upcoming=即将到来 +next=下一个 +inProgress=正在进行 +passedTo=传输到{0} +gapChangeSinceLegStartInSeconds=差距变化 +gapChangeSinceLegStartInSecondsTooltip=最后一个航段开始时与第一名差距的变化。\n负数表示差距减小;\n正数表示差距增加。 +sideToWhichMarkAtLegStartWasRounded=绕圈的标志 +sideToWhichMarkAtLegStartWasRoundedTooltip=在航段起点的标志处绕圈的一侧。 +raceIsLive=正在直播比赛轮次{0} +racesAreLive=正在直播比赛轮次{0} +regattaIsLive=正在直播比赛{0} +regattasAreLive=正在直播比赛{0} +knotsUnit=kts +knotsValue={0,number,#0.0} kts +knotsRange={0,number,#0.0} - {1,number,#0.0} kts +generatePolarSheet=生成极坐标表 +polars=极坐标图 +polarSheetChart=极坐标表 +polarSheetMinimumDataSizePerGraph=各图形的最小数据点 +polarSheetMinimumDataSizePerGraphTooltip=不显示基础数据点较少的所有图形。\n这样就不会为数据量不足的风速\n显示分散图。 +polarSheetMinimumDataSizePerAngle=各角度的最小数据点 +polarSheetMinimumDataSizePerAngleTooltip=在各图形中,仅显示至少具有一定量\n的基础数据点的角度数据。 可使用临界值隐藏图中的不重要\n部分。 +polarSheetMinimumWindConfidence=最小风力置信度 +polarSheetMinimumWindConfidenceTooltip=仅使用风力置信度高于给定临界值\n的修复。此置信度介于 0 和 1。 +polarSheetMinimumConfidenceMeasure=最小置信度 +polarSheetMinimumConfidenceMeasureTooltip=图形中显示某点的最低置信度。\n如果低于给定的临界值,则不显示此点。\n置信度介于 0 和 1,并使用统计方法\n确定。 +polarSheetUseOnlyWindGaugeData=仅将风力表数据用于风速 +polarSheetUseOnlyWindGaugeDataTooltip=仅考虑风力表的速度数据,\n我们排除手动输入的猜测的风速,此风速可能会篡改极坐标图。 +polarSheetUseOnlyEstimationData=仅将估算用于风向 +polarSheetUseOnlyEstimationDataTooltip=通过使用针对风向的准确风力估计,\n我们修复因无效的风力表\n数据造成旋转的极坐标图。 +polarSheetRemoveOutliers=移除离群点(基于距离的方法) +polarSheetRemoveOutliersTooltip=通过基于距离的方法移除离群点。\n可在下方调整参数。 +polarSheetOutlierDetectionRadius=离群点检测邻近半径 +polarSheetOutlierDetectionRadiusTooltip=基于距离的离群点\n检测算法中使用的半径。 +polarSheetOutlierDetectionMinimumPerc=最小离群点检测邻近百分比 +polarSheetOutlierDetectionMinimumPercTooltip=邻近数据点/总数据点的百分比需要小于作为离群点的给定值。 +polarSheetNumberOfHistogramColumns=各风力范围的直方图列数 +polarSheetWindSteppingInKnots=风力步进(节) +polarSheetWindSteppingMaxDistance=风高度的最大距离 +polarSheetWindSteppingMaxDistanceTooltip=设置将修复分配到风高度的最大半径。 +polarSheetSplitByWindGauges=风源区分 +polarSheetSplitByWindGaugesTooltip=拆分风源可更好地搜索坏风力表。\n无法保证统计的正确性。 (对于不同的风力表)相同的修复可\n多次计入极坐标表。 +applyMinimumWindConfidence=应用最小风力置信度 +applyMinimumWindConfidenceTooltip=如果选中,以上方框中的值将在生成期间用作最小有效的风力置信度。 +windRangeDistribution=风力范围分布。 +pleaseSeeToolTips=请将鼠标移到选项,查看可用的工具提示。 +competitorColumnTooltip=此参赛队的成员姓名。 +sailIdColumnTooltip=显示参赛队所代表的国家国旗和帆号。 +rankColumnTooltip=参赛队在比赛中的总名次。 +carryColumnTooltip=前几个轮次的比赛中的得分。 +totalsColumnTooltip=参赛队在比赛中的总得分。\n按名次(而不是得分)排序。 +windData=风力数据 +gpsData=GPS 数据 +status=状态 +noDataFound=未找到数据 +displayName=显示名称 +histogram=直方图 +numberOfDataPoints=数据点数 +angleAndTotalNumberOfDataPointsAndCovAndCm=角度: {0};数据点总数: {1};偏差系数: {2};置信度: {3} +buoyZone=浮标区 +radiusInMeters=半径 (m) +filterRegattasByName=按名称筛选比赛 +noRegattasYet=暂无比赛。 +addCourseArea=添加场地区域 +courseAreas=场地区域 +courseArea=场地区域 +pleaseEnterNonEmptyCourseArea=请输入场地区域。 +pleaseSelectACourseArea=请选择场地区域。 +lastUpperFlag=上旗标 +lastLowerFlag=下旗标 +cannotAddRacesToRegattaLeaderboardButOnlyToRegatta=有比赛积分榜。您只能在比赛定义中将比赛轮次直接添加到此积分榜。 +correctScore=更正得分 +correctScoreFor=更正参赛队{0}在比赛轮次{1}中的得分 +penaltyOrRedress=惩罚/补偿 +netScore=净分 +timePointMustBeAfterStartOfTracking=时间点必须在跟踪开始之后。 +timePointMustBeBeforeEndOfTracking=时间点必须在跟踪结束之前。 +regattaUsedForTheTrackedRace=用于跟踪的比赛轮次的比赛 +tracTracUpdateUrl=TracTrac 服务器更新 URI +passingInstructions=绕标说明 +refreshNow=现在刷新 +stopUpdating=停止更新 +startUpdating=开始更新 +currentTime=当前时间: +tractracUsername=TracTrac 用户名 +tractracPassword=TracTrac 密码 +operatorEquals=等于 +operatorNotEqualTo=不等于 +operatorLessThan=小于 +operatorLessThanEquals=小于或等于 +operatorGreaterThan=大于 +operatorGreaterThanEquals=大于或等于 +operatorContains=包含 +operatorNotContains=不包含 +operatorStartsWith=开头为 +operatorEndsWith=结尾为 +nationality=国籍 +numberMustBePositive=数字必须大于零。 +distanceToLineAtRaceStart=起航前与起航线的距离 +distanceToLineFiveSecondsBeforeStart=起航前 5 秒时与起航线的距离 +speedOverGroundAtRaceStart=起航时的实际速度 +speedOverGroundFiveSecondsBeforeStart=起航前 5 秒时的实际速度 +speedOverGroundWhenPassingStart=起航时的实际速度 +distanceToLineAtRaceStartTooltip=比赛轮次开始时离开起航线的距离 +distanceToLineFiveSecondsBeforeStartTooltip=起航前五秒时离开起航线的距离 +speedOverGroundAtRaceStartTooltip=比赛轮次开始时的实际速度 +speedOverGroundFiveSecondsBeforeStartTooltip=起航前五秒时的实际速度 +speedOverGroundWhenPassingStartTooltip=参赛队越过起航线时的实际速度 +startTack=开始迎风转向 +startTackTooltip=参赛队开始迎风转向 +portTack=端口 +starboardTack=右舷 +portSide=端口 +starboardSide=右舷 +pleaseEnterANumber=请输入数字。 +competitorsFilter=参赛队筛选器 +flagStatus=旗标状态 +additionalInformation=信息 +windFixListingDescription=风力修复(前 3 个,后 3 个,真值) +noWindFixesAvailable=风力修复不可用。 +distanceToStarboardEndOfStartlineWhenPassingStart=起航时起航线右舷的距离 +distanceToStarboardEndOfStartlineWhenPassingStartTooltip=参赛队越过起航线时离开起航线或单个起航标志右舷的距离 +actionAddFilter=添加筛选器 +actionEditFilter=编辑筛选器 +availableFilters=可用的筛选器 +createFilterHint=创建筛选器集,筛选参赛队清单。 +filterThisNameAlreadyExists=具有此名称的筛选器已存在。 +addAtLeastOneFilterCriteria=至少添加一个筛选条件。 +filterCriteria=筛选条件 +selectAFilterCriteria=选择筛选条件 +filterName=筛选器名称 +operator=运算符 +value=值 +nationalityMustBeISOorIOCcode=国籍必须为两个字母的 ISO 代码或三个字母的 IOC 代码。 +raceRank=比赛轮次名次 +waypoints=航路点 +disableRaceFilter=禁用筛选器 +enableRaceFilter=启用筛选器 +raceStatusColumn=比赛轮次状态 +loading=正在加载(如果网速较慢,可能需要几分钟时间)... +racesWithHiddenState=状态为 HIDDEN 的比赛轮次 +mediaDateFormatError=日期格式无效。 使用: {0} +selectedCompetitors=选择的参赛队 +filterNothing=筛选(无内容) +topNCompetitorsByRaceRank=比赛轮次前{0}名 +topNCompetitorsByTotalRank=总排名前{0}名 +simulator=模拟器 +optionsBar=选项栏 +simulateButton=预测 +setup=设置 +strength=强度 (kn) +oscillation=振荡 +oscillating=振荡 +amplitude=振幅 (Grad) +frequency=频率 (1/h) +noise=噪声 +sailing=航行 +optimality=最优 +maximumTurns=最大圈数 +raceDirection=比赛方向 +upWind=迎风 +downWind=顺风 +strategies=策略 +omniscient=全知级 +opportunistic=投机级 +mixed=混合 +maps=地图 +startEnd=开始-结束 +racecourse=场地 +summary=汇总 +replay=重新播放 +display=显示 +simulatorPolarHeader=极坐标图 +show=显示 +hide=隐藏 +leftWind=左侧风 +rightWind=右侧风 +strategyOption1=策略选项 1 +strategyOption2=策略选项 2 +strategyOption3=策略选项 3 +legLabel=航段 +raceLabel=比赛轮次 +competitorLabel=参赛队 +freemode=保持航向角 +whatIfCourse=模拟场地 +editRegatta=编辑比赛... +selectSailingEvent=请选择航行活动... +selectCourseArea=请选择场地区域.. +courseAreaOverview=区域总览 +courseDesignOverview=场地设计总览 +regattaOverview=比赛总览 +additionalSettings=附加设置 +showFollowingCourseAreas=显示后续场地区域 +showFollowingRegattas=显示后续比赛 +showOnlyRacesOfSameDay=仅显示同一天的比赛轮次 +showOnlyCurrentlyRunningRaces=显示当前举行的比赛轮次 +seriesDefinesResultDiscardingRule=系列定义结果作废规则 +addSeries=添加系列 +regattaDefinesResultDiscardingRules=比赛定义结果作废规则 +startsWithZeroScore=系列从零分开始 +masterDataImportPanel=主数据导入 +importSuccess=成功\n已创建{0}个积分榜分组、{1}个积分榜、{2}个活动和{3}场比赛。 +importSuccessOverwriteInfo=需要覆盖后续比赛,需要重新跟踪比赛轮次: +regattaOverviewConfiguration=比赛总览配置 +firstRaceIsNonDiscardableCarryForward=从不可作废的得分开始 +addReplicationMaster=连接到副本主服务器 +connect=连接 +connectToMaster=连接到主服务器 +exchangeHost=消息传送主机名称 +explainExchangeHostName=运行消息传送队列的主机名称。 +explainReplicationHostname=运行副本主服务器的主机名称。 +explainReplicationExchangeName=交换机队列的名称。必须与主服务器中配置的相同。 +explainReplicationExchangePort=消息传送交换机队列的端口。必须在初始加载后用于所有数据。 +explainReplicationServletPort=用于连接注册此副本和接收初始加载的 Servlet 端口编号。 +explainReplicasRegistered=副本已注册(此服务器为主服务器): +explainConnectionsToMaster=与主服务器的连接(此服务器为副本): +explainNoConnectionsToMaster=未配置与主服务器的连接。点击“连接到主服务器”按钮配置。 +explainNoConnectionsFromReplicas=未找到来自副本的连接。可以使用管理控制台连接副本。 +stopConnectionToMaster=停止复制 +asLink=链接 +noStarttimeAnnouncedYet=待定 +raceIsRunning=运行 +raceIsFinishing=正在完成 +raceIsFinished=已完成 +raceIsScheduled=已日程安排 +raceIsInStartphase=开始阶段 +generalRecall=全召 +startPostponed=已延迟 +raceAbandoned=已放弃 +stopAllReplicas=断开与所有副本的连接(危险!) +warningServerIsReplica=注意:此服务器配置为副本。请勿更改任何内容,否则将导致奇怪效果! +dropReplicaConnection=断开连接 +timePanelName=时间控制 +competitorFilterExplanation=筛选器将显示与条件匹配的所有参赛队: +protestTime=声明时间 +protestTimeFinishesAt=结束 +protestTimeFinishedAt=已结束 +flags=旗标 +lastUpdate=上一次更新 +noMoreRacingToday=今天没有其他比赛 +furtherSignalsAshore=岸上等信号 +earlyStarters=抢航者 +showingDetailsOfRace=显示比赛轮次{0}的详情 +startAt=开始时间 +finishAt=结束时间 +protestEndsAt=声明结束时间 +unknown=未知 +raceLog=比赛轮次日志 +regattaLog=比赛日志 +refreshRaceLog=刷新比赛轮次日志 +raceLogReloaded=比赛轮次日志已从数据库成功重新加载 +reloadAllRaceLogs=重新加载所有比赛轮次日志 +export=导出 +sideline=边线 +classAndGolfUp=升起旗标 - 起航前八分钟 - 起航程序为门标起航 +classDisplayed=升起旗标 - 起航前五分钟 +papaDisplayed=起航模式旗标 - 起航前四分钟 +blackDisplayed=起航模式旗标 - 取消抢航者资格 - 起航前四分钟 +zuluIndiaDisplayed=起航模式旗标 - 惩罚抢航者 - 起航前四分钟 +papaRemoved=起航模式旗标 - 起航前一分钟 +blackRemoved=起航模式旗标 - 取消抢航者资格 - 起航前一分钟 +zuluIndiaRemoved=起航模式旗标 - 以惩罚抢航者起航 - 起航前一分钟 +classFlagRemoved=降下旗标 - 比赛轮次开始信号 +xray=个别召回 - 有抢航者 +firstSubstitute=全召 - 抢航者过多 - 将重复起航程序 +blueFlagDisplayed=升起旗标 - 第一支参赛队越过终点线 +blueFlagRemoved=降下旗标 - 最后一支参赛队越过终点线或结束时间限制已过 +golfRemoved=降下旗标 - 移除门标 +answeringPennantOverAlphaDisplayed=升起旗标 - 起航延迟 - 今天没有其他比赛 +answeringPennantOverHotelDisplayed=升起旗标 - 起航延迟 - 岸上等信号 +answeringPennantDisplayed=升起旗标 - 起航延迟 +answeringPennantRemoved=降下旗标 - 起航程序在一分钟后开始 +novemberOverAlphaDisplayed=升起旗标 - 放弃比赛 - 今天没有其他比赛 +novemberOverHotelDisplayed=升起旗标 - 放弃比赛 - 岸上等信号 +novemberDisplayed=升起旗标 - 放弃比赛 +bravoDisplayed=声明时间开始 +bravoRemoved=声明时间结束 +essThreeDisplayed=起航前三分钟 +essTwoDisplayed=起航前两分钟 +essOneDisplayed=起航前一分钟 +essOneRemoved=比赛轮次开始信号 +dataBeforeAfter=比赛轮次前/后的数据 +rawFixes=所有修复(包括离群点) +importRemoteHost=远程主机: +importFetchRemoteLgs=获取积分榜分组清单 +importUrlInvalid=获取积分榜分组的 URL 无效: {0} +importGetLeaderboardsFailed=主机{0}获取积分榜分组请求失败,错误为{1} +importNoDataReturned=服务器未返回数据 +importServerError=获取积分榜请求失败,服务器出错。请查看服务器日志,了解更多信息。 +importLeaderboardGroups=积分榜分组: +importOverrideSwitchLabel=如果名称和编号匹配,则覆盖现有数据 +importSelectedLeaderboardGroups=导入选择的积分榜分组 +importSelectAtLeastOne=必须至少选择一个要导入的积分榜分组 +deselectAll=取消全选 +polarDiagramButton=极坐标图 +ratioBetweenTimeSinceLastPositionFixAndAverageSamplingInterval=GPS 滞后 +ratioBetweenTimeSinceLastPositionFixAndAverageSamplingIntervalTooltip=上次接收的 GPS 位置的时间和平均采样间隔之间的比率 +trackingQuality=跟踪质量 +legType=航段形式 +sailID=帆号 +seriesLeaderboard=系列积分榜 +regattaLeaderboards=比赛积分榜 +clearSelection=清除选择 +running=运行 +runAsSubstantive=运行 +done=完成 +lastFinished=最后完成 +run=运行 +times=次数 +dataAmount=数据量 +averageCleanedServerTime=∅ 清理服务器时间 +averageCleanedOverallTime=∅ 清理总时间 +dataMiningBenchmarkResults=数据挖掘基准结果 +serverTime=服务器时间 +confidenceShouldBeBetween=置信度需要介于 0 和 1。 +minDataValuesNeedToBeAtLeastZero=最小数据大小值不能为负。 +numberOfColumnsAtLeast2=直方图列数需要为一个以上。 +outlierRadiusNeedsToBePositiveString=离群点半径需要为正数。 +outlierMinimumNeighborhoodPctString=离群点邻近百分比需要为正数,最大为 1。 +oneOrMoreParametersAreEmpty=参数字段不能为空。 +errorWhileAddingSeriesToChart=尝试向记录添加\n新系列时出错。 +generatingPolarSheet=正在生成极坐标表... +dataCount=数据大小 +generationFinished=生成完成! +generating=正在生成 +removeAllSheets=移除所有工作表 +removeAll=全部移除 +selectSheet=选择工作表 +cleanedServerTime=清理服务器时间 +overallTime=总时间 +cleanedOverallTime=清理总时间 +dataMiningResult=数据挖掘结果 +groupBy=分组方式 +statisticToCalculate=计算统计 +queryResultsChartSubtitle={1}秒内处理{0}个数据条目 +noQuerySelected=没有查询选择 +runAutomatically=自动运行 +windImport_Upload=上传 +windImport_Title=从导航图导入风力 +windImport_BoatId=船只编号: +windImport_SelectedRacesWarning=是否确定将风力数据导入所选的{0}个比赛轮次?\n只有时间范围适用的比赛轮次将受到影响。 +windImport_AllRacesWarning=是否确定将风力数据导入所有比赛轮次?\n只有时间范围适用的比赛轮次将受到影响。 +windImport_ResultHeader=导入的风力数据自: {0}至: {1}。{2}个比赛轮次受到影响。 +windImport_ResultEntry=比赛轮次: {0} ({1}) - {2} 修复自: {3}至: {4} +windImport_ResultError=错误: {0} +showWindSpeedSeriesTooltip=切换所有数据源的风速的可见性 +showWindDirectionSeriesTooltip=切换所有数据源的风向的可见性 +combinedWindSourceTypeTooltip=将所有其他风源组合到一个数据集中 +courseBasedWindSourceTypeTooltip=基于场地设置(假设比赛轮次从迎风航段开始)的值 +trackBasedEstimationWindSourceTypeTooltip=从参赛队跟踪计算的数据 +windSensorWindSourceTypeTooltip=从移动测量系统获取的数据 +webWindSourceTypeTooltip=手动设置数据值 +raceCommitteeWindSourceTypeTooltip=从裁判长手动设置的数据 +sheetName=工作表名称 +sheetNameTooltip=可以使用文本字段为极坐标表命名。\n如果不提供名称,会使用船只级别生成名称。 +timeDownwind=顺风时间 +timeReaching=横风时间 +timeUpwind=迎风时间 +raceTimeTooltip=参赛队在本比赛轮次中越过开始航路点\n(不是比赛轮次开始时)航行的总时间 +raceTimeDownwindTooltip=本轮次比赛顺风航行的总时间 +raceTimeReachingTooltip=本轮次比赛横风航行的总时间 +raceTimeUpwindTooltip=本轮次比赛迎风航行的总时间 +noStatisticSelectedError=未选择待计算的统计 +noCustomGrouperScriptTextError=群集器脚本为空 +noDimensionToGroupBySelectedError=未选择分组方式尺寸 +noGrouperSelectedError=未选择群集器类型 +noDataRetrieverChainDefinitonSelectedError=未选择数据检索器 +queryNotValidBecause=无法查询,原因: +dataMining=数据挖掘 +errorRunningDataMiningQuery=运行查询期间出错 +hideToolbar=隐藏工具栏 +showSeriesLeaderboards=显示系列积分榜 +showOverallLeaderboard=显示总积分榜 +lineAngleToWindAndAdvantage=长度: {0}m\n风力角度: {1}°\n{2}侧具有 {3}m 优势 +doYouReallyWantToRemoveEvents=是否确定移除活动? +doYouReallyWantToRemoveEvent=是否确定移除活动 {0}? +line=线 +offset=分支 +doYouReallyWantToRemoveCompetitors=是否确定移除所选的参赛队? +doYouReallyWantToRemoveCompetitor=是否确定移除参赛队 {0}? +filterCompetitors=按名称、船只级别或帆号或编号筛选参赛队 +editCompetitor=编辑参赛队 +pleaseEnterASailNumber=请输入帆号 +successfullyAllowedCompetitorReset=已成功允许重新加载参赛队{0}。 +id=编号 +allowReload=允许重新加载 +compress=压缩 +compressTooltip=仅在导出服务器实例至少通过\n任务 0fbf6071dea125bec4a56dee55d61c99def4a62e 运行时使用。 +queryRunner=查询执行器 +rerunQueryAfterRefresh=在刷新后重新运行查询 +refreshIntervalMustntBeEmpty=刷新间隔不得为空 +selectionTables=选择表 +addConfiguration=添加配置 +noConfigurations=没有配置。 +errorRetrievingConfiguration=从服务器检索配置数据时出错。 +allowedCourseAreas=允许的场地区域 +minimumRoundsForCourse=场地的最小轮次 +maximumRoundsForCourse=场地的最大轮次 +resultsMailRecipient=结果邮件收件人 +deviceConfiguration=设备配置 +none=无 +courseDesignerMode=场地设计师 +racingProcedure=比赛程序 +courseNames=场地名称 +generate=生成 +dontoverwrite=不要覆盖 +setRacingProcedureConfiguration=设置比赛配置 +racingProcedureConfiguration=比赛配置 +activateIndividualRecall=激活个别召回 +rrs26Start=RRS26 开始 +setConfiguration=激活配置 +classFlag=级别旗标 +classFlagHelpText=设置用于{0}的级别旗标。 选择“不要覆盖”,激活程序的默认旗标。 +individualRecallHelpText=激活后,裁判长能够执行个别召回。 +startmodeFlags=起航模式旗标 +startmodeFlagsHelpText=设置可用的起航模式旗标。选择无,启用程序的默认旗标。 +gateStart=起航门标 +activatePathfinder=激活探路者 +pathfinderHelpText=激活后,裁判长能够设置探路者船只。 +essStart=ESS 开始 +basicStart=海选赛开始 +leagueStart=联赛开始 +configured=已配置 +overwriteRacingProceduresConfiguration=激活比赛配置 +overwriteRacingProceduresConfigurationHelpText=启用此选项将为比赛特定的配置中所有未配置的选项提供基本比赛配置。 +setStartTime=设置开始时间 +currentPass=当前绕标 +setStartTimeDescription=为比赛轮次选择新开始时间。 如果要将开始时间设置为过去的时间点,需要启用此复选框更新场次计数。 请注意,更改场次计数将丢失先前场次的所有信息(例如旗标活动)。 +setTrackingTimesDescription=设置比赛轮次跟踪的开始和结束。 +hasAdditionalGolfDownTime=激活附加高尔夫故障时间 +additionalGolfDownTimeHelpText=激活附加高尔夫故障时间 +invalidColor=颜色无效: {0} +igtimiAccounts=Igtimi 账户 +errorFetchingIgtimiAccounts=获取所有 Igtimi 账户出错: {0} +addIgtimiAccount=添加 Igtimi 账户 +errorAuthorizingAccessToIgtimiUser=授予 Igtimi 用户{0}权限出错: {1} +successfullyAuthorizedAccessToIgtimiUser=已成功授予 Igtimi 用户{0}权限 +couldNotAuthorizedAccessToIgtimiUser=无法授予用户{0}权限;用户名或密码无效 +errorGettingIgtimiAuthorizationUrl=获取 Igtimi 权限 URL 出错: {0} +addIgtimiUser=添加 Igtimi 用户 +doYouReallyWantToRemoveLeaderboards=是否确定移除积分榜? +errorTryingToRemoveIgtimiAccount=尝试移除用户{0}的 Igtimi 账户出错 +successfullyRemoveIgtimiAccount=已成功移除用户{0}的 Igtimi 账户 +eMailMustNotBeEmpty=电子邮件地址不得为空 +emailAddress=电子邮件地址 +password=密码 +doYouReallyWantToRemoveLeaderboard=是否确定移除积分榜: ''{0}''? +metaLeaderboardCannotBeChanged=此为元积分榜。无法在此处更改。 +failedToSetNewStartTime=设置新开始时间失败。 相同的开始时间可能已存在于比赛轮次日志中或某人已添加(场次编号和逻辑时间)更新的开始时间。 +doYouReallyWantToRemoveIgtimiAccount=是否确定移除授予用户{0}访问数据权限的 Igtimi 账户? +igtimiWindImport=从 Igtimi 导入风力数据 +seeIgtimiTabForAccountSettings=请查看 "Igtimi" 选项卡了解账户设置,确定将考虑的 Igtimi 数据。 +importWindFromIgtimi=从 Igtimi 导入风力数据 +errorImportingIgtimiWind=从 Igtimi 导入风力数据出错: {0} +resultFromIgtimiWindImport=已为所列的比赛轮次导入以下修复: {0} +timeToStart={0} - 开始 +timeSinceStart={0} - 开始后 +distanceToLine=与起航线的距离 +beatAngleTooltip=赛队航行的方向和风的夹角 +beatAngle=迎风航行角度 +showBoatClassChartsLabel=还可以查看可用船只级别的总直直方图。 +showDiagram=显示直方图 +runAutomaticallyTooltip=在更改统计或分组后,自动运行查询。 +rerunQueryAfterRefreshTooltip=在刷新表后,重新运行查询。 +queryDefinitionProvider=查询定义提供方 +statisticProvider=统计提供方 +calculateThe=计算 +groupingProvider=分组提供方 +releaseNotes=消息和版本历史 +hasSplitFleetContiguousScoring=区分连续得分的船队 +addRaceLogTracker=添加比赛轮次日志跟踪器 +addRaceLogTrackers=添加比赛轮次日志跟踪器 +denoteForRaceLogTracking=比赛轮次日志跟踪描述 +startRaceLogTracking=开始比赛轮次日志跟踪 +filterByLeaderboard=按积分榜筛选 +removeLeaderboardFilter=移除积分榜筛选器 +competitorRegistrations=参赛队注册 +trackerStatus=跟踪器状态 +canOnlyBeEditedBeforeStartingTracking=只可以在开始跟踪前编辑 +defineCourse=定义场地设置 +mapDevices=将设备映射到参赛队和标志 +edit_what=编辑{0} +add_what=添加{0} +remove_what=移除{0} +pleaseEnterA=请输入{0} +pingPosition=定位{0} +pleaseEnterAValidValueFor=请为{0} ({1}) 输入有效值 +copyCourseAndCompetitors=将场地和参赛队复制到其他比赛轮次 +setTrackingTimes=设置跟踪事件 +nowSelectRaceColumnAndFleetToCopyTo=现在选择要将场地复制到的比赛轮次列和船队。 +selectRowInTableToCopyCourse=在表中选择要将场地复制到的单个行。 +deviceId=设备编号 +deviceType=设备类型 +mappedToType=映射到类型 +mappedTo=映射到 +deviceMappings=设备映射 +atMostOneEndOfTheTimeRangeMayBeOpen=至多可以将映射时间范围的一端保持开放(不设置) +pleaseSelectAnItemToMapTo=请选择映射设备的项目 +device=设备 +timeRange=时间范围 +closeTimeRange=关闭时间范围的开放端 +setClosingTimePoint=设置关闭开放的时间范围的时间点 +startOfTimeRangeMustLieBeforeEnd=时间范围的起点必须在终点之前 +overallProgress=总进度 +eventOverview=活动总览 +start=开始 +showAddedScores=为积分榜中的各条目显示添加的得分 +ratio=比率 +importWind=导入风力数据 +importWindTooltip=取消选择此选项将大大降低传输的数据量。 +importDeviceConfigurations=导入设备配置 +importDeviceConfigurationsTooltip=选择此选项将导入远程服务器中的所有设备配置。 +authorName=作者名称 +authorPriority=作者优先级 +removeDenotation=移除描述 +competitorRegistrationsMissingProceed=所选的比赛轮次 ({0}) 中至少有一个缺少参赛队注册。 是否继续? +pleaseSelectAControlPoint=请选择控制点 +twoMarkControlPoint=2 个标志的控制点 +registeredCompetitors=注册的参赛队 +competitorPool=参赛队库 +selectAtLeastOne=至少选择一个 +selectRaces=选择比赛轮次 +importFixes=导入修复 +noSailingServerInstancesYet=尚未注册远程服务器实例。 +registeredSailingServerInstances=注册的远程服务器实例 +filterEventsByName=按名称筛选活动: +leaderboardsExceptFromSelectedGroup=积分榜(所选分组的积分榜除外) +availableLeaderboardGroups=可用的积分榜分组 +leaderboardGroupsOfSelectedEvent=分配到活动的积分榜分组 +addRaces=添加比赛轮次 +withNamePrefix=含名称前缀 +pleaseSelectASeriesFirst=请先选择系列。 +upcommingEventStartsInDays={0,number} 天后 +upcommingEventStartsInDays[one]=明天 +upcommingEventStartsInDays[none]=今天 +sharingMailTooltip=通过邮件分享 +sharingTwitterTooltip=在 Twitter 上分享 +sharingFacebookTooltip=在 Facebook 上分享 +#String eventSharingShortText(String eventName, String venue, String dateString); +eventSharingShortText={2}{1}中的{0} +#String eventSharingLongText(String eventName, String venue, String dateString, String url); +eventSharingLongText=我要在{2}分享{0}中的{1}。 详情: \n{3} +#String seriesSharingLongText(String seriesName, String url); +seriesSharingLongText=我要分享系列赛{0}。 详情: {1} +#String seriesSharingShortText(String seriesName); +seriesSharingShortText={0} +competitorsAnalytics=参赛队分析 +mediaNoContent=没有可用的照片或视频。 +media=媒体 +photos=照片 +videos=视频 +image=图像 +images=图像 +video=视频 +flagImageURL=旗标图像 URL(图像使用 18x12px 渲染) +imageURLs=图像 URL +videoURLs=视频 URL +sponsorImageURLs=赞助商图像 URL +invalidSelection=当前选择无效。 +advancePassId=提前绕标编号 +pleaseSelectAScoringResult=请选择记分结果... +timeZone=时区 +eventOfficialWebsiteURL=官方网站 URL +eventSailorsInfoWebsiteURL=水手信息网站 URL +eventOverviewURL=活动总览 URL +eventLogoImageURL=图标图像 URL +showPingMarkMappings=显示已定位标志的映射 +regattaNameMustNotContainSlashes=比赛名称不得包含斜线 +showNumberOfRacesScored=记分的比赛轮次数 +errorFetchingWindStreamletData=获取风力流数据出错: {0} +showWindStreamletOverlay=显示风流覆盖 +showWindStreamletColors=基于风流的颜色流 +showSimulationOverlay=显示模拟覆盖 +simulationLegendTooltip=时间比较:\n比赛轮次指根据 GPS 计算的航段历时,如果对风力了如指掌,则称为全知级;如果仅靠测量下一标志的距离就决定启航,则称为投机级;如果了解有关风力的所有信息并决定启航,则称为一圈即成级。 +racesScored=记分的比赛轮次 +racesScoredTooltip=参赛队完成并记录在此积分榜上的比赛轮次数。 +averageNumberOfOperationsPerMessage=各消息操作的平均数 +showUncorrectedNetPoints=显示未更正的净分 +setStartTimeReceived=设置接收的开始时间 +setStartTimeReceivedDescription=设置非持久的所选 TrackedRace 的 startTimeReceived。 这意味着,重启服务器后,将忘记新值。 +lastScoreCorrectionsTime=上次得分更正时间 +lastScoreCorrectionsComment=上次得分更正评论 +setTimeToNow=将时间设为“现在” +useStartTimeInference=使用从开始绕标推断的开始时间 +numberOfQueueMessagesSent=发送的队列消息的数量 +totalSize=总大小 +averageMessageSize=各消息的平均大小(字节) +totalNumberOfOperations=操作的总数 +currentOrAverageSpeedOverGroundInKnotsTooltip=在航段航行时的当前实际速度(节);航段完成时的平均数实际速度 +currentOrAverageSpeedOverGroundInKnots=实际速度(∅ 终点) +connectors=连接器 +videoComponentShortName=视频 +competitorSearchFilter=参赛队搜索筛选器 +searchCompetitorsBySailNumberOrName=搜索 +goToEventOverview=进入活动总览 +goToOverviewAndSeeLeaderboard=进入总览,并查看一个积分榜中的所有比赛轮次 +noSuchEvent=没有此类活动 +leaderboardNotContainedInLeaderboardGroup=积分榜{0}未包含在积分榜分组{1}中。 +leaderboardGroupNotContainedInEvent=积分榜分组{0}未包含在活动{1}中。 +raceIsInLiveTimePanelMode=正在直播比赛轮次 +backToLiveTimePanelMode=返回实况 +windChart=风力记录 +mediaNoVideosCaption=无视频 +mediaShowVideoCaption=显示视频 +mediaShowVideoTooltip=点击显示视频: {0} +mediaHideVideoCaption=隐藏视频 +mediaHideVideoTooltip=点击隐藏视频 +mediaSelectVideoCaption={0}个视频 +mediaSelectVideoTooltip=点击选择视频 +mediaManageMediaCaption=管理媒体 +mediaManageMediaTooltip=配置音频和视频短片,同步时间 +showAll=显示全部 +raceVisibilityColumn=可见性 +enterCarryValueFor=输入参赛队{0}的得分 +advanced=高级 +basedOn=基于 +retrieveWith=检索依据 +mappingDetails=映射详情 +deviceMappingQrCodeExplanation=如果使用跟踪应用,可以通过选择参赛队/标志、设置开始和结束时间,然后扫描此二维码添加设备映射。 +qrCode=二维码 +enterCourseAreaName=输入场地区域名称... +enterCourseName=输入场地名称... +enterImageURL=输入图像 URL... +enterVideoURL=输入视频 URL... +enterSponsorImageURL=输入赞助商图像 URL... +enterRaceName=输入比赛轮次名称... +serverError=尝试联系服务器时出错。请检查网络连接,并重试。 +remoteProcedureCall=远程过程调用 +serverReplies=服务器应答 +errorCommunicatingWithServer=与服务器通信时发生错误 +userManagement=用户管理 +regattaStructureImport=比赛结构导入 +filteredBy=筛选方式 +editSeries=编辑系列 +pleaseSelectAtLeastOneRegatta=请至少选择一场比赛 +pleaseSelectAnEvent=请选择活动 +errorTryingToGetEvents=尝试获取活动出错: {0} +showXYDiagram=显示 x-y 图 +xyDiagram=x-y 图 +boatSpeed=船只速度 +confidence=置信度 +createDefaultSettingsForAllRegattas=为所有比赛创建默认设置... +noOverallEventSelected=未选择整个活动... +errorTryingToCreateNewEvent=尝试新建活动{0}出错: {1} +createNewEvent=新建活动 +noFleetsDefined=未定义船队。 +successfullyCreatedRegattas=已成功创建比赛 +errorTryingToRegisterRacesForTracking=尝试注册比赛轮次{0}用于跟踪出错: {1}。检查实况/存储的 URI 语法。 +errorDeterminingPolarAvailability=确定比赛轮次{0}的极坐标/VPP 数据的可用性出错: {1} +error=错误 +fileStorage=文件存储 +active=已激活 +scoringSchemeHighPointEssOverallDescription=得分。 分站赛获胜者得 10 分、第 2 名 9 分、.... 在总体极限帆船系列赛中如有平局,以获得最多分站赛名次的参赛队取得胜利。 如果仍有平局,就以最后一个分站赛的名次打破平局。 +timeBetweenRaceStartAndCompetitorStartInSeconds=起航延迟 +timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=比赛轮次开始与参赛队越过起航航路点之间的时间。负值表示“抢航”。 +useInternalAlgorithm=使用内部绕标算法 +editMarkPassings=编辑绕标 +editMarkPositions=编辑标位 +removeFixedPassings=移除固定的绕标 +setFixedPassing=设置绕标时间 +setSuppressedPassing=从当前开始禁止绕标 +removeSuppressedPassing=移除禁止的绕标 +errorRemovingFixedPassing=移除固定的绕标出错: {0} +errorSettingFixedPassing=设置固定的绕标出错: {0} +errorSuppressingPassing=禁止绕标出错: {0} +errorRemovingSupressedPassing=移除禁止的绕标出错: {0} +errorTryingToObtainMarkPassing=尝试获取绕标出错: {0} +errorTryingToObtainRaceLogMarkPassingData=尝试获取比赛轮次日志绕标数据出错: {0} +email=电子邮件 +pleaseEnterAnEmail=请输入电子邮件。 +inviteCompetitors=邀请参赛队 +inviteSelectedCompetitors=邀请选择的参赛队 +notAllCompetitorsProvideEmail=并不是所有的参赛队提供电子邮件 +sendingMailsFailed=发送邮件失败 +sendingMailsSuccessful=已成功发送电子邮件 +selectEventForInvitation=选择邀请活动 +imageURL=图像 URL +upload=上传 +removeResult=移除操作: {0} {1} +uploadSuccessful=上传成功 +fileUploadResult=文件上传: {0} {1}。\n如果出错,请检查文件存储服务配置是否正确。 +removeUploadedFile=移除上传的文件 +showCompetitorSailIdColumn=帆号 +showCompetitorFullNameColumn=参赛队全名 +loadingDimensionValues=正在加载尺寸值 +runningQuery=运行查询 +inviteBuoyTenders=浮标招标 +orMultipleEmails=或使用逗号隔开的多个电子邮件 +courseOverGroundTrueDegreesTooltip=实在对地航向角度 +courseOverGroundTrueDegrees=对地航向 +distanceIncludingGateStartInMeters=距离(起航门标) +distanceTraveledIncludingGateStartTooltip=如果航段没有结束,从航段起点到终点\n或当前时间点航行的距离。\n如果航段包括起航门标,则包括尾销到起航位置的距离,\n这样,即便在不同时间起航,也可以比较参赛队。 +raceDistanceTraveledIncludingGateStartTooltip=如果航段没有结束,从比赛轮次开始到结束\n或当前时间点航行的距离。 对于起航门标,包括尾销到起航位置的距离,\n这样,即便在不同时间起航,也可以比较参赛队。 +results=结果 +groupName=分组名称 +valueAscending=值(递增) +valueDescending=值(递减) +sortBy=排序方式 +dashboardHeader=仪表盘 +dashboardNoWindBotAvailableHeader=风力机器人程序不可用。 +dashboardNoWindBotAvailableMessage=要从风力测量装置接收实况风力数据,请确保开启风力机器人程序,并与 SAP Sailing Analytics 相连。 +dashboardWindBot=风力机器人程序 +dashboardTrueWindSpeed=TWS +dashboardTrueWindDirection=TWD +dashboardTrueWindSpeedUnit=kts +dashboardTrueWindDirectionUnit=deg +dashboardLiveWind=实况 +dashboardAverageWind=平均 +dashboardAverageWindMinutes=({0}分钟) +dashboardWindChartHint=点按记录,更改间隔 +dashboardSelectCompetitor=选择参赛队 +dashboardStartAnalysesHeader=起航分析 +dashboardNewStartAnalysisAvailable=新起航分析可用 +dashboardNoStartAnalysesAvailableHeader=起航分析不可用。 +dashboardNoStartAnalysesAvailableMessage=存在从各比赛轮次开始创建的起航分析。在比赛开始前,请勿执行操作。 +dashboardNoStartlineAdvantagesByWindAvailableHeader=起航线优势不可用。 +dashboardNoStartlineAdvantagesByWindAvailableMessage=要计算起航线优势,需要由竞赛委员会设置场地。 +dashboardNoStartlineAdvantagesByGeometryAvailableHeader=起航线优势不可用。 +dashboardNoStartlineAdvantagesByGeometryAvailableMessage=要计算起航线优势,需要由竞赛委员会设置场地。 +dashboardStartlineAdvantagesByWindHeader=起航线优势 - 按风力 +dashboardStartlineAdvantageByGeometryHeader=起航线优势 - 按几何结构 +dashboardRankAtFirstMark=在第一个标志的名次 +dashboardTeam=团队 +dashboardDistanceToLineInM=与起航线的距离 (m) +dashboardSpeedInKts=速度 (kts) +dashboardAdvantageInSeconds=优势 (m) +dashboardSecondsAbreviation=s +dashboardDistanceToRCBoat=与 RC 船只的距离 (m) +dashboardPinEnd=尾销 +dashboardRCBoat=RC 船只 +fixedMarkPassing=(固定) +suppressedMarkPassing=(禁止) +windUp=风向向上(从地图的顶部显示风力) +filterBy=筛选方式 +currentFilterSelection=当前筛选器选择 +notCapableOfGeneratingACodeForIdentifier=无法为此标识符生成代码。 +serverUrl=服务器 URL +rotatedFromTrueNorthClickToToggleWindUp=自真北方向旋转{0}度。\n点按/点击在风向向上和北向上地图显示之间切换 +startLineToFirstMarkTriangle=开始经过第一个标志 ({0}m) +dataMiningComponentsHaveBeenUpdated=数据挖掘组件已更新 +dataMiningComponentsNeedReloadDialogMessage=点击“重新加载”,立即重新加载组件。 这将放弃当前显示的数据,并运行默认查询。\n点击“关闭”不执行任何操作。 在重新加载组件前,数据挖掘不能正常工作。 +noDataForEvent=活动暂无任何数据。 +countriesCount={0,number} 个国家 +countriesCount[one]={0,number} 个国家 +racesCount={0,number} 个比赛轮次 +racesCount[one]={0,number} 个比赛轮次 +trackedRacesCount={0,number} 个跟踪的比赛轮次 +trackedRacesCount[one]={0,number} 个跟踪的比赛轮次 +eventsCount={0,number} 个活动 +eventsCount[one]={0,number} 个活动 +competitorsCount={0,number} 支参赛队 +courseAreaName=场地区域: {0} +competitorsCount[one]={0,number} 支参赛队 +currentOfTotalLegs=航段 {0,number}/{1,number} +clone=克隆 +changed=已更改 +matcher=匹配程序 +any=任何 +urlProviders=基于 URL 的结果提供方 +pleaseSelectAURLProvider=请选择基于 URL 的结果提供方... +sampleURL=示例 URL: {0} +sapSportsOn=SAP Sports - +followSapSports=关注 SAP Sports +liveNow=现在直播 +analyseRace=分析比赛轮次 +nextRaceStartingIn=下一个比赛轮次开始于 +startingIn={0}开始于 +raceIsPlanned=已计划 +raceIsCanceled=已放弃 +raceIsPostponed=已延迟 +startingInMinutes={0,number} 分钟后开始 +startingInMinutes[none]=现在开始 +latestNews=最新消息 +resultsUpdate=结果更新 +competitorWonRace={0}赢得比赛轮次 +showCompetitorTimeOnTimeFactorColumn=时间对时间系数 +showCompetitorTimeOnDistanceAllowanceColumn=时间对距离宽限 +rankingMetric=排名 +oneDesignRankingMetric=统一设计 +orcPerformanceCurveRankingMetric=ORC 成绩曲线 +timeOnTimeAndDistanceRankingMetric=时间对时间/时间对距离 +oneDesignRankingMetricDescription=统一设计: 第一个过线的获胜;\n比赛名次基于上风位置(迎/顺风)或沿场地位置(横风) +orcPerformanceCurveRankingMetricDescription=ORC 成绩曲线: 复杂的差点方案,假设相对于风的预定义航段角度,根据 VPP/极坐标提供时间宽限;\n根据这些时间宽限,计算排名的基础 -“隐藏式风”。\n隐藏式风可在比赛轮次的任意时间计算,因此是比赛排名的基础。 +timeOnTimeAndDistanceRankingMetricDescription=时间对时间/时间对距离: 基于计算时间的最终排名;\n通过对实际时间选择应用一个系数(默认为 1.0)\n并减去应用于\n场地长度的每海里时间宽限(秒)计算时间。\n比赛名次假设当前航段的平均 VMG/VMC,以船只的最快速度预计到达当前位置为基础。 +timeOnTimeFactor=ToT 系数 +timeOnDistanceAllowanceInSecondsPerNauticalMile=ToD 宽限 +timeOnTimeFactorTooltip=时间对时间系数;在计算的时间公式中,实际时间乘以此系数 +timeOnDistanceAllowanceInSecondsPerNauticalMileTooltip=每海里的时间对距离宽限(秒);\n航行的距离乘以此宽限,在计算的时间公式中,从航行的实际时间\n(应用时间对时间系数选择计算)中减去生成的描述 +calculatedTimeTraveled=计算的时间 +calculatedTimeTraveledTooltip=根据参赛队\n的差点且基于比赛轮次开始的时间和航行的(上风)距离计算的时间 +raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSeconds=在最快速度下计算时间 +raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSecondsTooltip=预计到达当前在比赛轮次最前方的参赛队的计算时间;\n预计基于当前航段的平均 VMG 和同等于最快船只在所有后续航段的(计算)成绩 +sailorInfo=水手信息 +sailorInfoLongText=官方结果、声明、\n公告板、水手、天气: +eventQuickfinder=活动快速查找器 +regattaQuickfinder=比赛快速查找器 +resultsQuickfinder=结果快速查找器 +racesQuickfinder=比赛轮次快速查找器 +statistics=统计 +impressions=曝光量 +notAvailableOnMobileMessage=此内容不适用于移动设备。\n是否切换到桌面版? +gotoDesktop=进入桌面版 +goBack=返回 +showAllX=显示所有{0} +collapseX=折叠{0} + +numberOfGPSFixes=GPS 修复 +fastestSailor=最快 +numberWindFixes=风力修复 +sailedMiles=航行英里 +millionValue={0,number,#0.0} 百分 +billionValue={0,number,#0.0} 十亿 +noResults=没有可用的结果。 +noNews=没有可用的消息。 +pointsValue={0,number,#0.00} +openLeaderboard=打开积分榜 +now=现在 +minutesAgo={0}分钟前 +hoursAgo={0}小时前 +winner=获胜者 +durationPlain=持续时间 +finishedRaces=结束的比赛轮次 +selectCompetitor=请选择一支参赛队 +all=全部 +points=分数 +numberOfRacesShort=比赛轮次数 +courseGeometry=场地几何结构 +degreesToWind={0}°(相对于风) +miniLeeaderboardLegendText=显示分数以及各参赛队的比赛轮次数 +currentOfTotal={0,number}/{1,number} +noFinishedRaces=没有结束的比赛轮次 +racesOverview=比赛轮次总览 +listFormatLabel=清单格式 +competitionFormatLabel=赛制 +empty=空 +runAQuery=运行查询 +latestRegattaStandings=最新比赛排名 +plainText=纯文本 +columnChart=柱状图 +choosePresentation=选择介绍 +cantDisplayDataOfType=无法显示类型为{0}的数据 +shownDecimals=显示小数 +openFullscreenView=打开全屏视图 +closeFullscreenView=关闭全屏视图 +progress=进度 +videosCount={0,number} 个视频 +videosCount[one]={0,number} 个视频 +photosCount={0,number} 张照片 +photosCount[one]={0,number} 张照片 +eventsHaveTakenPlace={0}个活动已举行 +eventsHaveTakenPlace[one]=已举行一场活动 +raceOffice=竞赛办公室 +analyze=分析 +dataMiningSettings=数据挖掘设置 +multiResultsPresenter=多结果展示区 +plainResultsPresenter=纯结果展示区 +resultsChart=结果记录 +tabbedResultsPresenter=选项卡式结果展示区 +polarResultsPresenter=极坐标结果展示区 +dataMiningRetrieval=数据检索 +actionWatch=观看 +actionAnalyze=分析 +denoteAllRacesForRaceLogTrackingShorctut=为比赛轮次日志跟踪描述所有比赛轮次的快捷方式 +registerCompetitors=注册参赛队 +doYouWantToCreateADefaultRegattaLeaderboard=是否确认默认的比赛积分榜? +copyCourse=复制场地 +copyCompetitors=复制参赛队 +smartphoneTracking=智能手机跟踪 +flightsCount={0,number} 个航程 +flightsCount[one]={0,number} 个航程 +viewQueryDefinition=查看查询定义 +queryDefinitionViewer=查询定义查看器 +groupAverageAscending=分组平均值(递增) +groupAverageDescending=分组平均值(递减) +groupMedianAscending=分组中值(递增) +groupMedianDescending=分组中值(递减) +resultsFoundForSearch=找到 "{1}" 的 {0,number} 个结果 +resultsFoundForSearch[one]=找到 "{1}" 的 {0,number} 个结果 +runPredefinedQuery=运行预定义的查询 +selectPredefinedQuery=选择预定义的查询 +predefinedQueryRunner=预定义的查询执行器 +developerOptions=开发人员选项 +copyToClipboard=复制到剪贴板 +code=代码 +useClassGetName=将 Class.getName() 用于类型名称 +useClassGetNameTooltip=更灵活应对代码库的更改,但是代码片段只能在级别可用的范围内使用。 +useStringLiterals=将字符串文本用于类型名称 +useStringLiteralsTooltip=代码片段可在任意位置使用,当如果基本代码更改,其将中断。 +errorLoadingDataWithTryAgain=加载数据出错。请稍后重试。 +addGalleryPhoto=添加图库照片 +addStageImage=添加阶段图像 +addTeaserImage=添加预告片图像 +addEventLogo=添加活动图标 +noImagesDefinedYet=尚未定义图像 +imageSizeError={0}的图像大小不合适。 宽度应在{1}和{2} px 之间,高度在{3}和{4} px 之间。 +couldNotRetrieveImageSizeYet=无法检索图像的宽度和高度。 +pleaseOnlyUploadContentYouHaveAllUsageRightsFor=请仅上传具有所有使用权的内容。请记住,内容可能会被截断。 +registerCompetitorsOnRace=在比赛轮次注册参赛队(例如区分船队比赛) +doYouWantToRegisterCompetitorsDirectlyOnTheRace=是否直接在比赛轮次注册参赛队? +doYouWantToDisableCompetitorsRegistrationsOnTheRace=是否要禁用参赛队在比赛轮次注册? +warningDirectCompetitorRegistration=警告! 此设置会导致此比赛轮次的参赛队在每个比赛轮次注册。 在相应的比赛中注册参赛队时,将无法自动注册此比赛轮次。 +warningRegattaCompetitorRegistration=警告! 此操作将重新激活参赛队注册比赛。 比赛中的所有参赛队注册将自动用作此比赛轮次的参赛队注册。 +competitorRegistrationsOnRaceDisabled=参赛队注册已针对此比赛轮次禁用。选中左侧的复选框可启用。 +addMarkToRegatta=向比赛添加标志 +selectALeaderboardGroup=选择积分榜分组... +pleaseSelect=请选择 +requiresValidRegatta=此页面需要有效的比赛、比赛轮次列和船队名称,才能识别显示的比赛轮次。 +couldNotObtainRace=无法为名称为{0}的比赛获取船队{2}名称为{1}的比赛轮次: {3} +errorTryingToCreateEmbeddedMap=尝试创建嵌入式地图出错: {0} +topN=前{0} +transparentBufferLineOnHover=鼠标移到辅助线显示透明的缓冲线 +bufferLineStrokeWeight=缓冲线线条粗细 +profile=概要 +showOnlyCompetitorsOfLog=仅显示在日志中注册的参赛队 +confirmLosingCompetitorEditsWhenTogglingLogBasedView=此操作将重置当前未保存的参赛队更改。\n是否确定继续? +removalOfMarkDisabledMayBeUsedInRaces=移除已取消激活,标志在比赛轮次{0}中使用 +createDefaultLeaderboardGroup=是否为活动创建默认积分榜? +pleaseCreateAtLeastOneMappingBy=请至少创建一个映射:先选择左侧的轨道,然后选择右侧的标志或参赛队 +matcherType=匹配程序类型 +matchingDevices=配置的设备 +addDevice=添加设备 +createDeviceConfiguration=创建设备配置 +forWhichDeviceShouldConfigurationApply=指定应应用新配置的设备 +create=创建 +thereIsAlreadyAConfigurationForThisDevice=此设备已有配置。 +enterDeviceIdentifierName=输入标识符名称 +administration=管理 +pleaseSelectALeaderboardGroup=请选择积分榜分组 +linkLeaderboardToLeaderboardGroupOfEvent=将积分榜链接到活动的积分榜分组 +doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=将积分榜{0}链接到活动{1}的积分榜分组 +failedToLinkLeaderboardToLeaderboardGroup=将积分榜{0}链接到积分榜分组{1}失败 +createDefaultRegatta=创建默认的比赛 +doYouWantToCreateADefaultRegatta=是否创建默认的比赛? +defaultLocale=默认值 +defaultSailorsInfoLinkInfoText=如果不存在语言特定的覆盖,则使用默认链接。 如果不存在默认链接,则没有未明确设置的语言的链接。 +qrSync=QR-Sync +thereIsNoIdentifierSet=未设置标识符。 +couldNotObtainAccessTokenForUser=无法获取用户{0}的访问令牌 +raceManagerDeviceName=设备名称 +serverURLInvalid=请输入有效的服务器 URL +serverURLEmpty=服务器 URL 为空 +marks=标志 +addNewFix=新增修复 +pleaseSelectOtherTimepoint=请选择其他时间点。时间滑块中的此时间点已有修复。 +confirmMove=确认移动 +confirmNewFix=确认新修复 +selectAFixPositionBy=通过拖动地图选择修复位置。然后利用下方的按钮确认或取消。 +pleaseSelectAMark=请从左侧的清单中选择一个标志。 +markFixes=标志修复 +distanceFromAveragePosition=与平均位置的距离 +useATouchOptimizedUI=使用触摸优化的 UI 移动修复 +deleteFix=删除修复 +theDeletionOfThisFix=目前无法删除此修复。 +loadingMarkFixes=正在加载标志修复... +fixSuccessfullyAdded=已成功添加修复。 +fixPositionSuccessfullyEdited=已成功编辑修复位置。 +fixSuccessfullyRemoved=已成功移除修复。 +dragToChangePosition=拖动更改位置\n右键点击获取菜单以删除 +moveFix=移动修复 diff --git a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties.xlf b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties.xlf index 81c6e0cbbc2..b9582503229 100644 --- a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties.xlf +++ b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties.xlf @@ -1,12 +1,12 @@ - +
- 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 - +
@@ -2739,7 +2739,7 @@ Do you really want to remove competitor {0}? - Filter competitors by name, boat class or sail number + Filter competitors by name, boat class, sail number or ID Edit Competitor @@ -2825,6 +2825,9 @@ Activate individual recall + + Activate result entry + RRS26 start @@ -2840,6 +2843,9 @@ When activated the Race Officer is able to call for individual recall. + + When activated the Race Officer is able to enter results during and after the finishing phase. + Startmode flags @@ -3561,6 +3567,9 @@ Edit Mark Passings + + Edit Mark Positions + Remove fixed mark passing @@ -4401,6 +4410,90 @@ Device Name + + Please enter a valid Server URL + + + Server URL empty + + + Marks + + + Add new fix + + + Please select another timepoint. There already is a fix at the timepoint of the timeslider. + + + Confirm move + + + Confirm new fix + + + Select a fix position by dragging the map. Then confirm or cancel with the buttons below. + + + Please select a mark from the list on the left. + + + Mark fixes + + + utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions + + + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + + + https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app + + + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + + + https://play.google.com/intl/en/badges/images/generic/en-play-badge.png + + + http://appstore.com/sapsailinsight + + + http://appstore.com/stgtrainingstagebuch + + + _en + + + Distance from average position + + + Use a touch optimized UI to move the fix + + + Delete fix + + + The deletion of this fix is currently not possible. + + + Loading mark fixes... + + + Fix successfully added. + + + Fix position successfully edited. + + + Fix successfully removed. + + + Drag to change position\nRight-click to get menu to delete + + + Move fix +
\ No newline at end of file diff --git a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_en.properties.xlf b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_en.properties.xlf new file mode 100644 index 00000000000..18ed7fbe0f5 --- /dev/null +++ b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_en.properties.xlf @@ -0,0 +1,5992 @@ + + + +
+ + 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 + + + + + +
+ + + Manage2Sail + Manage2Sail + + + Race Manager App + Race Manager App + + + TracTrac Events + TracTrac Events + + + SwissTiming Events + SwissTiming Events + + + History of tracked events + History of tracked events + + + General + General + + + List Races + List Races + + + List Regattas + List Regattas + + + Wind + Wind + + + Maneuver + Maneuver + + + This is the Wind Panel which so far is completely empty. + This is the Wind Panel which so far is completely empty. + + + Refresh + Refresh + + + Remove + Remove + + + Wind Source + Wind Source + + + Dampening Interval + Dampening Interval + + + Map + Map + + + Race + Race + + + Races + Races + + + tracked + tracked + + + Linked Races + Linked Races + + + Time + Time + + + Time the competitor sailed on this leg. For the first leg this is counted from when the competitor passed the start line. + Time the competitor sailed on this leg. For the first leg this is counted from when the competitor passed the start line. + + + Play speed + Play speed + + + Use "1" for regular play-back speed, "2" for double-speed playback and so on + Use "1" for regular play-back speed, "2" for double-speed playback and so on + + + Live + Live + + + Replay Mode + Replay Mode + + + Delay + Delay + + + 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 + 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 + + + Speed (kn) + Speed (kn) + + + From (deg) + From (deg) + + + There are no races yet. + There are no races yet. + + + Σ + Σ + + + Accumulated + Accumulated + + + Competitor + Competitor + + + Competitors + Competitors + + + {0}/{1} competitors selected. + {0}/{1} competitors selected. + + + No such leaderboard + No such leaderboard + + + Leaderboard Configuration + Leaderboard Configuration + + + New... + New... + + + Edit Points... + Edit Points... + + + Race Names in Selected Leaderboard + Race Names in Selected Leaderboard + + + Add... + Add... + + + Rename... + Rename... + + + Tracked Race Connected to Selected Race Name + Tracked Race Connected to Selected Race Name + + + Link to Column + Link to Column + + + Unlink + Unlink + + + Leaderboard Name + Leaderboard Name + + + Cancel + Cancel + + + Please enter a name + Please enter a name + + + Please enter a boat class + Please enter a boat class + + + Discard one more race starting with how many started races + Discard one more race starting with how many started races + + + Leaderboard with this name already exists + Leaderboard with this name already exists + + + Discard thresholds must be numeric + Discard thresholds must be numeric + + + Discard thresholds must be ascending + Discard thresholds must be ascending + + + Discarding + Discarding + + + Starting from how many races + Starting from how many races + + + Rename Leaderboard + Rename Leaderboard + + + Add Column to Leaderboard + Add Column to Leaderboard + + + Please enter a name for new race column + Please enter a name for new race column + + + OK + OK + + + Medal Race + Medal Race + + + Rename Race + Rename Race + + + Open Selected Leaderboard + Open Selected Leaderboard + + + Rank + Rank + + + Competitor''s rank in the race + Competitor''s rank in the race + + + Regatta Rank + Regatta Rank + + + Competitor''s rank in the regatta + Competitor''s rank in the regatta + + + Overall Rank + Overall Rank + + + Competitor''s rank in the series + Competitor''s rank in the series + + + Regatta Rank + Regatta Rank + + + - + - + + + + + + + + + L + L + + + Distance + Distance + + + ∅ Speed + ∅ Speed + + + The average speed over ground during this leg,\ncalculated with the division of the distance traveled by the time needed. + The average speed over ground during this leg,\ncalculated with the division of the distance traveled by the time needed. + + + The average speed over ground during this race,\ncalculated with the division of the distance traveled by the time needed. + The average speed over ground during this race,\ncalculated with the division of the distance traveled by the time needed. + + + Rank Gain + Rank Gain + + + The difference of the position from the current and the previous leg. + The difference of the position from the current and the previous leg. + + + Sailing Analytics + Sailing Analytics + + + Leaderboard + Leaderboard + + + Leaderboards + Leaderboards + + + Leaderboard Settings + Leaderboard Settings + + + Settings + Settings + + + Select at least one leg detail + Select at least one leg detail + + + SOG + SOG + + + The current speed over ground. + The current speed over ground. + + + ETA + ETA + + + The estimated time that the competitor needs to reach the next waypoint, based on the competitor''s current velocity made good, considering the true wind direction. + The estimated time that the competitor needs to reach the next waypoint, based on the competitor''s current velocity made good, considering the true wind direction. + + + Gap to leader + Gap to leader + + + Estimates the (calculated) arrival time at the current position of the boat that is farthest ahead,\nbased on average VMG for the current leg and with performance equal to that of the race leader for subsequent legs.\nThe gap tells how much earlier the competitor would have had to be where she currently is\nin order to rank equal to the race leader at the projected arrival at the current position of the boat farthest ahead. + Estimates the (calculated) arrival time at the current position of the boat that is farthest ahead,\nbased on average VMG for the current leg and with performance equal to that of the race leader for subsequent legs.\nThe gap tells how much earlier the competitor would have had to be where she currently is\nin order to rank equal to the race leader at the projected arrival at the current position of the boat farthest ahead. + + + VMG + VMG + + + The velocity made good, which is the windward/leeward speed for upwind/downwind legs, respectively, or the along-track speed for reaching legs. + The velocity made good, which is the windward/leeward speed for upwind/downwind legs, respectively, or the along-track speed for reaching legs. + + + Windward distance to go + Windward distance to go + + + Windward/leeward distance from the competitor''s current position to the end of the leg for upwind/downwind legs, respectively, or the along-track distance for reaching legs. + Windward/leeward distance from the competitor''s current position to the end of the leg for upwind/downwind legs, respectively, or the along-track distance for reaching legs. + + + Gap + Gap + + + Windward/leeward distance of the competitor to the competitor farthest ahead in the race for upwind/downwind legs, respectively, or the along-track distance for reaching legs.\nNote that the competitor that is farthest ahead is not necessarily leading the race if handicap ranking is in place. + Windward/leeward distance of the competitor to the competitor farthest ahead in the race for upwind/downwind legs, respectively, or the along-track distance for reaching legs.\nNote that the competitor that is farthest ahead is not necessarily leading the race if handicap ranking is in place. + + + Name + Name + + + Leave empty for default + Leave empty for default + + + Track New event + Track New event + + + Trackable Races + Trackable Races + + + Track Wind + Track Wind + + + Regatta name + Regatta name + + + Event name + Event name + + + Event + Event + + + Start time + Start time + + + Start of tracking + Start of tracking + + + End of tracking + End of tracking + + + Regatta + Regatta + + + Regattas + Regattas + + + Start tracking + Start tracking + + + Stop tracking + Stop tracking + + + Connections + Connections + + + History of connections + History of connections + + + Define a new connection + Define a new connection + + + Tracked races + Tracked races + + + Can send requests + Can send requests + + + Connect and read races + Connect and read races + + + Ports + Ports + + + Live data + Live data + + + Stored data + Stored data + + + URIs + URIs + + + JSON URL + JSON URL + + + Port Live Data + Port Live Data + + + Port Stored Data + Port Stored Data + + + Live URI + Live URI + + + Stored URI + Stored URI + + + Events Currently Tracked + Events Currently Tracked + + + Hostname + Hostname + + + Correct Wind Bearing by Declination + Correct Wind Bearing by Declination + + + Tracking Started + Tracking Started + + + Pause automatic refresh + Pause automatic refresh + + + Refresh automatically + Refresh automatically + + + Delay (s) + Delay (s) + + + Delay between auto-updates in seconds: + Delay between auto-updates in seconds: + + + The delay must be greater than zero + The delay must be greater than zero + + + Choose update interval of at least one second + Choose update interval of at least one second + + + Error setting wind for race + Error setting wind for race + + + Error fetching wind information for race + Error fetching wind information for race + + + Error while trying to set "wind starts upwind" flag + Error while trying to set "wind starts upwind" flag + + + in event + in event + + + to + to + + + to + to + + + Show estimated wind + Show estimated wind + + + Timing + Timing + + + Race Details + Race Details + + + Overall Details + Overall Details + + + Leg Details + Leg Details + + + Up + Up + + + Down + Down + + + Port + Port + + + Race Started + Race Started + + + Show only selected competitors + Show only selected competitors + + + Show info box for selected competitors + Show info box for selected competitors + + + Tail length (s) + Tail length (s) + + + Which races would you like to display? + Which races would you like to display? + + + Length (s) + Length (s) + + + Stress Test + Stress Test + + + Maneuvers + Maneuvers + + + The number of the maneuvers sailed in this leg. + The number of the maneuvers sailed in this leg. + + + The number of maneuvers sailed in this race. + The number of maneuvers sailed in this race. + + + Tacks + Tacks + + + Jibes + Jibes + + + Penalty Circles + Penalty Circles + + + Medalrace value not allowed + Medalrace value not allowed + + + Configuration + Configuration + + + Maneuvers + Maneuvers + + + Choose chart + Choose chart + + + Distance Traveled + Distance Traveled + + + The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished. + The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished. + + + The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. + The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. + + + Velocity Made Good + Velocity Made Good + + + Speed Over Ground + Speed Over Ground + + + Gap To Leader + Gap To Leader + + + Points to load + Points to load + + + Speed + Speed + + + Distance + Distance + + + in + in + + + s + s + + + s/NM + s/NM + + + m + m + + + ° + ° + + + Close + Close + + + Compare competitors + Compare competitors + + + Description + Description + + + Sail number + Sail number + + + Country + Country + + + Unable to find the IOC 3-letter-codes. + Unable to find the IOC 3-letter-codes. + + + Add + Add + + + Delete + Delete + + + Show charts + Show charts + + + A race with that name already exists. + A race with that name already exists. + + + A race with that name already exists in this regatta. + A race with that name already exists in this regatta. + + + Head up + Head up + + + Bear away + Bear away + + + Tack + Tack + + + The amount of tacks sailed in this race. + The amount of tacks sailed in this race. + + + Jibe + Jibe + + + The amount of jibes sailed in this race. + The amount of jibes sailed in this race. + + + Penalty circle + Penalty circle + + + The amount of penalty circles sailed in this race. + The amount of penalty circles sailed in this race. + + + Mark passing + Mark passing + + + Mark + Mark + + + Unknown maneuver + Unknown maneuver + + + Douglas peucker points + Douglas peucker points + + + Filter races by name + Filter races by name + + + Filter media by name + Filter media by name + + + Track settings + Track settings + + + Edit + Edit + + + Edit competitors + Edit competitors + + + Edit scores + Edit scores + + + Open in Browser + Open in Browser + + + Remove + Remove + + + Edit Series + Edit Series + + + Edit or rename race + Edit or rename race + + + Unlink race + Unlink race + + + Remove race + Remove race + + + Export as XML + Export as XML + + + Open Coach Dashboard + Open Coach Dashboard + + + Filter leaderboards by name + Filter leaderboards by name + + + Actions + Actions + + + Is linked + Is linked + + + Yes + Yes + + + No + No + + + Hover over a point for details + Hover over a point for details + + + No selection + No selection + + + Race starts with upwind leg + Race starts with upwind leg + + + Events + Events + + + Settings for {0} + Settings for {0} + + + No events were found + No events were found + + + No event selected + No event selected + + + No leaderboards were found + No leaderboards were found + + + Search for events + Search for events + + + Location + Location + + + From + From + + + Until + Until + + + Only live events + Only live events + + + Location not available + Location not available + + + Start date not available + Start date not available + + + Start date + Start date + + + End date + End date + + + Unknown maneuver + Unknown maneuver + + + the tail length must be a number greater than zero. + the tail length must be a number greater than zero. + + + Failed to load race information: {0} + Failed to load race information: {0} + + + {0} passed {1} at {2} + {0} passed {1} at {2} + + + {0} at {1}: {2} + {0} at {1}: {2} + + + Do you really want to remove the race ''{0}''? Note: all race logs for this race will also permanently be removed! + Do you really want to remove the race ''{0}''? Note: all race logs for this race will also permanently be removed! + + + Show details + Show details + + + Hide leaderboard + Hide leaderboard + + + Hide leaderboards + Hide leaderboards + + + Show leaderboard + Show leaderboard + + + Hide races + Hide races + + + Show map + Show map + + + Hide map + Hide map + + + No leaderboard selected + No leaderboard selected + + + Leaderboard groups + Leaderboard groups + + + Filter leaderboard groups by name + Filter leaderboard groups by name + + + Create leaderboard group + Create leaderboard group + + + Leaderboard Group Configuration + Leaderboard Group Configuration + + + Legs + Legs + + + On Leg + On Leg + + + The number of the leg on which the competitor currently is, starting with 1 + The number of the leg on which the competitor currently is, starting with 1 + + + Leaderboard Group + Leaderboard Group + + + Please enter a non-empty description + Please enter a non-empty description + + + A leaderboard group with this name already exists. + A leaderboard group with this name already exists. + + + Details of leaderboard group + Details of leaderboard group + + + Edit + Edit + + + Save + Save + + + Abort + Abort + + + No leaderboard group with the name {0} found + No leaderboard group with the name {0} found + + + Overview + Overview + + + Welcome to SAP Sailing Analytics + Welcome to SAP Sailing Analytics + + + SAP brings sailing fans closer to the on-water action than ever before.\ The live-leaderboard enhances the fan experience through real-time rankings, boat speeds and winning margins. Follow every race and never miss a passing maneuver with SAP.\ This is the simple way to watch live sail racing from wherever you are. + SAP brings sailing fans closer to the on-water action than ever before.\ The live-leaderboard enhances the fan experience through real-time rankings, boat speeds and winning margins. Follow every race and never miss a passing maneuver with SAP.\ This is the simple way to watch live sail racing from wherever you are. + + + Home + Home + + + Click and drag in the plot area to zoom in + Click and drag in the plot area to zoom in + + + Wind speed (kts) + Wind speed (kts) + + + All times in UTC + All times in UTC + + + Auto zoom to + Auto zoom to + + + Boats + Boats + + + Buoys + Buoys + + + Wind sensors + Wind sensors + + + Off + Off + + + Tails + Tails + + + Zoom only to selected competitors + Zoom only to selected competitors + + + Bearing + Bearing + + + Zoom + Zoom + + + Step size must be greater than 0 + Step size must be greater than 0 + + + Step size in seconds + Step size in seconds + + + Refresh interval (s) + Refresh interval (s) + + + Refresh interval must be greater than {0} seconds + Refresh interval must be greater than {0} seconds + + + Competitor Chart + Competitor Chart + + + To show the competitor charts, select at least one competitor + To show the competitor charts, select at least one competitor + + + To send invitation E-Mails, select at least one competitor + To send invitation E-Mails, select at least one competitor + + + Direction change + Direction change + + + Speed change + Speed change + + + deg + deg + + + Untracked + Untracked + + + Delay for live mode: + Delay for live mode: + + + Not available + Not available + + + Details + Details + + + No group selected + No group selected + + + Combined + Combined + + + Course Layout + Course Layout + + + Estimation + Estimation + + + Measured + Measured + + + Manual + Manual + + + Race Committee + Race Committee + + + Click on the chart to set the time + Click on the chart to set the time + + + Position + Position + + + Wind Sources Used + Wind Sources Used + + + Error trying to update wind sources to exclude for race {0}: {1} + Error trying to update wind sources to exclude for race {0}: {1} + + + Feedback + Feedback + + + Start/Stop playing + Start/Stop playing + + + Jump back to live time point + Jump back to live time point + + + Slow play speed down or even run backwards + Slow play speed down or even run backwards + + + Speed play speed up or run forward again + Speed play speed up or run forward again + + + Show/Hide {0} + Show/Hide {0} + + + Angle to wind + Angle to wind + + + Races in leaderboard + Races in leaderboard + + + Leaderboards in group + Leaderboards in group + + + Replication + Replication + + + Error fetching replica data: {0} + Error fetching replica data: {0} + + + ∅ XTE + ∅ XTE + + + The average cross track error to the great circle segment connecting leg start with leg end + The average cross track error to the great circle segment connecting leg start with leg end + + + ∅ XTE +/- + ∅ XTE +/- + + + The average position on the course as a signed distance from the course middle line; 0 meaning on the course middle line; negative values mean left-hand side, positive values mean right-hand side. + The average position on the course as a signed distance from the course middle line; 0 meaning on the course middle line; negative values mean left-hand side, positive values mean right-hand side. + + + The average absolute cross track error to the great circle segments connecting leg start with leg end for all upwind legs of this race, ignoring to which side of the course middle line the competitor is + The average absolute cross track error to the great circle segments connecting leg start with leg end for all upwind legs of this race, ignoring to which side of the course middle line the competitor is + + + The signed average cross track error to the great circle segments connecting leg start with leg end for all upwind legs of this race; negative values mean left of the course middle line, positive values mean right. + The signed average cross track error to the great circle segments connecting leg start with leg end for all upwind legs of this race; negative values mean left of the course middle line, positive values mean right. + + + Hostname of Master Instance + Hostname of Master Instance + + + Error starting replication from host {0} / exchange {1}: {2} + Error starting replication from host {0} / exchange {1}: {2} + + + Help lines + Help lines + + + Start line + Start line + + + Finish line + Finish line + + + Advantage line + Advantage line + + + Course middle line + Course middle line + + + Messaging port number (0 for default) + Messaging port number (0 for default) + + + Servlet port number + Servlet port number + + + Registered at {0} + Registered at {0} + + + Replicating from master {0}:{2}, messaging port {3}:{1}, exchange {4} + Replicating from master {0}:{2}, messaging port {3}:{1}, exchange {4} + + + Show wind speed data + Show wind speed data + + + Show wind directions data + Show wind directions data + + + Fleet + Fleet + + + Boat Class + Boat Class + + + Set delay to live + Set delay to live + + + Please enter a venue. + Please enter a venue. + + + Please enter a start date and an end date. + Please enter a start date and an end date. + + + The start date must be before the end date. + The start date must be before the end date. + + + An event with this name already exists. + An event with this name already exists. + + + Venue + Venue + + + Please select a boat class. + Please select a boat class. + + + A regatta with this name already exists. + A regatta with this name already exists. + + + A series with this name already exists. + A series with this name already exists. + + + A fleet with this name already exists. + A fleet with this name already exists. + + + Fleets + Fleets + + + Series + Series + + + Split fleet + Split fleet + + + Color + Color + + + Medal Series + Medal Series + + + No color + No color + + + Please select a regatta. + Please select a regatta. + + + Add fleet + Add fleet + + + Do you really want to remove the regatta "{0}"? This will also remove all leaderboards for this regatta! + Do you really want to remove the regatta "{0}"? This will also remove all leaderboards for this regatta! + + + Error loading score correction providers: {0} + Error loading score correction providers: {0} + + + Select result list to import from + Select result list to import from + + + of + of + + + Error obtaining score corrections from provider {0} and event {1} for boat class {2} published on {3}: {4} + Error obtaining score corrections from provider {0} and event {1} for boat class {2} published on {3}: {4} + + + Assign race numbers of official results to leaderboard race columns + Assign race numbers of official results to leaderboard race columns + + + Import official results... + Import official results... + + + Select all + Select all + + + Apply + Apply + + + Successfully updated scores + Successfully updated scores + + + Error updating scores for leaderboard {0}: {1} + Error updating scores for leaderboard {0}: {1} + + + Maneuver types to show when competitor is clicked + Maneuver types to show when competitor is clicked + + + Simulate as live race + Simulate as live race + + + Offset before start in minutes: + Offset before start in minutes: + + + The selected races contain boat classes which are not the same as the boat class ''{0}'' of the selected regatta. No races will be loaded. + The selected races contain boat classes which are not the same as the boat class ''{0}'' of the selected regatta. No races will be loaded. + + + There is at least one regatta for the selected boat classes. Really create default regatta(s) for those race(s)? + There is at least one regatta for the selected boat classes. Really create default regatta(s) for those race(s)? + + + Reload + Reload + + + Add Regatta... + Add Regatta... + + + Import Regattas... + Import Regattas... + + + Exchange Name + Exchange Name + + + Course + Course + + + Course layout + Course layout + + + Buoy + Buoy + + + Gate + Gate + + + Buoys + Buoys + + + Waypoint + Waypoint + + + Show all competitors + Show all competitors + + + Boat tails + Boat tails + + + Start line to first Mark Triangle + Start line to first Mark Triangle + + + Result import URLs + Result import URLs + + + Error refreshing result import URL list: {0} + Error refreshing result import URL list: {0} + + + Successfully updated result import URL list + Successfully updated result import URL list + + + Error removing result import URLs: {0} + Error removing result import URLs: {0} + + + Please enter a URL. + Please enter a URL. + + + Add result import URL + Add result import URL + + + Error adding result import URL: {0} + Error adding result import URL: {0} + + + Remote Server Instances + Remote Server Instances + + + Local Server + Local Server + + + Error refreshing SailingServer instances: {0} + Error refreshing SailingServer instances: {0} + + + Successfully updated SailingServer instances + Successfully updated SailingServer instances + + + Error removing SailingServer instances: {0} + Error removing SailingServer instances: {0} + + + Add SailingServer instance + Add SailingServer instance + + + Error adding SailingServer instance: {0} + Error adding SailingServer instance: {0} + + + Error trying to obtain leaderboard contents: {0} + Error trying to obtain leaderboard contents: {0} + + + Last Score Update + Last Score Update + + + This website is not optimized for your browser. Please switch to a newer one like Firefox or Chrome. + This website is not optimized for your browser. Please switch to a newer one like Firefox or Chrome. + + + New Mark + New Mark + + + Mark/Gate + Mark/Gate + + + Error updating race course: {0} + Error updating race course: {0} + + + Successfully updated race course + Successfully updated race course + + + Select two marks to create a gate + Select two marks to create a gate + + + Error trying to obtain the marks of the race course: {0} + Error trying to obtain the marks of the race course: {0} + + + Error trying to obtain the race course: {0} + Error trying to obtain the race course: {0} + + + Insert waypoint before selected + Insert waypoint before selected + + + Insert waypoint after selected + Insert waypoint after selected + + + Add Gate + Add Gate + + + Low Point System + Low Point System + + + High Point System + High Point System + + + High Point System ESS Overall (10) + High Point System ESS Overall (10) + + + High Point System ESS Overall (12) + High Point System ESS Overall (12) + + + Score in points. Winner of an act scores 12 points, 2nd - 11 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. + Score in points. Winner of an act scores 12 points, 2nd - 11 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. + + + High Point System, Last Race Breaks Tie + High Point System, Last Race Breaks Tie + + + Low Point System, Winner Gets Zero + Low Point System, Winner Gets Zero + + + High Point System, Winner Gets 5 Points + High Point System, Winner Gets 5 Points + + + High Point System, Winner Gets 6 Points + High Point System, Winner Gets 6 Points + + + High Point System, Winner Gets 8 Points + High Point System, Winner Gets 8 Points + + + High Point System, Winner 8 Points, Interpolated + High Point System, Winner 8 Points, Interpolated + + + Low Point with Eliminations and Rounds, Winner Gets 0.7 Points + Low Point with Eliminations and Rounds, Winner Gets 0.7 Points + + + A variant of the low-point scoring scheme, using eliminations consisting of rounds.\nEach round shall be modeled as a series in the regatta, and the fleet ordering counts backwards\nstarting with the highest number for the first round.\nIf a final and losers final take place, use 1 and 2 as their ordering. Start with 3 for the semi-final round. + A variant of the low-point scoring scheme, using eliminations consisting of rounds.\nEach round shall be modeled as a series in the regatta, and the fleet ordering counts backwards\nstarting with the highest number for the first round.\nIf a final and losers final take place, use 1 and 2 as their ordering. Start with 3 for the semi-final round. + + + Low Point, ties broken by act point sum, then last act + Low Point, ties broken by act point sum, then last act + + + Instead of the usual count-back system used for low point schemes to break ties, competitors with equal point sums are compared by comparing the sum of the points they scored across all acts. If this still leaves a tie, the tie is broken by the last act. + Instead of the usual count-back system used for low point schemes to break ties, competitors with equal point sums are compared by comparing the sum of the points they scored across all acts. If this still leaves a tie, the tie is broken by the last act. + + + High Point, winner gets 1 point + High Point, winner gets 1 point + + + High Point, winner gets 10 points + High Point, winner gets 10 points + + + High Point, winner gets 10 points (or 8) + High Point, winner gets 10 points (or 8) + + + Score in points. Winner scores 10 points, 2nd - 9 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. + Score in points. Winner scores 10 points, 2nd - 9 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. + + + High Point, winner gets 12 points (or 8) + High Point, winner gets 12 points (or 8) + + + Score in points. Winner scores 12 points, 2nd - 11 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. + Score in points. Winner scores 12 points, 2nd - 11 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. + + + Scoring system + Scoring system + + + Create flexible leaderboard + Create flexible leaderboard + + + Create regatta leaderboard + Create regatta leaderboard + + + Create default regatta leaderboard + Create default regatta leaderboard + + + Edit flexible leaderboard + Edit flexible leaderboard + + + Edit regatta leaderboard + Edit regatta leaderboard + + + Default regatta + Default regatta + + + Use Overall leaderboard + Use Overall leaderboard + + + Overall Standings + Overall Standings + + + Type + Type + + + Add races + Add races + + + races with name prefix + races with name prefix + + + Max SOG + Max SOG + + + The competitor''s greatest speed over ground measured in the regatta. + The competitor''s greatest speed over ground measured in the regatta. + + + Total time downwind + Total time downwind + + + The total time the competitor sailed downwind in the regatta. + The total time the competitor sailed downwind in the regatta. + + + Total time upwind + Total time upwind + + + The total time the competitor sailed upwind in the regatta. + The total time the competitor sailed upwind in the regatta. + + + Total time reaching + Total time reaching + + + The total time the competitor sailed on reaching legs in the regatta. + The total time the competitor sailed on reaching legs in the regatta. + + + Total time + Total time + + + The total time the competitor sailed in the regatta, counted from race start time. + The total time the competitor sailed in the regatta, counted from race start time. + + + Total distance + Total distance + + + The total distance sailed in the regatta. + The total distance sailed in the regatta. + + + ∅ SOG + ∅ SOG + + + Average speed over ground across the regatta. + Average speed over ground across the regatta. + + + hh:mm:ss + hh:mm:ss + + + Add wind data + Add wind data + + + The value of ''{0}'' must be between {1} and {2}. + The value of ''{0}'' must be between {1} and {2}. + + + The value of ''{0}'' must be greater than {1}. + The value of ''{0}'' must be greater than {1}. + + + optional + optional + + + Please enter a value. + Please enter a value. + + + Latitude + Latitude + + + Longitude + Longitude + + + Add Event + Add Event + + + Publication URL + Publication URL + + + Suppress + Suppress + + + Is public + Is public + + + Unsuppress + Unsuppress + + + Suppressed Competitors + Suppressed Competitors + + + Audio & Video + Audio & Video + + + URL + URL + + + MIME Type + MIME Type + + + Title + Title + + + Duration (h:mm:ss.ms) + Duration (h:mm:ss.ms) + + + Add Audio/Video + Add Audio/Video + + + Add Youtube + Add Youtube + + + Youtube Id + Youtube Id + + + Do you really want to remove media track ''{0}''? + Do you really want to remove media track ''{0}''? + + + Please select a series + Please select a series + + + Please select a race + Please select a race + + + Display groups in reverse order + Display groups in reverse order + + + Configure URL + Configure URL + + + Configure a leaderboard and obtain the resulting URL from the link + Configure a leaderboard and obtain the resulting URL from the link + + + Embedded + Embedded + + + Additional URL Settings + Additional URL Settings + + + Restrict to single selected race + Restrict to single selected race + + + Expand selected race + Expand selected race + + + Allow for race details + Allow for race details + + + Number of races + Number of races + + + Please enter the number of last races to be displayed + Please enter the number of last races to be displayed + + + Choose the way you select races + Choose the way you select races + + + Select from all races + Select from all races + + + Select a number of races + Select a number of races + + + Number of most current races to show + Number of most current races to show + + + Always expand last race shown + Always expand last race shown + + + Factor + Factor + + + Error updating the medal race setting: {0} + Error updating the medal race setting: {0} + + + Maneuver loss + Maneuver loss + + + ∅ Maneuver Loss + ∅ Maneuver Loss + + + The average distance loss during any mneuver. + The average distance loss during any mneuver. + + + ∅ Tack Loss + ∅ Tack Loss + + + The average distance loss during tacks. + The average distance loss during tacks. + + + ∅ Jibe Loss + ∅ Jibe Loss + + + The average distance loss during jibes. + The average distance loss during jibes. + + + Shape + Shape + + + Pattern + Pattern + + + Legend + Legend + + + live + live + + + SwissTiming Archived Events + SwissTiming Archived Events + + + Error fetching chart data: {0} + Error fetching chart data: {0} + + + Loading competitor data... + Loading competitor data... + + + {0} after race {1} + {0} after race {1} + + + Ranking + Ranking + + + Total points + Total points + + + Competitor''s total points in the race + Competitor''s total points in the race + + + Competitor''s total points in the regatta + Competitor''s total points in the regatta + + + Show rank chart + Show rank chart + + + Overall Leaderboard + Overall Leaderboard + + + Error trying to obtain overall leaderboards: {0} + Error trying to obtain overall leaderboards: {0} + + + finished + finished + + + upcoming + upcoming + + + Next + Next + + + in progress + in progress + + + passed to {0} + passed to {0} + + + Gap Change + Gap Change + + + The change of the gap to the leader since the last leg start.\nA negative number means that the gap was decreased;\na positive number means that it was increased. + The change of the gap to the leader since the last leg start.\nA negative number means that the gap was decreased;\na positive number means that it was increased. + + + Mark rounded to + Mark rounded to + + + Side to which the mark at leg start was rounded. + Side to which the mark at leg start was rounded. + + + Race {0} is live + Race {0} is live + + + Races {0} are live + Races {0} are live + + + Regatta {0} is live + Regatta {0} is live + + + Regattas {0} are live + Regattas {0} are live + + + kts + kts + + + {0,number,#0.0} kts + {0,number,#0.0} kts + + + {0,number,#0.0} - {1,number,#0.0} kts + {0,number,#0.0} - {1,number,#0.0} kts + + + Generate Polar Sheet + Generate Polar Sheet + + + Polar Diagrams + Polar Diagrams + + + Polar Sheet + Polar Sheet + + + Minimum datapoints per graph + Minimum datapoints per graph + + + All graphs with less underlying datapoints are not shown visually.\nThis way there are no distracting diagrams shown for\nwindspeeds lacking a sufficient amount of data. + All graphs with less underlying datapoints are not shown visually.\nThis way there are no distracting diagrams shown for\nwindspeeds lacking a sufficient amount of data. + + + Minimum datapoints per angle + Minimum datapoints per angle + + + In each graph only data about angles with at least the given amount\nof underlying datapoints will be shown. Insignificant\nparts of the diagram can be hidden using this threshold. + In each graph only data about angles with at least the given amount\nof underlying datapoints will be shown. Insignificant\nparts of the diagram can be hidden using this threshold. + + + Minimum wind confidence value + Minimum wind confidence value + + + Only fixes with wind having a confidence over the given threshold are\nused. This confidence is between 0 and 1. + Only fixes with wind having a confidence over the given threshold are\nused. This confidence is between 0 and 1. + + + Minimum confidence measure + Minimum confidence measure + + + The minimum confidence measure for a point shown in the graph.\nIf it''s below the given threshold, the point won''t show.\nThe measure is between 0 and 1 and determined\nusing statistical measures. + The minimum confidence measure for a point shown in the graph.\nIf it''s below the given threshold, the point won''t show.\nThe measure is between 0 and 1 and determined\nusing statistical measures. + + + Use only wind gauge data for wind speed + Use only wind gauge data for wind speed + + + By taking only the speed data of wind gauges into account\nwe exclude guessed manually entered wind speeds, which can falsify the polar diagram. + By taking only the speed data of wind gauges into account\nwe exclude guessed manually entered wind speeds, which can falsify the polar diagram. + + + Use only estimation for wind direction + Use only estimation for wind direction + + + By using the accurate wind estimation for the wind direction,\nwe fix polar diagrams that are rotated due to invalid wind\ngauge data. + By using the accurate wind estimation for the wind direction,\nwe fix polar diagrams that are rotated due to invalid wind\ngauge data. + + + Remove outliers (Distance based approach) + Remove outliers (Distance based approach) + + + Outliers are removed by a distance based approach.\nThe parameters can be adjusted below. + Outliers are removed by a distance based approach.\nThe parameters can be adjusted below. + + + Outlier detection neighborhood radius + Outlier detection neighborhood radius + + + The radius used in the distance based outlier\ndetection algorithm. + The radius used in the distance based outlier\ndetection algorithm. + + + Minimum outlier detection neighborhood percentage + Minimum outlier detection neighborhood percentage + + + The percentage of neightborhood datapoints / overall datapoints\nneeds to be at less than the given value for the point to be considered an outlier. + The percentage of neightborhood datapoints / overall datapoints\nneeds to be at less than the given value for the point to be considered an outlier. + + + Number of histogram columns per wind range + Number of histogram columns per wind range + + + Wind stepping in knots + Wind stepping in knots + + + Max. distance to wind level + Max. distance to wind level + + + Sets a max radius for which fixes will be assigned to the wind levels. + Sets a max radius for which fixes will be assigned to the wind levels. + + + Split Windsources + Split Windsources + + + Splitting Windsources allows a better search for bad wind gauges.\nThe statistical correctness cannot be guaranteed. The same fix can\ncount into the resulting polar sheet multiple times (for different wind gauges). + Splitting Windsources allows a better search for bad wind gauges.\nThe statistical correctness cannot be guaranteed. The same fix can\ncount into the resulting polar sheet multiple times (for different wind gauges). + + + Apply minimum wind confidence + Apply minimum wind confidence + + + If checked the value in the box above will be used as the minimum valid wind confidence during generation. + If checked the value in the box above will be used as the minimum valid wind confidence during generation. + + + Distribution in the wind range. + Distribution in the wind range. + + + Please hover over the options to view tooltips where available. + Please hover over the options to view tooltips where available. + + + Names of the members of this competitor. + Names of the members of this competitor. + + + Shows the flag of the country and the sail number of the competitor. + Shows the flag of the country and the sail number of the competitor. + + + The overall rank of this competitor in the regatta. + The overall rank of this competitor in the regatta. + + + Points carried over from previous races. + Points carried over from previous races. + + + The total of all points of a competitor in the regatta.\nSorting based on rank, not points. + The total of all points of a competitor in the regatta.\nSorting based on rank, not points. + + + Wind data + Wind data + + + GPS data + GPS data + + + Status + Status + + + No data found + No data found + + + Display name + Display name + + + Histogram + Histogram + + + Number of data points + Number of data points + + + Angle: {0}; Total number of data-points: {1}; Coefficiant of Variation: {2}; Confidence Measure: {3} + Angle: {0}; Total number of data-points: {1}; Coefficiant of Variation: {2}; Confidence Measure: {3} + + + Buoy zone + Buoy zone + + + Radius (m) + Radius (m) + + + Filter regattas by name + Filter regattas by name + + + There are no regattas yet. + There are no regattas yet. + + + Add course area + Add course area + + + Course areas + Course areas + + + Course area + Course area + + + Please enter a course area. + Please enter a course area. + + + Please select a course area. + Please select a course area. + + + Upper flag + Upper flag + + + Lower flag + Lower flag + + + This is a regatta leaderboard. You can only add races to this leaderboard directly in the regatta definition. + This is a regatta leaderboard. You can only add races to this leaderboard directly in the regatta definition. + + + Correct Score + Correct Score + + + Correct score for competitor {0} in race {1} + Correct score for competitor {0} in race {1} + + + Penalty/Redress + Penalty/Redress + + + Net points + Net points + + + Time point must be after start of tracking. + Time point must be after start of tracking. + + + Time point must be before end of tracking. + Time point must be before end of tracking. + + + Regatta used for the tracked race + Regatta used for the tracked race + + + TracTrac Server Update URI + TracTrac Server Update URI + + + Passing instructions + Passing instructions + + + Refresh now + Refresh now + + + Stop updating + Stop updating + + + Start updating + Start updating + + + Current time: + Current time: + + + TracTrac username + TracTrac username + + + TracTrac password + TracTrac password + + + Equals + Equals + + + Not equals to + Not equals to + + + Less than + Less than + + + Less or equals + Less or equals + + + Greater than + Greater than + + + Greater or equals + Greater or equals + + + Contains + Contains + + + Not Contains + Not Contains + + + Starts with + Starts with + + + Ends with + Ends with + + + Nationality + Nationality + + + The number must be greater than zero. + The number must be greater than zero. + + + Distance to line at Start + Distance to line at Start + + + Distance to line 5s before start + Distance to line 5s before start + + + SOG at Start + SOG at Start + + + SOG 5s before start + SOG 5s before start + + + SOG when Starting + SOG when Starting + + + Distance to start line at race start time + Distance to start line at race start time + + + Distance to start line five seconds before the start + Distance to start line five seconds before the start + + + Speed over ground at race start time + Speed over ground at race start time + + + Speed over ground five seconds before the start + Speed over ground five seconds before the start + + + Speed over ground when the competitor passed the start + Speed over ground when the competitor passed the start + + + Start Tack + Start Tack + + + Tack on which the competitor started + Tack on which the competitor started + + + Port + Port + + + Starboard + Starboard + + + Port + Port + + + Starboard + Starboard + + + Please enter a number. + Please enter a number. + + + Competitors filter + Competitors filter + + + Flag status + Flag status + + + Info + Info + + + Wind Fixes (first 3, last 3, true values) + Wind Fixes (first 3, last 3, true values) + + + No Wind-Fixes available. + No Wind-Fixes available. + + + Dist. Stb-Side of Line when Starting + Dist. Stb-Side of Line when Starting + + + Distance to starboard side of start line or to the single start mark when the competitor passed the start + Distance to starboard side of start line or to the single start mark when the competitor passed the start + + + Add filter + Add filter + + + Edit filter + Edit filter + + + Available filters + Available filters + + + Create a filter set to filter the list of competitors. + Create a filter set to filter the list of competitors. + + + A filter with this name already exists. + A filter with this name already exists. + + + Add at least one filter criteria. + Add at least one filter criteria. + + + Filter criteria + Filter criteria + + + Select a filter criteria + Select a filter criteria + + + Filter name + Filter name + + + operator + operator + + + value + value + + + The nationality must be a two letter ISO code or a three letter IOC code. + The nationality must be a two letter ISO code or a three letter IOC code. + + + Race rank + Race rank + + + Waypoints + Waypoints + + + Disable filter + Disable filter + + + Enable filter + Enable filter + + + Race Status + Race Status + + + Loading (on a slow internet connection this can take some minutes)... + Loading (on a slow internet connection this can take some minutes)... + + + Races with state HIDDEN + Races with state HIDDEN + + + Invalid date format. Use: {0} + Invalid date format. Use: {0} + + + Selected competitors + Selected competitors + + + Filter nothing + Filter nothing + + + Race Top {0} + Race Top {0} + + + Total Top {0} + Total Top {0} + + + Simulator + Simulator + + + Optionsbar + Optionsbar + + + Predict + Predict + + + Setup + Setup + + + Strength (in kn) + Strength (in kn) + + + Oscillation + Oscillation + + + Oscillating + Oscillating + + + Amplitude(in Grad) + Amplitude(in Grad) + + + Frequency(in 1/h) + Frequency(in 1/h) + + + Noise + Noise + + + Sailing + Sailing + + + Optimality + Optimality + + + Maximum Turns + Maximum Turns + + + Race Direction + Race Direction + + + Upwind + Upwind + + + Downwind + Downwind + + + Strategies + Strategies + + + Omniscient + Omniscient + + + Opportunist + Opportunist + + + Mixed + Mixed + + + Maps + Maps + + + Start-End + Start-End + + + Course + Course + + + Summary + Summary + + + Replay + Replay + + + Display + Display + + + Polar diagram + Polar diagram + + + Show + Show + + + hide + hide + + + Left wind + Left wind + + + Right wind + Right wind + + + strategyOption1 + strategyOption1 + + + strategyOption2 + strategyOption2 + + + strategyOption3 + strategyOption3 + + + Leg + Leg + + + Race + Race + + + Competitor + Competitor + + + Keep Bearings + Keep Bearings + + + What-If Course + What-If Course + + + Edit Regatta... + Edit Regatta... + + + Please select a sailing event... + Please select a sailing event... + + + Please select a course area.. + Please select a course area.. + + + Area overview + Area overview + + + Course design overview + Course design overview + + + Regatta overview + Regatta overview + + + Additional settings + Additional settings + + + Show following course areas + Show following course areas + + + Show following regattas + Show following regattas + + + Show only races of same day + Show only races of same day + + + Show currently running races + Show currently running races + + + Series defines result discarding rules + Series defines result discarding rules + + + Add series + Add series + + + Regatta defines result discarding rules + Regatta defines result discarding rules + + + Series starts with zero score + Series starts with zero score + + + Master Data Import + Master Data Import + + + Success\nCreated {0} leaderboard group(s) and {1} leaderboard(s) and {2} event(s) and {3} regatta(s). + Success\nCreated {0} leaderboard group(s) and {1} leaderboard(s) and {2} event(s) and {3} regatta(s). + + + Had to overwrite the following regattas, you will need to retrack their races: + Had to overwrite the following regattas, you will need to retrack their races: + + + Regatta Overview Configuration + Regatta Overview Configuration + + + Starts with non-discardable carry-forward + Starts with non-discardable carry-forward + + + Connect to replication master server + Connect to replication master server + + + Connect + Connect + + + Connect to Master + Connect to Master + + + Messaging Hostname + Messaging Hostname + + + Hostname where the messaging queue is running on. + Hostname where the messaging queue is running on. + + + Hostname where the replication master is running on. + Hostname where the replication master is running on. + + + The name of the exchange queue. It must be the same as configured in master. + The name of the exchange queue. It must be the same as configured in master. + + + The port of the messaging exchange queue. This is used for all data after initial load. + The port of the messaging exchange queue. This is used for all data after initial load. + + + Servlet port number that is used to connect to register this replica and receive initial load. + Servlet port number that is used to connect to register this replica and receive initial load. + + + Replicas registered (this server is master): + Replicas registered (this server is master): + + + Connections to a master (this server is a replica): + Connections to a master (this server is a replica): + + + No connections to a master server configured. Click the Connect to Master button to configure one. + No connections to a master server configured. Click the Connect to Master button to configure one. + + + No connections from a replica found. You can connect replicas by using their AdminConsole. + No connections from a replica found. You can connect replicas by using their AdminConsole. + + + Stop Replication + Stop Replication + + + As link + As link + + + Pending + Pending + + + Running + Running + + + Finishing + Finishing + + + Finished + Finished + + + Scheduled + Scheduled + + + Start phase + Start phase + + + General recall + General recall + + + Postponed + Postponed + + + Abandoned + Abandoned + + + Drop connection to all replicas (Dangerous!) + Drop connection to all replicas (Dangerous!) + + + ATTENTION: This server is configured to be a replica. Do NOT change anything or this will lead to strange effects! + ATTENTION: This server is configured to be a replica. Do NOT change anything or this will lead to strange effects! + + + Drop connection + Drop connection + + + Time Control + Time Control + + + The filter will show all competitors matching the criterias: + The filter will show all competitors matching the criterias: + + + Protest time + Protest time + + + ends + ends + + + ended + ended + + + Flags + Flags + + + Last update + Last update + + + No more racing today + No more racing today + + + Further signals ashore + Further signals ashore + + + Early starters + Early starters + + + Showing details for race {0} + Showing details for race {0} + + + Start at + Start at + + + Finish at + Finish at + + + Protest ends at + Protest ends at + + + Unknown + Unknown + + + Race log + Race log + + + Regatta log + Regatta log + + + Refresh race log + Refresh race log + + + Race log successfully reloaded from database + Race log successfully reloaded from database + + + Reload all race logs + Reload all race logs + + + Export + Export + + + Sideline + Sideline + + + Flag displayed - eight minutes till start - the startprocedure is a gate start + Flag displayed - eight minutes till start - the startprocedure is a gate start + + + Flag displayed - five minutes till start + Flag displayed - five minutes till start + + + Start mode flag - four minutes till start + Start mode flag - four minutes till start + + + Start mode flag - disqualification for early starters - four minutes till start + Start mode flag - disqualification for early starters - four minutes till start + + + Start mode flag - penalties for early starters - four minutes till start + Start mode flag - penalties for early starters - four minutes till start + + + Start mode flag - one minute till start + Start mode flag - one minute till start + + + Start mode flag - disqualification for early starters - one minute till start + Start mode flag - disqualification for early starters - one minute till start + + + Start mode flag - start with penalties for early starters - one minute till start + Start mode flag - start with penalties for early starters - one minute till start + + + Flag removed - race starting signal + Flag removed - race starting signal + + + Individual recall - had early starters + Individual recall - had early starters + + + General recall - had too many early starters - start procedure will be repeated + General recall - had too many early starters - start procedure will be repeated + + + Flag displayed - first competitor passed the finishing line + Flag displayed - first competitor passed the finishing line + + + Flag removed - last competitor passed the finishing line or the finish time limit is passed + Flag removed - last competitor passed the finishing line or the finish time limit is passed + + + Flag removed - gate is closed + Flag removed - gate is closed + + + Flag displayed - start postponed - no more racing today + Flag displayed - start postponed - no more racing today + + + Flag displayed - start postponed - further signals ashore + Flag displayed - start postponed - further signals ashore + + + Flag displayed - start postponed + Flag displayed - start postponed + + + Flag removed - start procedure starts in one minute + Flag removed - start procedure starts in one minute + + + Flag displayed - race abandoned - no more racing today + Flag displayed - race abandoned - no more racing today + + + Flag displayed - race abandoned - further signals ashore + Flag displayed - race abandoned - further signals ashore + + + Flag displayed - race abandoned + Flag displayed - race abandoned + + + Protest time started + Protest time started + + + Protest time ended + Protest time ended + + + Three minutes till start + Three minutes till start + + + Two minutes till start + Two minutes till start + + + One minute till start + One minute till start + + + Race starting signal + Race starting signal + + + Data from before/after race + Data from before/after race + + + All fixes (including outliers) + All fixes (including outliers) + + + Remote host: + Remote host: + + + Fetch Leaderboard Group List + Fetch Leaderboard Group List + + + Not a valid URL for fetching leaderboardgroups: {0} + Not a valid URL for fetching leaderboardgroups: {0} + + + GET leaderboardgroups request failed for host {0} with error {1} + GET leaderboardgroups request failed for host {0} with error {1} + + + No data was returned by the server + No data was returned by the server + + + GET leaderboardgroups request failed with Server error. Please see server logs for more information. + GET leaderboardgroups request failed with Server error. Please see server logs for more information. + + + Leaderboard Groups: + Leaderboard Groups: + + + Override existing data if names and ids match + Override existing data if names and ids match + + + Import selected leaderboard groups + Import selected leaderboard groups + + + You have to select at least one leaderboard group to import + You have to select at least one leaderboard group to import + + + Deselect all + Deselect all + + + Polar Diagram + Polar Diagram + + + GPS Lag + GPS Lag + + + Ratio between time since last received GPS position and average sampling interval + Ratio between time since last received GPS position and average sampling interval + + + Tracking quality + Tracking quality + + + Leg Type + Leg Type + + + Sail Number + Sail Number + + + Series leaderboard + Series leaderboard + + + Regatta leaderboards + Regatta leaderboards + + + Clear Selection + Clear Selection + + + Running + Running + + + Run + Run + + + Done + Done + + + Last finished + Last finished + + + Run + Run + + + times + times + + + Data amount + Data amount + + + ∅ Cleaned Server Time + ∅ Cleaned Server Time + + + ∅ Cleaned Overall Time + ∅ Cleaned Overall Time + + + Data Mining Benchmark Results + Data Mining Benchmark Results + + + Server Time + Server Time + + + Confidence values need to be between 0 and 1. + Confidence values need to be between 0 and 1. + + + Minimum data size values cannot be negative. + Minimum data size values cannot be negative. + + + The number of histogram columns needs to be more than one. + The number of histogram columns needs to be more than one. + + + The outlier radius needs to be a positive number. + The outlier radius needs to be a positive number. + + + The outlier neighborhood percentage needs to be positive and max. 1. + The outlier neighborhood percentage needs to be positive and max. 1. + + + Parameter fields cannot be empty. + Parameter fields cannot be empty. + + + Error occured while trying to add\na new series to the chart. + Error occured while trying to add\na new series to the chart. + + + Generating Polar Sheet... + Generating Polar Sheet... + + + Data Size + Data Size + + + Generation finished! + Generation finished! + + + Generating + Generating + + + Remove all sheets + Remove all sheets + + + Remove all + Remove all + + + Select sheet + Select sheet + + + Cleaned Server Time + Cleaned Server Time + + + Overall Time + Overall Time + + + Cleaned Overall Time + Cleaned Overall Time + + + Data Mining Result + Data Mining Result + + + Group by + Group by + + + Calculate statistic + Calculate statistic + + + Worked through {0} data entries in {1} seconds + Worked through {0} data entries in {1} seconds + + + No query selected + No query selected + + + Run automatically + Run automatically + + + Upload + Upload + + + Import Wind from Expedition + Import Wind from Expedition + + + Boat Id: + Boat Id: + + + Do you really want to import wind into the selected {0} races?\nOnly races with applicable time window will be affected anyway. + Do you really want to import wind into the selected {0} races?\nOnly races with applicable time window will be affected anyway. + + + Do you really want to import wind into all races?\nOnly races with applicable time window will be affected anyway. + Do you really want to import wind into all races?\nOnly races with applicable time window will be affected anyway. + + + Imported wind from: {0} to: {1}. {2} races affected. + Imported wind from: {0} to: {1}. {2} races affected. + + + Race: {0} ({1}) - {2} fixes from: {3} to: {4} + Race: {0} ({1}) - {2} fixes from: {3} to: {4} + + + Error: {0} + Error: {0} + + + Toggles the visibility of the wind speed for all data sources + Toggles the visibility of the wind speed for all data sources + + + Toggles the visibility of the wind direction for all data sources + Toggles the visibility of the wind direction for all data sources + + + Combines all other wind sources to one data set + Combines all other wind sources to one data set + + + A value based on the course layout (under the assumption, that the race starts with an upwind leg) + A value based on the course layout (under the assumption, that the race starts with an upwind leg) + + + Calculated data from the competitor tracks + Calculated data from the competitor tracks + + + Data captured from mobile measuring systems + Data captured from mobile measuring systems + + + Manually set data values + Manually set data values + + + Data manually set from the race officers + Data manually set from the race officers + + + Sheet name + Sheet name + + + You can name your polar sheet using the text field.\nA name will be generated using the boat class\nif no name is provided. + You can name your polar sheet using the text field.\nA name will be generated using the boat class\nif no name is provided. + + + Time Downwind + Time Downwind + + + Time Reaching + Time Reaching + + + Time Upwind + Time Upwind + + + Total time traveled in this race, starting to measure when competitor passes start waypoint\n(not when the race starts) + Total time traveled in this race, starting to measure when competitor passes start waypoint\n(not when the race starts) + + + Total time traveled downwind in this race + Total time traveled downwind in this race + + + Total time traveled reaching in this race + Total time traveled reaching in this race + + + Total time traveled upwind in this race + Total time traveled upwind in this race + + + No statistic to calculate is selected + No statistic to calculate is selected + + + The grouper script is empty + The grouper script is empty + + + No dimension to group by is selected + No dimension to group by is selected + + + No grouper type is selected + No grouper type is selected + + + No data retriever is selected + No data retriever is selected + + + No query possible, because + No query possible, because + + + Data Mining + Data Mining + + + An error occured running the query + An error occured running the query + + + Hide toolbar + Hide toolbar + + + Show series leaderboards + Show series leaderboards + + + Show overall leaderboard + Show overall leaderboard + + + length: {0}m\nangle to wind: {1}°\n{2} side has {3}m advantage + length: {0}m\nangle to wind: {1}°\n{2} side has {3}m advantage + + + Do you really want to remove the events? + Do you really want to remove the events? + + + Do you really want to remove event {0}? + Do you really want to remove event {0}? + + + Line + Line + + + Offset + Offset + + + Do you really want to remove the selected competitors? + Do you really want to remove the selected competitors? + + + Do you really want to remove competitor {0}? + Do you really want to remove competitor {0}? + + + Filter competitors by name, boat class, sail number or ID + Filter competitors by name, boat class, sail number or ID + + + Edit Competitor + Edit Competitor + + + Please enter a sail number + Please enter a sail number + + + Successfully allowed reload of competitor(s) {0}. + Successfully allowed reload of competitor(s) {0}. + + + ID + ID + + + Allow reload + Allow reload + + + Compress + Compress + + + Use only if exporting server instance is at least\nrunning with commit 0fbf6071dea125bec4a56dee55d61c99def4a62e. + Use only if exporting server instance is at least\nrunning with commit 0fbf6071dea125bec4a56dee55d61c99def4a62e. + + + Query Runner + Query Runner + + + Rerun query after refresh + Rerun query after refresh + + + Refresh interval mustn''t be empty + Refresh interval mustn''t be empty + + + Selection Tables + Selection Tables + + + Add Configuration + Add Configuration + + + There are no configurations. + There are no configurations. + + + Error retrieving configuration data from server. + Error retrieving configuration data from server. + + + Allowed course areas + Allowed course areas + + + Minimum rounds for Course + Minimum rounds for Course + + + Maximum rounds for Course + Maximum rounds for Course + + + Results mail recipient + Results mail recipient + + + Device Configuration + Device Configuration + + + None + None + + + Course designer + Course designer + + + Racing procedure + Racing procedure + + + Course names + Course names + + + Generate + Generate + + + Don''t overwrite + Don''t overwrite + + + Set regatta configuration + Set regatta configuration + + + Regatta configuration + Regatta configuration + + + Activate individual recall + Activate individual recall + + + Activate result entry + Activate result entry + + + RRS26 start + RRS26 start + + + Activate configuration + Activate configuration + + + Class flag + Class flag + + + Sets the class flag used for {0}. Choose ''Don''t Overwrite'' to activate the procedure''s default flag. + Sets the class flag used for {0}. Choose ''Don''t Overwrite'' to activate the procedure''s default flag. + + + When activated the Race Officer is able to call for individual recall. + When activated the Race Officer is able to call for individual recall. + + + When activated the Race Officer is able to enter results during and after the finishing phase. + When activated the Race Officer is able to enter results during and after the finishing phase. + + + Startmode flags + Startmode flags + + + Sets the available start mode flags. Choose none to enable the procedure''s default flags. + Sets the available start mode flags. Choose none to enable the procedure''s default flags. + + + Gate Start + Gate Start + + + Activate Pathfinder + Activate Pathfinder + + + When activated the Race Officer is able to set the Pathfinder boat. + When activated the Race Officer is able to set the Pathfinder boat. + + + ESS Start + ESS Start + + + Basic Start + Basic Start + + + League Start + League Start + + + Configured + Configured + + + Activate regatta configuration + Activate regatta configuration + + + Enabling this option will provide a base regatta configuration for all options unconfigured in the regatta-specific configuration. + Enabling this option will provide a base regatta configuration for all options unconfigured in the regatta-specific configuration. + + + Set start time + Set start time + + + Current pass + Current pass + + + Select a new start time for the race. If you want to set the start time to a timepoint in the past then you have to enable the checkbox to update the pass count. Please be aware of the fact that changing the pass count will have you loose all information from the previous pass (like flag events). + Select a new start time for the race. If you want to set the start time to a timepoint in the past then you have to enable the checkbox to update the pass count. Please be aware of the fact that changing the pass count will have you loose all information from the previous pass (like flag events). + + + Set the start and end of tracking for the race. + Set the start and end of tracking for the race. + + + Activate additional golf down time + Activate additional golf down time + + + Activate additional golf down time + Activate additional golf down time + + + Invalid color: {0} + Invalid color: {0} + + + Igtimi Accounts + Igtimi Accounts + + + Error fetching all Igtimi accounts: {0} + Error fetching all Igtimi accounts: {0} + + + Add Igtimi Account + Add Igtimi Account + + + Error authorizing access to Igtimi user {0}: {1} + Error authorizing access to Igtimi user {0}: {1} + + + Successfully authorized access to Igtimi user {0} + Successfully authorized access to Igtimi user {0} + + + Could not authorize user {0}; invalid user name or password + Could not authorize user {0}; invalid user name or password + + + Error getting Igtimi authorization URL: {0} + Error getting Igtimi authorization URL: {0} + + + Add Igtimi User + Add Igtimi User + + + Do you really want to remove the leaderboards? + Do you really want to remove the leaderboards? + + + Error trying to remove Igtimi account for user {0} + Error trying to remove Igtimi account for user {0} + + + Successfully removed Igtimi account for user {0} + Successfully removed Igtimi account for user {0} + + + e-Mail address must not be empty + e-Mail address must not be empty + + + e-mail address + e-mail address + + + Password + Password + + + Do you really want to remove the leaderboard: ''{0}''? + Do you really want to remove the leaderboard: ''{0}''? + + + This is a meta leaderboard. It can''t be changed here. + This is a meta leaderboard. It can''t be changed here. + + + Failed to set new start time. This can happen when the same start time is already present in the race log or someone has added a start time that is newer (in terms of a pass id and logical time) than the one that you just added. + Failed to set new start time. This can happen when the same start time is already present in the race log or someone has added a start time that is newer (in terms of a pass id and logical time) than the one that you just added. + + + Do you really want to remove Igtimi account granting access to data of user {0}? + Do you really want to remove Igtimi account granting access to data of user {0}? + + + Import Wind from Igtimi + Import Wind from Igtimi + + + See the ''Igtimi'' tab for account settings determining which data from Igtimi will be considered. + See the ''Igtimi'' tab for account settings determining which data from Igtimi will be considered. + + + Import Wind from Igtimi + Import Wind from Igtimi + + + Error importing wind data from Igtimi: {0} + Error importing wind data from Igtimi: {0} + + + The following number of fixes were imported for the listed races: {0} + The following number of fixes were imported for the listed races: {0} + + + {0} to start + {0} to start + + + {0} since start + {0} since start + + + Distance to start line + Distance to start line + + + The angle between the competitors direction and the wind + The angle between the competitors direction and the wind + + + Beat Angle + Beat Angle + + + You can also view the overall diagram for the available boat classes. + You can also view the overall diagram for the available boat classes. + + + Show Diagram + Show Diagram + + + Run the query automatically, after you changed e.g. the statistic or the grouping. + Run the query automatically, after you changed e.g. the statistic or the grouping. + + + Reruns the query after the tables have been refreshed. + Reruns the query after the tables have been refreshed. + + + Query Definition Provider + Query Definition Provider + + + Statistic Provider + Statistic Provider + + + Calculate the + Calculate the + + + Grouping Provider + Grouping Provider + + + News and Release History + News and Release History + + + Split fleets scored contiguously + Split fleets scored contiguously + + + Add RaceLog Tracker + Add RaceLog Tracker + + + Add RaceLog Trackers + Add RaceLog Trackers + + + Denote for RaceLog tracking + Denote for RaceLog tracking + + + Start RaceLog Tracking + Start RaceLog Tracking + + + Filter by Leaderboard + Filter by Leaderboard + + + Remove Leaderboard filter + Remove Leaderboard filter + + + Competitor Registrations + Competitor Registrations + + + Tracker Status + Tracker Status + + + Can only be edited before starting tracking + Can only be edited before starting tracking + + + Define Course Layout + Define Course Layout + + + Map Devices to Competitors and Marks + Map Devices to Competitors and Marks + + + Edit {0} + Edit {0} + + + Add {0} + Add {0} + + + Remove {0} + Remove {0} + + + Please enter a {0} + Please enter a {0} + + + Ping {0} position + Ping {0} position + + + Please enter a valid value for {0} ({1}) + Please enter a valid value for {0} ({1}) + + + Copy course and competitors to other races + Copy course and competitors to other races + + + Set tracking times + Set tracking times + + + Now select the race column and fleet to copy the course to. + Now select the race column and fleet to copy the course to. + + + Select a single row in the table, to which to copy the course. + Select a single row in the table, to which to copy the course. + + + Device ID + Device ID + + + Device Type + Device Type + + + Mapped to Type + Mapped to Type + + + Mapped to + Mapped to + + + Device Mappings + Device Mappings + + + At most one end of the mapping''s time range may be left open (left unset) + At most one end of the mapping''s time range may be left open (left unset) + + + Please select an item to map the device to + Please select an item to map the device to + + + Device + Device + + + Time Range + Time Range + + + Close open end of Time Range + Close open end of Time Range + + + Set Timepoint that closes open time range + Set Timepoint that closes open time range + + + The start of the time range must lie before its end + The start of the time range must lie before its end + + + Overall Progress + Overall Progress + + + Event Overview + Event Overview + + + Start + Start + + + Show added scores for each entry in leaderboard + Show added scores for each entry in leaderboard + + + ratio + ratio + + + Import Wind + Import Wind + + + Unchecking this option will drastically lower the amount of data transfered. + Unchecking this option will drastically lower the amount of data transfered. + + + Import Device Configurations + Import Device Configurations + + + Checking this will import ALL device configurations on the remote server. + Checking this will import ALL device configurations on the remote server. + + + Author name + Author name + + + Author priority + Author priority + + + Remove Denotation + Remove Denotation + + + At least one of the selected races ({0}) is missing competitor registrations. Proceed anyway? + At least one of the selected races ({0}) is missing competitor registrations. Proceed anyway? + + + Please select a control point + Please select a control point + + + 2-mark-controlpoint + 2-mark-controlpoint + + + Registered Competitors + Registered Competitors + + + Competitor Pool + Competitor Pool + + + Select at least one + Select at least one + + + Select the Races + Select the Races + + + Import Fixes + Import Fixes + + + No remote server instances registered yet. + No remote server instances registered yet. + + + Registered remote server instances + Registered remote server instances + + + Filter Events by name: + Filter Events by name: + + + Leaderboards (except those of selected group) + Leaderboards (except those of selected group) + + + Available Leaderboard Groups + Available Leaderboard Groups + + + Leaderboard Groups Assigned to Event + Leaderboard Groups Assigned to Event + + + Add races + Add races + + + with name prefix + with name prefix + + + Please select a series first. + Please select a series first. + + + in {0,number} days + in {0,number} days + + + tomorrow + tomorrow + + + today + today + + + Share by mail + Share by mail + + + Share on Twitter + Share on Twitter + + + Share on Facebook + Share on Facebook + + + {0} in {1} on {2} + {0} in {1} on {2} + String eventSharingShortText(String eventName, String venue, String dateString); + + + I''d like to share {0} in {1} on {2}. Details on: \n{3} + I''d like to share {0} in {1} on {2}. Details on: \n{3} + String eventSharingLongText(String eventName, String venue, String dateString, String url); + + + I''d like to share series {0}. Details: {1} + I''d like to share series {0}. Details: {1} + String seriesSharingLongText(String seriesName, String url); + + + {0} + {0} + String seriesSharingShortText(String seriesName); + + + Competitors Analytics + Competitors Analytics + + + There are no photos or videos available yet. + There are no photos or videos available yet. + + + Media + Media + + + Photos + Photos + + + Videos + Videos + + + Image + Image + + + Images + Images + + + Video + Video + + + Flag image URL (image renders with 18x12px) + Flag image URL (image renders with 18x12px) + + + Image URLs + Image URLs + + + Video URLs + Video URLs + + + Sponsor Image URLs + Sponsor Image URLs + + + The current selection isn''t valid. + The current selection isn''t valid. + + + Advance Pass ID + Advance Pass ID + + + Please select a scoring result... + Please select a scoring result... + + + Time zone + Time zone + + + Official Website URL + Official Website URL + + + Sailors Info Website URL + Sailors Info Website URL + + + Event Overview URL + Event Overview URL + + + Logo Image URL + Logo Image URL + + + Show Mappings for pinged Marks + Show Mappings for pinged Marks + + + Regatta name must not contain slashes + Regatta name must not contain slashes + + + Number of races scored + Number of races scored + + + Error fetching wind streamlet data: {0} + Error fetching wind streamlet data: {0} + + + Show wind streamlets overlay + Show wind streamlets overlay + + + Color streamlets according to wind speed + Color streamlets according to wind speed + + + Show simulation overlay + Show simulation overlay + + + Time Comparison:\nRace is the leg duration measured from GPS, Omniscient is the course if one would know everything about the wind, Opportunist are courses if one decides to take a turn measuring the distance to the next mark, 1-Turners are the courses if one knows everything about the wind and just takes one turn + Time Comparison:\nRace is the leg duration measured from GPS, Omniscient is the course if one would know everything about the wind, Opportunist are courses if one decides to take a turn measuring the distance to the next mark, 1-Turners are the courses if one knows everything about the wind and just takes one turn + + + Races scored + Races scored + + + Number of races the competitor has completed or gotten a score for in this leaderboard. + Number of races the competitor has completed or gotten a score for in this leaderboard. + + + Average number of operations per message + Average number of operations per message + + + Show uncorrected net points + Show uncorrected net points + + + Set start time received + Set start time received + + + This sets the startTimeReceived of the selected TrackedRace that isn''t persistent. This means that the new value will be forgotten after the server has been restarted. + This sets the startTimeReceived of the selected TrackedRace that isn''t persistent. This means that the new value will be forgotten after the server has been restarted. + + + Last score correction time + Last score correction time + + + Last score correction comment + Last score correction comment + + + Set time to ''now'' + Set time to ''now'' + + + Use start time inference from start mark passings + Use start time inference from start mark passings + + + Number of queue messages sent + Number of queue messages sent + + + Total Size + Total Size + + + Average size per message in bytes + Average size per message in bytes + + + Total number of operations + Total number of operations + + + Current speed over ground in knots while leg is still running; average speed over ground when leg is completed + Current speed over ground in knots while leg is still running; average speed over ground when leg is completed + + + SOG (∅ at end) + SOG (∅ at end) + + + Connectors + Connectors + + + Video + Video + + + Competitor Search Filter + Competitor Search Filter + + + Search + Search + + + Go to event overview + Go to event overview + + + Go to the overview and see all Races in one Leaderboard + Go to the overview and see all Races in one Leaderboard + + + No such event + No such event + + + The leaderboard {0} is not contained in leaderboard group {1}. + The leaderboard {0} is not contained in leaderboard group {1}. + + + The leaderboard group {0} is not contained in event {1}. + The leaderboard group {0} is not contained in event {1}. + + + Race is Live + Race is Live + + + Back to Live + Back to Live + + + Wind Chart + Wind Chart + + + No Videos + No Videos + + + Show Video + Show Video + + + Click to show video: {0} + Click to show video: {0} + + + Hide Video + Hide Video + + + Click to hide video + Click to hide video + + + {0} Videos + {0} Videos + + + Click to select video + Click to select video + + + Manage Media + Manage Media + + + Configure audio and video clips, synchronize times + Configure audio and video clips, synchronize times + + + Show all + Show all + + + Visibility + Visibility + + + Enter carried points for competitor {0} + Enter carried points for competitor {0} + + + Advanced + Advanced + + + based on + based on + + + Retrieve with + Retrieve with + + + Mapping Details + Mapping Details + + + If you are using the Tracking App, you can add the device mapping also by selecting a competitor/mark, setting the from and to times, and then scanning this QRCode. + If you are using the Tracking App, you can add the device mapping also by selecting a competitor/mark, setting the from and to times, and then scanning this QRCode. + + + QRCode + QRCode + + + Enter course area name... + Enter course area name... + + + Enter course name... + Enter course name... + + + Enter image URL... + Enter image URL... + + + Enter video URL... + Enter video URL... + + + Enter sponsor image URL... + Enter sponsor image URL... + + + Enter race name... + Enter race name... + + + An error occurred while attempting to contact the server. Please check your network connection and try again. + An error occurred while attempting to contact the server. Please check your network connection and try again. + + + Remote Procedure Call + Remote Procedure Call + + + Server replies + Server replies + + + Error communicating with server + Error communicating with server + + + User Management + User Management + + + Regatta Structure Import + Regatta Structure Import + + + filtered by + filtered by + + + Edit Series + Edit Series + + + Please select at least one regatta + Please select at least one regatta + + + Please select an event + Please select an event + + + Error trying to get events: {0} + Error trying to get events: {0} + + + Show x-y-diagram + Show x-y-diagram + + + x-y-Diagram + x-y-Diagram + + + Boat Speed + Boat Speed + + + Confidence + Confidence + + + Create default settings for all regattas... + Create default settings for all regattas... + + + No overall event selected... + No overall event selected... + + + Error trying to create new event {0}: {1} + Error trying to create new event {0}: {1} + + + Create New Event + Create New Event + + + No fleets defined. + No fleets defined. + + + Successfully created regattas + Successfully created regattas + + + Error trying to register races {0} for tracking: {1}. Check live/stored URI syntax. + Error trying to register races {0} for tracking: {1}. Check live/stored URI syntax. + + + Error determining availability of polar / VPP data for race {0}: {1} + Error determining availability of polar / VPP data for race {0}: {1} + + + Error + Error + + + File Storage + File Storage + + + Active + Active + + + Score in points. Winner of an act scores 10 points, 2nd - 9 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. + Score in points. Winner of an act scores 10 points, 2nd - 9 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. + + + Start delay + Start delay + + + Time between the start of the race and the time the competitor passed the start waypoint. Negative time suggests OCS. + Time between the start of the race and the time the competitor passed the start waypoint. Negative time suggests OCS. + + + Use internal mark passing algorithm + Use internal mark passing algorithm + + + Edit Mark Passings + Edit Mark Passings + + + Edit Mark Positions + Edit Mark Positions + + + Remove fixed mark passing + Remove fixed mark passing + + + Set time as mark passing + Set time as mark passing + + + Suppress mark passing starting with current + Suppress mark passing starting with current + + + Remove suppressed mark passing + Remove suppressed mark passing + + + Error removing fixed mark passing: {0} + Error removing fixed mark passing: {0} + + + Error setting fixed mark passing: {0} + Error setting fixed mark passing: {0} + + + Error suppressing mark passings: {0} + Error suppressing mark passings: {0} + + + Error removing suppressed mark passings: {0} + Error removing suppressed mark passings: {0} + + + Error trying to obtain mark passings: {0} + Error trying to obtain mark passings: {0} + + + Error trying to obtain race log mark passing data: {0} + Error trying to obtain race log mark passing data: {0} + + + E-Mail + E-Mail + + + Please enter an E-Mail. + Please enter an E-Mail. + + + Invite competitors + Invite competitors + + + Invite selected competitors + Invite selected competitors + + + Not all competitors provide an E-Mail + Not all competitors provide an E-Mail + + + Sending Mails failed + Sending Mails failed + + + Successfully sent E-Mails + Successfully sent E-Mails + + + Select Event for Invitation + Select Event for Invitation + + + Image URL + Image URL + + + Upload + Upload + + + Remove operation: {0} {1} + Remove operation: {0} {1} + + + Upload successful + Upload successful + + + File upload: {0} {1}.\nIn case of error please check that your File Storage service is properly configured. + File upload: {0} {1}.\nIn case of error please check that your File Storage service is properly configured. + + + Remove uploaded file + Remove uploaded file + + + Sail Id + Sail Id + + + Competitor Full Name + Competitor Full Name + + + Loading dimension values + Loading dimension values + + + Running Query + Running Query + + + Invite Buoy Tenders + Invite Buoy Tenders + + + or multiple E-Mails separated by comma + or multiple E-Mails separated by comma + + + True course over ground in degrees + True course over ground in degrees + + + COG + COG + + + Distance (w/ Gate Start) + Distance (w/ Gate Start) + + + The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished.\nIf the leg includes a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. + The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished.\nIf the leg includes a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. + + + The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. For a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. + The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. For a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. + + + Results + Results + + + Group Name + Group Name + + + Value (Ascending) + Value (Ascending) + + + Value (Descending) + Value (Descending) + + + Sort by + Sort by + + + Dashboard + Dashboard + + + Wind Bot is not available. + Wind Bot is not available. + + + To receive live wind data from wind measurement units, ensure that the wind bot is switched on and connected to the SAP Sailing Analytics. + To receive live wind data from wind measurement units, ensure that the wind bot is switched on and connected to the SAP Sailing Analytics. + + + Wind Bot + Wind Bot + + + TWS + TWS + + + TWD + TWD + + + kts + kts + + + deg + deg + + + live + live + + + average + average + + + ({0} minutes) + ({0} minutes) + + + Tap on chart to change interval + Tap on chart to change interval + + + Select Competitor + Select Competitor + + + Start Analyses + Start Analyses + + + New start analysis available + New start analysis available + + + No Start Analyses available. + No Start Analyses available. + + + There is a Start Analysis created from each race start. Please stand by till racing has been started. + There is a Start Analysis created from each race start. Please stand by till racing has been started. + + + No Startline Advantages available. + No Startline Advantages available. + + + For calculating the startline advantage there needs to be a course set by the race commitee. + For calculating the startline advantage there needs to be a course set by the race commitee. + + + No Startline Advantage available. + No Startline Advantage available. + + + For calculating the startline advantage there needs to be a course set by the race commitee. + For calculating the startline advantage there needs to be a course set by the race commitee. + + + Startline Advantages by Wind + Startline Advantages by Wind + + + Startline Advantage by Geometry + Startline Advantage by Geometry + + + Rank at first mark + Rank at first mark + + + Team + Team + + + Distance to line in m + Distance to line in m + + + Speed in kts + Speed in kts + + + Advantage in m + Advantage in m + + + s + s + + + Distance to rc boat in m + Distance to rc boat in m + + + Pin End + Pin End + + + RC Boat + RC Boat + + + (fixed) + (fixed) + + + (suppressed) + (suppressed) + + + Wind-Up (show wind from top of map) + Wind-Up (show wind from top of map) + + + Filter by + Filter by + + + Current filter selection + Current filter selection + + + I''m not capable of generating a code for this identifier. + I''m not capable of generating a code for this identifier. + + + Server URL + Server URL + + + Rotated {0} degrees from true north.\nTap/click to toggle between wind-up and north-up map display + Rotated {0} degrees from true north.\nTap/click to toggle between wind-up and north-up map display + + + Start to first mark ({0}m) + Start to first mark ({0}m) + + + The Data-Mining components have been updated + The Data-Mining components have been updated + + + Click Reload to reload the components now. This will discard the current displayed data and run a default query.\nClick Close to do nothing. The Data-Mining won''t work correctly, until the components have been reloaded. + Click Reload to reload the components now. This will discard the current displayed data and run a default query.\nClick Close to do nothing. The Data-Mining won''t work correctly, until the components have been reloaded. + + + There isn''t any data for the event yet. + There isn''t any data for the event yet. + + + {0,number} countries + {0,number} countries + + + {0,number} country + {0,number} country + + + {0,number} races + {0,number} races + + + {0,number} race + {0,number} race + + + {0,number} tracked races + {0,number} tracked races + + + {0,number} tracked race + {0,number} tracked race + + + {0,number} events + {0,number} events + + + {0,number} event + {0,number} event + + + {0,number} competitors + {0,number} competitors + + + Course area: {0} + Course area: {0} + + + {0,number} competitor + {0,number} competitor + + + Leg {0,number}/{1,number} + Leg {0,number}/{1,number} + + + Clone + Clone + + + Changed + Changed + + + Matcher + Matcher + + + Any + Any + + + URL-based result providers + URL-based result providers + + + Please select a URL-based result provider... + Please select a URL-based result provider... + + + Sample URL: {0} + Sample URL: {0} + + + SAP Sports on + SAP Sports on + + + Follow SAP Sports + Follow SAP Sports + + + Live now + Live now + + + Analyze race + Analyze race + + + Next race starts in + Next race starts in + + + {0} starts in + {0} starts in + + + Planned + Planned + + + Abandoned + Abandoned + + + Postponed + Postponed + + + Starts in {0,number} min + Starts in {0,number} min + + + Starting now + Starting now + + + Latest News + Latest News + + + Result update + Result update + + + {0} won race + {0} won race + + + Time on Time Factor + Time on Time Factor + + + Time on Distance Allowance + Time on Distance Allowance + + + Ranking + Ranking + + + One-Design + One-Design + + + ORC Performance Curve + ORC Performance Curve + + + Time-on-Time/Time-on-Distance + Time-on-Time/Time-on-Distance + + + One-Design: First across the line wins;\nin-race ranks based on windward positions (upwind/downwind) or along-course position (reaching) + One-Design: First across the line wins;\nin-race ranks based on windward positions (upwind/downwind) or along-course position (reaching) + + + ORC Performance Curve: Sophisticated handicapping scheme that awards time allowances based on a VPP/polar assuming pre-defined legs'' angles to the wind;\nbased on these allowances, an "implied wind" is calculated which is the basis for ranking.\nImplied wind can be calculated at any time in the race and is therefore the basis for in-race ranking. + ORC Performance Curve: Sophisticated handicapping scheme that awards time allowances based on a VPP/polar assuming pre-defined legs'' angles to the wind;\nbased on these allowances, an "implied wind" is calculated which is the basis for ranking.\nImplied wind can be calculated at any time in the race and is therefore the basis for in-race ranking. + + + Time-on-Time / Time-on-Distance: Final ranking by calculated time;\ntime is calculated by optionally applying a factor to the actual time (defaulting to 1.0)\nand subtracting an allowance in seconds per nautical mile,\napplied to the course length.\nIn-race ranks based on expected arrival at fastest boat's current position\nassuming current leg's average VMG/VMC. + Time-on-Time / Time-on-Distance: Final ranking by calculated time;\ntime is calculated by optionally applying a factor to the actual time (defaulting to 1.0)\nand subtracting an allowance in seconds per nautical mile,\napplied to the course length.\nIn-race ranks based on expected arrival at fastest boat's current position\nassuming current leg's average VMG/VMC. + + + ToT Factor + ToT Factor + + + ToD Allowance + ToD Allowance + + + Time-on-Time factor; actual time is multiplied with this factor in calculated time formula + Time-on-Time factor; actual time is multiplied with this factor in calculated time formula + + + Time-on-Distance allowance in seconds per nautical mile;\ndistance sailed is multiplied with this allowance, and the resulting seconds are subtracted from the actual time sailed\n(optionally calculated by applying the time-on-time factor) in the calculated time formula + Time-on-Distance allowance in seconds per nautical mile;\ndistance sailed is multiplied with this allowance, and the resulting seconds are subtracted from the actual time sailed\n(optionally calculated by applying the time-on-time factor) in the calculated time formula + + + Calculated Time + Calculated Time + + + Calculated time according to competitor''s handicap\nbased on time since start of race and (windward) distance traveled + Calculated time according to competitor''s handicap\nbased on time since start of race and (windward) distance traveled + + + Calc.Time @ Fastest + Calc.Time @ Fastest + + + Calculated time at estimated arrival at the competitor that is currently farthest ahead in the race;\nestimation based on average VMG in current leg and equal (calculated) performance to fastest boat in all subsequent legs + Calculated time at estimated arrival at the competitor that is currently farthest ahead in the race;\nestimation based on average VMG in current leg and equal (calculated) performance to fastest boat in all subsequent legs + + + Sailor Info + Sailor Info + + + Official Results, Protests,\nNotice Board, Sailor weather: + Official Results, Protests,\nNotice Board, Sailor weather: + + + Event Quickfinder + Event Quickfinder + + + Regatta Quickfinder + Regatta Quickfinder + + + Results Quickfinder + Results Quickfinder + + + Races Quickfinder + Races Quickfinder + + + Statistics + Statistics + + + Impressions + Impressions + + + This content is not available on mobile.\nSwitch to the desktop version? + This content is not available on mobile.\nSwitch to the desktop version? + + + Go to desktop version + Go to desktop version + + + Go back + Go back + + + Show all {0} + Show all {0} + + + Collapse {0} + Collapse {0} + + + GPS fixes + GPS fixes + + + Fastest + Fastest + + + Wind fixes + Wind fixes + + + Sailed miles + Sailed miles + + + {0,number,#0.0} mil + {0,number,#0.0} mil + + + {0,number,#0.0} bil + {0,number,#0.0} bil + + + There are no results available yet. + There are no results available yet. + + + There are no news available. + There are no news available. + + + {0,number,#0.00} + {0,number,#0.00} + + + Open Leaderboard + Open Leaderboard + + + Now + Now + + + {0} min ago + {0} min ago + + + {0} h ago + {0} h ago + + + Winner + Winner + + + Duration + Duration + + + Finished Races + Finished Races + + + Please select one competitor + Please select one competitor + + + All + All + + + Points + Points + + + # Races + # Races + + + Course Geometry + Course Geometry + + + {0}° to wind + {0}° to wind + + + Shows the points along with the number of races per competitor + Shows the points along with the number of races per competitor + + + {0,number}/{1,number} + {0,number}/{1,number} + + + There are no finished races yet + There are no finished races yet + + + Races overview + Races overview + + + List format + List format + + + Competition format + Competition format + + + Empty + Empty + + + Run a Query + Run a Query + + + Latest Regatta Standings + Latest Regatta Standings + + + Plain Text + Plain Text + + + Column Chart + Column Chart + + + Choose Presentation + Choose Presentation + + + Can''t display data of type {0} + Can''t display data of type {0} + + + Shown Decimals + Shown Decimals + + + Open fullscreen view + Open fullscreen view + + + Close fullscreen view + Close fullscreen view + + + Progress + Progress + + + {0,number} videos + {0,number} videos + + + {0,number} video + {0,number} video + + + {0,number} photos + {0,number} photos + + + {0,number} photo + {0,number} photo + + + {0} events have taken place + {0} events have taken place + + + One event has taken place + One event has taken place + + + Race Office + Race Office + + + Analyze + Analyze + + + Data Mining Settings + Data Mining Settings + + + Multi Results Presenter + Multi Results Presenter + + + Plain Results Presenter + Plain Results Presenter + + + Results Chart + Results Chart + + + Tabbed Results Presenter + Tabbed Results Presenter + + + Polar Results Presenter + Polar Results Presenter + + + Data Retrieval + Data Retrieval + + + Watch + Watch + + + Analyze + Analyze + + + Shortcut to denote all races for racelog tracking + Shortcut to denote all races for racelog tracking + + + Register Competitors + Register Competitors + + + Do you want to create a default Regatta Leaderboard? + Do you want to create a default Regatta Leaderboard? + + + Copy Course + Copy Course + + + Copy Competitors + Copy Competitors + + + Smartphone Tracking + Smartphone Tracking + + + {0,number} flights + {0,number} flights + + + {0,number} flight + {0,number} flight + + + View Query Definition + View Query Definition + + + Query Definition Viewer + Query Definition Viewer + + + Group Average (Ascending) + Group Average (Ascending) + + + Group Average (Descending) + Group Average (Descending) + + + Group Median (Ascending) + Group Median (Ascending) + + + Group Median (Descending) + Group Median (Descending) + + + {0,number} results found for ''{1}'' + {0,number} results found for ''{1}'' + + + {0,number} result found for ''{1}'' + {0,number} result found for ''{1}'' + + + Run Predefined Query + Run Predefined Query + + + Select Predefined Query + Select Predefined Query + + + Predefined Query Runner + Predefined Query Runner + + + Developer Options + Developer Options + + + Copy to Clipboard + Copy to Clipboard + + + Code + Code + + + Use Class.getName() for type names + Use Class.getName() for type names + + + More robust against changes in the code base, but the code snippet can only be used in the scope where the classes are available. + More robust against changes in the code base, but the code snippet can only be used in the scope where the classes are available. + + + Use string literals for type names + Use string literals for type names + + + The code snippet can be used anywhere, but it will break if the code base changes. + The code snippet can be used anywhere, but it will break if the code base changes. + + + Error loading data. Trying again in a few moments. + Error loading data. Trying again in a few moments. + + + Add gallery photo + Add gallery photo + + + Add stage image + Add stage image + + + Add teaser image + Add teaser image + + + + No images defined yet + No images defined yet + + + The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px. + The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px. + + + The width and height of the image could not be retrieved yet. + The width and height of the image could not be retrieved yet. + + + Please only upload content you have all usage rights for. Remember that content may be cropped. + Please only upload content you have all usage rights for. Remember that content may be cropped. + + + Register Competitors on Race (e.g. for split-fleet racing) + Register Competitors on Race (e.g. for split-fleet racing) + + + Do you want to register competitors directly on the Race? + Do you want to register competitors directly on the Race? + + + Do you want to disable competitor registrations on the Race? + Do you want to disable competitor registrations on the Race? + + + Warning! This setting will lead to competitors for this race being registered on a per race basis. Competitors will not be automatically registered for this race, when registering them on the corresponding regatta. + Warning! This setting will lead to competitors for this race being registered on a per race basis. Competitors will not be automatically registered for this race, when registering them on the corresponding regatta. + + + Warning! This will reactivate competior registrations on the regatta. All competitor registrations from the regatta will automatically be used as competitor registration for this race. + Warning! This will reactivate competior registrations on the regatta. All competitor registrations from the regatta will automatically be used as competitor registration for this race. + + + Competitor Registrations are disabled for this race. Enable by checking the checkbox to the left. + Competitor Registrations are disabled for this race. Enable by checking the checkbox to the left. + + + Add Mark to Regatta + Add Mark to Regatta + + + Select a leaderboard group... + Select a leaderboard group... + + + Please select + Please select + + + This page requires a valid regatta, race column and fleet name to identify the race to show. + This page requires a valid regatta, race column and fleet name to identify the race to show. + + + Could not obtain a race with name {1} for fleet {2} for a regatta with name {0}: {3} + Could not obtain a race with name {1} for fleet {2} for a regatta with name {0}: {3} + + + Error trying to create the embedded map: {0} + Error trying to create the embedded map: {0} + + + Top {0} + Top {0} + + + Transparent buffer lines on hover of helplines + Transparent buffer lines on hover of helplines + + + Buffer line stroke weight + Buffer line stroke weight + + + Profile + Profile + + + Show only competitors registered in Log + Show only competitors registered in Log + + + This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? + This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? + + + Removal deavticated, marks are used in races {0} + Removal deavticated, marks are used in races {0} + + + Would you like to create a default LeaderboardGroup for your event? + Would you like to create a default LeaderboardGroup for your event? + + + Please create at least one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side + Please create at least one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side + + + Matcher type + Matcher type + + + Matching devices + Matching devices + + + Add Device + Add Device + + + Create Device Configuration + Create Device Configuration + + + Specify for which device the new configuration should apply + Specify for which device the new configuration should apply + + + Create + Create + + + There is already a configuration for this device. + There is already a configuration for this device. + + + Enter an identifier name + Enter an identifier name + + + Administration + Administration + + + Please select a leaderboard group + Please select a leaderboard group + + + Link Leaderboard to Leaderboard Group of Event + Link Leaderboard to Leaderboard Group of Event + + + Link leaderboard {0} to a leaderboard group of event {1} + Link leaderboard {0} to a leaderboard group of event {1} + + + Failed to link leaderboard {0} to leaderboard group {1} + Failed to link leaderboard {0} to leaderboard group {1} + + + Create default regatta + Create default regatta + + + Do you want to create a default Regatta? + Do you want to create a default Regatta? + + + Default + Default + + + The default link is used unless a language specific overwrite exists. If no default exists, there will be no link for languages that do not explicitly have one set. + The default link is used unless a language specific overwrite exists. If no default exists, there will be no link for languages that do not explicitly have one set. + + + QR-Sync + QR-Sync + + + There is no identifier set. + There is no identifier set. + + + Could not obtain access token for user {0} + Could not obtain access token for user {0} + + + Device Name + Device Name + + + Please enter a valid Server URL + Please enter a valid Server URL + + + Server URL empty + Server URL empty + + + Marks + Marks + + + Add new fix + Add new fix + + + Please select another timepoint. There already is a fix at the timepoint of the timeslider. + Please select another timepoint. There already is a fix at the timepoint of the timeslider. + + + Confirm move + Confirm move + + + Confirm new fix + Confirm new fix + + + Select a fix position by dragging the map. Then confirm or cancel with the buttons below. + Select a fix position by dragging the map. Then confirm or cancel with the buttons below. + + + Please select a mark from the list on the left. + Please select a mark from the list on the left. + + + Mark fixes + Mark fixes + + + utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions + utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions + + + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + + + https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app + https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app + + + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + + + https://play.google.com/intl/en/badges/images/generic/en-play-badge.png + https://play.google.com/intl/en/badges/images/generic/en-play-badge.png + + + http://appstore.com/sapsailinsight + http://appstore.com/sapsailinsight + + + http://appstore.com/stgtrainingstagebuch + http://appstore.com/stgtrainingstagebuch + + + _en + _en + + + Distance from average position + Distance from average position + + + Use a touch optimized UI to move the fix + Use a touch optimized UI to move the fix + + + Delete fix + Delete fix + + + The deletion of this fix is currently not possible. + The deletion of this fix is currently not possible. + + + Loading mark fixes... + Loading mark fixes... + + + Fix successfully added. + Fix successfully added. + + + Fix position successfully edited. + Fix position successfully edited. + + + Fix successfully removed. + Fix successfully removed. + + + Drag to change position\nRight-click to get menu to delete + Drag to change position\nRight-click to get menu to delete + + + Move fix + Move fix + + +
+
\ No newline at end of file diff --git a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties.xlf b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties.xlf new file mode 100644 index 00000000000..67bdad17514 --- /dev/null +++ b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties.xlf @@ -0,0 +1,5992 @@ + + + +
+ + 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 + + + + + +
+ + + Manage2Sail + Manage2Sail + + + Race Manager App + Приложение диспетчера гонок + + + TracTrac Events + События TracTrac + + + SwissTiming Events + События SwissTiming + + + History of tracked events + История отслеживаемых событий + + + General + Общее + + + List Races + Список гонок + + + List Regattas + Список регат + + + Wind + Ветер + + + Maneuver + Маневр + + + This is the Wind Panel which so far is completely empty. + Это панель ветров, которая пока что совсем пуста. + + + Refresh + Обновить + + + Remove + Удалить + + + Wind Source + Источник ветра + + + Dampening Interval + Интервал смягчения + + + Map + Карта + + + Race + Гонка + + + Races + Гонки + + + tracked + отслеживаемые + + + Linked Races + Связанные гонки + + + Time + Время + + + Time the competitor sailed on this leg. For the first leg this is counted from when the competitor passed the start line. + Время плавания данного участника на данном этапе. Для первого этапа отсчитывается от момента пересечения участником стартовой линии. + + + Play speed + Скорость воспроизведения + + + Use "1" for regular play-back speed, "2" for double-speed playback and so on + "1" — обычная скорость воспроизведения, "2" — удвоенная скорость воспроизведения и т. д. + + + Live + Активно + + + Replay Mode + Режим воспроизведения + + + Delay + Задержка + + + 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 + Оставьте пустым для воспроизведения в произвольное время; введите число секунд задержки перед потоком оперативных данных (например, "60" — одна минута задержки, "0" — без задержки) + + + Speed (kn) + Скорость (уз) + + + From (deg) + Источник (град.) + + + There are no races yet. + Гонок еще нет. + + + Σ + Σ + + + Accumulated + Накоплено + + + Competitor + Участник + + + Competitors + Участники + + + {0}/{1} competitors selected. + Выбрано участников: {0}/{1}. + + + No such leaderboard + Нет такой таблицы лидеров + + + Leaderboard Configuration + Конфигурация таблицы лидеров + + + New... + Создать... + + + Edit Points... + Изменить точки... + + + Race Names in Selected Leaderboard + Названия гонок в выбранной таблице лидеров + + + Add... + Добавить... + + + Rename... + Переименовать... + + + Tracked Race Connected to Selected Race Name + Отслеживаемая гонка связана с выбранным названием гонки + + + Link to Column + Связать со столбцом + + + Unlink + Отменить связывание + + + Leaderboard Name + Название таблицы лидеров + + + Cancel + Отмена + + + Please enter a name + Введите название + + + Please enter a boat class + Введите класс лодки + + + Discard one more race starting with how many started races + Исключить еще одну гонку, начиная с числа стартов в гонках + + + Leaderboard with this name already exists + Таблица лидеров с таким названием уже существует + + + Discard thresholds must be numeric + Пороги исключения должны быть числовыми + + + Discard thresholds must be ascending + Пороги исключения должны возрастать + + + Discarding + Исключение + + + Starting from how many races + Начиная с числа гонок + + + Rename Leaderboard + Переименовать таблицу лидеров + + + Add Column to Leaderboard + Добавить столбец в таблицу лидеров + + + Please enter a name for new race column + Введите название для столбца новой гонки + + + OK + ОК + + + Medal Race + Гонка на медали + + + Rename Race + Переименовать гонку + + + Open Selected Leaderboard + Открыть выбранную таблицу лидеров + + + Rank + Ранг + + + Competitor''s rank in the race + Ранг участника в данной гонке + + + Regatta Rank + Ранг в регате + + + Competitor''s rank in the regatta + Ранг участника в регате + + + Overall Rank + Общий ранг + + + Competitor''s rank in the series + Ранг участника в серии + + + Regatta Rank + Ранг в регате + + + - + - + + + + + + + + + L + Э + + + Distance + Дистанция + + + ∅ Speed + ∅ Скорость + + + The average speed over ground during this leg,\ncalculated with the division of the distance traveled by the time needed. + Средняя скорость относительно грунта на данном этапе:\nотношение пройденного расстояния к затраченному времени. + + + The average speed over ground during this race,\ncalculated with the division of the distance traveled by the time needed. + Средняя скорость в течение гонки,\nвычисляемая делением пройденного расстояния на затраченное время. + + + Rank Gain + Повышение ранга + + + The difference of the position from the current and the previous leg. + Разница в положении между текущим и предыдущим этапами. + + + Sailing Analytics + Аналитика плавания + + + Leaderboard + Таблица лидеров + + + Leaderboards + Таблицы лидеров + + + Leaderboard Settings + Параметры таблицы лидеров + + + Settings + Параметры + + + Select at least one leg detail + Выберите подробности минимум одного этапа + + + SOG + SOG + + + The current speed over ground. + Текущая скорость относительно грунта. + + + ETA + ETA + + + The estimated time that the competitor needs to reach the next waypoint, based on the competitor''s current velocity made good, considering the true wind direction. + Ожидаемое время достижения участником следующей путевой точки при эффективной скорости лавирования (VMG) с учетом направления истинного ветра. + + + Gap to leader + Отставание от лидера + + + Estimates the (calculated) arrival time at the current position of the boat that is farthest ahead,\nbased on average VMG for the current leg and with performance equal to that of the race leader for subsequent legs.\nThe gap tells how much earlier the competitor would have had to be where she currently is\nin order to rank equal to the race leader at the projected arrival at the current position of the boat farthest ahead. + Оценивает самое ранее (расчетное) время прибытия лодки в текущую позицию,\nисходя из среднего значения VMG для текущего этапа и эффективности, равной эффективности лидера гонки, для последующих этапов.\nПоказывает, насколько раньше нужно было прийти в текущую позицию,\nчтобы иметь ранг лидера гонки в расчетное время прибытия в текущую позицию лидирующей лодки. + + + VMG + VMG + + + The velocity made good, which is the windward/leeward speed for upwind/downwind legs, respectively, or the along-track speed for reaching legs. + Эффективная скорость лавирования, то есть скорость хода переменными галсами или полным ветром на этапах с соответствующими условиями. + + + Windward distance to go + Осталось пройти + + + Windward/leeward distance from the competitor''s current position to the end of the leg for upwind/downwind legs, respectively, or the along-track distance for reaching legs. + Расстояние от текущей позиции участника до конца этапа с учетом направления ветра. + + + Gap + Отставание + + + Windward/leeward distance of the competitor to the competitor farthest ahead in the race for upwind/downwind legs, respectively, or the along-track distance for reaching legs.\nNote that the competitor that is farthest ahead is not necessarily leading the race if handicap ranking is in place. + Расстояние от участника до первой лодки в гонке с учетом направления ветра.\nПервая лодка не обязательно лидирует в гонке, если применяется ранжирование с гандикапом. + + + Name + Название + + + Leave empty for default + Чтобы задать название по умолчанию, оставьте пустым + + + Track New event + Отслеживать новое событие + + + Trackable Races + Гонки с возможностью отслеживания + + + Track Wind + Отслеживать ветер + + + Regatta name + Название регаты + + + Event name + Название события + + + Event + Событие + + + Start time + Время начала + + + Start of tracking + Начало отслеживания + + + End of tracking + Окончание отслеживания + + + Regatta + Регата + + + Regattas + Регаты + + + Start tracking + Начать отслеживание + + + Stop tracking + Прекратить отслеживание + + + Connections + Подключение + + + History of connections + История подключений + + + Define a new connection + Определить новое подключение + + + Tracked races + Отслеживаемые гонки + + + Can send requests + Может отправлять запросы + + + Connect and read races + Подключиться и считать гонки + + + Ports + Порты + + + Live data + Оперативные данные + + + Stored data + Хранимые данные + + + URIs + URI + + + JSON URL + URL-адрес JSON + + + Port Live Data + Порт оперативных данных + + + Port Stored Data + Порт хранимых данных + + + Live URI + URI оперативных данных + + + Stored URI + URI хранимых данных + + + Events Currently Tracked + Отслеживаемые события + + + Hostname + Имя хоста + + + Correct Wind Bearing by Declination + Корректировать направление ветра по отклонению + + + Tracking Started + Отслеживание начато + + + Pause automatic refresh + Приостановить автоматическое обновление + + + Refresh automatically + Обновлять автоматически + + + Delay (s) + Задержка (с) + + + Delay between auto-updates in seconds: + Задержка между автообновлениями в секундах: + + + The delay must be greater than zero + Задержка должна быть больше нуля + + + Choose update interval of at least one second + Выберите интервал обновления не менее одной секунды + + + Error setting wind for race + Ошибка при установке ветра для гонки + + + Error fetching wind information for race + Ошибка при извлечении сведений о ветре для гонки + + + Error while trying to set "wind starts upwind" flag + Ошибка при попытке установить флаг "ветер начинается навстречу" + + + in event + в событии + + + to + на + + + to + на + + + Show estimated wind + Показать оценку ветра + + + Timing + Хронометраж + + + Race Details + Подробности гонки + + + Overall Details + Общие подробности + + + Leg Details + Подробности + + + Up + Вверх + + + Down + Вниз + + + Port + Порт + + + Race Started + Гонка начата + + + Show only selected competitors + Показать только выбранных участников + + + Show info box for selected competitors + Показать окно сведений для выбранных участников + + + Tail length (s) + Длина хвоста (с) + + + Which races would you like to display? + Какие гонки вы хотите просмотреть? + + + Length (s) + Длина (с) + + + Stress Test + Стресс-тест + + + Maneuvers + Маневры + + + The number of the maneuvers sailed in this leg. + Число совершенных маневров на данном этапе. + + + The number of maneuvers sailed in this race. + Число совершенных маневров в данной гонке. + + + Tacks + Поворотов оверштаг + + + Jibes + Поворотов фордевинд + + + Penalty Circles + Штрафных кругов + + + Medalrace value not allowed + Значение гонки на медали не разрешено + + + Configuration + Конфигурация + + + Maneuvers + Маневры + + + Choose chart + Выберите диаграмму + + + Distance Traveled + Пройденная дистанция + + + The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished. + Расстояние, пройденное от старта этапа до конца\nили до текущего момента, если этап не завершен. + + + The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. + Расстояние, пройденное от старта гонки до конца\nили до текущего момента, если гонка не завершена. + + + Velocity Made Good + Эффективная скорость лавирования (VMG) + + + Speed Over Ground + Скорость относительно грунта (SOG) + + + Gap To Leader + Отставание от лидера + + + Points to load + Точки для загрузки + + + Speed + Скорость + + + Distance + Дистанция + + + in + в + + + s + с + + + s/NM + с/NM + + + m + м + + + ° + ° + + + Close + Закрыть + + + Compare competitors + Сравнить участников + + + Description + Описание + + + Sail number + Номер на парусе + + + Country + Страна + + + Unable to find the IOC 3-letter-codes. + Не удалось найти 3-буквенные коды IOC. + + + Add + Добавить + + + Delete + Удалить + + + Show charts + Показать диаграммы + + + A race with that name already exists. + Гонка с таким названием уже существует. + + + A race with that name already exists in this regatta. + Гонка с таким названием уже существует в данной регате. + + + Head up + Приведение к ветру + + + Bear away + Увал под ветер + + + Tack + Оверштаг + + + The amount of tacks sailed in this race. + Число совершенных поворотов оверштаг в данной гонке. + + + Jibe + Фордевинд + + + The amount of jibes sailed in this race. + Число совершенных поворотов фордевинд в данной гонке. + + + Penalty circle + Штрафной круг + + + The amount of penalty circles sailed in this race. + Число штрафных кругов, пройденных в данной гонке. + + + Mark passing + Прохождение отметки + + + Mark + Отметка + + + Unknown maneuver + Неизвестный маневр + + + Douglas peucker points + Точки Дугласа – Пекера + + + Filter races by name + Фильтровать гонки по названию + + + Filter media by name + Фильтровать носители по названию + + + Track settings + Параметры отслеживания + + + Edit + Изменить + + + Edit competitors + Изменить участников + + + Edit scores + Изменить оценки + + + Open in Browser + Открыть в браузере + + + Remove + Удалить + + + Edit Series + Изменить серию + + + Edit or rename race + Изменить или переименовать гонку + + + Unlink race + Отменить связывание гонки + + + Remove race + Удалить гонку + + + Export as XML + Экспортировать как XML + + + Open Coach Dashboard + Открыть панель тренера + + + Filter leaderboards by name + Фильтровать таблицы лидеров по названию + + + Actions + Действия + + + Is linked + Связано + + + Yes + Да + + + No + Нет + + + Hover over a point for details + Наведите указатель для просмотра подробностей + + + No selection + Ничего не выбрано + + + Race starts with upwind leg + Гонка начинается против ветра + + + Events + События + + + Settings for {0} + Параметры для {0} + + + No events were found + События не найдены + + + No event selected + Не выбрано событие + + + No leaderboards were found + Таблицы лидеров не найдены + + + Search for events + Поиск событий + + + Location + Место + + + From + С + + + Until + По + + + Only live events + Только текущие события + + + Location not available + Место недоступно + + + Start date not available + Дата начала недоступна + + + Start date + Дата начала + + + End date + Дата окончания + + + Unknown maneuver + Неизвестный маневр + + + the tail length must be a number greater than zero. + длина хвоста должна быть задана числом больше нуля. + + + Failed to load race information: {0} + Не удалось загрузить сведения о гонке: {0} + + + {0} passed {1} at {2} + {0} пройдено {1} в {2} + + + {0} at {1}: {2} + {0} в {1}: {2} + + + Do you really want to remove the race ''{0}''? Note: all race logs for this race will also permanently be removed! + Действительно удалить гонку ''{0}''? Примечание: все журналы для этой гонки также будут окончательно удалены! + + + Show details + Показать подробности + + + Hide leaderboard + Скрыть таблицу лидеров + + + Hide leaderboards + Скрыть таблицы лидеров + + + Show leaderboard + Показать таблицу лидеров + + + Hide races + Скрыть гонки + + + Show map + Показать карту + + + Hide map + Скрыть карту + + + No leaderboard selected + Не выбрана таблица лидеров + + + Leaderboard groups + Группы таблиц лидеров + + + Filter leaderboard groups by name + Фильтровать группы таблиц лидеров по названию + + + Create leaderboard group + Создать группу таблиц лидеров + + + Leaderboard Group Configuration + Конфигурация группы таблиц лидеров + + + Legs + Отрезки + + + On Leg + На отрезке + + + The number of the leg on which the competitor currently is, starting with 1 + Номер отрезка, на котором сейчас находится участник, начиная с 1. + + + Leaderboard Group + Группа таблиц лидеров + + + Please enter a non-empty description + Введите непустое описание + + + A leaderboard group with this name already exists. + Группа таблиц лидеров с таким названием уже существует. + + + Details of leaderboard group + Подробности группы таблиц лидеров + + + Edit + Изменить + + + Save + Сохранить + + + Abort + Прервать + + + No leaderboard group with the name {0} found + Группа таблиц лидеров названием {0} не найдена + + + Overview + Обзор + + + Welcome to SAP Sailing Analytics + Вас приветствует SAP Sailing Analytics + + + SAP brings sailing fans closer to the on-water action than ever before.\ The live-leaderboard enhances the fan experience through real-time rankings, boat speeds and winning margins. Follow every race and never miss a passing maneuver with SAP.\ This is the simple way to watch live sail racing from wherever you are. + SAP позволяет любителям парусного спорта подойти к происходящему на воде ближе, чем когда-либо ранее.\ Онлайн-таблица лидеров содержит обновляемые в режиме реального времени данные о рангах участников, скоростях лодок и преимуществе лидеров. Следите за каждой гонкой и не пропустите ни одного маневра с SAP.\ Это удобный способ наблюдения за парусными гонками в реальном времени откуда угодно. + + + Home + Главная + + + Click and drag in the plot area to zoom in + Щелкните и перетащите в область визуализации для увеличения + + + Wind speed (kts) + Скорость ветра (уз) + + + All times in UTC + Время UTC + + + Auto zoom to + Автоувеличение до + + + Boats + Лодки + + + Buoys + Буи + + + Wind sensors + Датчики ветра + + + Off + Выкл. + + + Tails + Хвосты + + + Zoom only to selected competitors + Увеличить только до выбранных участников + + + Bearing + Ветер + + + Zoom + Увеличить + + + Step size must be greater than 0 + Размер шага должен быть больше 0 + + + Step size in seconds + Размер шага в секундах + + + Refresh interval (s) + Интервал обновления (с) + + + Refresh interval must be greater than {0} seconds + Интервал обновления должен быть больше {0} с + + + Competitor Chart + Диаграмма участника + + + To show the competitor charts, select at least one competitor + Чтобы просмотреть диаграммы участника, выберите хотя бы одного участника + + + To send invitation E-Mails, select at least one competitor + Чтобы отправить приглашения по эл. почте, выберите хотя бы одного участника + + + Direction change + Изменение направления + + + Speed change + Изменение скорости + + + deg + град. + + + Untracked + Не отслеживается + + + Delay for live mode: + Задержка для оперативного режима: + + + Not available + Недоступно + + + Details + Подробности + + + No group selected + Не выбрана группа + + + Combined + Объединено + + + Course Layout + Схема курса + + + Estimation + Расчетная + + + Measured + Измеренная + + + Manual + Вручную + + + Race Committee + Гоночный комитет + + + Click on the chart to set the time + Щелкните диаграмму, чтобы установить время + + + Position + Позиция + + + Wind Sources Used + Используемые источники ветра + + + Error trying to update wind sources to exclude for race {0}: {1} + Ошибка при попытке обновить источники ветра к исключению для гонки {0}: {1} + + + Feedback + Обратная связь + + + Start/Stop playing + Начать/остановить воспроизведение + + + Jump back to live time point + Вернуться к текущей отметке времени + + + Slow play speed down or even run backwards + Замедлить воспроизведение или даже запустить в обратном направлении + + + Speed play speed up or run forward again + Ускорить воспроизведение или снова запустить в прямом направлении + + + Show/Hide {0} + Показать/скрыть {0} + + + Angle to wind + Угол к ветру + + + Races in leaderboard + Гонки в таблице лидеров + + + Leaderboards in group + Таблицы лидеров в группе + + + Replication + Репликация + + + Error fetching replica data: {0} + Ошибка извлечения данных реплики: {0} + + + ∅ XTE + ∅ XTE + + + The average cross track error to the great circle segment connecting leg start with leg end + Среднее боковое уклонение к большому круговому сегменту, соединяющему начало отрезка с концом отрезка + + + ∅ XTE +/- + ∅ XTE +/- + + + The average position on the course as a signed distance from the course middle line; 0 meaning on the course middle line; negative values mean left-hand side, positive values mean right-hand side. + Средняя позиция на курсе как расстояние (со знаком) от средней линии курса; отрицательные значения означают уклонение влево, положительные — вправо. + + + The average absolute cross track error to the great circle segments connecting leg start with leg end for all upwind legs of this race, ignoring to which side of the course middle line the competitor is + Среднее абсолютное боковое уклонение к большим круговым сегментам, соединяющим начало отрезка с концом отрезка, для всех наветренных отрезках данной гонки без учета стороны участника от средней линии курса + + + The signed average cross track error to the great circle segments connecting leg start with leg end for all upwind legs of this race; negative values mean left of the course middle line, positive values mean right. + Боковое уклонение (со знаком) к большим круговым сегментам, соединяющим начало отрезка с концом отрезка, для всех наветренных отрезков данной гонки; отрицательные значения означают уклонение влево от средней линии курса, положительные — вправо. + + + Hostname of Master Instance + Имя хоста главного экземпляра + + + Error starting replication from host {0} / exchange {1}: {2} + Ошибка запуска репликации с хоста {0}/Exchange {1}: {2} + + + Help lines + Вспомогательные линии + + + Start line + Стартовая линия + + + Finish line + Финишная линия + + + Advantage line + Лини преимущества + + + Course middle line + Средняя линия курса + + + Messaging port number (0 for default) + Номер порта обмена сообщениями (0 по умолчанию) + + + Servlet port number + Номер порта сервлета + + + Registered at {0} + Зарегистрировано в {0} + + + Replicating from master {0}:{2}, messaging port {3}:{1}, exchange {4} + Репликация с главного экземпляра {0}:{2}, порт обмена сообщениями {3}:{1}, Exchange {4} + + + Show wind speed data + Показать данные о скорости ветра + + + Show wind directions data + Показать данные о направлениях ветра + + + Fleet + Флот + + + Boat Class + Класс лодок + + + Set delay to live + Установить задержку оперативных данных + + + Please enter a venue. + Введите место. + + + Please enter a start date and an end date. + Введите даты начала и окончания. + + + The start date must be before the end date. + Дата начала должна быть раньше даты окончания. + + + An event with this name already exists. + Событие с таким названием уже существует. + + + Venue + Место + + + Please select a boat class. + Выберите класс лодки. + + + A regatta with this name already exists. + Регата с таким названием уже существует. + + + A series with this name already exists. + Серия с таким названием уже существует. + + + A fleet with this name already exists. + Флот с таким названием уже существует. + + + Fleets + Флоты + + + Series + Серия + + + Split fleet + Разделить флот + + + Color + Цвет + + + Medal Series + Серия на медали + + + No color + Без цвета + + + Please select a regatta. + Выберите регату. + + + Add fleet + Добавить флот + + + Do you really want to remove the regatta "{0}"? This will also remove all leaderboards for this regatta! + Действительно удалить регату "{0}"? При этом также будут удалены все таблицы лидеров для данной регаты! + + + Error loading score correction providers: {0} + Ошибка при загрузке поставщиков корректировки оценок: {0} + + + Select result list to import from + Выберите список результатов для импорта + + + of + из + + + Error obtaining score corrections from provider {0} and event {1} for boat class {2} published on {3}: {4} + Ошибка при получении корректировок оценок от поставщика {0} и события {1} для класса лодок {2}, опубликованных в {3}: {4} + + + Assign race numbers of official results to leaderboard race columns + Присвойте номера гонок официальных результатов столбцам гонок таблицы лидеров + + + Import official results... + Импорт официальных результатов... + + + Select all + Выбрать все + + + Apply + Применить + + + Successfully updated scores + Оценки успешно обновлены + + + Error updating scores for leaderboard {0}: {1} + Ошибка при обновлении оценок для таблицы лидеров {0}: {1} + + + Maneuver types to show when competitor is clicked + Типы маневров для отображения при щелчке участника + + + Simulate as live race + Симулировать как текущую гонку + + + Offset before start in minutes: + Сдвиг перед стартом в минутах: + + + The selected races contain boat classes which are not the same as the boat class ''{0}'' of the selected regatta. No races will be loaded. + Выбранные гонки содержат классы лодок, не совпадающие с классом лодок ''{0}'' выбранной регаты. Гонки не будут загружены. + + + There is at least one regatta for the selected boat classes. Really create default regatta(s) for those race(s)? + Для выбранных классов лодок имеется минимум одна регата. Создать регаты по умолчанию для соответствующих гонок? + + + Reload + Перезагрузить + + + Add Regatta... + Добавить регату... + + + Import Regattas... + Импортировать регаты... + + + Exchange Name + Имя Exchange + + + Course + Курс + + + Course layout + Схема курса + + + Buoy + Буй + + + Gate + Ворота + + + Buoys + Буи + + + Waypoint + Путевая точка + + + Show all competitors + Показать всех участников + + + Boat tails + Хвосты лодок + + + Start line to first Mark Triangle + Линия старта до треугольника первой отметки + + + Result import URLs + URL-адреса импорта результатов + + + Error refreshing result import URL list: {0} + Ошибка при обновлении списка URL-адресов импорта результатов: {0} + + + Successfully updated result import URL list + Успешно обновлен список URL-адресов импорта результатов + + + Error removing result import URLs: {0} + Ошибка при удалении URL-адресов импорта результатов: {0} + + + Please enter a URL. + Введите URL-адрес. + + + Add result import URL + Добавьте URL-адрес импорта результатов + + + Error adding result import URL: {0} + Ошибка при добавлении URL-адресов импорта результатов: {0} + + + Remote Server Instances + Удаленные экземпляры сервера + + + Local Server + Локальный сервер + + + Error refreshing SailingServer instances: {0} + Ошибка при обновлении экземпляров SailingServer: {0} + + + Successfully updated SailingServer instances + Экземпляры SailingServer успешно обновлены + + + Error removing SailingServer instances: {0} + Ошибка при удалении экземпляров SailingServer: {0} + + + Add SailingServer instance + Добавить экземпляр SailingServer + + + Error adding SailingServer instance: {0} + Ошибка при добавлении экземпляра SailingServer: {0} + + + Error trying to obtain leaderboard contents: {0} + Ошибка при попытке получить содержимое таблицы лидеров: {0} + + + Last Score Update + Последнее обновление оценок + + + This website is not optimized for your browser. Please switch to a newer one like Firefox or Chrome. + Этот веб-сайт не оптимизирован для вашего браузера. Перейдите на более новый, такой как Firefox или Chrome. + + + New Mark + Новая отметка + + + Mark/Gate + Отметка/ворота + + + Error updating race course: {0} + Ошибка при обновлении курса гонки: {0} + + + Successfully updated race course + Курс гонки успешно обновлен + + + Select two marks to create a gate + Выберите две отметки, чтобы создать ворота + + + Error trying to obtain the marks of the race course: {0} + Ошибка при попытке получить отметки курса гонки: {0} + + + Error trying to obtain the race course: {0} + Ошибка при попытке получить курс гонки: {0} + + + Insert waypoint before selected + Вставка путевой точки перед выбранной + + + Insert waypoint after selected + Вставка путевой точки после выбранной + + + Add Gate + Добавить ворота + + + Low Point System + Система низких баллов + + + High Point System + Система высоких баллов + + + High Point System ESS Overall (10) + Итоговая оценка ESS по системе высоких баллов (10) + + + High Point System ESS Overall (12) + Итоговая оценка ESS по системе высоких баллов (12) + + + Score in points. Winner of an act scores 12 points, 2nd - 11 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. + Оценка в баллах. Победитель в акте получает 12 баллов, 2-й — 11 баллов, .... Любая ничья в общей оценке Extreme Sailing Series разрешается в пользу участника с наибольшим числом побед в актах. В случае равенства числа побед для разрешения используется последний акт. + + + High Point System, Last Race Breaks Tie + Система высоких баллов, последняя гонка разрешает ничью + + + Low Point System, Winner Gets Zero + Система низких баллов, победитель получает ноль + + + High Point System, Winner Gets 5 Points + Система высоких баллов, победитель получает 5 баллов + + + High Point System, Winner Gets 6 Points + Система высоких баллов, победитель получает 6 баллов + + + High Point System, Winner Gets 8 Points + Система высоких баллов, победитель получает 8 баллов + + + High Point System, Winner 8 Points, Interpolated + Система высоких баллов, победитель 8 баллов, интерполяция + + + Low Point with Eliminations and Rounds, Winner Gets 0.7 Points + Низкий балл с турами на выбывание, победитель получает 0,7 балла + + + A variant of the low-point scoring scheme, using eliminations consisting of rounds.\nEach round shall be modeled as a series in the regatta, and the fleet ordering counts backwards\nstarting with the highest number for the first round.\nIf a final and losers final take place, use 1 and 2 as their ordering. Start with 3 for the semi-final round. + Вариант схемы оценки с низкими баллами, использующий туры на выбывание.\nКаждый тур моделируется как серия в регате, и суда ранжируются в обратном порядке,\nначиная с наибольшего числа за первый раунд.\nВ финале и при определении 3-го места используйте ранги 1 и 2. Для полуфинального тура начните с 3. + + + Low Point, ties broken by act point sum, then last act + Низкий балл, ничьи разрешаются по сумме актов, затем по последнему акту + + + Instead of the usual count-back system used for low point schemes to break ties, competitors with equal point sums are compared by comparing the sum of the points they scored across all acts. If this still leaves a tie, the tie is broken by the last act. + Вместо обычной системы обратного отчета, используемой для разрешения ничьих в схемах низких баллов, участники с равными суммами баллов сравниваются по сумме баллов, полученных за все акты. Если равенство сохраняется, оно разрешается по последнему акту. + + + High Point, winner gets 1 point + Высокий балл, победитель получает 1 балл + + + High Point, winner gets 10 points + Высокий балл, победитель получает 10 баллов + + + High Point, winner gets 10 points (or 8) + Высокий балл, победитель получает 10 баллов (или 8) + + + Score in points. Winner scores 10 points, 2nd - 9 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. + Оценка в баллах. Победитель получает 10 баллов, 2-й — 9 баллов, .... Ничья разрешается в пользу участника, имеющего больше побед в гонках, если равенство сохраняется, оно разрешается по рангу в последней гонке. + + + High Point, winner gets 12 points (or 8) + Высокий балл, победитель получает 12 баллов (или 8) + + + Score in points. Winner scores 12 points, 2nd - 11 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. + Оценка в баллах. Победитель получает 12 баллов, 2-й — 11 баллов, .... Ничья разрешается в пользу участника, имеющего больше побед в гонках, если равенство сохраняется, оно разрешается по рангу в последней гонке. + + + Scoring system + Система оценок + + + Create flexible leaderboard + Создать гибкую таблицу лидеров + + + Create regatta leaderboard + Создать таблицу лидеров регаты + + + Create default regatta leaderboard + Создать таблицу лидеров регаты по умолчанию + + + Edit flexible leaderboard + Изменить гибкую таблицу лидеров + + + Edit regatta leaderboard + Изменить таблицу лидеров регаты + + + Default regatta + Регата по умолчанию + + + Use Overall leaderboard + Использовать итоговую таблицу лидеров + + + Overall Standings + Итоговые позиции + + + Type + Тип + + + Add races + Добавить гонки + + + races with name prefix + гонки с префиксом названия + + + Max SOG + Макс. SOG + + + The competitor''s greatest speed over ground measured in the regatta. + Максимальная скорость участника относительно грунта в ходе данной регаты. + + + Total time downwind + Общее время по ветру + + + The total time the competitor sailed downwind in the regatta. + Общее время хода участника по ветру в данной регате. + + + Total time upwind + Общее время против ветра + + + The total time the competitor sailed upwind in the regatta. + Общее время хода участника против ветра в данной регате. + + + Total time reaching + Общее время полным ветром + + + The total time the competitor sailed on reaching legs in the regatta. + Общее время хода участника полным ветром в данной регате. + + + Total time + Общее время + + + The total time the competitor sailed in the regatta, counted from race start time. + Общее время хода участника в данной регате, отсчитываемое от времени старта регаты. + + + Total distance + Общее расстояние + + + The total distance sailed in the regatta. + Общее пройденное расстояние в данной регате. + + + ∅ SOG + ∅ SOG + + + Average speed over ground across the regatta. + Средняя скорость относительно грунта в течение данной регаты. + + + hh:mm:ss + чч:мм:сс + + + Add wind data + Добавить данные о ветре + + + The value of ''{0}'' must be between {1} and {2}. + Значение ''{0}'' должно быть между {1} и {2}. + + + The value of ''{0}'' must be greater than {1}. + Значение ''{0}'' должно быть больше {1}. + + + optional + необязательно + + + Please enter a value. + Введите значение. + + + Latitude + Широта + + + Longitude + Долгота + + + Add Event + Добавить событие + + + Publication URL + URL-адрес публикации + + + Suppress + Подавлять + + + Is public + Общедоступно + + + Unsuppress + Отменить подавление + + + Suppressed Competitors + Подавляемые участники + + + Audio & Video + Аудио и видео + + + URL + URL-адрес + + + MIME Type + Тип MIME + + + Title + Название + + + Duration (h:mm:ss.ms) + Длительность (ч:мм:сс.мс) + + + Add Audio/Video + Добавить аудио/видео + + + Add Youtube + Добавить Youtube + + + Youtube Id + Ид. Youtube + + + Do you really want to remove media track ''{0}''? + Действительно удалить объект мультимедиа ''{0}''? + + + Please select a series + Выберите серию + + + Please select a race + Выберите гонку + + + Display groups in reverse order + Показывать группы в обратном порядке + + + Configure URL + Настроить URL-адрес + + + Configure a leaderboard and obtain the resulting URL from the link + Настройте таблицу лидеров и получите разультирующий URL-адрес из ссылки + + + Embedded + Внедрено + + + Additional URL Settings + Дополнительные параметры URL-адреса + + + Restrict to single selected race + Ограничить одной выбранной гонкой + + + Expand selected race + Развернуть выбранную гонку + + + Allow for race details + Разрешить подробности гонки + + + Number of races + Число гонок + + + Please enter the number of last races to be displayed + Введите число последних гонок для просмотра + + + Choose the way you select races + Выберите способ выбора гонок + + + Select from all races + Выбрать из всех гонок + + + Select a number of races + Выберите число гонок + + + Number of most current races to show + Число последних гонок для просмотра + + + Always expand last race shown + Всегда развертывать посленюю отображаемую гонку + + + Factor + Фактор + + + Error updating the medal race setting: {0} + Ошибка при обновлении параметра гонки на медали: {0} + + + Maneuver loss + Потеря маневра + + + ∅ Maneuver Loss + ∅ Потеря маневра + + + The average distance loss during any mneuver. + Средняя потеря дистанции в ходе маневра. + + + ∅ Tack Loss + ∅ Потеря на оверштаг + + + The average distance loss during tacks. + Средняя потеря дистанции при поворотах оверштаг. + + + ∅ Jibe Loss + ∅ Потеря на фордевинд + + + The average distance loss during jibes. + Средняя потеря дистанции при поворотах фордевинд. + + + Shape + Форма + + + Pattern + Образец + + + Legend + Условные знаки + + + live + активно + + + SwissTiming Archived Events + Архив событий SwissTiming + + + Error fetching chart data: {0} + Ошибка при извлечении данных диаграммы: {0} + + + Loading competitor data... + Загрузка данных участника... + + + {0} after race {1} + {0} после гонки {1} + + + Ranking + Ранг + + + Total points + Всего баллов + + + Competitor''s total points in the race + Общий балл участника в данной гонке + + + Competitor''s total points in the regatta + Общий балл участника в данной регате + + + Show rank chart + Показать диаграмму ранга + + + Overall Leaderboard + Итоговая таблица лидеров + + + Error trying to obtain overall leaderboards: {0} + Ошибка при попытке получить итоговые таблицы лидеров: {0} + + + finished + завершено + + + upcoming + предстоит + + + Next + Далее + + + in progress + выполняется + + + passed to {0} + передано {0} + + + Gap Change + Изменение отставания + + + The change of the gap to the leader since the last leg start.\nA negative number means that the gap was decreased;\na positive number means that it was increased. + Изменение отставания от лидера с момента начала последнего отрезка.\nОтрицательное число означает уменьшение отставания;\nположительное — увеличение. + + + Mark rounded to + Обход отметки + + + Side to which the mark at leg start was rounded. + Сторона, с которой была обойдена отметка в начале отрезка. + + + Race {0} is live + Гонка {0} активна + + + Races {0} are live + Гонки {0} активны + + + Regatta {0} is live + Регата {0} активна + + + Regattas {0} are live + Регаты {0} активны + + + kts + уз + + + {0,number,#0.0} kts + {0,number,#0.0} уз + + + {0,number,#0.0} - {1,number,#0.0} kts + {0,number,#0.0}–{1,number,#0.0} уз + + + Generate Polar Sheet + Генерировать полярные данные + + + Polar Diagrams + Полярные диаграммы + + + Polar Sheet + Полярные данные + + + Minimum datapoints per graph + Минимум точек данных на граф + + + All graphs with less underlying datapoints are not shown visually.\nThis way there are no distracting diagrams shown for\nwindspeeds lacking a sufficient amount of data. + Все графы с меньшим объемом базовых данных не визуализируются.\nЭто устраняет отображение диаграмм\nпо скоростям ветра с недостаточным объемом данных. + + + Minimum datapoints per angle + Минимум точек данных на угол + + + In each graph only data about angles with at least the given amount\nof underlying datapoints will be shown. Insignificant\nparts of the diagram can be hidden using this threshold. + В каждом графе будут показаны только данные об углах с объемом\nбазовых данных не меньше указанного. Этот порог\n позволяет скрыть незначимые части диаграммы. + + + Minimum wind confidence value + Минимальное значение достоверности ветра + + + Only fixes with wind having a confidence over the given threshold are\nused. This confidence is between 0 and 1. + Учитываются только замеры ветра с достоверностью выше указанного порога.\nДостоверность изменяется от 0 до 1. + + + Minimum confidence measure + Минимальный показатель достоверности + + + The minimum confidence measure for a point shown in the graph.\nIf it''s below the given threshold, the point won''t show.\nThe measure is between 0 and 1 and determined\nusing statistical measures. + Минимальный показатель достоверности для точки на графе.\nЕсли оно ниже указанного порога, точка не отображается.\nПоказатель изменяется от 0 до 1 и определяется\nпо статистическим показателям. + + + Use only wind gauge data for wind speed + Использовать для скорости ветра только данные анемометра + + + By taking only the speed data of wind gauges into account\nwe exclude guessed manually entered wind speeds, which can falsify the polar diagram. + Учитывая только данные скорости с датчиков ветра,\nмы исключаем скорости ветра, вводимые вручную на глаз, способные исказить полярную диаграмму. + + + Use only estimation for wind direction + Использовать только расчетное направление ветра + + + By using the accurate wind estimation for the wind direction,\nwe fix polar diagrams that are rotated due to invalid wind\ngauge data. + Используя точный расчет направления ветра,\nмы исправляем полярные диаграммы, повернутые из-за неверных данных\nдатчика ветра. + + + Remove outliers (Distance based approach) + Удалять выбросы (подход на базе дистанции) + + + Outliers are removed by a distance based approach.\nThe parameters can be adjusted below. + Выбросы удаляются на основании дистанции.\nПараметры можно настроить ниже. + + + Outlier detection neighborhood radius + Радиус обнаружения выбросов + + + The radius used in the distance based outlier\ndetection algorithm. + Радиус, используемый в алгоритме обнаружения\nвыбросов на базе дистанции. + + + Minimum outlier detection neighborhood percentage + Минимальный процент окрестности обнаружения выбросов + + + The percentage of neightborhood datapoints / overall datapoints\nneeds to be at less than the given value for the point to be considered an outlier. + Процент точек данных окрестности от общего числа точек данных\nдолжен быть не меньше указанного значения, чтобы считать точку выбросом. + + + Number of histogram columns per wind range + Число столбцов гистограммы на диапазон ветра + + + Wind stepping in knots + Скорость ветра в узлах + + + Max. distance to wind level + Макс. дистанция до уровня ветра + + + Sets a max radius for which fixes will be assigned to the wind levels. + Задает максимальный радиус, замеры для которого будут присваиваться уровням ветра. + + + Split Windsources + Разделить источники ветра + + + Splitting Windsources allows a better search for bad wind gauges.\nThe statistical correctness cannot be guaranteed. The same fix can\ncount into the resulting polar sheet multiple times (for different wind gauges). + Разделение источников ветра улучшает поиск поврежденных датчиков ветра.\nСтатистическая корректность не гарантируется. Один и тот же замер\nможет быть учтен в результирующих полярных данных несколько раз (для разных датчиков). + + + Apply minimum wind confidence + Применить минимальную достоверность ветра + + + If checked the value in the box above will be used as the minimum valid wind confidence during generation. + Если установлено, указанное выше значение будет использоваться как минимально допустимая достоверность ветра при генерировании. + + + Distribution in the wind range. + Распределение в диапазоне ветра. + + + Please hover over the options to view tooltips where available. + Наведите указатель на параметр, чтобы просмотреть всплывающую подсказку (если доступна). + + + Names of the members of this competitor. + Имена членов данного участника. + + + Shows the flag of the country and the sail number of the competitor. + Показывает флаг страны и хвостовой номер участника. + + + The overall rank of this competitor in the regatta. + Общий ранг данного участника в регате. + + + Points carried over from previous races. + Баллы, перенесенные из других гонок. + + + The total of all points of a competitor in the regatta.\nSorting based on rank, not points. + Общая сумма всех баллов участника в регате.\nСортировка по рангу, не по баллам. + + + Wind data + Данные о ветре + + + GPS data + Данные GPS + + + Status + Статус + + + No data found + Данные не найдены + + + Display name + Отображаемое имя + + + Histogram + Гистограмма + + + Number of data points + Число точек данных + + + Angle: {0}; Total number of data-points: {1}; Coefficiant of Variation: {2}; Confidence Measure: {3} + Угол: {0}; общее число точек данных: {1}; коэффициент вариации: {2}; показатель достоверности: {3} + + + Buoy zone + Зона буя + + + Radius (m) + Радиус (м) + + + Filter regattas by name + Фильтровать регаты по названию + + + There are no regattas yet. + Регат еще нет. + + + Add course area + Добавить зону гонки + + + Course areas + Зоны гонок + + + Course area + Зона гонки + + + Please enter a course area. + Введите зону гонки. + + + Please select a course area. + Выберите зону гонки. + + + Upper flag + Верхний флаг + + + Lower flag + Нижний флаг + + + This is a regatta leaderboard. You can only add races to this leaderboard directly in the regatta definition. + Это таблица лидеров регаты. Вы можете добавлять гонки в эту таблицу лидеров только непосредственно в определении регаты. + + + Correct Score + Правильная оценка + + + Correct score for competitor {0} in race {1} + Правильная оценка для участника {0} в гонке {1} + + + Penalty/Redress + Взыскание/компенсация + + + Net points + Точки сети + + + Time point must be after start of tracking. + Отметка времени должна быть после начала отслеживания. + + + Time point must be before end of tracking. + Отметка времени должна быть раньше окончания отслеживания. + + + Regatta used for the tracked race + Регата, используемая для отслеживаемой гонки + + + TracTrac Server Update URI + URI обновления сервера TracTrac + + + Passing instructions + Передача инструкций + + + Refresh now + Обновить сейчас + + + Stop updating + Прекратить обновление + + + Start updating + Начать обновление + + + Current time: + Текущее время: + + + TracTrac username + Имя пользователя TracTrac + + + TracTrac password + Пароль TracTrac + + + Equals + Равно + + + Not equals to + Не равно + + + Less than + Меньше + + + Less or equals + Меньше или равно + + + Greater than + Больше + + + Greater or equals + Больше или равно + + + Contains + Содержит + + + Not Contains + Не содержит + + + Starts with + Начинается с + + + Ends with + Заканчивается на + + + Nationality + Гражданство + + + The number must be greater than zero. + Число должна быть больше нуля. + + + Distance to line at Start + Дистанция до линии при старте + + + Distance to line 5s before start + Дистанция до линии за 5 с до старта + + + SOG at Start + SOG при старте + + + SOG 5s before start + SOG за 5 с до старта + + + SOG when Starting + SOG при старте + + + Distance to start line at race start time + Дистанция до линии старта во время старта гонки + + + Distance to start line five seconds before the start + Дистанция до линии старта за пять секунд до старта + + + Speed over ground at race start time + Скорость относительно грунта во время старта гонки + + + Speed over ground five seconds before the start + Скорость относительно грунта за пять секунд до старта + + + Speed over ground when the competitor passed the start + Скорость относительно грунта при прохождении старта участником + + + Start Tack + Стартовый галс + + + Tack on which the competitor started + Галс, на котором стартовал участник + + + Port + Левый + + + Starboard + Правый + + + Port + Левый + + + Starboard + Правый + + + Please enter a number. + Введите число. + + + Competitors filter + Фильтр участников + + + Flag status + Статус флага + + + Info + Инфо + + + Wind Fixes (first 3, last 3, true values) + Замеры ветра (первые 3, последние 3, истинные значения) + + + No Wind-Fixes available. + Нет доступных замеров ветра. + + + Dist. Stb-Side of Line when Starting + До правой стороны линии при старте + + + Distance to starboard side of start line or to the single start mark when the competitor passed the start + Дистанция до правой стороны линии старта или отметки старта при прохождении старта участником + + + Add filter + Добавить фильтр + + + Edit filter + Изменить фильтр + + + Available filters + Доступные фильтры + + + Create a filter set to filter the list of competitors. + Создание набора фильтров для фильтрации списка участников. + + + A filter with this name already exists. + Фильтр с таким названием уже существует. + + + Add at least one filter criteria. + Добавьте минимум один критерий фильтра. + + + Filter criteria + Критерии фильтра + + + Select a filter criteria + Выберите критерии фильтра + + + Filter name + Название фильтра + + + operator + оператор + + + value + значение + + + The nationality must be a two letter ISO code or a three letter IOC code. + Гражданство должно быть указан двузначным кодом ISO или трехзначным кодом IOC. + + + Race rank + Ранг гонки + + + Waypoints + Путевые точки + + + Disable filter + Отключить фильтр + + + Enable filter + Включить фильтр + + + Race Status + Статус гонки + + + Loading (on a slow internet connection this can take some minutes)... + Загрузка (при медленном подключении к Интернету может занять несколько минут)... + + + Races with state HIDDEN + Гонки с состоянием СКРЫТО + + + Invalid date format. Use: {0} + Недопустимый формат даты. Используйте формат: {0} + + + Selected competitors + Выбранные участники + + + Filter nothing + Не фильтровать + + + Race Top {0} + Первые {0} в гонке + + + Total Top {0} + Первые {0} в общем зачете + + + Simulator + Симулятор + + + Optionsbar + Панель параметров + + + Predict + Прогноз + + + Setup + Настройка + + + Strength (in kn) + Сила (кН) + + + Oscillation + Колебание + + + Oscillating + Колебания + + + Amplitude(in Grad) + Амплитуда (в град.) + + + Frequency(in 1/h) + Частота (1/ч) + + + Noise + Шум + + + Sailing + Плавание + + + Optimality + Оптимум + + + Maximum Turns + Максимум поворотов + + + Race Direction + Направление гонки + + + Upwind + Против ветра + + + Downwind + По ветру + + + Strategies + Стратегии + + + Omniscient + Всезнайка + + + Opportunist + Авантюрист + + + Mixed + Смешанная + + + Maps + Карты + + + Start-End + Начало-конец + + + Course + Курс + + + Summary + Сводка + + + Replay + Воспроизвести + + + Display + Просмотреть + + + Polar diagram + Полярная диаграмма + + + Show + Показать + + + hide + скрыть + + + Left wind + Ветер слева + + + Right wind + Ветер справа + + + strategyOption1 + strategyOption1 + + + strategyOption2 + strategyOption2 + + + strategyOption3 + strategyOption3 + + + Leg + Этап + + + Race + Гонка + + + Competitor + Участник + + + Keep Bearings + Держать направление + + + What-If Course + Подбирать курс + + + Edit Regatta... + Изменить регату... + + + Please select a sailing event... + Выбрать событие... + + + Please select a course area.. + Выбрать зону гонки... + + + Area overview + Обзор зоны + + + Course design overview + Обзор схемы курса + + + Regatta overview + Обзор регаты + + + Additional settings + Дополнительные параметры + + + Show following course areas + Показать следующие зоны гонок + + + Show following regattas + Показать следующие регаты + + + Show only races of same day + Показать только гонки того же дня + + + Show currently running races + Показать текущие гонки + + + Series defines result discarding rules + Серия определяет правила исключения результатов + + + Add series + Добавить серию + + + Regatta defines result discarding rules + Регата определяет правила исключения результатов + + + Series starts with zero score + Серия начинается с нулевым баллом + + + Master Data Import + Импорт мастер-данных + + + Success\nCreated {0} leaderboard group(s) and {1} leaderboard(s) and {2} event(s) and {3} regatta(s). + Спех\nСоздано групп таблиц лидеров: {0}, таблиц лидеров: {1}, событий: {2}, регат: {3}. + + + Had to overwrite the following regattas, you will need to retrack their races: + Следующие регаты перезаписаны, потребуется повторное отслеживанием их гонок: + + + Regatta Overview Configuration + Конфигурация обзора регаты + + + Starts with non-discardable carry-forward + Начинается с неисключаемого переноса + + + Connect to replication master server + Подключиться к главному серверу репликации + + + Connect + Подключиться + + + Connect to Master + Подключиться к главному серверу + + + Messaging Hostname + Имя хоста обмена сообщениями + + + Hostname where the messaging queue is running on. + Имя хоста, на котором выполняется очередь сообщений. + + + Hostname where the replication master is running on. + Имя хоста, на котором выполняется главный сервер репликации. + + + The name of the exchange queue. It must be the same as configured in master. + Имя очереди Exchange. Должно совпадать с указанным на главном сервере. + + + The port of the messaging exchange queue. This is used for all data after initial load. + Порт очереди обмена сообщениями Exchange. Используется для всех данных после начальной загрузки. + + + Servlet port number that is used to connect to register this replica and receive initial load. + Номер порта сервлета, используемый для подключения для регистрации данной реплики и получения начальной загрузки. + + + Replicas registered (this server is master): + Зарегистрированные реплики (это главный сервер): + + + Connections to a master (this server is a replica): + Подключение к главному серверу (это сервер реплики): + + + No connections to a master server configured. Click the Connect to Master button to configure one. + Подключения к главному серверу не настроены. Нажмите кнопку "Подключиться к главному серверу", чтобы настроить подключение. + + + No connections from a replica found. You can connect replicas by using their AdminConsole. + Подключения от реплик не найдены. Реплики можно подключить с помощью их консоли администрирования. + + + Stop Replication + Остановить репликацию + + + As link + Как ссылка + + + Pending + Ожидание + + + Running + Выполнение + + + Finishing + Завершение + + + Finished + Завершено + + + Scheduled + Запланировано + + + Start phase + Стартовая фаза + + + General recall + Общий отзыв + + + Postponed + Отложено + + + Abandoned + Отменено + + + Drop connection to all replicas (Dangerous!) + Сбросить подключение ко всем репликам (Опасно!) + + + ATTENTION: This server is configured to be a replica. Do NOT change anything or this will lead to strange effects! + ВНИМАНИЕ: этот сервер настроен как реплика. НЕ изменяйте ничего, иначе возможны непредвиденные последствия! + + + Drop connection + Сбросить подключение + + + Time Control + Управление временем + + + The filter will show all competitors matching the criterias: + Фильтр покажет всех участников, отвечающих следующим критериям: + + + Protest time + Время протеста + + + ends + заканчивается + + + ended + закончилось + + + Flags + Флаги + + + Last update + Последнее обновление + + + No more racing today + Больше никаких гонок сегодня + + + Further signals ashore + Дальнейшие сигналы на суше + + + Early starters + Рано стартовавшие + + + Showing details for race {0} + Отображение подробностей для гонки {0} + + + Start at + Старт в + + + Finish at + Финиш в + + + Protest ends at + Протест заканчивается в + + + Unknown + Неизвестно + + + Race log + Журнал гонки + + + Regatta log + Журнал регаты + + + Refresh race log + Обновить журнал гонки + + + Race log successfully reloaded from database + Журнал гонки успешно перезагружен из базы данных + + + Reload all race logs + Перезагрузить все журналы гонок + + + Export + Экспорт + + + Sideline + Боковая линия + + + Flag displayed - eight minutes till start - the startprocedure is a gate start + Флаг установлен – восемь минут до старта – процедура старта через ворота + + + Flag displayed - five minutes till start + Флаг установлен – пять минут до старта + + + Start mode flag - four minutes till start + Флаг стартового режима – четыре минуты до старта + + + Start mode flag - disqualification for early starters - four minutes till start + Флаг стартового режима – дисквалификация для рано стартовавших – четыре минуты до старта + + + Start mode flag - penalties for early starters - four minutes till start + Флаг стартового режима – штрафы для рано стартовавших – четыре минуты до старта + + + Start mode flag - one minute till start + Флаг стартового режима – одна минута до старта + + + Start mode flag - disqualification for early starters - one minute till start + Флаг стартового режима – дисквалификация для рано стартовавших – одна минута до старта + + + Start mode flag - start with penalties for early starters - one minute till start + Флаг стартового режима – старт со штрафами для рано стартовавших – одна минута до старта + + + Flag removed - race starting signal + Флаг снят – сигнал о старте гонки + + + Individual recall - had early starters + Индивидуальный отзыв – были рано стартовавшие + + + General recall - had too many early starters - start procedure will be repeated + Общий отзыв – слишком много рано стартовавших – процедура старта будет повторена + + + Flag displayed - first competitor passed the finishing line + Флаг установлен – первый участник перешел финишную линию + + + Flag removed - last competitor passed the finishing line or the finish time limit is passed + Флаг снят – последний участник перешел финишную линию либо истек лимит времени финиширования + + + Flag removed - gate is closed + Флаг снят – ворота закрыты + + + Flag displayed - start postponed - no more racing today + Флаг установлен – старт отложен – больше никаких гонок сегодня + + + Flag displayed - start postponed - further signals ashore + Флаг установлен – старт отложен – дальнейшие сигналы на суше + + + Flag displayed - start postponed + Флаг установлен – старт отложен + + + Flag removed - start procedure starts in one minute + Флаг снят – запуск процедуры старта через одну минуту + + + Flag displayed - race abandoned - no more racing today + Флаг показан – гонка отменена – больше никаких гонок сегодня + + + Flag displayed - race abandoned - further signals ashore + Флаг установлен – гонка отменена – дальнейшие сигналы на суше + + + Flag displayed - race abandoned + Флаг установлен – гонка отменена + + + Protest time started + Время протеста началось + + + Protest time ended + Время протеста закончилось + + + Three minutes till start + Три минуты до старта + + + Two minutes till start + Две минуты до старта + + + One minute till start + Одна минута до старта + + + Race starting signal + Сигнал о старте гонки + + + Data from before/after race + Данные из до/после гонки + + + All fixes (including outliers) + Все замеры (включая выбросы) + + + Remote host: + Удаленный хост: + + + Fetch Leaderboard Group List + Извлечь список группы таблиц лидеров + + + Not a valid URL for fetching leaderboardgroups: {0} + Недействительный URL-адрес для извлечения групп таблиц лидеров: {0} + + + GET leaderboardgroups request failed for host {0} with error {1} + Сбой GET-запроса групп таблиц лидеров для хоста {0} с ошибкой {1} + + + No data was returned by the server + Сервер не вернул никаких данных + + + GET leaderboardgroups request failed with Server error. Please see server logs for more information. + Сбой GET-запроса групп таблиц лидеров с ошибкой сервера. Дополнительные сведения см. в журналах сервера. + + + Leaderboard Groups: + Группы таблиц лидеров: + + + Override existing data if names and ids match + Переопределять существующие данные при совпадении названий и идентификаторов + + + Import selected leaderboard groups + Импорт выбранных групп таблиц лидеров + + + You have to select at least one leaderboard group to import + Выберите не менее одной группы таблиц лидеров для импорта + + + Deselect all + Отменить все + + + Polar Diagram + Полярная диаграмма + + + GPS Lag + Задержка GPS + + + Ratio between time since last received GPS position and average sampling interval + Отношение между временем с момента последнего получения позиции GPS и средним интервалом дискретизации + + + Tracking quality + Качество отслеживания + + + Leg Type + Тип отрезка + + + Sail Number + Номер на парусе + + + Series leaderboard + Таблица лидеров серии + + + Regatta leaderboards + Таблицы лидеров регаты + + + Clear Selection + Очистить выбор + + + Running + Выполнение + + + Run + Выполнить + + + Done + Готово + + + Last finished + Последний финиш + + + Run + Выполнить + + + times + раз + + + Data amount + Объем данных + + + ∅ Cleaned Server Time + ∅ Очищенное время сервера + + + ∅ Cleaned Overall Time + ∅ Очищенное общее время + + + Data Mining Benchmark Results + Результаты сравнительного анализа добычи данных + + + Server Time + Время сервера + + + Confidence values need to be between 0 and 1. + Значения достоверности должны быть между 0 и 1 + + + Minimum data size values cannot be negative. + Значения минимального размера данных не могут быть отрицательными. + + + The number of histogram columns needs to be more than one. + Число столбцов гистограммы должно быть больше единицы. + + + The outlier radius needs to be a positive number. + Радиус выбросов должен быть положительным числом. + + + The outlier neighborhood percentage needs to be positive and max. 1. + Процент окрестности выброса должен быть положительным и не более 1. + + + Parameter fields cannot be empty. + Поля параметров не могут быть пустыми. + + + Error occured while trying to add\na new series to the chart. + Ошибка при попытке добавить\nновую серию в диаграмму. + + + Generating Polar Sheet... + Генерирование полярных данных... + + + Data Size + Размер данных + + + Generation finished! + Генерирование завершено! + + + Generating + Генерирование + + + Remove all sheets + Удалить все листы + + + Remove all + Удалить все + + + Select sheet + Выбрать лист + + + Cleaned Server Time + Очищенное время сервера + + + Overall Time + Общее время + + + Cleaned Overall Time + Очищенное общее время + + + Data Mining Result + Результат добычи данных + + + Group by + Группировать по + + + Calculate statistic + Рассчитать статистику + + + Worked through {0} data entries in {1} seconds + Обработано {0} зап. данных за {1} с + + + No query selected + Не выбран запрос + + + Run automatically + Выполнить автоматически + + + Upload + Отправить + + + Import Wind from Expedition + Импортировать ветер из Expedition + + + Boat Id: + Ид. лодки: + + + Do you really want to import wind into the selected {0} races?\nOnly races with applicable time window will be affected anyway. + Вы действительно хотите импортировать ветер в выбранные гонки ({0})?\nЗатронуты будут только гонки с применимым окном времени. + + + Do you really want to import wind into all races?\nOnly races with applicable time window will be affected anyway. + Вы действительно хотите импортировать ветер во все гонки ()?\nЗатронуты будут только гонки с применимым окном времени. + + + Imported wind from: {0} to: {1}. {2} races affected. + Импортирован ветер из {0} в {1}. Затронуто гонок: {2}. + + + Race: {0} ({1}) - {2} fixes from: {3} to: {4} + Гонка: {0} ({1}) – {2} зам. из: {3} в: {4} + + + Error: {0} + Ошибка: {0} + + + Toggles the visibility of the wind speed for all data sources + Переключает видимость скорости ветра для всех источников данных + + + Toggles the visibility of the wind direction for all data sources + Переключает видимость направления ветра для всех источников данных + + + Combines all other wind sources to one data set + Объединяет все другие источники ветра в один набор данных + + + A value based on the course layout (under the assumption, that the race starts with an upwind leg) + Значение, основанное на схеме курса (предполагается, что гонка начинается против ветра) + + + Calculated data from the competitor tracks + Расчетные данные из отслеживаний участника + + + Data captured from mobile measuring systems + Данные из мобильных измеряющих систем + + + Manually set data values + Вручную установить значения данных + + + Data manually set from the race officers + Данные, заданные вручную персоналом гонки + + + Sheet name + Название листа + + + You can name your polar sheet using the text field.\nA name will be generated using the boat class\nif no name is provided. + В этом текстовом поле можно указать название для\nлиста полярных данных. Если имя не указано,\nоно будет сгенерировано на базе класса лодки. + + + Time Downwind + Время по ветру + + + Time Reaching + Время полным ветром + + + Time Upwind + Время против ветра + + + Total time traveled in this race, starting to measure when competitor passes start waypoint\n(not when the race starts) + Общее время хода в данной гонке, отсчитываемое с момента прохождения участником стартовой путевой точки\n(не от старта гонки) + + + Total time traveled downwind in this race + Общее время хода по ветру в данной гонке + + + Total time traveled reaching in this race + Общее время хода полным ветром в данной гонке + + + Total time traveled upwind in this race + Общее время хода против ветра в данной гонке + + + No statistic to calculate is selected + Не выбрана статистика для расчета + + + The grouper script is empty + Скрипт группирования пуст + + + No dimension to group by is selected + Не выбрано базовое измерение для группировки + + + No grouper type is selected + Не выбран тип группирования + + + No data retriever is selected + Не выбрано средство извлечения данных + + + No query possible, because + Запрос невозможен, так как + + + Data Mining + Добыча данных + + + An error occured running the query + При выполнении запроса возникла ошибка + + + Hide toolbar + Скрыть панель инструментов + + + Show series leaderboards + Показать таблицы лидеров серии + + + Show overall leaderboard + Показать итоговую таблицу лидеров + + + length: {0}m\nangle to wind: {1}°\n{2} side has {3}m advantage + длина: {0} м\nугол к ветру: {1}°\n{2} сторона имеет преимущество {3} м + + + Do you really want to remove the events? + Действительно удалить эти события? + + + Do you really want to remove event {0}? + Действительно удалить событие {0}? + + + Line + Линия + + + Offset + Сдвиг + + + Do you really want to remove the selected competitors? + Действительно удалить выбранных участников? + + + Do you really want to remove competitor {0}? + Действительно удалить участника {0}? + + + Filter competitors by name, boat class, sail number or ID + Фильтрация участников по названию, классу лодки, номеру на парусе или идентификатору + + + Edit Competitor + Изменить участника + + + Please enter a sail number + Введите номер на парусе + + + Successfully allowed reload of competitor(s) {0}. + Успешно разрешена перезагрузка участников {0}. + + + ID + Ид. + + + Allow reload + Разрешить перезагрузку + + + Compress + Сжать + + + Use only if exporting server instance is at least\nrunning with commit 0fbf6071dea125bec4a56dee55d61c99def4a62e. + Используйте только при выполнении экспортирующего экземпляра\nсервера с commit 0fbf6071dea125bec4a56dee55d61c99def4a62e. + + + Query Runner + Выполнение запроса + + + Rerun query after refresh + Повторить запрос после обновления + + + Refresh interval mustn''t be empty + Интервал обновления не должен быть пустым + + + Selection Tables + Таблица выбора + + + Add Configuration + Добавить конфигурацию + + + There are no configurations. + Нет конфигураций. + + + Error retrieving configuration data from server. + Ошибка при получении данных конфигурации с сервера. + + + Allowed course areas + Разрешенные зоны гонок + + + Minimum rounds for Course + Минимум кругов для курса + + + Maximum rounds for Course + Максимум кругов для курса + + + Results mail recipient + Получатель результатов + + + Device Configuration + Конфигурация устройства + + + None + Нет + + + Course designer + Дизайнер курса + + + Racing procedure + Процедура гонки + + + Course names + Названия курса + + + Generate + Генерировать + + + Don''t overwrite + Не перезаписывать + + + Set regatta configuration + Настройка конфигурации регаты + + + Regatta configuration + Конфигурация регаты + + + Activate individual recall + Активировать индивидуальный отзыв + + + Activate result entry + Активировать запись результата + + + RRS26 start + RRS26 старт + + + Activate configuration + Активировать конфигурацию + + + Class flag + Флаг класса + + + Sets the class flag used for {0}. Choose ''Don''t Overwrite'' to activate the procedure''s default flag. + Установка флага класса для {0}. Выберите ''Не перезаписывать'', чтобы активировать соответствующий флаг процедуры по умолчанию. + + + When activated the Race Officer is able to call for individual recall. + При активации руководитель гонок может запросить индивидуальный отзыв. + + + When activated the Race Officer is able to enter results during and after the finishing phase. + При активации руководитель гонок может вводить результаты во время и после фазы финиширования. + + + Startmode flags + Флаги режима старта + + + Sets the available start mode flags. Choose none to enable the procedure''s default flags. + Установка доступных флагов режима старта. Выберите "Нет", чтобы активировать флаги процедуры по умолчанию. + + + Gate Start + Старт через ворота + + + Activate Pathfinder + Активировать указатель курса + + + When activated the Race Officer is able to set the Pathfinder boat. + При активации руководитель гонок может назначить лодку-указатель курса. + + + ESS Start + Старт ESS + + + Basic Start + Общий старт + + + League Start + Старт лиги + + + Configured + Настроено + + + Activate regatta configuration + Активировать конфигурацию регаты + + + Enabling this option will provide a base regatta configuration for all options unconfigured in the regatta-specific configuration. + Включение этого параметра предоставит базовую конфигурацию регаты для всех не настроенных параметров в конфигурации данной регаты. + + + Set start time + Установить время старта + + + Current pass + Текущее прохождение + + + Select a new start time for the race. If you want to set the start time to a timepoint in the past then you have to enable the checkbox to update the pass count. Please be aware of the fact that changing the pass count will have you loose all information from the previous pass (like flag events). + Выберите новое время старта для гонки. Если требуется назначить старт на время в прошлом, установите флажок для обновления счетчика прохождений. Учтите, что при изменении числа прохождений будут потеряны все сведения из предыдущих прохождений (такие как события флагов). + + + Set the start and end of tracking for the race. + Установка времени начала и окончания отслеживания гонки. + + + Activate additional golf down time + Активировать дополнительное время + + + Activate additional golf down time + Активировать дополнительное время + + + Invalid color: {0} + Недопустимый цвет: {0} + + + Igtimi Accounts + Учетные записи Igtimi + + + Error fetching all Igtimi accounts: {0} + Ошибка при извлечении всех учетных записей Igtimi: {0} + + + Add Igtimi Account + Добавить учетную запись Igtimi + + + Error authorizing access to Igtimi user {0}: {1} + Ошибка при авторизации доступа к пользователю Igtimi {0}: {1} + + + Successfully authorized access to Igtimi user {0} + Успешно авторизован доступа к пользователю Igtimi : {0} + + + Could not authorize user {0}; invalid user name or password + Не удалось авторизовать пользователя {0}; недействительное имя пользователя и пароль + + + Error getting Igtimi authorization URL: {0} + Ошибка при получении URL-адреса авторизации Igtimi: {0} + + + Add Igtimi User + Добавить пользователя Igtimi + + + Do you really want to remove the leaderboards? + Действительно удалить эти таблицы лидеров? + + + Error trying to remove Igtimi account for user {0} + Ошибка при попытке удалить учетную запись Igtimi для пользователя {0} + + + Successfully removed Igtimi account for user {0} + Успешно удалена учетная запись Igtimi для пользователя {0} + + + e-Mail address must not be empty + Адрес эл. почты не должен быть пустым + + + e-mail address + адрес эл. почты + + + Password + Пароль + + + Do you really want to remove the leaderboard: ''{0}''? + Действительно удалить таблицу лидеров ''{0}''? + + + This is a meta leaderboard. It can''t be changed here. + Это метатаблица лидеров. Изменить ее здесь невозможно. + + + Failed to set new start time. This can happen when the same start time is already present in the race log or someone has added a start time that is newer (in terms of a pass id and logical time) than the one that you just added. + Не удалось установить новое время старта. Возможно, такое же время старта уже присутствует в журнале гонки или кто-то добавить более новое (ид. прохождения и логическое время) время старта, чем добавленное вами. + + + Do you really want to remove Igtimi account granting access to data of user {0}? + Действительно удалить учетную запись Igtimi, предоставляющую доступ к данным пользователя {0}? + + + Import Wind from Igtimi + Импортировать ветер из Igtimi + + + See the ''Igtimi'' tab for account settings determining which data from Igtimi will be considered. + Параметры учетной записи, определяющие учитываемые данные из Igtimi см. на вкладке ''Igtimi''. + + + Import Wind from Igtimi + Импортировать ветер из Igtimi + + + Error importing wind data from Igtimi: {0} + Ошибка при импорте данных о ветре из Igtimi: {0} + + + The following number of fixes were imported for the listed races: {0} + Для перечисленных гонок импортировано следующее число замеров: {0} + + + {0} to start + {0} до старта + + + {0} since start + {0} от старта + + + Distance to start line + Дистанция до линии старта + + + The angle between the competitors direction and the wind + Угол между направлением участников и ветром + + + Beat Angle + Угол удара + + + You can also view the overall diagram for the available boat classes. + Также можно просмотреть общую диаграмму для доступных классов лодок. + + + Show Diagram + Показать диаграмму + + + Run the query automatically, after you changed e.g. the statistic or the grouping. + Автоматически выполнять запрос после изменения, например, статистики или группирования. + + + Reruns the query after the tables have been refreshed. + Повторно выполняет запрос после обновления таблиц. + + + Query Definition Provider + Поставщик определения запроса + + + Statistic Provider + Поставщик статистики + + + Calculate the + Рассчитать + + + Grouping Provider + Поставщик группирования + + + News and Release History + Новости и история выпусков + + + Split fleets scored contiguously + Разделенные флоты получили сходные оценки + + + Add RaceLog Tracker + Добавить средство отслеживания журнала гонки + + + Add RaceLog Trackers + Добавить средства отслеживания журнала гонки + + + Denote for RaceLog tracking + Отменить отслеживание журнала гонки + + + Start RaceLog Tracking + Начать отслеживание журнала гонки + + + Filter by Leaderboard + Фильтровать по таблице лидеров + + + Remove Leaderboard filter + Удалить фильтр таблицы лидеров + + + Competitor Registrations + Регистрации участников + + + Tracker Status + Статус средства отслеживания + + + Can only be edited before starting tracking + Редактирование возможно только до начала отслеживания + + + Define Course Layout + Определить схему курса + + + Map Devices to Competitors and Marks + Сопоставить устройства с участниками и отметками + + + Edit {0} + Изменить {0} + + + Add {0} + Добавить {0} + + + Remove {0} + Удалить {0} + + + Please enter a {0} + Введите {0} + + + Ping {0} position + Проверить связь с позицией {0} + + + Please enter a valid value for {0} ({1}) + Введите допустимое значение для {0} ({1}) + + + Copy course and competitors to other races + Копировать курс и участников для других гонок + + + Set tracking times + Установить время отслеживания + + + Now select the race column and fleet to copy the course to. + Выберите столбец гонки и флот для копирования курса. + + + Select a single row in the table, to which to copy the course. + Выберите в таблице одну строку для копирования курса. + + + Device ID + Ид. устройства + + + Device Type + Тип устройства + + + Mapped to Type + Сопоставлено с типом + + + Mapped to + Сопоставлено с + + + Device Mappings + Сопоставления устройств + + + At most one end of the mapping''s time range may be left open (left unset) + Открытым (не указанным) можно оставить не более одного конца диапазона времени сопоставления + + + Please select an item to map the device to + Выберите элемент для сопоставления с устройством + + + Device + Устройство + + + Time Range + Диапазон времени + + + Close open end of Time Range + Закрыть открытый конец диапазона времени + + + Set Timepoint that closes open time range + Установите время, закрывающее диапазон времени + + + The start of the time range must lie before its end + Начало диапазона времени должно быть раньше его окончания + + + Overall Progress + Общий ход выполнения + + + Event Overview + Обзор события + + + Start + Начать + + + Show added scores for each entry in leaderboard + Показать добавленные баллы для каждой записи в таблице лидеров + + + ratio + отношение + + + Import Wind + Импортировать ветер + + + Unchecking this option will drastically lower the amount of data transfered. + Снятие этого параметра существенно понизит объем передаваемых данных. + + + Import Device Configurations + Импортировать конфигурации устройств + + + Checking this will import ALL device configurations on the remote server. + Установка этого параметра импортирует ВСЕ конфигурации устройств на удаленный сервер. + + + Author name + Имя автора + + + Author priority + Приоритет автора + + + Remove Denotation + Удалить обозначение + + + At least one of the selected races ({0}) is missing competitor registrations. Proceed anyway? + По крайней мере в одной из выбранных гонок ({0}) отсутствуют регистрации участников. Продолжить? + + + Please select a control point + Выберите контрольную точку + + + 2-mark-controlpoint + 2-отметочная контрольная точка + + + Registered Competitors + Зарегистрированные участники + + + Competitor Pool + Пул участников + + + Select at least one + Выберите не менее одного + + + Select the Races + Выберите гонки + + + Import Fixes + Импортировать замеры + + + No remote server instances registered yet. + Удаленные инстанции сервера еще не зарегистрированы. + + + Registered remote server instances + Зарегистрированные удаленные инстанции сервера + + + Filter Events by name: + Фильтровать события по названию: + + + Leaderboards (except those of selected group) + Таблицы лидеров (кроме выбранных групп) + + + Available Leaderboard Groups + Доступные группы таблиц лидеров + + + Leaderboard Groups Assigned to Event + Присвоенные событию группы таблиц лидеров + + + Add races + Добавить гонки + + + with name prefix + с префиксом названия + + + Please select a series first. + Сначала выберите серию. + + + in {0,number} days + Через {0,number} дн. + + + tomorrow + завтра + + + today + сегодня + + + Share by mail + Поделиться по почте + + + Share on Twitter + Поделиться в Twitter + + + Share on Facebook + Поделиться в Facebook + + + {0} in {1} on {2} + {0} в {1} на {2} + String eventSharingShortText(String eventName, String venue, String dateString); + + + I''d like to share {0} in {1} on {2}. Details on: \n{3} + Хочу поделиться {0} в {1} на {2}. Подробно: \n{3} + String eventSharingLongText(String eventName, String venue, String dateString, String url); + + + I''d like to share series {0}. Details: {1} + Хочу поделиться серией {0}. Подробно: \n{1} + String seriesSharingLongText(String seriesName, String url); + + + {0} + {0} + String seriesSharingShortText(String seriesName); + + + Competitors Analytics + Анализ участников + + + There are no photos or videos available yet. + Фото или видео пока недоступны. + + + Media + Мультимедиа + + + Photos + Фото + + + Videos + Видео + + + Image + Изображение + + + Images + Изображения + + + Video + Видео + + + Flag image URL (image renders with 18x12px) + URL-адрес изображения флага (визуализируется с разрешением 18x12 пикс.) + + + Image URLs + URL-адреса изображений + + + Video URLs + URL-адреса видео + + + Sponsor Image URLs + URL-адреса изображений спонсоров + + + The current selection isn''t valid. + Текущий выбор недопустим. + + + Advance Pass ID + Ид. досрочного прохождения + + + Please select a scoring result... + Выберите результат оценки... + + + Time zone + Часовой пояс + + + Official Website URL + URL-адрес официального веб-сайта + + + Sailors Info Website URL + URL-адрес веб-сайта сведений о мореходах + + + Event Overview URL + URL-адрес обзора события + + + Logo Image URL + URL-адрес изображения логотипа + + + Show Mappings for pinged Marks + Показать сопоставления для проверенных отметок + + + Regatta name must not contain slashes + Название регаты не должно содержать символы косой черты + + + Number of races scored + Число оцененных гонок + + + Error fetching wind streamlet data: {0} + Ошибка при извлечении данных потока ветра: {0} + + + Show wind streamlets overlay + Показать наложение потоков ветра + + + Color streamlets according to wind speed + Цвет потока соответствует скорости ветра + + + Show simulation overlay + Показать наложение симуляции + + + Time Comparison:\nRace is the leg duration measured from GPS, Omniscient is the course if one would know everything about the wind, Opportunist are courses if one decides to take a turn measuring the distance to the next mark, 1-Turners are the courses if one knows everything about the wind and just takes one turn + Сравнение времени:\nгонка — это продолжительность отрезка, измеренная по данным GPS, "Всезнайка" — курс при наличии всех сведений о ветре, "Авантюрист" — курсы при принятии решения сделать поворот для измерения дистанции до следующей отметки, "1 поворот" — курсы с одним поворотом при наличии всех сведений о ветре + + + Races scored + Оцененные гонки + + + Number of races the competitor has completed or gotten a score for in this leaderboard. + Число гонок, которые участник завершил или за которые имеет оценки в данной таблице лидеров. + + + Average number of operations per message + Среднее число операций на сообщение + + + Show uncorrected net points + Показать неисправленные точки сети + + + Set start time received + Установить полученное время старта + + + This sets the startTimeReceived of the selected TrackedRace that isn''t persistent. This means that the new value will be forgotten after the server has been restarted. + Устанавливает полученное время старта для выбранной отслеживаемой гонки, которое не хранится постоянно. Это значит, что после перезагрузки сервера новое значение будет забыто. + + + Last score correction time + Последнее время исправления оценки + + + Last score correction comment + Комментарий последнего исправления оценки + + + Set time to ''now'' + Установить время "сейчас" + + + Use start time inference from start mark passings + Использовать вывод о времени старта из прохождений стартовой отметки + + + Number of queue messages sent + Число отправленных сообщений очереди + + + Total Size + Общий размер + + + Average size per message in bytes + Средний размер сообщения в байтах + + + Total number of operations + Общее число операций + + + Current speed over ground in knots while leg is still running; average speed over ground when leg is completed + Текущая скорость относительно грунта в узлах во время прохождения отрезка; средняя скорость относительно грунта по завершении отрезка + + + SOG (∅ at end) + SOG (∅ в конце) + + + Connectors + Соединители + + + Video + Видео + + + Competitor Search Filter + Фильтр поиска участников + + + Search + Поиск + + + Go to event overview + Перейти к обзору события + + + Go to the overview and see all Races in one Leaderboard + Переход к обзору и просмотр всех гонок в одной таблице лидеров + + + No such event + Нет такого события + + + The leaderboard {0} is not contained in leaderboard group {1}. + Таблица лидеров {0} не входит в группу таблиц лидеров {1}. + + + The leaderboard group {0} is not contained in event {1}. + Группа таблиц лидеров {0} не содержится в событии {1}. + + + Race is Live + Гонка активна + + + Back to Live + Вернуться в оперативный режим + + + Wind Chart + Диаграмма ветра + + + No Videos + Нет видео + + + Show Video + Показать видео + + + Click to show video: {0} + Щелкните, чтобы показать видео: {0} + + + Hide Video + Скрыть видео + + + Click to hide video + Щелкните, чтобы скрыть видео + + + {0} Videos + {0} видео + + + Click to select video + Щелкните, чтобы выбрать видео + + + Manage Media + Управление мультимедиа + + + Configure audio and video clips, synchronize times + Настройка аудио- и видеоклипов, синхронизация времени + + + Show all + Показать все + + + Visibility + Видимость + + + Enter carried points for competitor {0} + Введите перенесенные баллы для участника {0} + + + Advanced + Дополнительно + + + based on + на базе + + + Retrieve with + Получить с помощью + + + Mapping Details + Подробности сопоставления + + + If you are using the Tracking App, you can add the device mapping also by selecting a competitor/mark, setting the from and to times, and then scanning this QRCode. + Если используется приложение отслеживания, можно добавить также сопоставление устройства, выбрав участника/отметку, установив интервал времени, а затем отсканировав этот QR-код. + + + QRCode + QR-код + + + Enter course area name... + Ввести название зоны гонки... + + + Enter course name... + Ввести название курса... + + + Enter image URL... + Ввести URL-адрес изображения... + + + Enter video URL... + Ввести URL-адрес видео... + + + Enter sponsor image URL... + Ввести URL-адрес изображения спонсора... + + + Enter race name... + Ввести название гонки... + + + An error occurred while attempting to contact the server. Please check your network connection and try again. + При попытке обратиться к серверу возникла ошибка. Проверьте подключение к сети и повторите попытку. + + + Remote Procedure Call + Удаленный вызов процедуры + + + Server replies + Ответы сервера + + + Error communicating with server + Ошибка связи с сервером + + + User Management + Управление пользователями + + + Regatta Structure Import + Импорт структуры регаты + + + filtered by + отфильтровано по + + + Edit Series + Изменить серию + + + Please select at least one regatta + Выберите не менее одной регаты + + + Please select an event + Выберите событие + + + Error trying to get events: {0} + Ошибка при попытке получить события: {0} + + + Show x-y-diagram + Показать диаграмму x-y + + + x-y-Diagram + Диаграмма x-y + + + Boat Speed + Скорость лодки + + + Confidence + Достоверность + + + Create default settings for all regattas... + Создать настройки по умолчанию для всех регат... + + + No overall event selected... + Не выбрано общее событие... + + + Error trying to create new event {0}: {1} + Ошибка при попытке создать новое событие {0}: {1} + + + Create New Event + Создать новое событие + + + No fleets defined. + Не определены флоты. + + + Successfully created regattas + Регаты успешно созданы + + + Error trying to register races {0} for tracking: {1}. Check live/stored URI syntax. + Ошибка при попытке зарегистрировать гонки {0} для отслеживания: {1}. проверьте синтаксис URI оперативных/хранимых данных. + + + Error determining availability of polar / VPP data for race {0}: {1} + Ошибка при определении доступности полярных/VPP данных для гонки {0}: {1} + + + Error + Ошибка + + + File Storage + Хранилище файлов + + + Active + Активно + + + Score in points. Winner of an act scores 10 points, 2nd - 9 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. + Оценка в баллах. Победитель в акте получает 10 баллов, 2-й — 9 баллов, .... Любая ничья в общей оценке Extreme Sailing Series разрешается в пользу участника с наибольшим числом побед в актах. В случае равенства числа побед для разрешения используется последний акт. + + + Start delay + Задержка старта + + + Time between the start of the race and the time the competitor passed the start waypoint. Negative time suggests OCS. + Время между стартом гонки и временем, когда участник проходит путевую точку старта. Отрицательное время означает ранний старт (OCS). + + + Use internal mark passing algorithm + Использовать внутренний алгоритм прохождения отметки + + + Edit Mark Passings + Изменить прохождения отметок + + + Edit Mark Positions + Изменить позиции отметок + + + Remove fixed mark passing + Удалить прохождение фиксированной отметки + + + Set time as mark passing + Установить время как прохождение отметки + + + Suppress mark passing starting with current + Подавить прохождение отметки, начиная с текущей + + + Remove suppressed mark passing + Удалить подавленное прохождение отметки + + + Error removing fixed mark passing: {0} + Ошибка при удалении прохождения фиксированной отметки: {0} + + + Error setting fixed mark passing: {0} + Ошибка при настройке прохождение фиксированной отметки: {0} + + + Error suppressing mark passings: {0} + Ошибка при подавлении прохождений отметок: {0} + + + Error removing suppressed mark passings: {0} + Ошибка при удалении подавленных прохождений отметок: {0} + + + Error trying to obtain mark passings: {0} + Ошибка при попытке получить прохождения отметок: {0} + + + Error trying to obtain race log mark passing data: {0} + Ошибка при попытке получить данные журнала гонки о прохождении отметок: {0} + + + E-Mail + Эл. почта + + + Please enter an E-Mail. + Введите электронную почту. + + + Invite competitors + Пригласить участников + + + Invite selected competitors + Пригласить выбранных участников + + + Not all competitors provide an E-Mail + Не все участники указали эл. почту + + + Sending Mails failed + Сбой отправки сообщений + + + Successfully sent E-Mails + Сообщения эл. почты успешно отправлены + + + Select Event for Invitation + Выберите событие для приглашения + + + Image URL + URL-адрес изображения + + + Upload + Отправить + + + Remove operation: {0} {1} + Удалить операцию: {0} {1} + + + Upload successful + Отправлено успешно + + + File upload: {0} {1}.\nIn case of error please check that your File Storage service is properly configured. + Отправка файла: {0} {1}.\nВ случае ошибки проверьте правильность конфигурации службы хранилища файлов. + + + Remove uploaded file + Удалить отправленный файл + + + Sail Id + Ид. паруса + + + Competitor Full Name + Полное имя участника + + + Loading dimension values + Загрузка значений измерения + + + Running Query + Выполнение запроса + + + Invite Buoy Tenders + Пригласить лоцманов + + + or multiple E-Mails separated by comma + или несколько адресов эл. почты через запятую + + + True course over ground in degrees + Истинный курс относительно грунта в градусах + + + COG + COG + + + Distance (w/ Gate Start) + Дистанция (при старте через ворота) + + + The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished.\nIf the leg includes a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. + Дистанция, пройденная от начала отрезка до конца\nили до текущего момента времени, если отрезок не завершен.\nЕсли отрезок включает старт через ворота, дистанция от отметки до стартовой позиции включается,\nчтобы обеспечить сравнение участников даже при старте в разное время. + + + The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. For a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. + Дистанция, пройденная от начала гонки до конца\nили до текущего момента времени, если гонка не завершена.\nДля старта через ворота включается дистанция от привязки до стартовой позиции,\nчтобы обеспечить сравнение участников даже при старте в разное время. + + + Results + Результаты + + + Group Name + Название группы + + + Value (Ascending) + Значение (по возрастанию) + + + Value (Descending) + Значение (по убыванию) + + + Sort by + Сортировать по + + + Dashboard + Панель + + + Wind Bot is not available. + WindBot недоступен. + + + To receive live wind data from wind measurement units, ensure that the wind bot is switched on and connected to the SAP Sailing Analytics. + Чтобы получать оперативные данные от устройств измерения ветра, убедитесь, что WindBot включен и подключен к SAP Sailing Analytics. + + + Wind Bot + WindBot + + + TWS + TWS + + + TWD + TWD + + + kts + уз + + + deg + град. + + + live + активно + + + average + ср. + + + ({0} minutes) + ({0} мин.) + + + Tap on chart to change interval + Коснитесь диаграммы, чтобы изменить интервал + + + Select Competitor + Выбор участника + + + Start Analyses + Анализы старта + + + New start analysis available + Доступен новый анализ старта + + + No Start Analyses available. + Анализы старта недоступны. + + + There is a Start Analysis created from each race start. Please stand by till racing has been started. + Анализ старта создается из каждого старта гонки. Дождитесь начала гонки. + + + No Startline Advantages available. + Преимущества на линии старта недоступны. + + + For calculating the startline advantage there needs to be a course set by the race commitee. + Для расчета преимущества на линии старта необходим курс, установленный гоночным комитетом. + + + No Startline Advantage available. + Преимущество на линии старта недоступно. + + + For calculating the startline advantage there needs to be a course set by the race commitee. + Для расчета преимущества на линии старта необходим курс, установленный гоночным комитетом + + + Startline Advantages by Wind + Преимущества в ветре на линии старта + + + Startline Advantage by Geometry + Преимущества в геометрии на линии старта + + + Rank at first mark + Ранг на первой отметке + + + Team + Команда + + + Distance to line in m + Дистанция до линии в км + + + Speed in kts + Скорость в узлах + + + Advantage in m + Преимущество в м + + + s + с + + + Distance to rc boat in m + Дистанция до лодки ГК в км + + + Pin End + Привязка + + + RC Boat + Лодка ГК + + + (fixed) + (фиксировано) + + + (suppressed) + (подавляется) + + + Wind-Up (show wind from top of map) + На ветер (показать ветер сверху карты) + + + Filter by + Фильтровать по + + + Current filter selection + Текущий выбор фильтра + + + I''m not capable of generating a code for this identifier. + Я не могу сгенерировать код для этого идентификатора. + + + Server URL + URL-адрес сервера + + + Rotated {0} degrees from true north.\nTap/click to toggle between wind-up and north-up map display + Повернуто на {0} град. от истинного севера.\nКоснитесь/щелкните для переключения между отображением карты с ветром или севером вверху + + + Start to first mark ({0}m) + От старта до первой отметки ({0} м) + + + The Data-Mining components have been updated + Компоненты добычи данных обновлены. + + + Click Reload to reload the components now. This will discard the current displayed data and run a default query.\nClick Close to do nothing. The Data-Mining won''t work correctly, until the components have been reloaded. + Щелкните "Перезагрузить", чтобы перезагрузить компоненты сейчас. Текущее отображение данных будет сброшено с выполнением запроса по умолчанию. Добыча данных не будет работать правильно до перезагрузки компонентов. + + + There isn''t any data for the event yet. + Данных для данного события еще нет. + + + {0,number} countries + {0,number} стран + + + {0,number} country + {0,number} страна + + + {0,number} races + {0,number} гонок + + + {0,number} race + {0,number} гонка + + + {0,number} tracked races + {0,number} отслеживаемых гонок + + + {0,number} tracked race + {0,number} отслеживаемая гонка + + + {0,number} events + {0,number} событий + + + {0,number} event + {0,number} событие + + + {0,number} competitors + {0,number} участников + + + Course area: {0} + Зона гонки: {0} + + + {0,number} competitor + {0,number} участник + + + Leg {0,number}/{1,number} + Отрезок {0,number}/{1,number} + + + Clone + Клон + + + Changed + Изменено + + + Matcher + Совпадение + + + Any + Любое + + + URL-based result providers + Поставщики результатов на базе URL-адресов + + + Please select a URL-based result provider... + Выберите поставщика результатов на базе URL-адреса... + + + Sample URL: {0} + Образец URL-адреса: {0} + + + SAP Sports on + SAP Sports по адресу + + + Follow SAP Sports + Отслеживать SAP Sports + + + Live now + Оперативные данные + + + Analyze race + Анализировать гонку + + + Next race starts in + Следующая гонка начинается через + + + {0} starts in + {0} начинается через + + + Planned + Запланировано + + + Abandoned + Отменено + + + Postponed + Отложено + + + Starts in {0,number} min + Начинается через {0,number} мин. + + + Starting now + Начиная сейчас + + + Latest News + Последние новости + + + Result update + Обновление результата + + + {0} won race + Выиграно гонок: {0} + + + Time on Time Factor + Фактор время-время (ToT) + + + Time on Distance Allowance + Фактор время-дистанция (ToD) + + + Ranking + Ранг + + + One-Design + Монотип + + + ORC Performance Curve + Кривая эффективности ORC + + + Time-on-Time/Time-on-Distance + Время-время/Время-дистанция + + + One-Design: First across the line wins;\nin-race ranks based on windward positions (upwind/downwind) or along-course position (reaching) + Монотип: первый пересекший линию побеждает;\nранги в гонке основаны на позиции к ветру (наветренная/подветренная) или позиции на курсе (полный ветер) + + + ORC Performance Curve: Sophisticated handicapping scheme that awards time allowances based on a VPP/polar assuming pre-defined legs'' angles to the wind;\nbased on these allowances, an "implied wind" is calculated which is the basis for ranking.\nImplied wind can be calculated at any time in the race and is therefore the basis for in-race ranking. + Кривая эффективности ORC: сложная схема гандикапа, предоставляющая фору с учетом VPP/полярных данных для предварительно определенных углов отрезков к ветру;\nна основе этих допусков рассчитывается "подразумеваемый ветер", используемый как основа для ранжирования.\nПодразумеваемый ветер можно рассчитать в любое время в ходе гонки, поэтому он является основой для ранжирования в гонке. + + + Time-on-Time / Time-on-Distance: Final ranking by calculated time;\ntime is calculated by optionally applying a factor to the actual time (defaulting to 1.0)\nand subtracting an allowance in seconds per nautical mile,\napplied to the course length.\nIn-race ranks based on expected arrival at fastest boat's current position\nassuming current leg's average VMG/VMC. + Время-время/Время-дистанция: окончательное ранжирование по расчетному времени;\nвремя рассчитывается путем необязательного применения коэффициента к фактическому времени (по умолчанию 1,0)\nи вычитания допуска в секундах на морскую милю\nк длине курса.\nРанги в гонке основаны на ожидаемом прибытии на текущую позицию самой быстрой лодки\nс учетом средних значений VMG/VMC текущего отрезка. + + + ToT Factor + Фактор ToT + + + ToD Allowance + Допуск ToD + + + Time-on-Time factor; actual time is multiplied with this factor in calculated time formula + Фактор время-время; в формуле расчета времени фактическое время умножается на этот коэффициент + + + Time-on-Distance allowance in seconds per nautical mile;\ndistance sailed is multiplied with this allowance, and the resulting seconds are subtracted from the actual time sailed\n(optionally calculated by applying the time-on-time factor) in the calculated time formula + Допуск время-дистанция в секундах на морскую милю;\nв формуле расчета времени пройденная дистанция умножается на этот допуск, и полученное число секунд вычитается из фактического времени хода\n(необязательно рассчитывается применением коэффициента время-время) + + + Calculated Time + Расчетное время + + + Calculated time according to competitor''s handicap\nbased on time since start of race and (windward) distance traveled + Расчетное время с учетом гандикапа участника\nна основе времени от старта гонки и пройденной (по ветру) дистанции + + + Calc.Time @ Fastest + Расч. время самой быстрой лодки + + + Calculated time at estimated arrival at the competitor that is currently farthest ahead in the race;\nestimation based on average VMG in current leg and equal (calculated) performance to fastest boat in all subsequent legs + Расчетное время ожидаемого прибытия в позицию текущего лидера гонки;\nоценка основана на среднем значении VMG на текущем отрезке и (расчетной) эффективности, равной эффективности самой быстрой лодки, на всех последующих отрезках + + + Sailor Info + Сведения о мореходе + + + Official Results, Protests,\nNotice Board, Sailor weather: + Официальные результаты, протесты,\nдоска уведомлений, погода: + + + Event Quickfinder + Быстрый поиск событий + + + Regatta Quickfinder + Быстрый поиск регат + + + Results Quickfinder + Быстрый поиск результатов + + + Races Quickfinder + Быстрый поиск гонок + + + Statistics + Статистика + + + Impressions + Впечатления + + + This content is not available on mobile.\nSwitch to the desktop version? + Это содержимое недоступно на мобильных устройствах.\nПерейти на версию для рабочего стола? + + + Go to desktop version + Перейти на версию для рабочего стола + + + Go back + Назад + + + Show all {0} + Показать все {0} + + + Collapse {0} + Свернуть {0} + + + GPS fixes + Замеры GPS + + + Fastest + Самый быстрый + + + Wind fixes + Замеры ветра + + + Sailed miles + Пройдено миль + + + {0,number,#0.0} mil + {0,number,#0.0} mil + + + {0,number,#0.0} bil + {0,number,#0.0} bil + + + There are no results available yet. + Результаты пока недоступны. + + + There are no news available. + Новости пока недоступны. + + + {0,number,#0.00} + {0,number,#0.00} + + + Open Leaderboard + Открыть таблицу лидеров + + + Now + Сейчас + + + {0} min ago + {0} мин. назад + + + {0} h ago + {0} ч. назад + + + Winner + Победитель + + + Duration + Продолжительность + + + Finished Races + Завершенные гонки + + + Please select one competitor + Выберите одного участника + + + All + Все + + + Points + Баллы + + + # Races + Гонки + + + Course Geometry + Геометрия курса + + + {0}° to wind + {0}° к ветру + + + Shows the points along with the number of races per competitor + Показывает баллы и число гонок каждого участника + + + {0,number}/{1,number} + {0,number}/{1,number} + + + There are no finished races yet + Завершенных гонок еще нет + + + Races overview + Обзор гонок + + + List format + Формат списка + + + Competition format + Формат соревнования + + + Empty + Пусто + + + Run a Query + Выполнить запрос + + + Latest Regatta Standings + Позиции в последней регате + + + Plain Text + Простой текст + + + Column Chart + Столбчатая диаграмма + + + Choose Presentation + Выберите представление + + + Can''t display data of type {0} + Невозможно отобразить данные типа {0} + + + Shown Decimals + Отображаемые десятичные разряды + + + Open fullscreen view + Открыть полноэкранный режим + + + Close fullscreen view + Закрыть полноэкранный режим + + + Progress + Ход выполнения + + + {0,number} videos + {0,number} видео + + + {0,number} video + {0,number} видео + + + {0,number} photos + {0,number} фото + + + {0,number} photo + {0,number} фото + + + {0} events have taken place + Имело место {0} событий + + + One event has taken place + Имело место одно событие + + + Race Office + Служба гонки + + + Analyze + Анализировать + + + Data Mining Settings + Параметры добычи данных + + + Multi Results Presenter + Презентатор множества результатов + + + Plain Results Presenter + Презентатор простых результатов + + + Results Chart + Диаграмма результатов + + + Tabbed Results Presenter + Презентатор результатов со вкладками + + + Polar Results Presenter + Полярный презентатор результатов + + + Data Retrieval + Извлечение данных + + + Watch + Смотреть + + + Analyze + Анализировать + + + Shortcut to denote all races for racelog tracking + Ярлык для отмена отслеживания журналов всех гонок + + + Register Competitors + Регистрация участников + + + Do you want to create a default Regatta Leaderboard? + Создать таблицу лидеров регаты по умолчанию? + + + Copy Course + Копировать курс + + + Copy Competitors + Копировать участников + + + Smartphone Tracking + Отслеживание смартфона + + + {0,number} flights + {0,number} полетов + + + {0,number} flight + {0,number} полет + + + View Query Definition + Просмотреть определение запроса + + + Query Definition Viewer + Средство просмотра определения запроса + + + Group Average (Ascending) + Среднее группы (по возрастанию) + + + Group Average (Descending) + Среднее группы (по убыванию) + + + Group Median (Ascending) + Медиана группы (по возрастанию) + + + Group Median (Descending) + Медиана группы (по убыванию) + + + {0,number} results found for ''{1}'' + Найдено {0,number} результатов для ''{1}'' + + + {0,number} result found for ''{1}'' + Найден {0,number} результат для ''{1}'' + + + Run Predefined Query + Выполнить готовый запрос + + + Select Predefined Query + Выбрать готовый запрос + + + Predefined Query Runner + Средство выполнения готовых запросов + + + Developer Options + Параметры разработчика + + + Copy to Clipboard + Копировать в буфер обмена + + + Code + Код + + + Use Class.getName() for type names + Использовать Class.getName() для имен типов + + + More robust against changes in the code base, but the code snippet can only be used in the scope where the classes are available. + Более надежно по сравнению с изменениями в основании кода, но фрагмент кода может быть использован только в области с доступными классами. + + + Use string literals for type names + Использовать строковые литералы для имен типов + + + The code snippet can be used anywhere, but it will break if the code base changes. + Фрагмент кода может использоваться где угодно, но будет нарушен в случае изменения основания кода. + + + Error loading data. Trying again in a few moments. + Ошибка при загрузке данных. Повтор попытки через несколько секунд. + + + Add gallery photo + Добавить фото галереи + + + Add stage image + Добавить изображение этапа + + + Add teaser image + Добавить изображение анонса + + + + No images defined yet + Изображения еще не определены + + + The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px. + Размер изображения {0} не подходит. Ширина должна быть между {1} и {2} пикс., а высота между {3} и {4} пикс. + + + The width and height of the image could not be retrieved yet. + Ширину и высоту изображения еще не удалось извлечь. + + + Please only upload content you have all usage rights for. Remember that content may be cropped. + Выкладывайте только контент, на использование которого у вас есть все права. Не забывайте о возможности кадрировать контент. + + + Register Competitors on Race (e.g. for split-fleet racing) + Зарегистрировать участников в гонке (например, для гонок с разделением флота) + + + Do you want to register competitors directly on the Race? + Зарегистрировать участников непосредственно в гонке? + + + Do you want to disable competitor registrations on the Race? + Отключить регистрации участников в гонке? + + + Warning! This setting will lead to competitors for this race being registered on a per race basis. Competitors will not be automatically registered for this race, when registering them on the corresponding regatta. + Внимание! Этот параметр приведет к регистрации участников этой гонки только в данной гонке. При регистрации в соответствующей регате они не будут автоматически зарегистрированы в данной гонке. + + + Warning! This will reactivate competior registrations on the regatta. All competitor registrations from the regatta will automatically be used as competitor registration for this race. + Внимание! Это приведет к повторной активации регистраций участника в регате. Все регистрации участника из регаты будут автоматически использованы как регистрация участника для данной гонки. + + + Competitor Registrations are disabled for this race. Enable by checking the checkbox to the left. + Регистрации участника отключены для данной гонки. Чтобы включить, установите флажок слева. + + + Add Mark to Regatta + Добавить отметку к регате + + + Select a leaderboard group... + Выбрать группу таблиц лидеров... + + + Please select + Выберите + + + This page requires a valid regatta, race column and fleet name to identify the race to show. + Эта страница определяет гонку для отображения по допустимым значениям регаты, столбца гонки и названия флота. + + + Could not obtain a race with name {1} for fleet {2} for a regatta with name {0}: {3} + Не удалось получить гонку с названием {1} для флота {2} для регаты с названием {0}: {3} + + + Error trying to create the embedded map: {0} + Ошибка при попытке создать внедренную карту: {0} + + + Top {0} + Первые {0} + + + Transparent buffer lines on hover of helplines + Прозрачные буферные линии при наведении на вспомогательные линии + + + Buffer line stroke weight + Вес штриха буферной линии + + + Profile + Профиль + + + Show only competitors registered in Log + Показать только участников, зарегистрированных в журнале + + + This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? + Это приведет к сбросу текущих, не сохраненных изменений участников.\nПродолжить? + + + Removal deavticated, marks are used in races {0} + Удаление деактивировано, отметки используются в гонках {0} + + + Would you like to create a default LeaderboardGroup for your event? + Создать группу таблиц лидеров по умолчанию для вашего события? + + + Please create at least one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side + Создайте хотя бы одно сопоставление, выбрав отслеживание слева, а затем отметку или участника справа + + + Matcher type + Тип сопоставления + + + Matching devices + Соответствующие устройства + + + Add Device + Добавить устройство + + + Create Device Configuration + Создать конфигурацию устройства + + + Specify for which device the new configuration should apply + Укажите, для какого устройства следует применить новую конфигурацию + + + Create + Создать + + + There is already a configuration for this device. + Для этого устройства уже есть конфигурация. + + + Enter an identifier name + Введите имя идентификатора + + + Administration + Администрирование + + + Please select a leaderboard group + Выберите группу таблиц лидеров + + + Link Leaderboard to Leaderboard Group of Event + Связать таблицу лидеров с группой таблиц лидеров события + + + Link leaderboard {0} to a leaderboard group of event {1} + Связать таблицу лидеров {0} с группой таблиц лидеров события {1} + + + Failed to link leaderboard {0} to leaderboard group {1} + Не удалось связать таблицу лидеров {0} с группой таблиц лидеров {1} + + + Create default regatta + Создать регату по умолчанию + + + Do you want to create a default Regatta? + Создать регату по умолчанию? + + + Default + По умолчанию + + + The default link is used unless a language specific overwrite exists. If no default exists, there will be no link for languages that do not explicitly have one set. + При отсутствии замен для конкретного языка используется ссылка по умолчанию. Если значения по умолчанию не существует, ссылок для языков, не имеющих одного явно заданного набора, не будет. + + + QR-Sync + QR-синхронизация + + + There is no identifier set. + Не задан идентификатор. + + + Could not obtain access token for user {0} + Не удалось получить токен для пользователя {0} + + + Device Name + Имя устройства + + + Please enter a valid Server URL + Введите действительный URL-адрес сервера + + + Server URL empty + URL-адрес сервера пуст + + + Marks + Отметки + + + Add new fix + Добавить новый замер + + + Please select another timepoint. There already is a fix at the timepoint of the timeslider. + Выберите другой момент времени. На этой отметке шкалы времени уже есть замер. + + + Confirm move + Подтвердить движение + + + Confirm new fix + Подтвердить новый замер + + + Select a fix position by dragging the map. Then confirm or cancel with the buttons below. + Выберите позицию замера, перетащив карту. Затем подтвердите или отмените действие с помощью кнопок ниже. + + + Please select a mark from the list on the left. + Выберите отметку из списка слева. + + + Mark fixes + Замеры отметки + + + utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions + utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions + + + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + + + https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app + https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app + + + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + + + https://play.google.com/intl/en/badges/images/generic/en-play-badge.png + https://play.google.com/intl/en/badges/images/generic/en-play-badge.png + + + http://appstore.com/sapsailinsight + http://appstore.com/sapsailinsight + + + http://appstore.com/stgtrainingstagebuch + http://appstore.com/stgtrainingstagebuch + + + _en + _en + + + Distance from average position + Дистанция от средней позиции + + + Use a touch optimized UI to move the fix + Используйте сенсорный UI для перемещения замера + + + Delete fix + Удалить замер + + + The deletion of this fix is currently not possible. + Удалить этот замер сейчас невозможно. + + + Loading mark fixes... + Загрузка замеров отметки... + + + Fix successfully added. + Замер успешно добавлен. + + + Fix position successfully edited. + Позиция замера успешно изменена. + + + Fix successfully removed. + Замер успешно удален. + + + Drag to change position\nRight-click to get menu to delete + Позиция изменяется перетаскиванием\nДля удаления вызовите меню щелчком правой кнопкой мыши + + + Move fix + Переместить замер + + +
+
\ No newline at end of file diff --git a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties.xlf b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties.xlf index bf0bb260570..86eabbede7d 100644 --- a/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties.xlf +++ b/XLF/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties.xlf @@ -1,5867 +1,5991 @@ - +
- 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 - +
Manage2Sail - Manage2Sail + Manage2Sail Race Manager App - Race Manager 应用 + Race Manager 应用 TracTrac Events - TracTrac 活动 + TracTrac 活动 SwissTiming Events - SwissTiming 活动 + SwissTiming 活动 History of tracked events - 已跟踪活动的历史记录 + 已跟踪活动的历史记录 General - 常规 + 常规 List Races - 比赛轮次清单 + 比赛轮次清单 List Regattas - 比赛清单 + 比赛清单 Wind - 风力 + 风力 Maneuver - 操作 + 操作 This is the Wind Panel which so far is completely empty. - 这是风力面板,目前完全空白。 + 这是风力面板,目前完全空白。 Refresh - 刷新 + 刷新 Remove - 移除 + 移除 Wind Source - 风源 + 风源 Dampening Interval - 阻尼间隔 + 阻尼间隔 Map - 地图 + 地图 Race - 比赛轮次 + 比赛轮次 Races - 比赛轮次 + 比赛轮次 tracked - 跟踪 + 跟踪 Linked Races - 链接的比赛轮次 + 链接的比赛轮次 Time - 时间 + 时间 Time the competitor sailed on this leg. For the first leg this is counted from when the competitor passed the start line. - 参赛队在此航段航行的时间。 第一航段的时间从参赛队越过起航线算起。 + 参赛队在此航段航行的时间。 第一航段的时间从参赛队越过起航线算起。 Play speed - 播放速度 + 播放速度 Use "1" for regular play-back speed, "2" for double-speed playback and so on - 使用 "1" 以正常回放速度播放,"2" 以倍速回放等 + 使用 "1" 以正常回放速度播放,"2" 以倍速回放等 Live - 实时 + 实时 Replay Mode - 重放模式 + 重放模式 Delay - 延迟 + 延迟 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 - 要在任意时间重播,则留空;输入导入实况数据前延迟的秒数(例如“60”表示一分钟或“0”表示无) + 要在任意时间重播,则留空;输入导入实况数据前延迟的秒数(例如“60”表示一分钟或“0”表示无) Speed (kn) - 速度 (kn) + 速度 (kn) From (deg) - 自(度) + 自(度) There are no races yet. - 暂无比赛轮次。 + 暂无比赛轮次。 Σ - Σ + Σ Accumulated - 累积 + 累积 Competitor - 参赛队 + 参赛队 Competitors - 参赛队 + 参赛队 {0}/{1} competitors selected. - 已选择{0}/{1}支参赛队。 + 已选择{0}/{1}支参赛队。 No such leaderboard - 没有积分榜 + 没有积分榜 Leaderboard Configuration - 积分榜配置 + 积分榜配置 New... - 新建... + 新建... Edit Points... - 编辑得分... + 编辑得分... Race Names in Selected Leaderboard - 所选积分榜中的比赛轮次名称 + 所选积分榜中的比赛轮次名称 Add... - 添加... + 添加... Rename... - 重命名... + 重命名... Tracked Race Connected to Selected Race Name - 跟踪的比赛轮次已连接到所选的比赛轮次名称 + 跟踪的比赛轮次已连接到所选的比赛轮次名称 Link to Column - 链接到列 + 链接到列 Unlink - 取消链接 + 取消链接 Leaderboard Name - 积分榜名称 + 积分榜名称 Cancel - 取消 + 取消 Please enter a name - 请输入名称 + 请输入名称 Please enter a boat class - 请输入船只级别 + 请输入船只级别 Discard one more race starting with how many started races - 从已开始的比赛轮次数开始再放弃一个比赛轮次 + 从已开始的比赛轮次数开始再放弃一个比赛轮次 Leaderboard with this name already exists - 具有此名称的积分榜已存在 + 具有此名称的积分榜已存在 Discard thresholds must be numeric - 放弃临界值必须为数字 + 放弃临界值必须为数字 Discard thresholds must be ascending - 放弃临界值必须递增 + 放弃临界值必须递增 Discarding - 放弃 + 放弃 Starting from how many races - 从比赛轮次数开始 + 从比赛轮次数开始 Rename Leaderboard - 重命名积分榜 + 重命名积分榜 Add Column to Leaderboard - 向列添加积分榜 + 向列添加积分榜 Please enter a name for new race column - 请输入新比赛轮次列的名称 + 请输入新比赛轮次列的名称 OK - 确定 + 确定 Medal Race - 奖牌轮 + 奖牌轮 Rename Race - 重命名比赛轮次 + 重命名比赛轮次 Open Selected Leaderboard - 打开选择的积分榜 + 打开选择的积分榜 Rank - 名次 + 名次 Competitor''s rank in the race - 参赛队在比赛轮次中的名次 + 参赛队在比赛轮次中的名次 Regatta Rank - 比赛名次 + 比赛名次 Competitor''s rank in the regatta - 参赛队在比赛中的名次 + 参赛队在比赛中的名次 Overall Rank - 总名次 + 总名次 Competitor''s rank in the series - 参赛队在系列赛中的名次 + 参赛队在系列赛中的名次 Regatta Rank - 比赛名次 + 比赛名次 - - - + - + - + + + L - L + L Distance - 距离 + 距离 ∅ Speed - ∅ 速度 + ∅ 速度 The average speed over ground during this leg,\ncalculated with the division of the distance traveled by the time needed. - 此航段的平均实际速度,\n通过航行的距离除以所需的时间计算得出。 + 此航段的平均实际速度,\n通过航行的距离除以所需的时间计算得出。 The average speed over ground during this race,\ncalculated with the division of the distance traveled by the time needed. - 此比赛轮次的平均实际速度,\n通过航行的距离除以所需的时间计算得出。 + 此比赛轮次的平均实际速度,\n通过航行的距离除以所需的时间计算得出。 Rank Gain - 名次进阶 + 名次进阶 The difference of the position from the current and the previous leg. - 当前和先前航段的位置差异。 + 当前和先前航段的位置差异。 Sailing Analytics - Sailing Analytics + Sailing Analytics Leaderboard - 积分榜 + 积分榜 Leaderboards - 积分榜 + 积分榜 Leaderboard Settings - 积分榜设置 + 积分榜设置 Settings - 设置 + 设置 Select at least one leg detail - 至少选择一个航段详情 + 至少选择一个航段详情 SOG - SOG + SOG The current speed over ground. - 当前实际速度。 + 当前实际速度。 ETA - ETA + ETA The estimated time that the competitor needs to reach the next waypoint, based on the competitor''s current velocity made good, considering the true wind direction. - 考虑到实际风向,参赛队以当前沿计划航线上的航速到达下个航路点所需要的预计时间。 + 考虑到实际风向,参赛队以当前沿计划航线上的航速到达下个航路点所需要的预计时间。 Gap to leader - 与第一名的差距 + 与第一名的差距 Estimates the (calculated) arrival time at the current position of the boat that is farthest ahead,\nbased on average VMG for the current leg and with performance equal to that of the race leader for subsequent legs.\nThe gap tells how much earlier the competitor would have had to be where she currently is\nin order to rank equal to the race leader at the projected arrival at the current position of the boat farthest ahead. - 根据当前航段的平均沿计划航线上的航速 (VMG) 和同等于比赛轮次第一名在后续航段的成绩,预计到达最前方船只当前位置的(计算)时间。\n此差距表明参赛队必须超前于其目前的航行状况才能以预计时间到达最前方船只当前位置取得与比赛轮次第一名相同的名次。 + 根据当前航段的平均沿计划航线上的航速 (VMG) 和同等于比赛轮次第一名在后续航段的成绩,预计到达最前方船只当前位置的(计算)时间。\n此差距表明参赛队必须超前于其目前的航行状况才能以预计时间到达最前方船只当前位置取得与比赛轮次第一名相同的名次。 VMG - VMG + VMG The velocity made good, which is the windward/leeward speed for upwind/downwind legs, respectively, or the along-track speed for reaching legs. - 沿计划航线上的航速分别指迎/顺风航段时的上风/下风速度,或横风航段的沿轨道航行速度。 + 沿计划航线上的航速分别指迎/顺风航段时的上风/下风速度,或横风航段的沿轨道航行速度。 Windward distance to go - 离开上风距离 + 离开上风距离 Windward/leeward distance from the competitor''s current position to the end of the leg for upwind/downwind legs, respectively, or the along-track distance for reaching legs. - 参赛队的当前位置分别与迎/顺风航段终点的上风/下风距离,或横风航段的沿轨道航行距离。 + 参赛队的当前位置分别与迎/顺风航段终点的上风/下风距离,或横风航段的沿轨道航行距离。 Gap - 差距 + 差距 Windward/leeward distance of the competitor to the competitor farthest ahead in the race for upwind/downwind legs, respectively, or the along-track distance for reaching legs.\nNote that the competitor that is farthest ahead is not necessarily leading the race if handicap ranking is in place. - 迎/顺风航段中参赛队分别与比赛轮次中最前方参赛队的上风/下风距离,或横风航段的沿轨道航行距离。\n请注意,如果设定差点排名,最前方的参赛队并不一定是比赛轮次的领先者。 + 迎/顺风航段中参赛队分别与比赛轮次中最前方参赛队的上风/下风距离,或横风航段的沿轨道航行距离。\n请注意,如果设定差点排名,最前方的参赛队并不一定是比赛轮次的领先者。 Name - 名称 + 名称 Leave empty for default - 针对默认值留空 + 针对默认值留空 Track New event - 跟踪新活动 + 跟踪新活动 Trackable Races - 可跟踪的比赛轮次 + 可跟踪的比赛轮次 Track Wind - 跟踪风力 + 跟踪风力 Regatta name - 比赛名称 + 比赛名称 Event name - 活动名称 + 活动名称 Event - 活动 + 活动 Start time - 开始时间 + 开始时间 Start of tracking - 开始跟踪 + 开始跟踪 End of tracking - 结束跟踪 + 结束跟踪 Regatta - 比赛 + 比赛 Regattas - 比赛 + 比赛 Start tracking - 开始跟踪 + 开始跟踪 Stop tracking - 停止跟踪 + 停止跟踪 Connections - 连接 + 连接 History of connections - 连接历史记录 + 连接历史记录 Define a new connection - 定义新连接 + 定义新连接 Tracked races - 跟踪的比赛轮次 + 跟踪的比赛轮次 Can send requests - 可以发送申请 + 可以发送申请 Connect and read races - 连接并读取比赛轮次 + 连接并读取比赛轮次 Ports - 端口 + 端口 Live data - 实况数据 + 实况数据 Stored data - 存储的数据 + 存储的数据 URIs - URI + URI JSON URL - JSON URL + JSON URL Port Live Data - 端口实况数据 + 端口实况数据 Port Stored Data - 端口存储的数据 + 端口存储的数据 Live URI - 实况 URI + 实况 URI Stored URI - 存储的 URI + 存储的 URI Events Currently Tracked - 当前跟踪的活动 + 当前跟踪的活动 Hostname - 主机名 + 主机名 Correct Wind Bearing by Declination - 通过偏角更正风方位 + 通过偏角更正风方位 Tracking Started - 开始的跟踪 + 开始的跟踪 Pause automatic refresh - 暂停自动刷新 + 暂停自动刷新 Refresh automatically - 自动刷新 + 自动刷新 Delay (s) - 延迟 (s) + 延迟 (s) Delay between auto-updates in seconds: - 自动刷新之间的延迟(秒): + 自动刷新之间的延迟(秒): The delay must be greater than zero - 延迟必须大于零 + 延迟必须大于零 Choose update interval of at least one second - 选择至少一秒的更新间隔 + 选择至少一秒的更新间隔 Error setting wind for race - 设置比赛轮次的风力出错 + 设置比赛轮次的风力出错 Error fetching wind information for race - 获取比赛轮次的风力信息出错 + 获取比赛轮次的风力信息出错 Error while trying to set "wind starts upwind" flag - 尝试设置“开始迎风”旗标出错 + 尝试设置“开始迎风”旗标出错 in event - 活动中 + 活动中 to - 至 + 至 to - 至 + 至 Show estimated wind - 显示预计风力 + 显示预计风力 Timing - 定时 + 定时 Race Details - 比赛轮次详情 + 比赛轮次详情 Overall Details - 总体详情 + 总体详情 Leg Details - 航段详情 + 航段详情 Up - 向上 + 向上 Down - 向下 + 向下 Port - 端口 + 端口 Race Started - 比赛轮次开始时间 + 比赛轮次开始时间 Show only selected competitors - 仅显示选择的参赛队 + 仅显示选择的参赛队 Show info box for selected competitors - 显示所选参赛队的信息框 + 显示所选参赛队的信息框 Tail length (s) - 尾流线长度 (s) + 尾流线长度 (s) Which races would you like to display? - 要显示哪个比赛轮次? + 要显示哪个比赛轮次? Length (s) - 长度 (s) + 长度 (s) Stress Test - 压力测试 + 压力测试 Maneuvers - 操作 + 操作 The number of the maneuvers sailed in this leg. - 本航段操作数量。 + 本航段操作数量。 The number of maneuvers sailed in this race. - 本比赛轮次操作数量。 + 本比赛轮次操作数量。 Tacks - 迎风转向 + 迎风转向 Jibes - 顺风转向 + 顺风转向 Penalty Circles - 惩罚转圈 + 惩罚转圈 Medalrace value not allowed - 不允许奖牌轮值 + 不允许奖牌轮值 Configuration - 配置 + 配置 Maneuvers - 操作 + 操作 Choose chart - 选择记录 + 选择记录 Distance Traveled - 航行距离 + 航行距离 The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished. - 如果航段没有结束,从航段起点到终点\n或当前时间点航行的距离。 + 如果航段没有结束,从航段起点到终点\n或当前时间点航行的距离。 The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. - 如果航段没有结束,从比赛轮次开始到结束\n或当前时间点航行的距离。 + 如果航段没有结束,从比赛轮次开始到结束\n或当前时间点航行的距离。 Velocity Made Good - 沿计划航线上的航速 + 沿计划航线上的航速 Speed Over Ground - 实际速度 + 实际速度 Gap To Leader - 与第一名的差距 + 与第一名的差距 Points to load - 得分 + 得分 Speed - 速度 + 速度 Distance - 距离 + 距离 in - 于 + 于 s - s + s s/NM - s/NM + s/NM m - m + m ° - ° + ° Close - 关闭 + 关闭 Compare competitors - 比较参赛队 + 比较参赛队 Description - 描述 + 描述 Sail number - 帆号 + 帆号 Country - 国家/地区 + 国家/地区 Unable to find the IOC 3-letter-codes. - 无法找到 IOC 3 个字母的代码。 + 无法找到 IOC 3 个字母的代码。 Add - 添加 + 添加 Delete - 删除 + 删除 Show charts - 显示记录 + 显示记录 A race with that name already exists. - 具有此名称的比赛轮次已存在。 + 具有此名称的比赛轮次已存在。 A race with that name already exists in this regatta. - 具有此名称的比赛轮次在比赛中已存在。 + 具有此名称的比赛轮次在比赛中已存在。 Head up - 顶风行驶 + 顶风行驶 Bear away - 顺偏行驶 + 顺偏行驶 Tack - 迎风转向 + 迎风转向 The amount of tacks sailed in this race. - 本比赛轮次的迎风转向次数。 + 本比赛轮次的迎风转向次数。 Jibe - 顺风转向 + 顺风转向 The amount of jibes sailed in this race. - 本比赛轮次的顺风转向次数。 + 本比赛轮次的顺风转向次数。 Penalty circle - 惩罚转圈 + 惩罚转圈 The amount of penalty circles sailed in this race. - 本比赛轮次的惩罚圈数。 + 本比赛轮次的惩罚圈数。 Mark passing - 绕标 + 绕标 Mark - 标志 + 标志 Unknown maneuver - 未知操作 + 未知操作 Douglas peucker points - 道格拉斯-普克得分 + 道格拉斯-普克得分 Filter races by name - 按名称筛选比赛轮次 + 按名称筛选比赛轮次 Filter media by name - 按名称筛选媒体 + 按名称筛选媒体 Track settings - 跟踪设置 + 跟踪设置 Edit - 编辑 + 编辑 Edit competitors - 编辑参赛队 + 编辑参赛队 Edit scores - 编辑得分 + 编辑得分 Open in Browser - 在浏览器中打开 + 在浏览器中打开 Remove - 移除 + 移除 Edit Series - 编辑系列 + 编辑系列 Edit or rename race - 编辑或重命名比赛轮次 + 编辑或重命名比赛轮次 Unlink race - 取消链接比赛轮次 + 取消链接比赛轮次 Remove race - 移除比赛轮次 + 移除比赛轮次 Export as XML - 以 XML 格式导出 + 以 XML 格式导出 Open Coach Dashboard - 打开教练仪表盘 + 打开教练仪表盘 Filter leaderboards by name - 按名称筛选积分榜 + 按名称筛选积分榜 Actions - 操作 + 操作 Is linked - 已链接 + 已链接 Yes - 是 + 是 No - 否 + 否 Hover over a point for details - 将鼠标移到得分,查看详情 + 将鼠标移到得分,查看详情 No selection - 无选择 + 无选择 Race starts with upwind leg - 比赛轮次从迎风航段开始 + 比赛轮次从迎风航段开始 Events - 活动 + 活动 Settings for {0} - {0}设置 + {0}设置 No events were found - 未找到活动 + 未找到活动 No event selected - 未选择活动 + 未选择活动 No leaderboards were found - 未找到积分榜 + 未找到积分榜 Search for events - 搜索活动 + 搜索活动 Location - 地点 + 地点 From - 从 + 从 Until - 至 + 至 Only live events - 仅实况活动 + 仅实况活动 Location not available - 地点不可用 + 地点不可用 Start date not available - 开始日期不可用 + 开始日期不可用 Start date - 开始日期 + 开始日期 End date - 结束日期 + 结束日期 Unknown maneuver - 未知操作 + 未知操作 the tail length must be a number greater than zero. - 尾流线长度必须是大于零的数字。 + 尾流线长度必须是大于零的数字。 Failed to load race information: {0} - 加载比赛轮次信息失败: {0} + 加载比赛轮次信息失败: {0} {0} passed {1} at {2} - {0}于{2}越过{1} + {0}于{2}越过{1} {0} at {1}: {2} - {0}(于{1}): {2} + {0}(于{1}): {2} Do you really want to remove the race ''{0}''? Note: all race logs for this race will also permanently be removed! - 是否确定移除比赛轮次 "{0}"? 注意: 此比赛轮次的所有比赛轮次日志也将永久移除! + 是否确定移除比赛轮次 "{0}"? 注意: 此比赛轮次的所有比赛轮次日志也将永久移除! Show details - 显示详情 + 显示详情 Hide leaderboard - 隐藏积分榜 + 隐藏积分榜 Hide leaderboards - 隐藏积分榜 + 隐藏积分榜 Show leaderboard - 显示积分榜 + 显示积分榜 Hide races - 隐藏比赛轮次 + 隐藏比赛轮次 Show map - 显示地图 + 显示地图 Hide map - 隐藏地图 + 隐藏地图 No leaderboard selected - 未选择积分榜 + 未选择积分榜 Leaderboard groups - 积分榜分组 + 积分榜分组 Filter leaderboard groups by name - 按名称筛选积分榜分组 + 按名称筛选积分榜分组 Create leaderboard group - 创建积分榜分组 + 创建积分榜分组 Leaderboard Group Configuration - 积分榜分组配置 + 积分榜分组配置 Legs - 航段 + 航段 On Leg - 当前航段 + 当前航段 The number of the leg on which the competitor currently is, starting with 1 - 参赛队目前所处的航段编号,从 1 开始 + 参赛队目前所处的航段编号,从 1 开始 Leaderboard Group - 积分榜分组 + 积分榜分组 Please enter a non-empty description - 请输入非空描述 + 请输入非空描述 A leaderboard group with this name already exists. - 具有此名称的积分榜分组已存在。 + 具有此名称的积分榜分组已存在。 Details of leaderboard group - 积分榜分组详情 + 积分榜分组详情 Edit - 编辑 + 编辑 Save - 保存 + 保存 Abort - 中止 + 中止 No leaderboard group with the name {0} found - 未找到名称为{0}的积分榜分组 + 未找到名称为{0}的积分榜分组 Overview - 总览 + 总览 Welcome to SAP Sailing Analytics - 欢迎使用 SAP Sailing Analytics + 欢迎使用 SAP Sailing Analytics SAP brings sailing fans closer to the on-water action than ever before.\ The live-leaderboard enhances the fan experience through real-time rankings, boat speeds and winning margins. Follow every race and never miss a passing maneuver with SAP.\ This is the simple way to watch live sail racing from wherever you are. - SAP 使船赛粉丝得以近距离直击水上运动,史无前例。\实况积分榜让粉丝全程了解最新排名、船速和输赢差距。 使用 SAP 关注每场比赛轮次,绝不错过任何一个操作。\不论您身在何地,这都是观看实况帆船比赛的简单方式。 + SAP 使船赛粉丝得以近距离直击水上运动,史无前例。\实况积分榜让粉丝全程了解最新排名、船速和输赢差距。 使用 SAP 关注每场比赛轮次,绝不错过任何一个操作。\不论您身在何地,这都是观看实况帆船比赛的简单方式。 Home - 主页 + 主页 Click and drag in the plot area to zoom in - 单击并拖动绘图区以放大 + 单击并拖动绘图区以放大 Wind speed (kts) - 风速 (kts) + 风速 (kts) All times in UTC - 所有时间均为 UTC 格式 + 所有时间均为 UTC 格式 Auto zoom to - 自动放大/缩小 + 自动放大/缩小 Boats - 船只 + 船只 Buoys - 浮标 + 浮标 Wind sensors - 风力感应器 + 风力感应器 Off - 关 + 关 Tails - 尾流线 + 尾流线 Zoom only to selected competitors - 仅缩放所选的参赛队 + 仅缩放所选的参赛队 Bearing - 航向角 + 航向角 Zoom - 放大/缩小 + 放大/缩小 Step size must be greater than 0 - 步长必须大于 0 + 步长必须大于 0 Step size in seconds - 步长(秒) + 步长(秒) Refresh interval (s) - 刷新间隔 (s) + 刷新间隔 (s) Refresh interval must be greater than {0} seconds - 刷新间隔必须大于{0}秒 + 刷新间隔必须大于{0}秒 Competitor Chart - 参赛队记录 + 参赛队记录 To show the competitor charts, select at least one competitor - 要显示参赛队记录,至少选择一支参赛队 + 要显示参赛队记录,至少选择一支参赛队 To send invitation E-Mails, select at least one competitor - 要发送邀请电子邮件,至少选择一支参赛队 + 要发送邀请电子邮件,至少选择一支参赛队 Direction change - 风向变化 + 风向变化 Speed change - 速度变化 + 速度变化 deg - deg + deg Untracked - 取消跟踪 + 取消跟踪 Delay for live mode: - 实况模式延迟: + 实况模式延迟: Not available - 不可用 + 不可用 Details - 详情 + 详情 No group selected - 未选择分组 + 未选择分组 Combined - 组合 + 组合 Course Layout - 场地设置 + 场地设置 Estimation - 估算 + 估算 Measured - 测量 + 测量 Manual - 手动 + 手动 Race Committee - 竞赛委员会 + 竞赛委员会 Click on the chart to set the time - 点击记录设置时间 + 点击记录设置时间 Position - 位置 + 位置 Wind Sources Used - 使用的风源 + 使用的风源 Error trying to update wind sources to exclude for race {0}: {1} - 尝试更新风源以针对比赛轮次{0}排除出错: {1} + 尝试更新风源以针对比赛轮次{0}排除出错: {1} Feedback - 反馈 + 反馈 Start/Stop playing - 开始/停止播放 + 开始/停止播放 Jump back to live time point - 跳回到实况时间点 + 跳回到实况时间点 Slow play speed down or even run backwards - 减慢播放速度,甚至倒放 + 减慢播放速度,甚至倒放 Speed play speed up or run forward again - 加快播放速度或重新继续播放 + 加快播放速度或重新继续播放 Show/Hide {0} - 显示/隐藏{0} + 显示/隐藏{0} Angle to wind - 风夹角 + 风夹角 Races in leaderboard - 积分榜中的比赛轮次 + 积分榜中的比赛轮次 Leaderboards in group - 分组中的积分榜 + 分组中的积分榜 Replication - 复制 + 复制 Error fetching replica data: {0} - 获取重复数据出错: {0} + 获取重复数据出错: {0} ∅ XTE - ∅ XTE + ∅ XTE The average cross track error to the great circle segment connecting leg start with leg end - 连接航段起点和终点的大圆弧的平均交叉轨道误差 + 连接航段起点和终点的大圆弧的平均交叉轨道误差 ∅ XTE +/- - ∅ XTE +/- + ∅ XTE +/- The average position on the course as a signed distance from the course middle line; 0 meaning on the course middle line; negative values mean left-hand side, positive values mean right-hand side. - 赛场中的平均位置 - 从场地中线开始计算的符号距离;0 代表场地中线;负数代表左侧,正数代表右侧。 + 赛场中的平均位置 - 从场地中线开始计算的符号距离;0 代表场地中线;负数代表左侧,正数代表右侧。 The average absolute cross track error to the great circle segments connecting leg start with leg end for all upwind legs of this race, ignoring to which side of the course middle line the competitor is - 所有比赛轮次中迎风航段连接航段起点和终点的大圆弧的平均绝对交叉轨道误差,忽略参赛队所在的场地中线 + 所有比赛轮次中迎风航段连接航段起点和终点的大圆弧的平均绝对交叉轨道误差,忽略参赛队所在的场地中线 The signed average cross track error to the great circle segments connecting leg start with leg end for all upwind legs of this race; negative values mean left of the course middle line, positive values mean right. - 所有比赛轮次中迎风航段连接航段起点和终点的大圆弧的符号平均交叉轨道误差;负数代表场地中线的左侧,正数代表右侧。 + 所有比赛轮次中迎风航段连接航段起点和终点的大圆弧的符号平均交叉轨道误差;负数代表场地中线的左侧,正数代表右侧。 Hostname of Master Instance - 主实例的主机名称 + 主实例的主机名称 Error starting replication from host {0} / exchange {1}: {2} - 从主机{0}/交换机{1}开始复制出错: {2} + 从主机{0}/交换机{1}开始复制出错: {2} Help lines - 帮助线 + 辅助线 Start line - 起航线 + 起航线 Finish line - 终点线 + 终点线 Advantage line - 优势航线 + 优势航线 Course middle line - 场地中线 + 场地中线 Messaging port number (0 for default) - 消息传送端口编号(默认为 0) + 消息传送端口编号(默认为 0) Servlet port number - Servlet 端口编号 + Servlet 端口编号 Registered at {0} - 注册日期{0} + 注册日期{0} Replicating from master {0}:{2}, messaging port {3}:{1}, exchange {4} - 正在从主服务器{0}:{2}、消息传送端口{3}:{1}、交换机{4}复制 + 正在从主服务器{0}:{2}、消息传送端口{3}:{1}、交换机{4}复制 Show wind speed data - 显示风速数据 + 显示风速数据 Show wind directions data - 显示风向数据 + 显示风向数据 Fleet - 船队 + 船队 Boat Class - 船只级别 + 船只级别 Set delay to live - 设置实况延迟 + 设置实况延迟 Please enter a venue. - 请输入场地。 + 请输入场地。 Please enter a start date and an end date. - 请输入开始日期和结束日期。 + 请输入开始日期和结束日期。 The start date must be before the end date. - 开始日期必须早于结束日期。 + 开始日期必须早于结束日期。 An event with this name already exists. - 具有此名称的活动已存在。 + 具有此名称的活动已存在。 Venue - 场地 + 场地 Please select a boat class. - 请选择船只级别。 + 请选择船只级别。 A regatta with this name already exists. - 具有此名称的比赛已存在。 + 具有此名称的比赛已存在。 A series with this name already exists. - 具有此名称的序列已存在。 + 具有此名称的序列已存在。 A fleet with this name already exists. - 具有此名称的船队已存在。 + 具有此名称的船队已存在。 Fleets - 船队 + 船队 Series - 系列 + 系列 Split fleet - 船队区分 + 船队区分 Color - 颜色 + 颜色 Medal Series - 奖牌轮系列 + 奖牌轮系列 No color - 没有颜色 + 没有颜色 Please select a regatta. - 请选择比赛。 + 请选择比赛。 Add fleet - 添加船队 + 添加船队 Do you really want to remove the regatta "{0}"? This will also remove all leaderboards for this regatta! - 是否确定移除比赛 "{0}"? 还将移除此比赛的所有积分榜! + 是否确定移除比赛 "{0}"? 还将移除此比赛的所有积分榜! Error loading score correction providers: {0} - 加载得分更正机构出错: {0} + 加载得分更正机构出错: {0} Select result list to import from - 选择从中导入的结果清单 + 选择从中导入的结果清单 of - / + / Error obtaining score corrections from provider {0} and event {1} for boat class {2} published on {3}: {4} - 从机构{0}获取于{3}公布的船只级别{2}活动{1}的得分更正出错: {4} + 从机构{0}获取于{3}公布的船只级别{2}活动{1}的得分更正出错: {4} Assign race numbers of official results to leaderboard race columns - 向积分榜比赛轮次列分配官方结果的比赛轮次数 + 向积分榜比赛轮次列分配官方结果的比赛轮次数 Import official results... - 导入官方结果... + 导入官方结果... Select all - 全选 + 全选 Apply - 应用 + 应用 Successfully updated scores - 已成功更新得分 + 已成功更新得分 Error updating scores for leaderboard {0}: {1} - 更新积分榜{0}的得分出错: {1} + 更新积分榜{0}的得分出错: {1} Maneuver types to show when competitor is clicked - 点击参赛队时显示的操作类型 + 点击参赛队时显示的操作类型 Simulate as live race - 模拟实况比赛轮次 + 模拟实况比赛轮次 Offset before start in minutes: - 起航前的偏移(分钟): + 起航前的偏移(分钟): The selected races contain boat classes which are not the same as the boat class ''{0}'' of the selected regatta. No races will be loaded. - 所选的比赛轮次包含不同于所选比赛船只级别 "{0}" 的船只级别。 将不加载比赛轮次。 + 所选的比赛轮次包含不同于所选比赛船只级别 "{0}" 的船只级别。 将不加载比赛轮次。 There is at least one regatta for the selected boat classes. Really create default regatta(s) for those race(s)? - 所选船只级别至少有一场比赛。是否确定为这些比赛轮次创建默认比赛? + 所选船只级别至少有一场比赛。是否确定为这些比赛轮次创建默认比赛? Reload - 重新加载 + 重新加载 Add Regatta... - 添加比赛... + 添加比赛... Import Regattas... - 导入比赛... + 导入比赛... Exchange Name - 交换机名称 + 交换机名称 Course - 场地 + 场地 Course layout - 场地设置 + 场地设置 Buoy - 浮标 + 浮标 Gate - 门标 + 门标 Buoys - 浮标 + 浮标 Waypoint - 航路点 + 航路点 Show all competitors - 显示所有参赛队 + 显示所有参赛队 Boat tails - 船只尾流线 + 船只尾流线 Start line to first Mark Triangle - 起航线与第一个标志形成的三角形 + 起航线与第一个标志形成的三角形 Result import URLs - 结果导入 URL + 结果导入 URL Error refreshing result import URL list: {0} - 刷新结果导入 URL 清单出错: {0} + 刷新结果导入 URL 清单出错: {0} Successfully updated result import URL list - 已成功更新结果导入 URL 清单 + 已成功更新结果导入 URL 清单 Error removing result import URLs: {0} - 移除结果导入 URL 出错: {0} + 移除结果导入 URL 出错: {0} Please enter a URL. - 请输入 URL。 + 请输入 URL。 Add result import URL - 添加结果导入 URL + 添加结果导入 URL Error adding result import URL: {0} - 添加结果导入 URL 出错: {0} + 添加结果导入 URL 出错: {0} Remote Server Instances - 远程服务器实例 + 远程服务器实例 Local Server - 本地服务器 + 本地服务器 Error refreshing SailingServer instances: {0} - 刷新 SailingServer 实例出错: {0} + 刷新 SailingServer 实例出错: {0} Successfully updated SailingServer instances - 已成功更新 SailingServer 实例 + 已成功更新 SailingServer 实例 Error removing SailingServer instances: {0} - 移除 SailingServer 实例出错: {0} + 移除 SailingServer 实例出错: {0} Add SailingServer instance - 添加 SailingServer 实例 + 添加 SailingServer 实例 Error adding SailingServer instance: {0} - 添加 SailingServer 实例出错: {0} + 添加 SailingServer 实例出错: {0} Error trying to obtain leaderboard contents: {0} - 尝试获取积分榜内容出错: {0} + 尝试获取积分榜内容出错: {0} Last Score Update - 上次得分更新 + 上次得分更新 This website is not optimized for your browser. Please switch to a newer one like Firefox or Chrome. - 此网站未针对您的浏览器实施优化。请切换为更新浏览器,例如 Firefox 或 Chrome。 + 此网站未针对您的浏览器实施优化。请切换为更新浏览器,例如 Firefox 或 Chrome。 New Mark - 新标志 + 新标志 Mark/Gate - 标志/门标 + 标志/门标 Error updating race course: {0} - 更新比赛轮次场地出错: {0} + 更新比赛轮次场地出错: {0} Successfully updated race course - 已成功更新比赛轮次场地 + 已成功更新比赛轮次场地 Select two marks to create a gate - 选择两个标志,以创建门标 + 选择两个标志,以创建门标 Error trying to obtain the marks of the race course: {0} - 尝试获取比赛轮次场地的标志出错: {0} + 尝试获取比赛轮次场地的标志出错: {0} Error trying to obtain the race course: {0} - 尝试获取比赛轮次场地出错: {0} + 尝试获取比赛轮次场地出错: {0} Insert waypoint before selected - 选择前插入航路点 + 选择前插入航路点 Insert waypoint after selected - 选择后插入航路点 + 选择后插入航路点 Add Gate - 添加门标 + 添加门标 Low Point System - 低分系统 + 低分系统 High Point System - 高分系统 + 高分系统 High Point System ESS Overall (10) - 高分系统 - 总体极限帆船系列赛 (10) + 高分系统 - 总体极限帆船系列赛 (10) High Point System ESS Overall (12) - 高分系统 - 总体极限帆船系列赛 (12) + 高分系统 - 总体极限帆船系列赛 (12) Score in points. Winner of an act scores 12 points, 2nd - 11 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. - 得分。 分站赛获胜者得 12 分、第 2 名 11 分、.... 在总体极限帆船系列赛中如有平局,以获得最多分站赛名次的参赛队取得胜利。 如果仍有平局,就以最后一个分站赛的名次打破平局。 + 得分。 分站赛获胜者得 12 分、第 2 名 11 分、.... 在总体极限帆船系列赛中如有平局,以获得最多分站赛名次的参赛队取得胜利。 如果仍有平局,就以最后一个分站赛的名次打破平局。 High Point System, Last Race Breaks Tie - 高分系统,最后一轮打破平局 + 高分系统,最后一轮打破平局 Low Point System, Winner Gets Zero - 低分系统,获胜者得零分 + 低分系统,获胜者得零分 High Point System, Winner Gets 5 Points - 高分系统,获胜者得 5 分 + 高分系统,获胜者得 5 分 High Point System, Winner Gets 6 Points - 高分系统,获胜者得 6 分 + 高分系统,获胜者得 6 分 High Point System, Winner Gets 8 Points - 高分系统,获胜者得 8 分 + 高分系统,获胜者得 8 分 High Point System, Winner 8 Points, Interpolated - 高分系统,获胜者 8 分,内插 + 高分系统,获胜者 8 分,内插 Low Point with Eliminations and Rounds, Winner Gets 0.7 Points - 采用多轮淘汰制的低分系统,获胜者得 0.7 分 + 采用多轮淘汰制的低分系统,获胜者得 0.7 分 A variant of the low-point scoring scheme, using eliminations consisting of rounds.\nEach round shall be modeled as a series in the regatta, and the fleet ordering counts backwards\nstarting with the highest number for the first round.\nIf a final and losers final take place, use 1 and 2 as their ordering. Start with 3 for the semi-final round. - 低分记分系统的一种,采用多轮淘汰制。\n每一轮应作为比赛系列,船队顺序\n从第一轮的最高数向后计。\n如果有最终一支舰队和最终败者,则使用 1 和 2 排序。 半决赛从第 3 位开始。 + 低分记分系统的一种,采用多轮淘汰制。\n每一轮应作为比赛系列,船队顺序\n从第一轮的最高数向后计。\n如果有最终一支舰队和最终败者,则使用 1 和 2 排序。 半决赛从第 3 位开始。 Low Point, ties broken by act point sum, then last act - 低分,分站赛得分总和,否则采用最后一个分站赛的得分打破平局 + 低分,分站赛得分总和,否则采用最后一个分站赛的得分打破平局 Instead of the usual count-back system used for low point schemes to break ties, competitors with equal point sums are compared by comparing the sum of the points they scored across all acts. If this still leaves a tie, the tie is broken by the last act. - 与用于低分记分系统打破平局的常规倒算系统不同,对于总得分相同的参赛队,比较其在所有分站赛中的得分总和。 如果仍有平局,则以最后一个分站赛的得分打破平局。 + 与用于低分记分系统打破平局的常规倒算系统不同,对于总得分相同的参赛队,比较其在所有分站赛中的得分总和。 如果仍有平局,则以最后一个分站赛的得分打破平局。 High Point, winner gets 1 point - 高分,获胜者得 1 分 + 高分,获胜者得 1 分 High Point, winner gets 10 points - 高分,获胜者得 10 分 + 高分,获胜者得 10 分 High Point, winner gets 10 points (or 8) - 高分,获胜者得 10 分(或 8 分) + 高分,获胜者得 10 分(或 8 分) Score in points. Winner scores 10 points, 2nd - 9 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. - 得分。 获胜者得 10 分、第 2 名 9 分、.... 以赢得最多比赛轮次的参赛队取得胜利,如果仍有平局,则以最后一个比赛轮次的名次打破平局。 + 得分。 获胜者得 10 分、第 2 名 9 分、.... 以赢得最多比赛轮次的参赛队取得胜利,如果仍有平局,则以最后一个比赛轮次的名次打破平局。 High Point, winner gets 12 points (or 8) - 高分,获胜者得 12 分(或 8 分) + 高分,获胜者得 12 分(或 8 分) Score in points. Winner scores 12 points, 2nd - 11 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. - 得分。 获胜者得 12 分、第 2 名 11 分、.... 以赢得最多比赛轮次的参赛队取得胜利,如果仍有平局,则以最后一个比赛轮次的名次打破平局。 + 得分。 获胜者得 12 分、第 2 名 11 分、.... 以赢得最多比赛轮次的参赛队取得胜利,如果仍有平局,则以最后一个比赛轮次的名次打破平局。 Scoring system - 记分系统 + 记分系统 Create flexible leaderboard - 创建灵活的积分榜 + 创建灵活的积分榜 Create regatta leaderboard - 创建比赛积分榜 + 创建比赛积分榜 Create default regatta leaderboard - 创建默认的比赛积分榜 + 创建默认的比赛积分榜 Edit flexible leaderboard - 编辑灵活的积分榜 + 编辑灵活的积分榜 Edit regatta leaderboard - 编辑比赛积分榜 + 编辑比赛积分榜 Default regatta - 默认的比赛 + 默认的比赛 Use Overall leaderboard - 使用总积分榜 + 使用总积分榜 Overall Standings - 总排名 + 总排名 Type - 类型 + 类型 Add races - 添加比赛轮次 + 添加比赛轮次 races with name prefix - 具有名称前缀的比赛轮次 + 具有名称前缀的比赛轮次 Max SOG - 最大实际速度 + 最大实际速度 The competitor''s greatest speed over ground measured in the regatta. - 比赛中参赛队的最大实际速度。 + 比赛中参赛队的最大实际速度。 Total time downwind - 顺风总时间 + 顺风总时间 The total time the competitor sailed downwind in the regatta. - 参赛队在比赛中顺风航行的总时间。 + 参赛队在比赛中顺风航行的总时间。 Total time upwind - 迎风总时间 + 迎风总时间 The total time the competitor sailed upwind in the regatta. - 参赛队在比赛中迎风航行的总时间。 + 参赛队在比赛中迎风航行的总时间。 Total time reaching - 横风总时间 + 横风总时间 The total time the competitor sailed on reaching legs in the regatta. - 参赛队在比赛中的横风航段航行的总时间。 + 参赛队在比赛中的横风航段航行的总时间。 Total time - 总时间 + 总时间 The total time the competitor sailed in the regatta, counted from race start time. - 从比赛轮次开始时间算起,参赛队在比赛中航行的总时间。 + 从比赛轮次开始时间算起,参赛队在比赛中航行的总时间。 Total distance - 总距离 + 总距离 The total distance sailed in the regatta. - 比赛中航行的总距离。 + 比赛中航行的总距离。 ∅ SOG - ∅ 实际速度 + ∅ 实际速度 Average speed over ground across the regatta. - 比赛中的平均实际速度。 + 比赛中的平均实际速度。 hh:mm:ss - hh:mm:ss + hh:mm:ss Add wind data - 添加风力数据 + 添加风力数据 The value of ''{0}'' must be between {1} and {2}. - "{0}" 的值必须在{1}与{2}之间。 + "{0}" 的值必须在{1}与{2}之间。 The value of ''{0}'' must be greater than {1}. - "{0}" 的值必须大于{1}。 + "{0}" 的值必须大于{1}。 optional - 可选 + 可选 Please enter a value. - 请输入值。 + 请输入值。 Latitude - 纬度 + 纬度 Longitude - 经度 + 经度 Add Event - 添加活动 + 添加活动 Publication URL - 出版 URL + 出版 URL Suppress - 禁止 + 禁止 Is public - 公开 + 公开 Unsuppress - 取消禁止 + 取消禁止 Suppressed Competitors - 禁止的参赛队 + 禁止的参赛队 Audio & Video - 音频和视频 + 音频和视频 URL - URL + URL MIME Type - MIME 类型 + MIME 类型 Title - 标题 + 标题 Duration (h:mm:ss.ms) - 持续时间 (h:mm:ss.ms) + 持续时间 (h:mm:ss.ms) Add Audio/Video - 添加音频/视频 + 添加音频/视频 Add Youtube - 添加 Youtube + 添加 Youtube Youtube Id - Youtube 编号 + Youtube 编号 Do you really want to remove media track ''{0}''? - 是否确定移除媒体轨道 "{0}"? + 是否确定移除媒体轨道 "{0}"? Please select a series - 请选择系列 + 请选择系列 Please select a race - 请选择比赛轮次 + 请选择比赛轮次 Display groups in reverse order - 以相反的顺序显示分组 + 以相反的顺序显示分组 Configure URL - 配置 URL + 配置 URL Configure a leaderboard and obtain the resulting URL from the link - 配置积分榜,并从链接获取生成的 URL + 配置积分榜,并从链接获取生成的 URL Embedded - 嵌入式 + 嵌入式 Additional URL Settings - 附加 URL 设置 + 附加 URL 设置 Restrict to single selected race - 限制为单个选择的比赛轮次 + 限制为单个选择的比赛轮次 Expand selected race - 展开选择的比赛轮次 + 展开选择的比赛轮次 Allow for race details - 允许比赛轮次详情 + 允许比赛轮次详情 Number of races - 比赛轮次数 + 比赛轮次数 Please enter the number of last races to be displayed - 请输入要显示的最后比赛轮次的数量 + 请输入要显示的最后比赛轮次的数量 Choose the way you select races - 选择选取比赛轮次的方式 + 选择选取比赛轮次的方式 Select from all races - 从所有比赛轮次中选择 + 从所有比赛轮次中选择 Select a number of races - 选择一定量的比赛轮次 + 选择一定量的比赛轮次 Number of most current races to show - 待显示的最新比赛轮次的数量 + 待显示的最新比赛轮次的数量 Always expand last race shown - 始终展开显示的最后比赛轮次 + 始终展开显示的最后比赛轮次 Factor - 系数 + 系数 Error updating the medal race setting: {0} - 更新奖牌轮设置出错: {0} + 更新奖牌轮设置出错: {0} Maneuver loss - 操作损失 + 操作损失 ∅ Maneuver Loss - ∅ 操作损失 + ∅ 操作损失 The average distance loss during any mneuver. - 任何操作中的平均距离损失。 + 任何操作中的平均距离损失。 ∅ Tack Loss - ∅ 迎风转向损失 + ∅ 迎风转向损失 The average distance loss during tacks. - 迎风转向中的平均距离损失。 + 迎风转向中的平均距离损失。 ∅ Jibe Loss - ∅ 顺风转向损失 + ∅ 顺风转向损失 The average distance loss during jibes. - 顺风转向中的平均距离损失。 + 顺风转向中的平均距离损失。 Shape - 形状 + 形状 Pattern - 模式 + 模式 Legend - 图例 + 图例 live - 实况 + 实况 SwissTiming Archived Events - SwissTiming 归档的活动 + SwissTiming 归档的活动 Error fetching chart data: {0} - 获取记录数据出错: {0} + 获取记录数据出错: {0} Loading competitor data... - 正在加载参赛队数据... + 正在加载参赛队数据... {0} after race {1} - {0} 比赛轮次后 {1} + {0} 比赛轮次后 {1} Ranking - 排名 + 排名 Total points - 总分 + 总分 Competitor''s total points in the race - 参赛队在本轮次比赛中的总分 + 参赛队在本轮次比赛中的总分 Competitor''s total points in the regatta - 参赛队在比赛中的总分 + 参赛队在比赛中的总分 Show rank chart - 显示排名记录 + 显示排名记录 Overall Leaderboard - 总积分榜 + 总积分榜 Error trying to obtain overall leaderboards: {0} - 尝试获取总积分榜出错: {0} + 尝试获取总积分榜出错: {0} finished - 已完成 + 已完成 upcoming - 即将到来 + 即将到来 Next - 下一个 + 下一个 in progress - 正在进行 + 正在进行 passed to {0} - 传输到{0} + 传输到{0} Gap Change - 差距变化 + 差距变化 The change of the gap to the leader since the last leg start.\nA negative number means that the gap was decreased;\na positive number means that it was increased. - 最后一个航段开始时与第一名差距的变化。\n负数表示差距减小;\n正数表示差距增加。 + 最后一个航段开始时与第一名差距的变化。\n负数表示差距减小;\n正数表示差距增加。 Mark rounded to - 绕圈的标志 + 绕圈的标志 Side to which the mark at leg start was rounded. - 在航段起点的标志处绕圈的一侧。 + 在航段起点的标志处绕圈的一侧。 Race {0} is live - 正在直播比赛轮次{0} + 正在直播比赛轮次{0} Races {0} are live - 正在直播比赛轮次{0} + 正在直播比赛轮次{0} Regatta {0} is live - 正在直播比赛{0} + 正在直播比赛{0} Regattas {0} are live - 正在直播比赛{0} + 正在直播比赛{0} kts - kts + kts {0,number,#0.0} kts - {0,number,#0.0} kts + {0,number,#0.0} kts {0,number,#0.0} - {1,number,#0.0} kts - {0,number,#0.0} - {1,number,#0.0} kts + {0,number,#0.0} - {1,number,#0.0} kts Generate Polar Sheet - 生成极坐标表 + 生成极坐标表 Polar Diagrams - 极坐标图 + 极坐标图 Polar Sheet - 极坐标表 + 极坐标表 Minimum datapoints per graph - 各图形的最小数据点 + 各图形的最小数据点 All graphs with less underlying datapoints are not shown visually.\nThis way there are no distracting diagrams shown for\nwindspeeds lacking a sufficient amount of data. - 不显示基础数据点较少的所有图形。\n这样就不会为数据量不足的风速\n显示分散图。 + 不显示基础数据点较少的所有图形。\n这样就不会为数据量不足的风速\n显示分散图。 Minimum datapoints per angle - 各角度的最小数据点 + 各角度的最小数据点 In each graph only data about angles with at least the given amount\nof underlying datapoints will be shown. Insignificant\nparts of the diagram can be hidden using this threshold. - 在各图形中,仅显示至少具有一定量\n的基础数据点的角度数据。 可使用临界值隐藏图中的不重要\n部分。 + 在各图形中,仅显示至少具有一定量\n的基础数据点的角度数据。 可使用临界值隐藏图中的不重要\n部分。 Minimum wind confidence value - 最小风力置信度 + 最小风力置信度 Only fixes with wind having a confidence over the given threshold are\nused. This confidence is between 0 and 1. - 仅使用风力置信度高于给定临界值\n的修复。此置信度介于 0 和 1。 + 仅使用风力置信度高于给定临界值\n的修复。此置信度介于 0 和 1。 Minimum confidence measure - 最小置信度 + 最小置信度 The minimum confidence measure for a point shown in the graph.\nIf it''s below the given threshold, the point won''t show.\nThe measure is between 0 and 1 and determined\nusing statistical measures. - 图形中显示某点的最低置信度。\n如果低于给定的临界值,则不显示此点。\n置信度介于 0 和 1,并使用统计方法\n确定。 + 图形中显示某点的最低置信度。\n如果低于给定的临界值,则不显示此点。\n置信度介于 0 和 1,并使用统计方法\n确定。 Use only wind gauge data for wind speed - 仅将风力表数据用于风速 + 仅将风力表数据用于风速 By taking only the speed data of wind gauges into account\nwe exclude guessed manually entered wind speeds, which can falsify the polar diagram. - 仅考虑风力表的速度数据,\n我们排除手动输入的猜测的风速,此风速可能会篡改极坐标图。 + 仅考虑风力表的速度数据,\n我们排除手动输入的猜测的风速,此风速可能会篡改极坐标图。 Use only estimation for wind direction - 仅将估算用于风向 + 仅将估算用于风向 By using the accurate wind estimation for the wind direction,\nwe fix polar diagrams that are rotated due to invalid wind\ngauge data. - 通过使用针对风向的准确风力估计,\n我们修复因无效的风力表\n数据造成旋转的极坐标图。 + 通过使用针对风向的准确风力估计,\n我们修复因无效的风力表\n数据造成旋转的极坐标图。 Remove outliers (Distance based approach) - 移除离群点(基于距离的方法) + 移除离群点(基于距离的方法) Outliers are removed by a distance based approach.\nThe parameters can be adjusted below. - 通过基于距离的方法移除离群点。\n可在下方调整参数。 + 通过基于距离的方法移除离群点。\n可在下方调整参数。 Outlier detection neighborhood radius - 离群点检测邻近半径 + 离群点检测邻近半径 The radius used in the distance based outlier\ndetection algorithm. - 基于距离的离群点\n检测算法中使用的半径。 + 基于距离的离群点\n检测算法中使用的半径。 Minimum outlier detection neighborhood percentage - 最小离群点检测邻近百分比 + 最小离群点检测邻近百分比 The percentage of neightborhood datapoints / overall datapoints\nneeds to be at less than the given value for the point to be considered an outlier. - 邻近数据点/总数据点的百分比需要小于作为离群点的给定值。 + 邻近数据点/总数据点的百分比需要小于作为离群点的给定值。 Number of histogram columns per wind range - 各风力范围的直方图列数 + 各风力范围的直方图列数 Wind stepping in knots - 风力步进(节) + 风力步进(节) Max. distance to wind level - 风高度的最大距离 + 风高度的最大距离 Sets a max radius for which fixes will be assigned to the wind levels. - 设置将修复分配到风高度的最大半径。 + 设置将修复分配到风高度的最大半径。 Split Windsources - 风源区分 + 风源区分 Splitting Windsources allows a better search for bad wind gauges.\nThe statistical correctness cannot be guaranteed. The same fix can\ncount into the resulting polar sheet multiple times (for different wind gauges). - 拆分风源可更好地搜索坏风力表。\n无法保证统计的正确性。 (对于不同的风力表)相同的修复可\n多次计入极坐标表。 + 拆分风源可更好地搜索坏风力表。\n无法保证统计的正确性。 (对于不同的风力表)相同的修复可\n多次计入极坐标表。 Apply minimum wind confidence - 应用最小风力置信度 + 应用最小风力置信度 If checked the value in the box above will be used as the minimum valid wind confidence during generation. - 如果选中,以上方框中的值将在生成期间用作最小有效的风力置信度。 + 如果选中,以上方框中的值将在生成期间用作最小有效的风力置信度。 Distribution in the wind range. - 风力范围分布。 + 风力范围分布。 Please hover over the options to view tooltips where available. - 请将鼠标移到选项,查看可用的工具提示。 + 请将鼠标移到选项,查看可用的工具提示。 Names of the members of this competitor. - 此参赛队的成员姓名。 + 此参赛队的成员姓名。 Shows the flag of the country and the sail number of the competitor. - 显示参赛队所代表的国家国旗和帆号。 + 显示参赛队所代表的国家国旗和帆号。 The overall rank of this competitor in the regatta. - 参赛队在比赛中的总名次。 + 参赛队在比赛中的总名次。 Points carried over from previous races. - 前几个轮次的比赛中的得分。 + 前几个轮次的比赛中的得分。 The total of all points of a competitor in the regatta.\nSorting based on rank, not points. - 参赛队在比赛中的总得分。\n按名次(而不是得分)排序。 + 参赛队在比赛中的总得分。\n按名次(而不是得分)排序。 Wind data - 风力数据 + 风力数据 GPS data - GPS 数据 + GPS 数据 Status - 状态 + 状态 No data found - 未找到数据 + 未找到数据 Display name - 显示名称 + 显示名称 Histogram - 直方图 + 直方图 Number of data points - 数据点数 + 数据点数 Angle: {0}; Total number of data-points: {1}; Coefficiant of Variation: {2}; Confidence Measure: {3} - 角度: {0};数据点总数: {1};偏差系数: {2};置信度: {3} + 角度: {0};数据点总数: {1};偏差系数: {2};置信度: {3} Buoy zone - 浮标区 + 浮标区 Radius (m) - 半径 (m) + 半径 (m) Filter regattas by name - 按名称筛选比赛 + 按名称筛选比赛 There are no regattas yet. - 暂无比赛。 + 暂无比赛。 Add course area - 添加场地区域 + 添加场地区域 Course areas - 场地区域 + 场地区域 Course area - 场地区域 + 场地区域 Please enter a course area. - 请输入场地区域。 + 请输入场地区域。 Please select a course area. - 请选择场地区域。 + 请选择场地区域。 Upper flag - 上旗标 + 上旗标 Lower flag - 下旗标 + 下旗标 This is a regatta leaderboard. You can only add races to this leaderboard directly in the regatta definition. - 有比赛积分榜。您只能在比赛定义中将比赛轮次直接添加到此积分榜。 + 有比赛积分榜。您只能在比赛定义中将比赛轮次直接添加到此积分榜。 Correct Score - 更正得分 + 更正得分 Correct score for competitor {0} in race {1} - 更正参赛队{0}在比赛轮次{1}中的得分 + 更正参赛队{0}在比赛轮次{1}中的得分 Penalty/Redress - 惩罚/补偿 + 惩罚/补偿 Net points - 净分 + 净分 Time point must be after start of tracking. - 时间点必须在跟踪开始之后。 + 时间点必须在跟踪开始之后。 Time point must be before end of tracking. - 时间点必须在跟踪结束之前。 + 时间点必须在跟踪结束之前。 Regatta used for the tracked race - 用于跟踪的比赛轮次的比赛 + 用于跟踪的比赛轮次的比赛 TracTrac Server Update URI - TracTrac 服务器更新 URI + TracTrac 服务器更新 URI Passing instructions - 绕标说明 + 绕标说明 Refresh now - 现在刷新 + 现在刷新 Stop updating - 停止更新 + 停止更新 Start updating - 开始更新 + 开始更新 Current time: - 当前时间: + 当前时间: TracTrac username - TracTrac 用户名 + TracTrac 用户名 TracTrac password - TracTrac 密码 + TracTrac 密码 Equals - 等于 + 等于 Not equals to - 不等于 + 不等于 Less than - 小于 + 小于 Less or equals - 小于或等于 + 小于或等于 Greater than - 大于 + 大于 Greater or equals - 大于或等于 + 大于或等于 Contains - 包含 + 包含 Not Contains - 不包含 + 不包含 Starts with - 开头为 + 开头为 Ends with - 结尾为 + 结尾为 Nationality - 国籍 + 国籍 The number must be greater than zero. - 数字必须大于零。 + 数字必须大于零。 Distance to line at Start - 起航前与起航线的距离 + 起航前与起航线的距离 Distance to line 5s before start - 起航前 5 秒时与起航线的距离 + 起航前 5 秒时与起航线的距离 SOG at Start - 起航时的实际速度 + 起航时的实际速度 SOG 5s before start - 起航前 5 秒时的实际速度 + 起航前 5 秒时的实际速度 SOG when Starting - 起航时的实际速度 + 起航时的实际速度 Distance to start line at race start time - 比赛轮次开始时离开起航线的距离 + 比赛轮次开始时离开起航线的距离 Distance to start line five seconds before the start - 起航前五秒时离开起航线的距离 + 起航前五秒时离开起航线的距离 Speed over ground at race start time - 比赛轮次开始时的实际速度 + 比赛轮次开始时的实际速度 Speed over ground five seconds before the start - 起航前五秒时的实际速度 + 起航前五秒时的实际速度 Speed over ground when the competitor passed the start - 参赛队越过起航线时的实际速度 + 参赛队越过起航线时的实际速度 Start Tack - 开始迎风转向 + 开始迎风转向 Tack on which the competitor started - 参赛队开始迎风转向 + 参赛队开始迎风转向 Port - 端口 + 端口 Starboard - 右舷 + 右舷 Port - 端口 + 端口 Starboard - 右舷 + 右舷 Please enter a number. - 请输入数字。 + 请输入数字。 Competitors filter - 参赛队筛选器 + 参赛队筛选器 Flag status - 旗标状态 + 旗标状态 Info - 信息 + 信息 Wind Fixes (first 3, last 3, true values) - 风力修复(前 3 个,后 3 个,真值) + 风力修复(前 3 个,后 3 个,真值) No Wind-Fixes available. - 风力修复不可用。 + 风力修复不可用。 Dist. Stb-Side of Line when Starting - 起航时起航线右舷的距离 + 起航时起航线右舷的距离 Distance to starboard side of start line or to the single start mark when the competitor passed the start - 参赛队越过起航线时离开起航线或单个起航标志右舷的距离 + 参赛队越过起航线时离开起航线或单个起航标志右舷的距离 Add filter - 添加筛选器 + 添加筛选器 Edit filter - 编辑筛选器 + 编辑筛选器 Available filters - 可用的筛选器 + 可用的筛选器 Create a filter set to filter the list of competitors. - 创建筛选器集,筛选参赛队清单。 + 创建筛选器集,筛选参赛队清单。 A filter with this name already exists. - 具有此名称的筛选器已存在。 + 具有此名称的筛选器已存在。 Add at least one filter criteria. - 至少添加一个筛选条件。 + 至少添加一个筛选条件。 Filter criteria - 筛选条件 + 筛选条件 Select a filter criteria - 选择筛选条件 + 选择筛选条件 Filter name - 筛选器名称 + 筛选器名称 operator - 运算符 + 运算符 value - 值 + 值 The nationality must be a two letter ISO code or a three letter IOC code. - 国籍必须为两个字母的 ISO 代码或三个字母的 IOC 代码。 + 国籍必须为两个字母的 ISO 代码或三个字母的 IOC 代码。 Race rank - 比赛轮次名次 + 比赛轮次名次 Waypoints - 航路点 + 航路点 Disable filter - 禁用筛选器 + 禁用筛选器 Enable filter - 启用筛选器 + 启用筛选器 Race Status - 比赛轮次状态 + 比赛轮次状态 Loading (on a slow internet connection this can take some minutes)... - 正在加载(如果网速较慢,可能需要几分钟时间)... + 正在加载(如果网速较慢,可能需要几分钟时间)... Races with state HIDDEN - 状态为 HIDDEN 的比赛轮次 + 状态为 HIDDEN 的比赛轮次 Invalid date format. Use: {0} - 日期格式无效。 使用: {0} + 日期格式无效。 使用: {0} Selected competitors - 选择的参赛队 + 选择的参赛队 Filter nothing - 筛选(无内容) + 筛选(无内容) Race Top {0} - 比赛轮次前{0}名 + 比赛轮次前{0}名 Total Top {0} - 总排名前{0}名 + 总排名前{0}名 Simulator - 模拟器 + 模拟器 Optionsbar - 选项栏 + 选项栏 Predict - 预测 + 预测 Setup - 设置 + 设置 Strength (in kn) - 强度 (kn) + 强度 (kn) Oscillation - 振荡 + 振荡 Oscillating - 振荡 + 振荡 Amplitude(in Grad) - 振幅 (Grad) + 振幅 (Grad) Frequency(in 1/h) - 频率 (1/h) + 频率 (1/h) Noise - 噪声 + 噪声 Sailing - 航行 + 航行 Optimality - 最优 + 最优 Maximum Turns - 最大圈数 + 最大圈数 Race Direction - 比赛方向 + 比赛方向 Upwind - 迎风 + 迎风 Downwind - 顺风 + 顺风 Strategies - 策略 + 策略 Omniscient - 全知级 + 全知级 Opportunist - 投机级 + 投机级 Mixed - 混合 + 混合 Maps - 地图 + 地图 Start-End - 开始-结束 + 开始-结束 Course - 场地 + 场地 Summary - 汇总 + 汇总 Replay - 重新播放 + 重新播放 Display - 显示 + 显示 Polar diagram - 极坐标图 + 极坐标图 Show - 显示 + 显示 hide - 隐藏 + 隐藏 Left wind - 左侧风 + 左侧风 Right wind - 右侧风 + 右侧风 strategyOption1 - 策略选项 1 + 策略选项 1 strategyOption2 - 策略选项 2 + 策略选项 2 strategyOption3 - 策略选项 3 + 策略选项 3 Leg - 航段 + 航段 Race - 比赛轮次 + 比赛轮次 Competitor - 参赛队 + 参赛队 Keep Bearings - 保持航向角 + 保持航向角 What-If Course - 模拟场地 + 模拟场地 Edit Regatta... - 编辑比赛... + 编辑比赛... Please select a sailing event... - 请选择航行活动... + 请选择航行活动... Please select a course area.. - 请选择场地区域.. + 请选择场地区域.. Area overview - 区域总览 + 区域总览 Course design overview - 场地设计总览 + 场地设计总览 Regatta overview - 比赛总览 + 比赛总览 Additional settings - 附加设置 + 附加设置 Show following course areas - 显示后续场地区域 + 显示后续场地区域 Show following regattas - 显示后续比赛 + 显示后续比赛 Show only races of same day - 仅显示同一天的比赛轮次 + 仅显示同一天的比赛轮次 Show currently running races - 显示当前举行的比赛轮次 + 显示当前举行的比赛轮次 Series defines result discarding rules - 系列定义结果作废规则 + 系列定义结果作废规则 Add series - 添加系列 + 添加系列 Regatta defines result discarding rules - 比赛定义结果作废规则 + 比赛定义结果作废规则 Series starts with zero score - 系列从零分开始 + 系列从零分开始 Master Data Import - 主数据导入 + 主数据导入 Success\nCreated {0} leaderboard group(s) and {1} leaderboard(s) and {2} event(s) and {3} regatta(s). - 成功\n已创建{0}个积分榜分组、{1}个积分榜、{2}个活动和{3}场比赛。 + 成功\n已创建{0}个积分榜分组、{1}个积分榜、{2}个活动和{3}场比赛。 Had to overwrite the following regattas, you will need to retrack their races: - 需要覆盖后续比赛,需要重新跟踪比赛轮次: + 需要覆盖后续比赛,需要重新跟踪比赛轮次: Regatta Overview Configuration - 比赛总览配置 + 比赛总览配置 Starts with non-discardable carry-forward - 从不可作废的得分开始 + 从不可作废的得分开始 Connect to replication master server - 连接到副本主服务器 + 连接到副本主服务器 Connect - 连接 + 连接 Connect to Master - 连接到主服务器 + 连接到主服务器 Messaging Hostname - 消息传送主机名称 + 消息传送主机名称 Hostname where the messaging queue is running on. - 运行消息传送队列的主机名称。 + 运行消息传送队列的主机名称。 Hostname where the replication master is running on. - 运行副本主服务器的主机名称。 + 运行副本主服务器的主机名称。 The name of the exchange queue. It must be the same as configured in master. - 交换机队列的名称。必须与主服务器中配置的相同。 + 交换机队列的名称。必须与主服务器中配置的相同。 The port of the messaging exchange queue. This is used for all data after initial load. - 消息传送交换机队列的端口。必须在初始加载后用于所有数据。 + 消息传送交换机队列的端口。必须在初始加载后用于所有数据。 Servlet port number that is used to connect to register this replica and receive initial load. - 用于连接注册此副本和接收初始加载的 Servlet 端口编号。 + 用于连接注册此副本和接收初始加载的 Servlet 端口编号。 Replicas registered (this server is master): - 副本已注册(此服务器为主服务器): + 副本已注册(此服务器为主服务器): Connections to a master (this server is a replica): - 与主服务器的连接(此服务器为副本): + 与主服务器的连接(此服务器为副本): No connections to a master server configured. Click the Connect to Master button to configure one. - 未配置与主服务器的连接。点击“连接到主服务器”按钮配置。 + 未配置与主服务器的连接。点击“连接到主服务器”按钮配置。 No connections from a replica found. You can connect replicas by using their AdminConsole. - 未找到来自副本的连接。可以使用管理控制台连接副本。 + 未找到来自副本的连接。可以使用管理控制台连接副本。 Stop Replication - 停止复制 + 停止复制 As link - 链接 + 链接 Pending - 待定 + 待定 Running - 运行 + 运行 Finishing - 正在完成 + 正在完成 Finished - 已完成 + 已完成 Scheduled - 已日程安排 + 已日程安排 Start phase - 开始阶段 + 开始阶段 General recall - 全召 + 全召 Postponed - 已延迟 + 已延迟 Abandoned - 已放弃 + 已放弃 Drop connection to all replicas (Dangerous!) - 断开与所有副本的连接(危险!) + 断开与所有副本的连接(危险!) ATTENTION: This server is configured to be a replica. Do NOT change anything or this will lead to strange effects! - 注意:此服务器配置为副本。请勿更改任何内容,否则将导致奇怪效果! + 注意:此服务器配置为副本。请勿更改任何内容,否则将导致奇怪效果! Drop connection - 断开连接 + 断开连接 Time Control - 时间控制 + 时间控制 The filter will show all competitors matching the criterias: - 筛选器将显示与条件匹配的所有参赛队: + 筛选器将显示与条件匹配的所有参赛队: Protest time - 声明时间 + 声明时间 ends - 结束 + 结束 ended - 已结束 + 已结束 Flags - 旗标 + 旗标 Last update - 上一次更新 + 上一次更新 No more racing today - 今天没有其他比赛 + 今天没有其他比赛 Further signals ashore - 岸上等信号 + 岸上等信号 Early starters - 抢航者 + 抢航者 Showing details for race {0} - 显示比赛轮次{0}的详情 + 显示比赛轮次{0}的详情 Start at - 开始时间 + 开始时间 Finish at - 结束时间 + 结束时间 Protest ends at - 声明结束时间 + 声明结束时间 Unknown - 未知 + 未知 Race log - 比赛轮次日志 + 比赛轮次日志 Regatta log - 比赛日志 + 比赛日志 Refresh race log - 刷新比赛轮次日志 + 刷新比赛轮次日志 Race log successfully reloaded from database - 比赛轮次日志已从数据库成功重新加载 + 比赛轮次日志已从数据库成功重新加载 Reload all race logs - 重新加载所有比赛轮次日志 + 重新加载所有比赛轮次日志 Export - 导出 + 导出 Sideline - 边线 + 边线 Flag displayed - eight minutes till start - the startprocedure is a gate start - 升起旗标 - 起航前八分钟 - 起航程序为门标起航 + 升起旗标 - 起航前八分钟 - 起航程序为门标起航 Flag displayed - five minutes till start - 升起旗标 - 起航前五分钟 + 升起旗标 - 起航前五分钟 Start mode flag - four minutes till start - 起航模式旗标 - 起航前四分钟 + 起航模式旗标 - 起航前四分钟 Start mode flag - disqualification for early starters - four minutes till start - 起航模式旗标 - 取消抢航者资格 - 起航前四分钟 + 起航模式旗标 - 取消抢航者资格 - 起航前四分钟 Start mode flag - penalties for early starters - four minutes till start - 起航模式旗标 - 惩罚抢航者 - 起航前四分钟 + 起航模式旗标 - 惩罚抢航者 - 起航前四分钟 Start mode flag - one minute till start - 起航模式旗标 - 起航前一分钟 + 起航模式旗标 - 起航前一分钟 Start mode flag - disqualification for early starters - one minute till start - 起航模式旗标 - 取消抢航者资格 - 起航前一分钟 + 起航模式旗标 - 取消抢航者资格 - 起航前一分钟 Start mode flag - start with penalties for early starters - one minute till start - 起航模式旗标 - 以惩罚抢航者起航 - 起航前一分钟 + 起航模式旗标 - 以惩罚抢航者起航 - 起航前一分钟 Flag removed - race starting signal - 降下旗标 - 比赛轮次开始信号 + 降下旗标 - 比赛轮次开始信号 Individual recall - had early starters - 个别召回 - 有抢航者 + 个别召回 - 有抢航者 General recall - had too many early starters - start procedure will be repeated - 全召 - 抢航者过多 - 将重复起航程序 + 全召 - 抢航者过多 - 将重复起航程序 Flag displayed - first competitor passed the finishing line - 升起旗标 - 第一支参赛队越过终点线 + 升起旗标 - 第一支参赛队越过终点线 Flag removed - last competitor passed the finishing line or the finish time limit is passed - 降下旗标 - 最后一支参赛队越过终点线或结束时间限制已过 + 降下旗标 - 最后一支参赛队越过终点线或结束时间限制已过 Flag removed - gate is closed - 降下旗标 - 移除门标 + 降下旗标 - 移除门标 Flag displayed - start postponed - no more racing today - 升起旗标 - 起航延迟 - 今天没有其他比赛 + 升起旗标 - 起航延迟 - 今天没有其他比赛 Flag displayed - start postponed - further signals ashore - 升起旗标 - 起航延迟 - 岸上等信号 + 升起旗标 - 起航延迟 - 岸上等信号 Flag displayed - start postponed - 升起旗标 - 起航延迟 + 升起旗标 - 起航延迟 Flag removed - start procedure starts in one minute - 降下旗标 - 起航程序在一分钟后开始 + 降下旗标 - 起航程序在一分钟后开始 Flag displayed - race abandoned - no more racing today - 升起旗标 - 放弃比赛 - 今天没有其他比赛 + 升起旗标 - 放弃比赛 - 今天没有其他比赛 Flag displayed - race abandoned - further signals ashore - 升起旗标 - 放弃比赛 - 岸上等信号 + 升起旗标 - 放弃比赛 - 岸上等信号 Flag displayed - race abandoned - 升起旗标 - 放弃比赛 + 升起旗标 - 放弃比赛 Protest time started - 声明时间开始 + 声明时间开始 Protest time ended - 声明时间结束 + 声明时间结束 Three minutes till start - 起航前三分钟 + 起航前三分钟 Two minutes till start - 起航前两分钟 + 起航前两分钟 One minute till start - 起航前一分钟 + 起航前一分钟 Race starting signal - 比赛轮次开始信号 + 比赛轮次开始信号 Data from before/after race - 比赛轮次前/后的数据 + 比赛轮次前/后的数据 All fixes (including outliers) - 所有修复(包括离群点) + 所有修复(包括离群点) Remote host: - 远程主机: + 远程主机: Fetch Leaderboard Group List - 获取积分榜分组清单 + 获取积分榜分组清单 Not a valid URL for fetching leaderboardgroups: {0} - 获取积分榜分组的 URL 无效: {0} + 获取积分榜分组的 URL 无效: {0} GET leaderboardgroups request failed for host {0} with error {1} - 主机{0}获取积分榜分组请求失败,错误为{1} + 主机{0}获取积分榜分组请求失败,错误为{1} No data was returned by the server - 服务器未返回数据 + 服务器未返回数据 GET leaderboardgroups request failed with Server error. Please see server logs for more information. - 获取积分榜请求失败,服务器出错。请查看服务器日志,了解更多信息。 + 获取积分榜请求失败,服务器出错。请查看服务器日志,了解更多信息。 Leaderboard Groups: - 积分榜分组: + 积分榜分组: Override existing data if names and ids match - 如果名称和编号匹配,则覆盖现有数据 + 如果名称和编号匹配,则覆盖现有数据 Import selected leaderboard groups - 导入选择的积分榜分组 + 导入选择的积分榜分组 You have to select at least one leaderboard group to import - 必须至少选择一个要导入的积分榜分组 + 必须至少选择一个要导入的积分榜分组 Deselect all - 取消全选 + 取消全选 Polar Diagram - 极坐标图 + 极坐标图 GPS Lag - GPS 滞后 + GPS 滞后 Ratio between time since last received GPS position and average sampling interval - 上次接收的 GPS 位置的时间和平均采样间隔之间的比率 + 上次接收的 GPS 位置的时间和平均采样间隔之间的比率 Tracking quality - 跟踪质量 + 跟踪质量 Leg Type - 航段形式 + 航段形式 Sail Number - 帆号 + 帆号 Series leaderboard - 系列积分榜 + 系列积分榜 Regatta leaderboards - 比赛积分榜 + 比赛积分榜 Clear Selection - 清除选择 + 清除选择 Running - 运行 + 运行 Run - 运行 + 运行 Done - 完成 + 完成 Last finished - 最后完成 + 最后完成 Run - 运行 + 运行 times - 次数 + 次数 Data amount - 数据量 + 数据量 ∅ Cleaned Server Time - ∅ 清理服务器时间 + ∅ 清理服务器时间 ∅ Cleaned Overall Time - ∅ 清理总时间 + ∅ 清理总时间 Data Mining Benchmark Results - 数据挖掘基准结果 + 数据挖掘基准结果 Server Time - 服务器时间 + 服务器时间 Confidence values need to be between 0 and 1. - 置信度需要介于 0 和 1。 + 置信度需要介于 0 和 1。 Minimum data size values cannot be negative. - 最小数据大小值不能为负。 + 最小数据大小值不能为负。 The number of histogram columns needs to be more than one. - 直方图列数需要为一个以上。 + 直方图列数需要为一个以上。 The outlier radius needs to be a positive number. - 离群点半径需要为正数。 + 离群点半径需要为正数。 The outlier neighborhood percentage needs to be positive and max. 1. - 离群点邻近百分比需要为正数,最大为 1。 + 离群点邻近百分比需要为正数,最大为 1。 Parameter fields cannot be empty. - 参数字段不能为空。 + 参数字段不能为空。 Error occured while trying to add\na new series to the chart. - 尝试向记录添加\n新系列时出错。 + 尝试向记录添加\n新系列时出错。 Generating Polar Sheet... - 正在生成极坐标表... + 正在生成极坐标表... Data Size - 数据大小 + 数据大小 Generation finished! - 生成完成! + 生成完成! Generating - 正在生成 + 正在生成 Remove all sheets - 移除所有工作表 + 移除所有工作表 Remove all - 全部移除 + 全部移除 Select sheet - 选择工作表 + 选择工作表 Cleaned Server Time - 清理服务器时间 + 清理服务器时间 Overall Time - 总时间 + 总时间 Cleaned Overall Time - 清理总时间 + 清理总时间 Data Mining Result - 数据挖掘结果 + 数据挖掘结果 Group by - 分组方式 + 分组方式 Calculate statistic - 计算统计 + 计算统计 Worked through {0} data entries in {1} seconds - {1}秒内处理{0}个数据条目 + {1}秒内处理{0}个数据条目 No query selected - 没有查询选择 + 没有查询选择 Run automatically - 自动运行 + 自动运行 Upload - 上传 + 上传 Import Wind from Expedition - 从导航图导入风力 + 从导航图导入风力 Boat Id: - 船只编号: + 船只编号: Do you really want to import wind into the selected {0} races?\nOnly races with applicable time window will be affected anyway. - 是否确定将风力数据导入所选的{0}个比赛轮次?\n只有时间范围适用的比赛轮次将受到影响。 + 是否确定将风力数据导入所选的{0}个比赛轮次?\n只有时间范围适用的比赛轮次将受到影响。 Do you really want to import wind into all races?\nOnly races with applicable time window will be affected anyway. - 是否确定将风力数据导入所有比赛轮次?\n只有时间范围适用的比赛轮次将受到影响。 + 是否确定将风力数据导入所有比赛轮次?\n只有时间范围适用的比赛轮次将受到影响。 Imported wind from: {0} to: {1}. {2} races affected. - 导入的风力数据自: {0}至: {1}。{2}个比赛轮次受到影响。 + 导入的风力数据自: {0}至: {1}。{2}个比赛轮次受到影响。 Race: {0} ({1}) - {2} fixes from: {3} to: {4} - 比赛轮次: {0} ({1}) - {2} 修复自: {3}至: {4} + 比赛轮次: {0} ({1}) - {2} 修复自: {3}至: {4} Error: {0} - 错误: {0} + 错误: {0} Toggles the visibility of the wind speed for all data sources - 切换所有数据源的风速的可见性 + 切换所有数据源的风速的可见性 Toggles the visibility of the wind direction for all data sources - 切换所有数据源的风向的可见性 + 切换所有数据源的风向的可见性 Combines all other wind sources to one data set - 将所有其他风源组合到一个数据集中 + 将所有其他风源组合到一个数据集中 A value based on the course layout (under the assumption, that the race starts with an upwind leg) - 基于场地设置(假设比赛轮次从迎风航段开始)的值 + 基于场地设置(假设比赛轮次从迎风航段开始)的值 Calculated data from the competitor tracks - 从参赛队跟踪计算的数据 + 从参赛队跟踪计算的数据 Data captured from mobile measuring systems - 从移动测量系统获取的数据 + 从移动测量系统获取的数据 Manually set data values - 手动设置数据值 + 手动设置数据值 Data manually set from the race officers - 从裁判长手动设置的数据 + 从裁判长手动设置的数据 Sheet name - 工作表名称 + 工作表名称 You can name your polar sheet using the text field.\nA name will be generated using the boat class\nif no name is provided. - 可以使用文本字段为极坐标表命名。\n如果不提供名称,会使用船只级别生成名称。 + 可以使用文本字段为极坐标表命名。\n如果不提供名称,会使用船只级别生成名称。 Time Downwind - 顺风时间 + 顺风时间 Time Reaching - 横风时间 + 横风时间 Time Upwind - 迎风时间 + 迎风时间 Total time traveled in this race, starting to measure when competitor passes start waypoint\n(not when the race starts) - 参赛队在本比赛轮次中越过开始航路点\n(不是比赛轮次开始时)航行的总时间 + 参赛队在本比赛轮次中越过开始航路点\n(不是比赛轮次开始时)航行的总时间 Total time traveled downwind in this race - 本轮次比赛顺风航行的总时间 + 本轮次比赛顺风航行的总时间 Total time traveled reaching in this race - 本轮次比赛横风航行的总时间 + 本轮次比赛横风航行的总时间 Total time traveled upwind in this race - 本轮次比赛迎风航行的总时间 + 本轮次比赛迎风航行的总时间 No statistic to calculate is selected - 未选择待计算的统计 + 未选择待计算的统计 The grouper script is empty - 群集器脚本为空 + 群集器脚本为空 No dimension to group by is selected - 未选择分组方式尺寸 + 未选择分组方式尺寸 No grouper type is selected - 未选择群集器类型 + 未选择群集器类型 No data retriever is selected - 未选择数据检索器 + 未选择数据检索器 No query possible, because - 无法查询,原因: + 无法查询,原因: Data Mining - 数据挖掘 + 数据挖掘 An error occured running the query - 运行查询期间出错 + 运行查询期间出错 Hide toolbar - 隐藏工具栏 + 隐藏工具栏 Show series leaderboards - 显示系列积分榜 + 显示系列积分榜 Show overall leaderboard - 显示总积分榜 + 显示总积分榜 length: {0}m\nangle to wind: {1}°\n{2} side has {3}m advantage - 长度: {0}m\n风力角度: {1}°\n{2}侧具有 {3}m 优势 + 长度: {0}m\n风力角度: {1}°\n{2}侧具有 {3}m 优势 Do you really want to remove the events? - 是否确定移除活动? + 是否确定移除活动? Do you really want to remove event {0}? - 是否确定移除活动 {0}? + 是否确定移除活动 {0}? Line - 线 + 线 Offset - 分支 + 分支 Do you really want to remove the selected competitors? - 是否确定移除所选的参赛队? + 是否确定移除所选的参赛队? Do you really want to remove competitor {0}? - 是否确定移除参赛队 {0}? + 是否确定移除参赛队 {0}? - Filter competitors by name, boat class or sail number - 按名称、船只级别或帆号筛选参赛队 + Filter competitors by name, boat class, sail number or ID + 按名称、船只级别或帆号或编号筛选参赛队 Edit Competitor - 编辑参赛队 + 编辑参赛队 Please enter a sail number - 请输入帆号 + 请输入帆号 Successfully allowed reload of competitor(s) {0}. - 已成功允许重新加载参赛队{0}。 + 已成功允许重新加载参赛队{0}。 ID - 编号 + 编号 Allow reload - 允许重新加载 + 允许重新加载 Compress - 压缩 + 压缩 Use only if exporting server instance is at least\nrunning with commit 0fbf6071dea125bec4a56dee55d61c99def4a62e. - 仅在导出服务器实例至少通过\n任务 0fbf6071dea125bec4a56dee55d61c99def4a62e 运行时使用。 + 仅在导出服务器实例至少通过\n任务 0fbf6071dea125bec4a56dee55d61c99def4a62e 运行时使用。 Query Runner - Query Runner + 查询执行器 Rerun query after refresh - 在刷新后重新运行查询 + 在刷新后重新运行查询 Refresh interval mustn''t be empty - 刷新间隔不得为空 + 刷新间隔不得为空 Selection Tables - 选择表 + 选择表 Add Configuration - 添加配置 + 添加配置 There are no configurations. - 没有配置。 + 没有配置。 Error retrieving configuration data from server. - 从服务器检索配置数据时出错。 + 从服务器检索配置数据时出错。 Allowed course areas - 允许的场地区域 + 允许的场地区域 Minimum rounds for Course - 场地的最小轮次 + 场地的最小轮次 Maximum rounds for Course - 场地的最大轮次 + 场地的最大轮次 Results mail recipient - 结果邮件收件人 + 结果邮件收件人 Device Configuration - 设备配置 + 设备配置 None - 无 + 无 Course designer - 场地设计师 + 场地设计师 Racing procedure - 比赛程序 + 比赛程序 Course names - 场地名称 + 场地名称 Generate - 生成 + 生成 Don''t overwrite - 不要覆盖 + 不要覆盖 Set regatta configuration - 设置比赛配置 + 设置比赛配置 Regatta configuration - 比赛配置 + 比赛配置 Activate individual recall - 激活个别召回 + 激活个别召回 + + + Activate result entry + 激活结果条目 RRS26 start - RRS26 开始 + RRS26 开始 Activate configuration - 激活配置 + 激活配置 Class flag - 级别旗标 + 级别旗标 Sets the class flag used for {0}. Choose ''Don''t Overwrite'' to activate the procedure''s default flag. - 设置用于{0}的级别旗标。 选择“不要覆盖”,激活程序的默认旗标。 + 设置用于{0}的级别旗标。 选择“不要覆盖”,激活程序的默认旗标。 When activated the Race Officer is able to call for individual recall. - 激活后,裁判长能够执行个别召回。 + 激活后,裁判长能够执行个别召回。 + + + When activated the Race Officer is able to enter results during and after the finishing phase. + 激活后,裁判长能够在结束阶段期间和之后输入结果。 Startmode flags - 起航模式旗标 + 起航模式旗标 Sets the available start mode flags. Choose none to enable the procedure''s default flags. - 设置可用的起航模式旗标。选择无,启用程序的默认旗标。 + 设置可用的起航模式旗标。选择无,启用程序的默认旗标。 Gate Start - 起航门标 + 起航门标 Activate Pathfinder - 激活探路者 + 激活探路者 When activated the Race Officer is able to set the Pathfinder boat. - 激活后,裁判长能够设置探路者船只。 + 激活后,裁判长能够设置探路者船只。 ESS Start - ESS 开始 + ESS 开始 Basic Start - 海选赛开始 + 海选赛开始 League Start - 联赛开始 + 联赛开始 Configured - 已配置 + 已配置 Activate regatta configuration - 激活比赛配置 + 激活比赛配置 Enabling this option will provide a base regatta configuration for all options unconfigured in the regatta-specific configuration. - 启用此选项将为比赛特定的配置中所有未配置的选项提供基本比赛配置。 + 启用此选项将为比赛特定的配置中所有未配置的选项提供基本比赛配置。 Set start time - 设置开始时间 + 设置开始时间 Current pass - 当前绕标 + 当前绕标 Select a new start time for the race. If you want to set the start time to a timepoint in the past then you have to enable the checkbox to update the pass count. Please be aware of the fact that changing the pass count will have you loose all information from the previous pass (like flag events). - 为比赛轮次选择新开始时间。 如果要将开始时间设置为过去的时间点,需要启用此复选框更新场次计数。 请注意,更改场次计数将丢失先前场次的所有信息(例如旗标活动)。 + 为比赛轮次选择新开始时间。 如果要将开始时间设置为过去的时间点,需要启用此复选框更新场次计数。 请注意,更改场次计数将丢失先前场次的所有信息(例如旗标活动)。 Set the start and end of tracking for the race. - 设置比赛轮次跟踪的开始和结束。 + 设置比赛轮次跟踪的开始和结束。 Activate additional golf down time - 激活附加高尔夫故障时间 + 激活附加高尔夫故障时间 Activate additional golf down time - 激活附加高尔夫故障时间 + 激活附加高尔夫故障时间 Invalid color: {0} - 颜色无效: {0} + 颜色无效: {0} Igtimi Accounts - Igtimi 账户 + Igtimi 账户 Error fetching all Igtimi accounts: {0} - 获取所有 Igtimi 账户出错: {0} + 获取所有 Igtimi 账户出错: {0} Add Igtimi Account - 添加 Igtimi 账户 + 添加 Igtimi 账户 Error authorizing access to Igtimi user {0}: {1} - 授予 Igtimi 用户{0}权限出错: {1} + 授予 Igtimi 用户{0}权限出错: {1} Successfully authorized access to Igtimi user {0} - 已成功授予 Igtimi 用户{0}权限 + 已成功授予 Igtimi 用户{0}权限 Could not authorize user {0}; invalid user name or password - 无法授予用户{0}权限;用户名或密码无效 + 无法授予用户{0}权限;用户名或密码无效 Error getting Igtimi authorization URL: {0} - 获取 Igtimi 权限 URL 出错: {0} + 获取 Igtimi 权限 URL 出错: {0} Add Igtimi User - 添加 Igtimi 用户 + 添加 Igtimi 用户 Do you really want to remove the leaderboards? - 是否确定移除积分榜? + 是否确定移除积分榜? Error trying to remove Igtimi account for user {0} - 尝试移除用户{0}的 Igtimi 账户出错 + 尝试移除用户{0}的 Igtimi 账户出错 Successfully removed Igtimi account for user {0} - 已成功移除用户{0}的 Igtimi 账户 + 已成功移除用户{0}的 Igtimi 账户 e-Mail address must not be empty - 电子邮件地址不得为空 + 电子邮件地址不得为空 e-mail address - 电子邮件地址 + 电子邮件地址 Password - 密码 + 密码 Do you really want to remove the leaderboard: ''{0}''? - 是否确定移除积分榜: ''{0}''? + 是否确定移除积分榜: ''{0}''? This is a meta leaderboard. It can''t be changed here. - 此为元积分榜。无法在此处更改。 + 此为元积分榜。无法在此处更改。 Failed to set new start time. This can happen when the same start time is already present in the race log or someone has added a start time that is newer (in terms of a pass id and logical time) than the one that you just added. - 设置新开始时间失败。 相同的开始时间可能已存在于比赛轮次日志中或某人已添加(场次编号和逻辑时间)更新的开始时间。 + 设置新开始时间失败。 相同的开始时间可能已存在于比赛轮次日志中或某人已添加(场次编号和逻辑时间)更新的开始时间。 Do you really want to remove Igtimi account granting access to data of user {0}? - 是否确定移除授予用户{0}访问数据权限的 Igtimi 账户? + 是否确定移除授予用户{0}访问数据权限的 Igtimi 账户? Import Wind from Igtimi - 从 Igtimi 导入风力数据 + 从 Igtimi 导入风力数据 See the ''Igtimi'' tab for account settings determining which data from Igtimi will be considered. - 请查看 "Igtimi" 选项卡了解账户设置,确定将考虑的 Igtimi 数据。 + 请查看 "Igtimi" 选项卡了解账户设置,确定将考虑的 Igtimi 数据。 Import Wind from Igtimi - 从 Igtimi 导入风力数据 + 从 Igtimi 导入风力数据 Error importing wind data from Igtimi: {0} - 从 Igtimi 导入风力数据出错: {0} + 从 Igtimi 导入风力数据出错: {0} The following number of fixes were imported for the listed races: {0} - 已为所列的比赛轮次导入以下修复: {0} + 已为所列的比赛轮次导入以下修复: {0} {0} to start - {0} - 开始 + {0} - 开始 {0} since start - {0} - 开始后 + {0} - 开始后 Distance to start line - 与起航线的距离 + 与起航线的距离 The angle between the competitors direction and the wind - 赛队航行的方向和风的夹角 + 赛队航行的方向和风的夹角 Beat Angle - 迎风航行角度 + 迎风航行角度 You can also view the overall diagram for the available boat classes. - 还可以查看可用船只级别的总直直方图。 + 还可以查看可用船只级别的总直直方图。 Show Diagram - 显示直方图 + 显示直方图 Run the query automatically, after you changed e.g. the statistic or the grouping. - 在更改统计或分组后,自动运行查询。 + 在更改统计或分组后,自动运行查询。 Reruns the query after the tables have been refreshed. - 在刷新表后,重新运行查询。 + 在刷新表后,重新运行查询。 Query Definition Provider - 查询定义提供方 + 查询定义提供方 Statistic Provider - 统计提供方 + 统计提供方 Calculate the - 计算 + 计算 Grouping Provider - 分组提供方 + 分组提供方 News and Release History - 消息和版本历史 + 消息和版本历史 Split fleets scored contiguously - 区分连续得分的船队 + 区分连续得分的船队 Add RaceLog Tracker - 添加比赛轮次日志跟踪器 + 添加比赛轮次日志跟踪器 Add RaceLog Trackers - 添加比赛轮次日志跟踪器 + 添加比赛轮次日志跟踪器 Denote for RaceLog tracking - 比赛轮次日志跟踪描述 + 比赛轮次日志跟踪描述 Start RaceLog Tracking - 开始比赛轮次日志跟踪 + 开始比赛轮次日志跟踪 Filter by Leaderboard - 按积分榜筛选 + 按积分榜筛选 Remove Leaderboard filter - 移除积分榜筛选器 + 移除积分榜筛选器 Competitor Registrations - 参赛队注册 + 参赛队注册 Tracker Status - 跟踪器状态 + 跟踪器状态 Can only be edited before starting tracking - 只可以在开始跟踪前编辑 + 只可以在开始跟踪前编辑 Define Course Layout - 定义场地设置 + 定义场地设置 Map Devices to Competitors and Marks - 将设备映射到参赛队和标志 + 将设备映射到参赛队和标志 Edit {0} - 编辑{0} + 编辑{0} Add {0} - 添加{0} + 添加{0} Remove {0} - 移除{0} + 移除{0} Please enter a {0} - 请输入{0} + 请输入{0} Ping {0} position - 定位{0} + 定位{0} Please enter a valid value for {0} ({1}) - 请为{0} ({1}) 输入有效值 + 请为{0} ({1}) 输入有效值 Copy course and competitors to other races - 将场地和参赛队复制到其他比赛轮次 + 将场地和参赛队复制到其他比赛轮次 Set tracking times - 设置跟踪事件 + 设置跟踪事件 Now select the race column and fleet to copy the course to. - 现在选择要将场地复制到的比赛轮次列和船队。 + 现在选择要将场地复制到的比赛轮次列和船队。 Select a single row in the table, to which to copy the course. - 在表中选择要将场地复制到的单个行。 + 在表中选择要将场地复制到的单个行。 Device ID - 设备编号 + 设备编号 Device Type - 设备类型 + 设备类型 Mapped to Type - 映射到类型 + 映射到类型 Mapped to - 映射到 + 映射到 Device Mappings - 设备映射 + 设备映射 At most one end of the mapping''s time range may be left open (left unset) - 至多可以将映射时间范围的一端保持开放(不设置) + 至多可以将映射时间范围的一端保持开放(不设置) Please select an item to map the device to - 请选择映射设备的项目 + 请选择映射设备的项目 Device - 设备 + 设备 Time Range - 时间范围 + 时间范围 Close open end of Time Range - 关闭时间范围的开放端 + 关闭时间范围的开放端 Set Timepoint that closes open time range - 设置关闭开放的时间范围的时间点 + 设置关闭开放的时间范围的时间点 The start of the time range must lie before its end - 时间范围的起点必须在终点之前 + 时间范围的起点必须在终点之前 Overall Progress - 总进度 + 总进度 Event Overview - 活动总览 + 活动总览 Start - 开始 + 开始 Show added scores for each entry in leaderboard - 为积分榜中的各条目显示添加的得分 + 为积分榜中的各条目显示添加的得分 ratio - 比率 + 比率 Import Wind - 导入风力数据 + 导入风力数据 Unchecking this option will drastically lower the amount of data transfered. - 取消选择此选项将大大降低传输的数据量。 + 取消选择此选项将大大降低传输的数据量。 Import Device Configurations - 导入设备配置 + 导入设备配置 Checking this will import ALL device configurations on the remote server. - 选择此选项将导入远程服务器中的所有设备配置。 + 选择此选项将导入远程服务器中的所有设备配置。 Author name - 作者名称 + 作者名称 Author priority - 作者优先级 + 作者优先级 Remove Denotation - 移除描述 + 移除描述 At least one of the selected races ({0}) is missing competitor registrations. Proceed anyway? - 所选的比赛轮次 ({0}) 中至少有一个缺少参赛队注册。 是否继续? + 所选的比赛轮次 ({0}) 中至少有一个缺少参赛队注册。 是否继续? Please select a control point - 请选择控制点 + 请选择控制点 2-mark-controlpoint - 2 个标志的控制点 + 2 个标志的控制点 Registered Competitors - 注册的参赛队 + 注册的参赛队 Competitor Pool - 参赛队库 + 参赛队库 Select at least one - 至少选择一个 + 至少选择一个 Select the Races - 选择比赛轮次 + 选择比赛轮次 Import Fixes - 导入修复 + 导入修复 No remote server instances registered yet. - 尚未注册远程服务器实例。 + 尚未注册远程服务器实例。 Registered remote server instances - 注册的远程服务器实例 + 注册的远程服务器实例 Filter Events by name: - 按名称筛选活动: + 按名称筛选活动: Leaderboards (except those of selected group) - 积分榜(所选分组的积分榜除外) + 积分榜(所选分组的积分榜除外) Available Leaderboard Groups - 可用的积分榜分组 + 可用的积分榜分组 Leaderboard Groups Assigned to Event - 分配到活动的积分榜分组 + 分配到活动的积分榜分组 Add races - 添加比赛轮次 + 添加比赛轮次 with name prefix - 含名称前缀 + 含名称前缀 Please select a series first. - 请先选择系列。 + 请先选择系列。 in {0,number} days - {0,number} 天后 + {0,number} 天后 tomorrow - 明天 + 明天 today - 今天 + 今天 Share by mail - 通过邮件分享 + 通过邮件分享 Share on Twitter - 在 Twitter 上分享 + 在 Twitter 上分享 Share on Facebook - 在 Facebook 上分享 + 在 Facebook 上分享 {0} in {1} on {2} - {2}{1}中的{0} + {2}{1}中的{0} String eventSharingShortText(String eventName, String venue, String dateString); I''d like to share {0} in {1} on {2}. Details on: \n{3} - 我要在{2}分享{0}中的{1}。 详情: \n{3} + 我要在{2}分享{0}中的{1}。 详情: \n{3} String eventSharingLongText(String eventName, String venue, String dateString, String url); I''d like to share series {0}. Details: {1} - 我要分享系列赛{0}。 详情: {1} + 我要分享系列赛{0}。 详情: {1} String seriesSharingLongText(String seriesName, String url); {0} - {0} + {0} String seriesSharingShortText(String seriesName); Competitors Analytics - 参赛队分析 + 参赛队分析 There are no photos or videos available yet. - 没有可用的照片或视频。 + 没有可用的照片或视频。 Media - 媒体 + 媒体 Photos - 照片 + 照片 Videos - 视频 + 视频 Image - 图像 + 图像 Images - 图像 + 图像 Video - 视频 + 视频 Flag image URL (image renders with 18x12px) - 旗标图像 URL(图像使用 18x12px 渲染) + 旗标图像 URL(图像使用 18x12px 渲染) Image URLs - 图像 URL + 图像 URL Video URLs - 视频 URL + 视频 URL Sponsor Image URLs - 赞助商图像 URL + 赞助商图像 URL The current selection isn''t valid. - 当前选择无效。 + 当前选择无效。 Advance Pass ID - 提前绕标编号 + 提前绕标编号 Please select a scoring result... - 请选择记分结果... + 请选择记分结果... Time zone - 时区 + 时区 Official Website URL - 官方网站 URL + 官方网站 URL Sailors Info Website URL - 水手信息网站 URL + 水手信息网站 URL Event Overview URL - 活动总览 URL + 活动总览 URL Logo Image URL - 图标图像 URL + 图标图像 URL Show Mappings for pinged Marks - 显示已定位标志的映射 + 显示已定位标志的映射 Regatta name must not contain slashes - 比赛名称不得包含斜线 + 比赛名称不得包含斜线 Number of races scored - 记分的比赛轮次数 + 记分的比赛轮次数 Error fetching wind streamlet data: {0} - 获取风力流数据出错: {0} + 获取风力流数据出错: {0} Show wind streamlets overlay - 显示风流覆盖 + 显示风流覆盖 Color streamlets according to wind speed - 基于风流的颜色流 + 基于风流的颜色流 Show simulation overlay - 显示模拟覆盖 + 显示模拟覆盖 Time Comparison:\nRace is the leg duration measured from GPS, Omniscient is the course if one would know everything about the wind, Opportunist are courses if one decides to take a turn measuring the distance to the next mark, 1-Turners are the courses if one knows everything about the wind and just takes one turn - 时间比较:\n比赛轮次指根据 GPS 计算的航段历时,如果对风力了如指掌,则称为全知级;如果仅靠测量下一标志的距离就决定启航,则称为投机级;如果了解有关风力的所有信息并决定启航,则称为一圈即成级。 + 时间比较:\n比赛轮次指根据 GPS 计算的航段历时,如果对风力了如指掌,则称为全知级;如果仅靠测量下一标志的距离就决定启航,则称为投机级;如果了解有关风力的所有信息并决定启航,则称为一圈即成级。 Races scored - 记分的比赛轮次 + 记分的比赛轮次 Number of races the competitor has completed or gotten a score for in this leaderboard. - 参赛队完成并记录在此积分榜上的比赛轮次数。 + 参赛队完成并记录在此积分榜上的比赛轮次数。 Average number of operations per message - 各消息操作的平均数 + 各消息操作的平均数 Show uncorrected net points - 显示未更正的净分 + 显示未更正的净分 Set start time received - 设置接收的开始时间 + 设置接收的开始时间 This sets the startTimeReceived of the selected TrackedRace that isn''t persistent. This means that the new value will be forgotten after the server has been restarted. - 设置非持久的所选 TrackedRace 的 startTimeReceived。 这意味着,重启服务器后,将忘记新值。 + 设置非持久的所选 TrackedRace 的 startTimeReceived。 这意味着,重启服务器后,将忘记新值。 Last score correction time - 上次得分更正时间 + 上次得分更正时间 Last score correction comment - 上次得分更正评论 + 上次得分更正评论 Set time to ''now'' - 将时间设为“现在” + 将时间设为“现在” Use start time inference from start mark passings - 使用从开始绕标推断的开始时间 + 使用从开始绕标推断的开始时间 Number of queue messages sent - 发送的队列消息的数量 + 发送的队列消息的数量 Total Size - 总大小 + 总大小 Average size per message in bytes - 各消息的平均大小(字节) + 各消息的平均大小(字节) Total number of operations - 操作的总数 + 操作的总数 Current speed over ground in knots while leg is still running; average speed over ground when leg is completed - 在航段航行时的当前实际速度(节);航段完成时的平均数实际速度 + 在航段航行时的当前实际速度(节);航段完成时的平均数实际速度 SOG (∅ at end) - 实际速度(∅ 终点) + 实际速度(∅ 终点) Connectors - 连接器 + 连接器 Video - 视频 + 视频 Competitor Search Filter - 参赛队搜索筛选器 + 参赛队搜索筛选器 Search - 搜索 + 搜索 Go to event overview - 进入活动总览 + 进入活动总览 Go to the overview and see all Races in one Leaderboard - 进入总览,并查看一个积分榜中的所有比赛轮次 + 进入总览,并查看一个积分榜中的所有比赛轮次 No such event - 没有此类活动 + 没有此类活动 The leaderboard {0} is not contained in leaderboard group {1}. - 积分榜{0}未包含在积分榜分组{1}中。 + 积分榜{0}未包含在积分榜分组{1}中。 The leaderboard group {0} is not contained in event {1}. - 积分榜分组{0}未包含在活动{1}中。 + 积分榜分组{0}未包含在活动{1}中。 Race is Live - 正在直播比赛轮次 + 正在直播比赛轮次 Back to Live - 返回实况 + 返回实况 Wind Chart - 风力记录 + 风力记录 No Videos - 无视频 + 无视频 Show Video - 显示视频 + 显示视频 Click to show video: {0} - 点击显示视频: {0} + 点击显示视频: {0} Hide Video - 隐藏视频 + 隐藏视频 Click to hide video - 点击隐藏视频 + 点击隐藏视频 {0} Videos - {0}个视频 + {0}个视频 Click to select video - 点击选择视频 + 点击选择视频 Manage Media - 管理媒体 + 管理媒体 Configure audio and video clips, synchronize times - 配置音频和视频短片,同步时间 + 配置音频和视频短片,同步时间 Show all - 显示全部 + 显示全部 Visibility - 可见性 + 可见性 Enter carried points for competitor {0} - 输入参赛队{0}的得分 + 输入参赛队{0}的得分 Advanced - 高级 + 高级 based on - 基于 + 基于 Retrieve with - 检索依据 + 检索依据 Mapping Details - 映射详情 + 映射详情 If you are using the Tracking App, you can add the device mapping also by selecting a competitor/mark, setting the from and to times, and then scanning this QRCode. - 如果使用跟踪应用,可以通过选择参赛队/标志、设置开始和结束时间,然后扫描此二维码添加设备映射。 + 如果使用跟踪应用,可以通过选择参赛队/标志、设置开始和结束时间,然后扫描此二维码添加设备映射。 QRCode - 二维码 + 二维码 Enter course area name... - 输入场地区域名称... + 输入场地区域名称... Enter course name... - 输入场地名称... + 输入场地名称... Enter image URL... - 输入图像 URL... + 输入图像 URL... Enter video URL... - 输入视频 URL... + 输入视频 URL... Enter sponsor image URL... - 输入赞助商图像 URL... + 输入赞助商图像 URL... Enter race name... - 输入比赛轮次名称... + 输入比赛轮次名称... An error occurred while attempting to contact the server. Please check your network connection and try again. - 尝试联系服务器时出错。请检查网络连接,并重试。 + 尝试联系服务器时出错。请检查网络连接,并重试。 Remote Procedure Call - 远程过程调用 + 远程过程调用 Server replies - 服务器应答 + 服务器应答 Error communicating with server - 与服务器通信时发生错误 + 与服务器通信时发生错误 User Management - 用户管理 + 用户管理 Regatta Structure Import - 比赛结构导入 + 比赛结构导入 filtered by - 筛选方式 + 筛选方式 Edit Series - 编辑系列 + 编辑系列 Please select at least one regatta - 请至少选择一场比赛 + 请至少选择一场比赛 Please select an event - 请选择活动 + 请选择活动 Error trying to get events: {0} - 尝试获取活动出错: {0} + 尝试获取活动出错: {0} Show x-y-diagram - 显示 x-y 图 + 显示 x-y 图 x-y-Diagram - x-y 图 + x-y 图 Boat Speed - 船只速度 + 船只速度 Confidence - 置信度 + 置信度 Create default settings for all regattas... - 为所有比赛创建默认设置... + 为所有比赛创建默认设置... No overall event selected... - 未选择整个活动... + 未选择整个活动... Error trying to create new event {0}: {1} - 尝试新建活动{0}出错: {1} + 尝试新建活动{0}出错: {1} Create New Event - 新建活动 + 新建活动 No fleets defined. - 未定义船队。 + 未定义船队。 Successfully created regattas - 已成功创建比赛 + 已成功创建比赛 Error trying to register races {0} for tracking: {1}. Check live/stored URI syntax. - 尝试注册比赛轮次{0}用于跟踪出错: {1}。检查实况/存储的 URI 语法。 + 尝试注册比赛轮次{0}用于跟踪出错: {1}。检查实况/存储的 URI 语法。 Error determining availability of polar / VPP data for race {0}: {1} - 确定比赛轮次{0}的极坐标/VPP 数据的可用性出错: {1} + 确定比赛轮次{0}的极坐标/VPP 数据的可用性出错: {1} Error - 错误 + 错误 File Storage - 文件存储 + 文件存储 Active - 已激活 + 已激活 Score in points. Winner of an act scores 10 points, 2nd - 9 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. - 得分。 分站赛获胜者得 10 分、第 2 名 9 分、.... 在总体极限帆船系列赛中如有平局,以获得最多分站赛名次的参赛队取得胜利。 如果仍有平局,就以最后一个分站赛的名次打破平局。 + 得分。 分站赛获胜者得 10 分、第 2 名 9 分、.... 在总体极限帆船系列赛中如有平局,以获得最多分站赛名次的参赛队取得胜利。 如果仍有平局,就以最后一个分站赛的名次打破平局。 Start delay - 起航延迟 + 起航延迟 Time between the start of the race and the time the competitor passed the start waypoint. Negative time suggests OCS. - 比赛轮次开始与参赛队越过起航航路点之间的时间。负值表示“抢航”。 + 比赛轮次开始与参赛队越过起航航路点之间的时间。负值表示“抢航”。 Use internal mark passing algorithm - 使用内部绕标算法 + 使用内部绕标算法 Edit Mark Passings - 编辑绕标 + 编辑绕标 + + + Edit Mark Positions + 编辑标位 Remove fixed mark passing - 移除固定的绕标 + 移除固定的绕标 Set time as mark passing - 设置绕标时间 + 设置绕标时间 Suppress mark passing starting with current - 从当前开始禁止绕标 + 从当前开始禁止绕标 Remove suppressed mark passing - 移除禁止的绕标 + 移除禁止的绕标 Error removing fixed mark passing: {0} - 移除固定的绕标出错: {0} + 移除固定的绕标出错: {0} Error setting fixed mark passing: {0} - 设置固定的绕标出错: {0} + 设置固定的绕标出错: {0} Error suppressing mark passings: {0} - 禁止绕标出错: {0} + 禁止绕标出错: {0} Error removing suppressed mark passings: {0} - 移除禁止的绕标出错: {0} + 移除禁止的绕标出错: {0} Error trying to obtain mark passings: {0} - 尝试获取绕标出错: {0} + 尝试获取绕标出错: {0} Error trying to obtain race log mark passing data: {0} - 尝试获取比赛轮次日志绕标数据出错: {0} + 尝试获取比赛轮次日志绕标数据出错: {0} E-Mail - 电子邮件 + 电子邮件 Please enter an E-Mail. - 请输入电子邮件。 + 请输入电子邮件。 Invite competitors - 邀请参赛队 + 邀请参赛队 Invite selected competitors - 邀请选择的参赛队 + 邀请选择的参赛队 Not all competitors provide an E-Mail - 并不是所有的参赛队提供电子邮件 + 并不是所有的参赛队提供电子邮件 Sending Mails failed - 发送邮件失败 + 发送邮件失败 Successfully sent E-Mails - 已成功发送电子邮件 + 已成功发送电子邮件 Select Event for Invitation - 选择邀请活动 + 选择邀请活动 Image URL - 图像 URL + 图像 URL Upload - 上传 + 上传 Remove operation: {0} {1} - 移除操作: {0} {1} + 移除操作: {0} {1} Upload successful - 上传成功 + 上传成功 File upload: {0} {1}.\nIn case of error please check that your File Storage service is properly configured. - 文件上传: {0} {1}。\n如果出错,请检查文件存储服务配置是否正确。 + 文件上传: {0} {1}。\n如果出错,请检查文件存储服务配置是否正确。 Remove uploaded file - 移除上传的文件 + 移除上传的文件 Sail Id - 帆号 + 帆号 Competitor Full Name - 参赛队全名 + 参赛队全名 Loading dimension values - 正在加载尺寸值 + 正在加载尺寸值 Running Query - 运行查询 + 运行查询 Invite Buoy Tenders - 浮标招标 + 浮标招标 or multiple E-Mails separated by comma - 或使用逗号隔开的多个电子邮件 + 或使用逗号隔开的多个电子邮件 True course over ground in degrees - 实在对地航向角度 + 实在对地航向角度 COG - 对地航向 + 对地航向 Distance (w/ Gate Start) - 距离(起航门标) + 距离(起航门标) The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished.\nIf the leg includes a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. - 如果航段没有结束,从航段起点到终点\n或当前时间点航行的距离。\n如果航段包括起航门标,则包括尾销到起航位置的距离,\n这样,即便在不同时间起航,也可以比较参赛队。 + 如果航段没有结束,从航段起点到终点\n或当前时间点航行的距离。\n如果航段包括起航门标,则包括尾销到起航位置的距离,\n这样,即便在不同时间起航,也可以比较参赛队。 The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. For a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. - 如果航段没有结束,从比赛轮次开始到结束\n或当前时间点航行的距离。 对于起航门标,包括尾销到起航位置的距离,\n这样,即便在不同时间起航,也可以比较参赛队。 + 如果航段没有结束,从比赛轮次开始到结束\n或当前时间点航行的距离。 对于起航门标,包括尾销到起航位置的距离,\n这样,即便在不同时间起航,也可以比较参赛队。 Results - 结果 + 结果 Group Name - 分组名称 + 分组名称 Value (Ascending) - 值(递增) + 值(递增) Value (Descending) - 值(递减) + 值(递减) Sort by - 排序方式 + 排序方式 Dashboard - 仪表盘 + 仪表盘 Wind Bot is not available. - 风力机器人程序不可用。 + 风力机器人程序不可用。 To receive live wind data from wind measurement units, ensure that the wind bot is switched on and connected to the SAP Sailing Analytics. - 要从风力测量装置接收实况风力数据,请确保开启风力机器人程序,并与 SAP Sailing Analytics 相连。 + 要从风力测量装置接收实况风力数据,请确保开启风力机器人程序,并与 SAP Sailing Analytics 相连。 Wind Bot - 风力机器人程序 + 风力机器人程序 TWS - TWS + TWS TWD - TWD + TWD kts - kts + kts deg - deg + deg live - 实况 + 实况 average - 平均 + 平均 ({0} minutes) - ({0}分钟) + ({0}分钟) Tap on chart to change interval - 点按记录,更改间隔 + 点按记录,更改间隔 Select Competitor - 选择参赛队 + 选择参赛队 Start Analyses - 起航分析 + 起航分析 New start analysis available - 新起航分析可用 + 新起航分析可用 No Start Analyses available. - 起航分析不可用。 + 起航分析不可用。 There is a Start Analysis created from each race start. Please stand by till racing has been started. - 存在从各比赛轮次开始创建的起航分析。在比赛开始前,请勿执行操作。 + 存在从各比赛轮次开始创建的起航分析。在比赛开始前,请勿执行操作。 No Startline Advantages available. - 起航线优势不可用。 + 起航线优势不可用。 For calculating the startline advantage there needs to be a course set by the race commitee. - 要计算起航线优势,需要由竞赛委员会设置场地。 + 要计算起航线优势,需要由竞赛委员会设置场地。 No Startline Advantage available. - 起航线优势不可用。 + 起航线优势不可用。 For calculating the startline advantage there needs to be a course set by the race commitee. - 要计算起航线优势,需要由竞赛委员会设置场地。 + 要计算起航线优势,需要由竞赛委员会设置场地。 Startline Advantages by Wind - 起航线优势 - 按风力 + 起航线优势 - 按风力 Startline Advantage by Geometry - 起航线优势 - 按几何结构 + 起航线优势 - 按几何结构 Rank at first mark - 在第一个标志的名次 + 在第一个标志的名次 Team - 团队 + 团队 Distance to line in m - 与起航线的距离 (m) + 与起航线的距离 (m) Speed in kts - 速度 (kts) + 速度 (kts) Advantage in m - 优势 (m) + 优势 (m) s - s + s Distance to rc boat in m - 与 RC 船只的距离 (m) + 与 RC 船只的距离 (m) Pin End - 尾销 + 尾销 RC Boat - RC 船只 + RC 船只 (fixed) - (固定) + (固定) (suppressed) - (禁止) + (禁止) Wind-Up (show wind from top of map) - 风向向上(从地图的顶部显示风力) + 风向向上(从地图的顶部显示风力) Filter by - 筛选方式 + 筛选方式 Current filter selection - 当前筛选器选择 + 当前筛选器选择 I''m not capable of generating a code for this identifier. - 无法为此标识符生成代码。 + 无法为此标识符生成代码。 Server URL - 服务器 URL + 服务器 URL Rotated {0} degrees from true north.\nTap/click to toggle between wind-up and north-up map display - 自真北方向旋转{0}度。\n点按/点击在风向向上和北向上地图显示之间切换 + 自真北方向旋转{0}度。\n点按/点击在风向向上和北向上地图显示之间切换 Start to first mark ({0}m) - 开始经过第一个标志 ({0}m) + 开始经过第一个标志 ({0}m) The Data-Mining components have been updated - 数据挖掘组件已更新 + 数据挖掘组件已更新 Click Reload to reload the components now. This will discard the current displayed data and run a default query.\nClick Close to do nothing. The Data-Mining won''t work correctly, until the components have been reloaded. - 点击“重新加载”,立即重新加载组件。 这将放弃当前显示的数据,并运行默认查询。\n点击“关闭”不执行任何操作。 在重新加载组件前,数据挖掘不能正常工作。 + 点击“重新加载”,立即重新加载组件。 这将放弃当前显示的数据,并运行默认查询。\n点击“关闭”不执行任何操作。 在重新加载组件前,数据挖掘不能正常工作。 There isn''t any data for the event yet. - 活动暂无任何数据。 + 活动暂无任何数据。 {0,number} countries - {0,number} 个国家 + {0,number} 个国家 {0,number} country - {0,number} 个国家 + {0,number} 个国家 {0,number} races - {0,number} 个比赛轮次 + {0,number} 个比赛轮次 {0,number} race - {0,number} 个比赛轮次 + {0,number} 个比赛轮次 {0,number} tracked races - {0,number} 个跟踪的比赛轮次 + {0,number} 个跟踪的比赛轮次 {0,number} tracked race - {0,number} 个跟踪的比赛轮次 + {0,number} 个跟踪的比赛轮次 {0,number} events - {0,number} 个活动 + {0,number} 个活动 {0,number} event - {0,number} 个活动 + {0,number} 个活动 {0,number} competitors - {0,number} 支参赛队 + {0,number} 支参赛队 Course area: {0} - 场地区域: {0} + 场地区域: {0} {0,number} competitor - {0,number} 支参赛队 + {0,number} 支参赛队 Leg {0,number}/{1,number} - 航段 {0,number}/{1,number} + 航段 {0,number}/{1,number} Clone - 克隆 + 克隆 Changed - 已更改 + 已更改 Matcher - 匹配程序 + 匹配程序 Any - 任何 + 任何 URL-based result providers - 基于 URL 的结果提供方 + 基于 URL 的结果提供方 Please select a URL-based result provider... - 请选择基于 URL 的结果提供方... + 请选择基于 URL 的结果提供方... Sample URL: {0} - 示例 URL: {0} + 示例 URL: {0} SAP Sports on - SAP Sports on + SAP Sports - Follow SAP Sports - 关注 SAP Sports + 关注 SAP Sports Live now - 现在直播 + 现在直播 Analyze race - 分析比赛轮次 + 分析比赛轮次 Next race starts in - 下一个比赛轮次开始于 + 下一个比赛轮次开始于 {0} starts in - {0}开始于 + {0}开始于 Planned - 已计划 + 已计划 Abandoned - 已放弃 + 已放弃 Postponed - 已延迟 + 已延迟 Starts in {0,number} min - {0,number} 分钟后开始 + {0,number} 分钟后开始 Starting now - 现在开始 + 现在开始 Latest News - 最新消息 + 最新消息 Result update - 结果更新 + 结果更新 {0} won race - {0}赢得比赛轮次 + {0}赢得比赛轮次 Time on Time Factor - 时间对时间系数 + 时间对时间系数 Time on Distance Allowance - 时间对距离宽限 + 时间对距离宽限 Ranking - 排名 + 排名 One-Design - 统一设计 + 统一设计 ORC Performance Curve - ORC 成绩曲线 + ORC 成绩曲线 Time-on-Time/Time-on-Distance - 时间对时间/时间对距离 + 时间对时间/时间对距离 One-Design: First across the line wins;\nin-race ranks based on windward positions (upwind/downwind) or along-course position (reaching) - 统一设计: 第一个过线的获胜;\n比赛名次基于上风位置(迎/顺风)或沿场地位置(横风) + 统一设计: 第一个过线的获胜;\n比赛名次基于上风位置(迎/顺风)或沿场地位置(横风) ORC Performance Curve: Sophisticated handicapping scheme that awards time allowances based on a VPP/polar assuming pre-defined legs'' angles to the wind;\nbased on these allowances, an "implied wind" is calculated which is the basis for ranking.\nImplied wind can be calculated at any time in the race and is therefore the basis for in-race ranking. - ORC 成绩曲线: 复杂的差点方案,假设相对于风的预定义航段角度,根据 VPP/极坐标提供时间宽限;\n根据这些时间宽限,计算排名的基础 -“隐藏式风”。\n隐藏式风可在比赛轮次的任意时间计算,因此是比赛排名的基础。 + ORC 成绩曲线: 复杂的差点方案,假设相对于风的预定义航段角度,根据 VPP/极坐标提供时间宽限;\n根据这些时间宽限,计算排名的基础 -“隐藏式风”。\n隐藏式风可在比赛轮次的任意时间计算,因此是比赛排名的基础。 Time-on-Time / Time-on-Distance: Final ranking by calculated time;\ntime is calculated by optionally applying a factor to the actual time (defaulting to 1.0)\nand subtracting an allowance in seconds per nautical mile,\napplied to the course length.\nIn-race ranks based on expected arrival at fastest boat's current position\nassuming current leg's average VMG/VMC. - 时间对时间/时间对距离: 基于计算时间的最终排名;\n通过对实际时间选择应用一个系数(默认为 1.0)\n并减去应用于\n场地长度的每海里时间宽限(秒)计算时间。\n比赛名次假设当前航段的平均 VMG/VMC,以船只的最快速度预计到达当前位置为基础。 + 时间对时间/时间对距离: 基于计算时间的最终排名;\n通过对实际时间选择应用一个系数(默认为 1.0)\n并减去应用于\n场地长度的每海里时间宽限(秒)计算时间。\n比赛名次假设当前航段的平均 VMG/VMC,以船只的最快速度预计到达当前位置为基础。 ToT Factor - ToT 系数 + ToT 系数 ToD Allowance - ToD 宽限 + ToD 宽限 Time-on-Time factor; actual time is multiplied with this factor in calculated time formula - 时间对时间系数;在计算的时间公式中,实际时间乘以此系数 + 时间对时间系数;在计算的时间公式中,实际时间乘以此系数 Time-on-Distance allowance in seconds per nautical mile;\ndistance sailed is multiplied with this allowance, and the resulting seconds are subtracted from the actual time sailed\n(optionally calculated by applying the time-on-time factor) in the calculated time formula - 每海里的时间对距离宽限(秒);\n航行的距离乘以此宽限,在计算的时间公式中,从航行的实际时间\n(应用时间对时间系数选择计算)中减去生成的描述 + 每海里的时间对距离宽限(秒);\n航行的距离乘以此宽限,在计算的时间公式中,从航行的实际时间\n(应用时间对时间系数选择计算)中减去生成的描述 Calculated Time - 计算的时间 + 计算的时间 Calculated time according to competitor''s handicap\nbased on time since start of race and (windward) distance traveled - 根据参赛队\n的差点且基于比赛轮次开始的时间和航行的(上风)距离计算的时间 + 根据参赛队\n的差点且基于比赛轮次开始的时间和航行的(上风)距离计算的时间 Calc.Time @ Fastest - 在最快速度下计算时间 + 在最快速度下计算时间 Calculated time at estimated arrival at the competitor that is currently farthest ahead in the race;\nestimation based on average VMG in current leg and equal (calculated) performance to fastest boat in all subsequent legs - 预计到达当前在比赛轮次最前方的参赛队的计算时间;\n预计基于当前航段的平均 VMG 和同等于最快船只在所有后续航段的(计算)成绩 + 预计到达当前在比赛轮次最前方的参赛队的计算时间;\n预计基于当前航段的平均 VMG 和同等于最快船只在所有后续航段的(计算)成绩 Sailor Info - 水手信息 + 水手信息 Official Results, Protests,\nNotice Board, Sailor weather: - 官方结果、声明、\n公告板、水手、天气: + 官方结果、声明、\n公告板、水手、天气: Event Quickfinder - 活动快速查找器 + 活动快速查找器 Regatta Quickfinder - 比赛快速查找器 + 比赛快速查找器 Results Quickfinder - 结果快速查找器 + 结果快速查找器 Races Quickfinder - 比赛轮次快速查找器 + 比赛轮次快速查找器 Statistics - 统计 + 统计 Impressions - 曝光量 + 曝光量 This content is not available on mobile.\nSwitch to the desktop version? - 此内容不适用于移动设备。\n是否切换到桌面版? + 此内容不适用于移动设备。\n是否切换到桌面版? Go to desktop version - 进入桌面版 + 进入桌面版 Go back - 返回 + 返回 Show all {0} - 显示所有{0} + 显示所有{0} Collapse {0} - 折叠{0} + 折叠{0} GPS fixes - GPS 修复 + GPS 修复 Fastest - 最快 + 最快 Wind fixes - 风力修复 + 风力修复 Sailed miles - 航行英里 + 航行英里 {0,number,#0.0} mil - {0,number,#0.0} 百分 + {0,number,#0.0} 百分 {0,number,#0.0} bil - {0,number,#0.0} 十亿 + {0,number,#0.0} 十亿 There are no results available yet. - 没有可用的结果。 + 没有可用的结果。 There are no news available. - 没有可用的消息。 + 没有可用的消息。 {0,number,#0.00} - {0,number,#0.00} + {0,number,#0.00} Open Leaderboard - 打开积分榜 + 打开积分榜 Now - 现在 + 现在 {0} min ago - {0}分钟前 + {0}分钟前 {0} h ago - {0}小时前 + {0}小时前 Winner - 获胜者 + 获胜者 Duration - 持续时间 + 持续时间 Finished Races - 结束的比赛轮次 + 结束的比赛轮次 Please select one competitor - 请选择一支参赛队 + 请选择一支参赛队 All - 全部 + 全部 Points - 分数 + 分数 # Races - 比赛轮次数 + 比赛轮次数 Course Geometry - 场地几何结构 + 场地几何结构 {0}° to wind - {0}°(相对于风) + {0}°(相对于风) Shows the points along with the number of races per competitor - 显示分数以及各参赛队的比赛轮次数 + 显示分数以及各参赛队的比赛轮次数 {0,number}/{1,number} - {0,number}/{1,number} + {0,number}/{1,number} There are no finished races yet - 没有结束的比赛轮次 + 没有结束的比赛轮次 Races overview - 比赛轮次总览 + 比赛轮次总览 List format - 清单格式 + 清单格式 Competition format - 赛制 + 赛制 Empty - 空 + 空 Run a Query - 运行查询 + 运行查询 Latest Regatta Standings - 最新比赛排名 + 最新比赛排名 Plain Text - 纯文本 + 纯文本 Column Chart - 柱状图 + 柱状图 Choose Presentation - 选择介绍 + 选择介绍 Can''t display data of type {0} - 无法显示类型为{0}的数据 + 无法显示类型为{0}的数据 Shown Decimals - 显示小数 + 显示小数 Open fullscreen view - 打开全屏视图 + 打开全屏视图 Close fullscreen view - 关闭全屏视图 + 关闭全屏视图 Progress - 进度 + 进度 {0,number} videos - {0,number} 个视频 + {0,number} 个视频 {0,number} video - {0,number} 个视频 + {0,number} 个视频 {0,number} photos - {0,number} 张照片 + {0,number} 张照片 {0,number} photo - {0,number} 张照片 + {0,number} 张照片 {0} events have taken place - {0}个活动已举行 + {0}个活动已举行 One event has taken place - 已举行一场活动 + 已举行一场活动 Race Office - 竞赛办公室 + 竞赛办公室 Analyze - 分析 + 分析 Data Mining Settings - 数据挖掘设置 + 数据挖掘设置 Multi Results Presenter - 多结果展示区 + 多结果展示区 Plain Results Presenter - 纯结果展示区 + 纯结果展示区 Results Chart - 结果记录 + 结果记录 Tabbed Results Presenter - 选项卡式结果展示区 + 选项卡式结果展示区 Polar Results Presenter - 极坐标结果展示区 + 极坐标结果展示区 Data Retrieval - 数据检索 + 数据检索 Watch - 观看 + 观看 Analyze - 分析 + 分析 Shortcut to denote all races for racelog tracking - 为比赛轮次日志跟踪描述所有比赛轮次的快捷方式 + 为比赛轮次日志跟踪描述所有比赛轮次的快捷方式 Register Competitors - 注册参赛队 + 注册参赛队 Do you want to create a default Regatta Leaderboard? - 是否确认默认的比赛积分榜? + 是否确认默认的比赛积分榜? Copy Course - 复制场地 + 复制场地 Copy Competitors - 复制参赛队 + 复制参赛队 Smartphone Tracking - 智能手机跟踪 + 智能手机跟踪 {0,number} flights - {0,number} 个航程 + {0,number} 个航程 {0,number} flight - {0,number} 个航程 + {0,number} 个航程 View Query Definition - 查看查询定义 + 查看查询定义 Query Definition Viewer - 查询定义查看器 + 查询定义查看器 Group Average (Ascending) - 分组平均值(递增) + 分组平均值(递增) Group Average (Descending) - 分组平均值(递减) + 分组平均值(递减) Group Median (Ascending) - 分组中值(递增) + 分组中值(递增) Group Median (Descending) - 分组中值(递减) + 分组中值(递减) {0,number} results found for ''{1}'' - 找到 "{1}" 的 {0,number} 个结果 + 找到 "{1}" 的 {0,number} 个结果 {0,number} result found for ''{1}'' - 找到 "{1}" 的 {0,number} 个结果 + 找到 "{1}" 的 {0,number} 个结果 Run Predefined Query - 运行预定义的查询 + 运行预定义的查询 Select Predefined Query - 选择预定义的查询 + 选择预定义的查询 Predefined Query Runner - 预定义的 Query Runner + 预定义的查询执行器 Developer Options - 开发人员选项 + 开发人员选项 Copy to Clipboard - 复制到剪贴板 + 复制到剪贴板 Code - 代码 + 代码 Use Class.getName() for type names - 将 Class.getName() 用于类型名称 + 将 Class.getName() 用于类型名称 More robust against changes in the code base, but the code snippet can only be used in the scope where the classes are available. - 更灵活应对代码库的更改,但是代码片段只能在级别可用的范围内使用。 + 更灵活应对代码库的更改,但是代码片段只能在级别可用的范围内使用。 Use string literals for type names - 将字符串文本用于类型名称 + 将字符串文本用于类型名称 The code snippet can be used anywhere, but it will break if the code base changes. - 代码片段可在任意位置使用,当如果基本代码更改,其将中断。 + 代码片段可在任意位置使用,当如果基本代码更改,其将中断。 Error loading data. Trying again in a few moments. - 加载数据出错。请稍后重试。 + 加载数据出错。请稍后重试。 Add gallery photo - 添加图库照片 + 添加图库照片 Add stage image - 添加阶段图像 + 添加阶段图像 Add teaser image - 添加预告片图像 + 添加预告片图像 No images defined yet - 尚未定义图像 + 尚未定义图像 The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px. - {0}的图像大小不合适。 宽度应在{1}和{2} px 之间,高度在{3}和{4} px 之间。 + {0}的图像大小不合适。 宽度应在{1}和{2} px 之间,高度在{3}和{4} px 之间。 The width and height of the image could not be retrieved yet. - 无法检索图像的宽度和高度。 + 无法检索图像的宽度和高度。 Please only upload content you have all usage rights for. Remember that content may be cropped. - 请仅上传具有所有使用权的内容。请记住,内容可能会被截断。 + 请仅上传具有所有使用权的内容。请记住,内容可能会被截断。 Register Competitors on Race (e.g. for split-fleet racing) - 在比赛轮次注册参赛队(例如区分船队比赛) + 在比赛轮次注册参赛队(例如区分船队比赛) Do you want to register competitors directly on the Race? - 是否直接在比赛轮次注册参赛队? + 是否直接在比赛轮次注册参赛队? Do you want to disable competitor registrations on the Race? - 是否要禁用参赛队在比赛轮次注册? + 是否要禁用参赛队在比赛轮次注册? Warning! This setting will lead to competitors for this race being registered on a per race basis. Competitors will not be automatically registered for this race, when registering them on the corresponding regatta. - 警告! 此设置会导致此比赛轮次的参赛队在每个比赛轮次注册。 在相应的比赛中注册参赛队时,将无法自动注册此比赛轮次。 + 警告! 此设置会导致此比赛轮次的参赛队在每个比赛轮次注册。 在相应的比赛中注册参赛队时,将无法自动注册此比赛轮次。 Warning! This will reactivate competior registrations on the regatta. All competitor registrations from the regatta will automatically be used as competitor registration for this race. - 警告! 此操作将重新激活参赛队注册比赛。 比赛中的所有参赛队注册将自动用作此比赛轮次的参赛队注册。 + 警告! 此操作将重新激活参赛队注册比赛。 比赛中的所有参赛队注册将自动用作此比赛轮次的参赛队注册。 Competitor Registrations are disabled for this race. Enable by checking the checkbox to the left. - 参赛队注册已针对此比赛轮次禁用。选中左侧的复选框可启用。 + 参赛队注册已针对此比赛轮次禁用。选中左侧的复选框可启用。 Add Mark to Regatta - 向比赛添加标志 + 向比赛添加标志 Select a leaderboard group... - 选择积分榜分组... + 选择积分榜分组... Please select - 请选择 + 请选择 This page requires a valid regatta, race column and fleet name to identify the race to show. - 此页面需要有效的比赛、比赛轮次列和船队名称,才能识别显示的比赛轮次。 + 此页面需要有效的比赛、比赛轮次列和船队名称,才能识别显示的比赛轮次。 Could not obtain a race with name {1} for fleet {2} for a regatta with name {0}: {3} - 无法为名称为{0}的比赛获取船队{2}名称为{1}的比赛轮次: {3} + 无法为名称为{0}的比赛获取船队{2}名称为{1}的比赛轮次: {3} Error trying to create the embedded map: {0} - 尝试创建嵌入式地图出错: {0} + 尝试创建嵌入式地图出错: {0} Top {0} - 前{0} + 前{0} Transparent buffer lines on hover of helplines - 鼠标移到帮助线显示透明的缓冲线 + 鼠标移到辅助线显示透明的缓冲线 Buffer line stroke weight - 缓冲线线条粗细 + 缓冲线线条粗细 Profile - 概要 + 概要 Show only competitors registered in Log - 仅显示在日志中注册的参赛队 + 仅显示在日志中注册的参赛队 This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? - 此操作将重置当前未保存的参赛队更改。\n是否确定继续? + 此操作将重置当前未保存的参赛队更改。\n是否确定继续? Removal deavticated, marks are used in races {0} - 移除已取消激活,标志在比赛轮次{0}中使用 + 移除已取消激活,标志在比赛轮次{0}中使用 Would you like to create a default LeaderboardGroup for your event? - 是否为活动创建默认积分榜? + 是否为活动创建默认积分榜? Please create at least one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side - 请至少创建一个映射:先选择左侧的轨道,然后选择右侧的标志或参赛队 + 请至少创建一个映射:先选择左侧的轨道,然后选择右侧的标志或参赛队 Matcher type - 匹配程序类型 + 匹配程序类型 Matching devices - 配置的设备 + 配置的设备 Add Device - 添加设备 + 添加设备 Create Device Configuration - 创建设备配置 + 创建设备配置 Specify for which device the new configuration should apply - 指定应应用新配置的设备 + 指定应应用新配置的设备 Create - 创建 + 创建 There is already a configuration for this device. - 此设备已有配置。 + 此设备已有配置。 Enter an identifier name - 输入标识符名称 + 输入标识符名称 Administration - 管理 + 管理 Please select a leaderboard group - 请选择积分榜分组 + 请选择积分榜分组 Link Leaderboard to Leaderboard Group of Event - 将积分榜链接到活动的积分榜分组 + 将积分榜链接到活动的积分榜分组 Link leaderboard {0} to a leaderboard group of event {1} - 将积分榜{0}链接到活动{1}的积分榜分组 + 将积分榜{0}链接到活动{1}的积分榜分组 Failed to link leaderboard {0} to leaderboard group {1} - 将积分榜{0}链接到积分榜分组{1}失败 + 将积分榜{0}链接到积分榜分组{1}失败 Create default regatta - 创建默认的比赛 + 创建默认的比赛 Do you want to create a default Regatta? - 是否创建默认的比赛? + 是否创建默认的比赛? Default - 默认值 + 默认值 The default link is used unless a language specific overwrite exists. If no default exists, there will be no link for languages that do not explicitly have one set. - 如果不存在语言特定的覆盖,则使用默认链接。 如果不存在默认链接,则没有未明确设置的语言的链接。 + 如果不存在语言特定的覆盖,则使用默认链接。 如果不存在默认链接,则没有未明确设置的语言的链接。 QR-Sync - QR-Sync + QR-Sync There is no identifier set. - 未设置标识符。 + 未设置标识符。 Could not obtain access token for user {0} - 无法获取用户{0}的访问令牌 + 无法获取用户{0}的访问令牌 Device Name - 设备名称 + 设备名称 + + + Please enter a valid Server URL + 请输入有效的服务器 URL + + + Server URL empty + 服务器 URL 为空 + + + Marks + 标志 + + + Add new fix + 新增修复 + + + Please select another timepoint. There already is a fix at the timepoint of the timeslider. + 请选择其他时间点。时间滑块中的此时间点已有修复。 + + + Confirm move + 确认移动 + + + Confirm new fix + 确认新修复 + + + Select a fix position by dragging the map. Then confirm or cancel with the buttons below. + 通过拖动地图选择修复位置。然后利用下方的按钮确认或取消。 + + + Please select a mark from the list on the left. + 请从左侧的清单中选择一个标志。 + + + Mark fixes + 标志修复 + + + utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions + utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions + + + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app + + + https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app + https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app + + + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app + + + https://play.google.com/intl/en/badges/images/generic/en-play-badge.png + https://play.google.com/intl/en/badges/images/generic/en-play-badge.png + + + http://appstore.com/sapsailinsight + http://appstore.com/sapsailinsight + + + http://appstore.com/stgtrainingstagebuch + http://appstore.com/stgtrainingstagebuch + + + _en + _en + + + Distance from average position + 与平均位置的距离 + + + Use a touch optimized UI to move the fix + 使用触摸优化的 UI 移动修复 + + + Delete fix + 删除修复 + + + The deletion of this fix is currently not possible. + 目前无法删除此修复。 + + + Loading mark fixes... + 正在加载标志修复... + + + Fix successfully added. + 已成功添加修复。 + + + Fix position successfully edited. + 已成功编辑修复位置。 + + + Fix successfully removed. + 已成功移除修复。 + + + Drag to change position\nRight-click to get menu to delete + 拖动更改位置\n右键点击获取菜单以删除 + + + Move fix + 移动修复
diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java index 21b373768df..c24bc340a5c 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/Activator.java @@ -1,140 +1,140 @@ -package com.sap.sailing.datamining; - -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -import org.osgi.framework.BundleContext; - -import com.sap.sailing.datamining.data.HasGPSFixContext; -import com.sap.sailing.datamining.data.HasLeaderboardContext; -import com.sap.sailing.datamining.data.HasLeaderboardGroupContext; -import com.sap.sailing.datamining.data.HasMarkPassingContext; -import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext; -import com.sap.sailing.datamining.data.HasRaceResultOfCompetitorContext; -import com.sap.sailing.datamining.data.HasTrackedLegContext; -import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; -import com.sap.sailing.datamining.data.HasTrackedRaceContext; -import com.sap.sailing.datamining.impl.components.aggregators.ParallelBoolSumAggregationProcessor; -import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceAverageAggregationProcessor; -import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceMaxAggregationProcessor; -import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceMedianAggregationProcessor; -import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceMinAggregationProcessor; -import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceSumAggregationProcessor; -import com.sap.sailing.domain.common.Speed; -import com.sap.sse.datamining.DataSourceProvider; -import com.sap.sse.datamining.components.AggregationProcessorDefinition; -import com.sap.sse.datamining.components.DataRetrieverChainDefinition; -import com.sap.sse.datamining.data.ClusterGroup; -import com.sap.sse.datamining.impl.AbstractDataMiningActivatorWithPredefinedQueries; -import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO; -import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier; -import com.sap.sse.i18n.ResourceBundleStringMessages; -import com.sap.sse.i18n.impl.ResourceBundleStringMessagesImpl; - -public class Activator extends AbstractDataMiningActivatorWithPredefinedQueries { - - private static final String STRING_MESSAGES_BASE_NAME = "stringmessages/Sailing_StringMessages"; - private static final SailingClusterGroups clusterGroups = new SailingClusterGroups(); - - private static Activator INSTANCE; - - private BundleContext context = null; - - private final ResourceBundleStringMessages sailingServerStringMessages; - private final SailingDataRetrievalChainDefinitions dataRetrieverChainDefinitions; - private final SailingPredefinedQueries predefinedQueries; - private Collection> dataSourceProviders; - private boolean dataSourceProvidersHaveBeenInitialized; - - public Activator() { - sailingServerStringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClassLoader()); - dataRetrieverChainDefinitions = new SailingDataRetrievalChainDefinitions(); - predefinedQueries = new SailingPredefinedQueries(); - } - - @Override - public void start(BundleContext context) throws Exception { - INSTANCE = this; - this.context = context; - dataSourceProvidersHaveBeenInitialized = false; - super.start(context); - } - - @Override - public void stop(BundleContext context) throws Exception { - this.context = null; - INSTANCE = null; - super.stop(context); - } - - @Override - public ResourceBundleStringMessages getStringMessages() { - return sailingServerStringMessages; - } - - @Override - public Iterable> getClassesWithMarkedMethods() { - Set> internalClasses = new HashSet<>(); - internalClasses.add(HasTrackedRaceContext.class); - internalClasses.add(HasRaceResultOfCompetitorContext.class); - internalClasses.add(HasTrackedLegContext.class); - internalClasses.add(HasTrackedLegOfCompetitorContext.class); - internalClasses.add(HasGPSFixContext.class); - internalClasses.add(HasMarkPassingContext.class); - internalClasses.add(HasRaceOfCompetitorContext.class); - internalClasses.add(HasLeaderboardGroupContext.class); - internalClasses.add(HasLeaderboardContext.class); - return internalClasses; - } - - @Override - public Iterable> getDataRetrieverChainDefinitions() { - return dataRetrieverChainDefinitions.get(); - } - - @Override - public Iterable> getDataSourceProviders() { - if (!dataSourceProvidersHaveBeenInitialized) { - initializeDataSourceProviders(); - dataSourceProvidersHaveBeenInitialized = true; - } - return dataSourceProviders; - } - - @Override - public Iterable> getAggregationProcessorDefinitions() { - HashSet> aggregators = new HashSet<>(); - aggregators.add(ParallelBoolSumAggregationProcessor.getDefinition()); - aggregators.add(ParallelDistanceSumAggregationProcessor.getDefinition()); - aggregators.add(ParallelDistanceAverageAggregationProcessor.getDefinition()); - aggregators.add(ParallelDistanceMaxAggregationProcessor.getDefinition()); - aggregators.add(ParallelDistanceMinAggregationProcessor.getDefinition()); - aggregators.add(ParallelDistanceMedianAggregationProcessor.getDefinition()); - return aggregators; - } - - @Override - public Map getPredefinedQueries() { - return predefinedQueries.get(); - } - - private void initializeDataSourceProviders() { - dataSourceProviders = new HashSet<>(); - dataSourceProviders.add(new RacingEventServiceProvider(context)); - } - - public static ClusterGroup getWindStrengthInBeaufortClusterGroup() { - return clusterGroups.getWindStrengthInBeaufortCluster(); - } - - public static Activator getDefault() { - if (INSTANCE == null) { - INSTANCE = new Activator(); // probably non-OSGi case, as in test execution - } - - return INSTANCE; - } - -} +package com.sap.sailing.datamining; + +import java.util.Collection; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +import org.osgi.framework.BundleContext; + +import com.sap.sailing.datamining.data.HasGPSFixContext; +import com.sap.sailing.datamining.data.HasLeaderboardContext; +import com.sap.sailing.datamining.data.HasLeaderboardGroupContext; +import com.sap.sailing.datamining.data.HasMarkPassingContext; +import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext; +import com.sap.sailing.datamining.data.HasRaceResultOfCompetitorContext; +import com.sap.sailing.datamining.data.HasTrackedLegContext; +import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; +import com.sap.sailing.datamining.data.HasTrackedRaceContext; +import com.sap.sailing.datamining.impl.components.aggregators.ParallelBoolSumAggregationProcessor; +import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceAverageAggregationProcessor; +import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceMaxAggregationProcessor; +import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceMedianAggregationProcessor; +import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceMinAggregationProcessor; +import com.sap.sailing.datamining.impl.components.aggregators.ParallelDistanceSumAggregationProcessor; +import com.sap.sailing.domain.common.Speed; +import com.sap.sse.datamining.DataSourceProvider; +import com.sap.sse.datamining.components.AggregationProcessorDefinition; +import com.sap.sse.datamining.components.DataRetrieverChainDefinition; +import com.sap.sse.datamining.data.ClusterGroup; +import com.sap.sse.datamining.impl.AbstractDataMiningActivatorWithPredefinedQueries; +import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO; +import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier; +import com.sap.sse.i18n.ResourceBundleStringMessages; +import com.sap.sse.i18n.impl.ResourceBundleStringMessagesImpl; + +public class Activator extends AbstractDataMiningActivatorWithPredefinedQueries { + + private static final String STRING_MESSAGES_BASE_NAME = "stringmessages/Sailing_StringMessages"; + private static final SailingClusterGroups clusterGroups = new SailingClusterGroups(); + + private static Activator INSTANCE; + + private BundleContext context = null; + + private final ResourceBundleStringMessages sailingServerStringMessages; + private final SailingDataRetrievalChainDefinitions dataRetrieverChainDefinitions; + private final SailingPredefinedQueries predefinedQueries; + private Collection> dataSourceProviders; + private boolean dataSourceProvidersHaveBeenInitialized; + + public Activator() { + sailingServerStringMessages = new ResourceBundleStringMessagesImpl(STRING_MESSAGES_BASE_NAME, getClassLoader()); + dataRetrieverChainDefinitions = new SailingDataRetrievalChainDefinitions(); + predefinedQueries = new SailingPredefinedQueries(); + } + + @Override + public void start(BundleContext context) throws Exception { + INSTANCE = this; + this.context = context; + dataSourceProvidersHaveBeenInitialized = false; + super.start(context); + } + + @Override + public void stop(BundleContext context) throws Exception { + this.context = null; + INSTANCE = null; + super.stop(context); + } + + @Override + public ResourceBundleStringMessages getStringMessages() { + return sailingServerStringMessages; + } + + @Override + public Iterable> getClassesWithMarkedMethods() { + Set> internalClasses = new HashSet<>(); + internalClasses.add(HasTrackedRaceContext.class); + internalClasses.add(HasRaceResultOfCompetitorContext.class); + internalClasses.add(HasTrackedLegContext.class); + internalClasses.add(HasTrackedLegOfCompetitorContext.class); + internalClasses.add(HasGPSFixContext.class); + internalClasses.add(HasMarkPassingContext.class); + internalClasses.add(HasRaceOfCompetitorContext.class); + internalClasses.add(HasLeaderboardGroupContext.class); + internalClasses.add(HasLeaderboardContext.class); + return internalClasses; + } + + @Override + public Iterable> getDataRetrieverChainDefinitions() { + return dataRetrieverChainDefinitions.get(); + } + + @Override + public Iterable> getDataSourceProviders() { + if (!dataSourceProvidersHaveBeenInitialized) { + initializeDataSourceProviders(); + dataSourceProvidersHaveBeenInitialized = true; + } + return dataSourceProviders; + } + + @Override + public Iterable> getAggregationProcessorDefinitions() { + HashSet> aggregators = new HashSet<>(); + aggregators.add(ParallelBoolSumAggregationProcessor.getDefinition()); + aggregators.add(ParallelDistanceSumAggregationProcessor.getDefinition()); + aggregators.add(ParallelDistanceAverageAggregationProcessor.getDefinition()); + aggregators.add(ParallelDistanceMaxAggregationProcessor.getDefinition()); + aggregators.add(ParallelDistanceMinAggregationProcessor.getDefinition()); + aggregators.add(ParallelDistanceMedianAggregationProcessor.getDefinition()); + return aggregators; + } + + @Override + public Map getPredefinedQueries() { + return predefinedQueries.getQueries(); + } + + private void initializeDataSourceProviders() { + dataSourceProviders = new HashSet<>(); + dataSourceProviders.add(new RacingEventServiceProvider(context)); + } + + public static ClusterGroup getWindStrengthInBeaufortClusterGroup() { + return clusterGroups.getWindStrengthInBeaufortCluster(); + } + + public static Activator getDefault() { + if (INSTANCE == null) { + INSTANCE = new Activator(); // probably non-OSGi case, as in test execution + } + + return INSTANCE; + } + +} diff --git a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SailingPredefinedQueries.java b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SailingPredefinedQueries.java index e3639387441..3f7906d4ef7 100644 --- a/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SailingPredefinedQueries.java +++ b/java/com.sap.sailing.datamining/src/com/sap/sailing/datamining/SailingPredefinedQueries.java @@ -1,143 +1,194 @@ -package com.sap.sailing.datamining; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import com.sap.sailing.datamining.data.HasGPSFixContext; -import com.sap.sailing.datamining.data.HasLeaderboardContext; -import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext; -import com.sap.sailing.datamining.data.HasTrackedLegContext; -import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; -import com.sap.sailing.datamining.data.HasTrackedRaceContext; -import com.sap.sailing.datamining.impl.components.GPSFixRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.LeaderboardRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.RaceOfCompetitorRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.TrackedLegOfCompetitorRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.TrackedLegRetrievalProcessor; -import com.sap.sailing.datamining.impl.components.TrackedRaceRetrievalProcessor; -import com.sap.sailing.datamining.impl.data.LeaderboardGroupWithContext; -import com.sap.sailing.domain.common.Distance; -import com.sap.sailing.domain.common.LegType; -import com.sap.sailing.server.RacingEventService; -import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO; -import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier; -import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO; -import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO; -import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO; -import com.sap.sse.datamining.shared.impl.dto.FunctionDTO; -import com.sap.sse.datamining.shared.impl.dto.LocalizedTypeDTO; -import com.sap.sse.datamining.shared.impl.dto.ModifiableStatisticQueryDefinitionDTO; - -public class SailingPredefinedQueries { - - private final Map predefinedQueries; - - public SailingPredefinedQueries() { - predefinedQueries = new HashMap<>(); - predefinedQueries.put(new PredefinedQueryIdentifier("AvgSpeed_Per_Regatta-Race", "Average Speed grouped by Regatta Name and Race Name"), - create_AvgSpeed_Per_Regatta_Race()); - predefinedQueries.put(new PredefinedQueryIdentifier("AvgSpeed_Per_Competitor-LegType", "Average Speed grouped by Competitor Team Name and Leg Type"), - create_AvgSpeed_Per_Competitor_LegType()); - predefinedQueries.put(new PredefinedQueryIdentifier("SumDistance_Per_Competitor-LegType", "Sum of the traveled Distance grouped by Competitor Team Name and Leg Type"), - create_SumDistance_Per_Competitor_LegType()); - predefinedQueries.put(new PredefinedQueryIdentifier("SumManeuvers_Per_Competitor", "Sum of the performed Maneuvers grouped by Competitor Team Name"), - create_SumManeuvers_Per_Competitor()); - } - - private StatisticQueryDefinitionDTO create_AvgSpeed_Per_Regatta_Race() { - FunctionDTO statistic = new FunctionDTO(false, "getGPSFix().getSpeed().getKnots()", HasGPSFixContext.class.getName(), double.class.getName(), new ArrayList(), "", 0); - AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), Number.class.getName(), ""); - - ArrayList retrieverLevels = new ArrayList<>(); - retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), "GPS-Fix"), null)); - DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); - - ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); - - FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getTrackedLegOfCompetitorContext().getTrackedLegContext().getTrackedRaceContext().getRegatta().getName()", HasGPSFixContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); - - FunctionDTO dimensionToGroupBy1 = new FunctionDTO(true, "getTrackedLegOfCompetitorContext().getTrackedLegContext().getTrackedRaceContext().getRace().getName()", HasGPSFixContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy1); - - return queryDefinition; - } - - private StatisticQueryDefinitionDTO create_AvgSpeed_Per_Competitor_LegType() { - FunctionDTO statistic = new FunctionDTO(false, "getGPSFix().getSpeed().getKnots()", HasGPSFixContext.class.getName(), double.class.getName(), new ArrayList(), "", 0); - AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), Number.class.getName(), ""); - - ArrayList retrieverLevels = new ArrayList<>(); - retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), "GPS-Fix"), null)); - DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); - - ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); - - FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getTrackedLegOfCompetitorContext().getCompetitor().getTeam().getName()", HasGPSFixContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); - - FunctionDTO dimensionToGroupBy1 = new FunctionDTO(true, "getTrackedLegOfCompetitorContext().getTrackedLegContext().getLegType()", HasGPSFixContext.class.getName(), LegType.class.getName(), new ArrayList(), "", 0); - queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy1); - - return queryDefinition; - } - - private StatisticQueryDefinitionDTO create_SumDistance_Per_Competitor_LegType() { - FunctionDTO statistic = new FunctionDTO(false, "getDistanceTraveled()", HasTrackedLegOfCompetitorContext.class.getName(), Distance.class.getName(), new ArrayList(), "", 0); - AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Sum", Distance.class.getName(), Distance.class.getName(), ""); - - ArrayList retrieverLevels = new ArrayList<>(); - retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null)); - DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); - - ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); - - FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getCompetitor().getTeam().getName()", HasTrackedLegOfCompetitorContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); - - FunctionDTO dimensionToGroupBy1 = new FunctionDTO(true, "getTrackedLegContext().getLegType()", HasTrackedLegOfCompetitorContext.class.getName(), LegType.class.getName(), new ArrayList(), "", 0); - queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy1); - - return queryDefinition; - } - - private StatisticQueryDefinitionDTO create_SumManeuvers_Per_Competitor() { - FunctionDTO statistic = new FunctionDTO(false, "getNumberOfManeuvers()", HasRaceOfCompetitorContext.class.getName(), int.class.getName(), new ArrayList(), "", 0); - AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Sum", Number.class.getName(), Number.class.getName(), ""); - - ArrayList retrieverLevels = new ArrayList<>(); - retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); - retrieverLevels.add(new DataRetrieverLevelDTO(3, RaceOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasRaceOfCompetitorContext.class.getName(), "Competitor"), null)); - DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); - - ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); - - FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getCompetitor().getTeam().getName()", HasRaceOfCompetitorContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); - - return queryDefinition; - } - - public Map get() { - return predefinedQueries; - } - -} +package com.sap.sailing.datamining; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import com.sap.sailing.datamining.data.HasGPSFixContext; +import com.sap.sailing.datamining.data.HasLeaderboardContext; +import com.sap.sailing.datamining.data.HasRaceOfCompetitorContext; +import com.sap.sailing.datamining.data.HasTrackedLegContext; +import com.sap.sailing.datamining.data.HasTrackedLegOfCompetitorContext; +import com.sap.sailing.datamining.data.HasTrackedRaceContext; +import com.sap.sailing.datamining.impl.components.GPSFixRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.LeaderboardGroupRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.LeaderboardRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.RaceOfCompetitorRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.TrackedLegOfCompetitorRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.TrackedLegRetrievalProcessor; +import com.sap.sailing.datamining.impl.components.TrackedRaceRetrievalProcessor; +import com.sap.sailing.datamining.impl.data.LeaderboardGroupWithContext; +import com.sap.sailing.domain.common.Distance; +import com.sap.sailing.domain.common.LegType; +import com.sap.sailing.server.RacingEventService; +import com.sap.sse.datamining.shared.dto.StatisticQueryDefinitionDTO; +import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier; +import com.sap.sse.datamining.shared.impl.dto.AggregationProcessorDefinitionDTO; +import com.sap.sse.datamining.shared.impl.dto.DataRetrieverChainDefinitionDTO; +import com.sap.sse.datamining.shared.impl.dto.DataRetrieverLevelDTO; +import com.sap.sse.datamining.shared.impl.dto.FunctionDTO; +import com.sap.sse.datamining.shared.impl.dto.LocalizedTypeDTO; +import com.sap.sse.datamining.shared.impl.dto.ModifiableStatisticQueryDefinitionDTO; + +public class SailingPredefinedQueries { + private final Map predefinedQueries; + + public final static String QUERY_AVERAGE_SPEED_PER_REGATTA_RACE = "AvgSpeed_Per_Regatta-Race"; + public final static String QUERY_AVERAGE_SPEED_PER_COMPETITOR_LEGTYPE = "AvgSpeed_Per_Competitor-LegType"; + public final static String QUERY_AVERAGE_SPEED_PER_COMPETITOR = "AvgSpeed_Per_Competitor"; + public final static String QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE = "DistanceTraveled_Per_Competitor-LegType"; + public final static String QUERY_DISTANCE_TRAVELED_PER_COMPETITOR = "DistanceTraveled_Per_Competitor"; + public final static String QUERY_MANEUVERS_PER_COMPETITOR = "Maneuvers_Per_Competitor"; + + public SailingPredefinedQueries() { + predefinedQueries = new HashMap<>(); + predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_AVERAGE_SPEED_PER_REGATTA_RACE, "Average Speed grouped by regatta name and race name"), + create_AvgSpeed_Per_Regatta_Race()); + predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_AVERAGE_SPEED_PER_COMPETITOR_LEGTYPE, "Average speed grouped by competitor/team name and leg type"), + create_AvgSpeed_Per_Competitor_LegType()); + predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_AVERAGE_SPEED_PER_COMPETITOR, "Average speed grouped by competitor/team name"), + create_AvgSpeed_Per_Competitor()); + predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE, "Distance traveled grouped by competitor/team name and leg type"), + create_SumTraveledDistance_Per_Competitor_LegType()); + predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_DISTANCE_TRAVELED_PER_COMPETITOR, "Distance traveled grouped by competitor/team name and leg type"), + create_SumTraveledDistance_Per_Competitor()); + predefinedQueries.put(new PredefinedQueryIdentifier(QUERY_MANEUVERS_PER_COMPETITOR, "Maneuvers grouped by competitor/team name"), + create_SumManeuvers_Per_Competitor()); + } + + private StatisticQueryDefinitionDTO create_AvgSpeed_Per_Regatta_Race() { + FunctionDTO statistic = new FunctionDTO(false, "getGPSFix().getSpeed().getKnots()", HasGPSFixContext.class.getName(), double.class.getName(), new ArrayList(), "", 0); + AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), Number.class.getName(), ""); + + ArrayList retrieverLevels = new ArrayList<>(); + retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), "GPS-Fix"), null)); + DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); + + ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); + + FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getTrackedLegOfCompetitorContext().getTrackedLegContext().getTrackedRaceContext().getRegatta().getName()", HasGPSFixContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); + + FunctionDTO dimensionToGroupBy1 = new FunctionDTO(true, "getTrackedLegOfCompetitorContext().getTrackedLegContext().getTrackedRaceContext().getRace().getName()", HasGPSFixContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy1); + + return queryDefinition; + } + + private StatisticQueryDefinitionDTO create_AvgSpeed_Per_Competitor_LegType() { + FunctionDTO statistic = new FunctionDTO(false, "getGPSFix().getSpeed().getKnots()", HasGPSFixContext.class.getName(), double.class.getName(), new ArrayList(), "", 0); + AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), Number.class.getName(), ""); + + ArrayList retrieverLevels = new ArrayList<>(); + retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), "GPS-Fix"), null)); + DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); + + ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); + + FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getTrackedLegOfCompetitorContext().getCompetitor().getTeam().getName()", HasGPSFixContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); + + FunctionDTO dimensionToGroupBy1 = new FunctionDTO(true, "getTrackedLegOfCompetitorContext().getTrackedLegContext().getLegType()", HasGPSFixContext.class.getName(), LegType.class.getName(), new ArrayList(), "", 0); + queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy1); + + return queryDefinition; + } + + private StatisticQueryDefinitionDTO create_SumTraveledDistance_Per_Competitor_LegType() { + FunctionDTO statistic = new FunctionDTO(false, "getDistanceTraveled()", HasTrackedLegOfCompetitorContext.class.getName(), Distance.class.getName(), new ArrayList(), "", 0); + AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Sum", Distance.class.getName(), Distance.class.getName(), ""); + + ArrayList retrieverLevels = new ArrayList<>(); + retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null)); + DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); + + ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); + + FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getCompetitor().getTeam().getName()", HasTrackedLegOfCompetitorContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); + + FunctionDTO dimensionToGroupBy1 = new FunctionDTO(true, "getTrackedLegContext().getLegType()", HasTrackedLegOfCompetitorContext.class.getName(), LegType.class.getName(), new ArrayList(), "", 0); + queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy1); + + return queryDefinition; + } + + private StatisticQueryDefinitionDTO create_AvgSpeed_Per_Competitor() { + FunctionDTO statistic = new FunctionDTO(false, "getGPSFix().getSpeed().getKnots()", HasGPSFixContext.class.getName(), double.class.getName(), new ArrayList(), "", 0); + AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Average", Number.class.getName(), Number.class.getName(), ""); + + ArrayList retrieverLevels = new ArrayList<>(); + retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(5, GPSFixRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasGPSFixContext.class.getName(), "GPS-Fix"), null)); + DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); + + ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); + + FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getTrackedLegOfCompetitorContext().getCompetitor().getTeam().getName()", HasGPSFixContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); + + return queryDefinition; + } + + private StatisticQueryDefinitionDTO create_SumTraveledDistance_Per_Competitor() { + FunctionDTO statistic = new FunctionDTO(false, "getDistanceTraveled()", HasTrackedLegOfCompetitorContext.class.getName(), Distance.class.getName(), new ArrayList(), "", 0); + AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Sum", Distance.class.getName(), Distance.class.getName(), ""); + + ArrayList retrieverLevels = new ArrayList<>(); + retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(3, TrackedLegRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegContext.class.getName(), "Leg"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(4, TrackedLegOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedLegOfCompetitorContext.class.getName(), "Leg of competitor"), null)); + DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); + + ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); + + FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getCompetitor().getTeam().getName()", HasTrackedLegOfCompetitorContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); + + return queryDefinition; + } + + private StatisticQueryDefinitionDTO create_SumManeuvers_Per_Competitor() { + FunctionDTO statistic = new FunctionDTO(false, "getNumberOfManeuvers()", HasRaceOfCompetitorContext.class.getName(), int.class.getName(), new ArrayList(), "", 0); + AggregationProcessorDefinitionDTO aggregator = new AggregationProcessorDefinitionDTO("Sum", Number.class.getName(), Number.class.getName(), ""); + + ArrayList retrieverLevels = new ArrayList<>(); + retrieverLevels.add(new DataRetrieverLevelDTO(0, LeaderboardGroupRetrievalProcessor.class.getName(), new LocalizedTypeDTO(LeaderboardGroupWithContext.class.getName(), "Leaderboard Group"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(1, LeaderboardRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasLeaderboardContext.class.getName(), "Leaderboard"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(2, TrackedRaceRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasTrackedRaceContext.class.getName(), "Race"), null)); + retrieverLevels.add(new DataRetrieverLevelDTO(3, RaceOfCompetitorRetrievalProcessor.class.getName(), new LocalizedTypeDTO(HasRaceOfCompetitorContext.class.getName(), "Competitor"), null)); + DataRetrieverChainDefinitionDTO retrieverChain = new DataRetrieverChainDefinitionDTO("", RacingEventService.class.getName(), retrieverLevels); + + ModifiableStatisticQueryDefinitionDTO queryDefinition = new ModifiableStatisticQueryDefinitionDTO("default", statistic, aggregator, retrieverChain); + + FunctionDTO dimensionToGroupBy0 = new FunctionDTO(true, "getCompetitor().getTeam().getName()", HasRaceOfCompetitorContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + queryDefinition.appendDimensionToGroupBy(dimensionToGroupBy0); + + return queryDefinition; + } + + public Map getQueries() { + return predefinedQueries; + } + +} diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CourseDesignerMode.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CourseDesignerMode.java index 627266e2e18..32f66797e7e 100644 --- a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CourseDesignerMode.java +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/CourseDesignerMode.java @@ -9,15 +9,23 @@ import java.util.List; * When modifying these values also check res/preferences.xml of racecommittee.app! */ public enum CourseDesignerMode { - UNKNOWN("Unknown"), - BY_NAME("By-Name Course Designer"), // O2, O3, I2,... - BY_MAP("By-Map Course Designer"), // Map-based Course Designer - BY_MARKS("By-Marks Course Designer"); // ESS + UNKNOWN("Unknown", /* waypointSequenceValid */ false), + BY_NAME("By-Name Course Designer", /* waypointSequenceValid */ false), // O2, O3, I2,... + BY_MAP("By-Map Course Designer", /* waypointSequenceValid */ true), // Map-based Course Designer + BY_MARKS("By-Marks Course Designer", /* waypointSequenceValid */ true), // ESS + ADMIN_CONSOLE("Administration Console", /* waypointSequenceValid */ true); - private String displayName; + private final String displayName; + + /** + * Some course designers may only be able to tell, say, a name for the new course but not + * necessarily a valid waypoint sequence. This flag tells. + */ + private final boolean waypointSequenceValid; - private CourseDesignerMode(String displayName) { + private CourseDesignerMode(String displayName, boolean waypointSequenceValid) { this.displayName = displayName; + this.waypointSequenceValid = waypointSequenceValid; } @Override @@ -25,6 +33,10 @@ public enum CourseDesignerMode { return displayName; } + public boolean isWaypointSequenceValid() { + return waypointSequenceValid; + } + public static CourseDesignerMode[] validValues() { List validValues = new ArrayList(); for (CourseDesignerMode type : values()) { diff --git a/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/RaceColumnConstants.java b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/RaceColumnConstants.java new file mode 100644 index 00000000000..e1ae25521ee --- /dev/null +++ b/java/com.sap.sailing.domain.common/src/com/sap/sailing/domain/common/impl/RaceColumnConstants.java @@ -0,0 +1,12 @@ +package com.sap.sailing.domain.common.impl; + +public class RaceColumnConstants { + + public static final String LEADERBOARD_NAME = "leaderboard_name"; + public static final String LEADERBOARD_DISPLAY_NAME = "leaderboard_display_name"; + public static final String RACE_COLUMNS = "race_columns"; + public static final String RACE_COLUMN_NAME = "race_column_name"; + public static final String EXPLICIT_FACTOR = "explicit_factor"; + public static final String FACTOR = "factor"; + +} diff --git a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/IgtimiConnectionFactoryImpl.java b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/IgtimiConnectionFactoryImpl.java index be207056dc7..9ea016cf818 100755 --- a/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/IgtimiConnectionFactoryImpl.java +++ b/java/com.sap.sailing.domain.igtimiadapter/src/com/sap/sailing/domain/igtimiadapter/impl/IgtimiConnectionFactoryImpl.java @@ -8,7 +8,6 @@ import java.net.URISyntaxException; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Collections; -import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -501,14 +500,7 @@ public class IgtimiConnectionFactoryImpl implements IgtimiConnectionFactory { result.add(uri); } // sort those to the front that don't do port 443 nor wss:// - Collections.sort(result, new Comparator() { - @Override - public int compare(URI o1, URI o2) { - int o1Score = (o1.toString().contains("443") ? 1 : 0) + (o1.toString().contains("wss") ? 1 : 0); - int o2Score = (o2.toString().contains("443") ? 1 : 0) + (o2.toString().contains("wss") ? 1 : 0); - return o1Score - o2Score; - } - }); + Collections.shuffle(result); // shuffle as a failover strategy logger.info("Trying Igtimi WebSocket servers in the following order: "+result); return result; } diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java index 9eb8f687b6b..2680b9b4441 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/DomainObjectFactoryImpl.java @@ -143,6 +143,7 @@ import com.sap.sailing.domain.base.impl.SailingServerConfigurationImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.VenueImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.PassingInstruction; @@ -1498,7 +1499,9 @@ public class DomainObjectFactoryImpl implements DomainObjectFactory { private RaceLogCourseDesignChangedEvent loadRaceLogCourseDesignChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { String courseName = (String) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN_NAME.name()); CourseBase courseData = loadCourseData((BasicDBList) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGN.name()), courseName); - return new RaceLogCourseDesignChangedEventImpl(createdAt, logicalTimePoint, author, id, passId, courseData); + final String courseDesignerModeName = (String) dbObject.get(FieldNames.RACE_LOG_COURSE_DESIGNER_MODE.name()); + final CourseDesignerMode courseDesignerMode = courseDesignerModeName == null ? null : CourseDesignerMode.valueOf(courseDesignerModeName); + return new RaceLogCourseDesignChangedEventImpl(createdAt, logicalTimePoint, author, id, passId, courseData, courseDesignerMode); } private RaceLogCourseAreaChangedEvent loadRaceLogCourseAreaChangedEvent(TimePoint createdAt, AbstractLogEventAuthor author, TimePoint logicalTimePoint, Serializable id, Integer passId, List competitors, DBObject dbObject) { diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java index 1763fe75957..ab6560670e6 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/FieldNames.java @@ -88,7 +88,7 @@ public enum FieldNames { // race log RACE_LOG_IDENTIFIER, RACE_LOG_EVENT, RACE_LOG_EVENT_PASS_ID, RACE_LOG_EVENT_ID, RACE_LOG_EVENT_CREATED_AT, RACE_LOG_EVENT_AUTHOR_NAME, RACE_LOG_EVENT_AUTHOR_PRIORITY, RACE_LOG_EVENT_INVOLVED_BOATS, RACE_LOG_EVENT_FLAG_UPPER, RACE_LOG_EVENT_FLAG_LOWER, RACE_LOG_EVENT_FLAG_DISPLAYED, - RACE_LOG_EVENT_START_TIME, RACE_LOG_EVENT_CLASS, RACE_LOG_EVENT_NEXT_STATUS, RACE_LOG_COURSE_DESIGN, WAYPOINT_ID, WAYPOINT_NAME, + RACE_LOG_EVENT_START_TIME, RACE_LOG_EVENT_CLASS, RACE_LOG_EVENT_NEXT_STATUS, RACE_LOG_COURSE_DESIGN, RACE_LOG_COURSE_DESIGNER_MODE, WAYPOINT_ID, WAYPOINT_NAME, WAYPOINT_PASSINGINSTRUCTIONS, CONTROLPOINT, CONTROLPOINT_CLASS, MARK_ID, MARK_COLOR, MARK_NAME, MARK_PATTERN, MARK_SHAPE, MARK_TYPE, CONTROLPOINT_VALUE, CONTROLPOINTWITHTWOMARKS_ID, CONTROLPOINTWITHTWOMARKS_NAME, CONTROLPOINTWITHTWOMARKS_LEFT, CONTROLPOINTWITHTWOMARKS_RIGHT, RACE_LOG_POSITIONED_COMPETITORS, RACE_LOG_PATHFINDER_ID, RACE_LOG_GATE_LINE_OPENING_TIME, RACE_LOG_GOLF_DOWN_TIME, RACE_LOG_START_PROCEDURE_TYPE, diff --git a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java index 8377d398eff..9942e04dbd7 100644 --- a/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java +++ b/java/com.sap.sailing.domain.persistence/src/com/sap/sailing/domain/persistence/impl/MongoObjectFactoryImpl.java @@ -1116,6 +1116,8 @@ public class MongoObjectFactoryImpl implements MongoObjectFactory { storeRaceLogEventProperties(courseDesignChangedEvent, result); result.put(FieldNames.RACE_LOG_EVENT_CLASS.name(), RaceLogCourseDesignChangedEvent.class.getSimpleName()); result.put(FieldNames.RACE_LOG_COURSE_DESIGN_NAME.name(), courseDesignChangedEvent.getCourseDesign().getName()); + result.put(FieldNames.RACE_LOG_COURSE_DESIGNER_MODE.name(), + courseDesignChangedEvent.getCourseDesignerMode() == null ? null : courseDesignChangedEvent.getCourseDesignerMode().name()); result.put(FieldNames.RACE_LOG_COURSE_DESIGN.name(), storeCourseBase(courseDesignChangedEvent.getCourseDesign())); return result; } diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java index 5e9ca597b04..cab79b3e678 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogRaceTracker.java @@ -436,7 +436,7 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { private void onCourseDesignChangedEvent(RaceLogCourseDesignChangedEvent event) { if (trackedRace != null) { - CourseBase base = new LastPublishedCourseDesignFinder(params.getRaceLog()).analyze(); + CourseBase base = new LastPublishedCourseDesignFinder(params.getRaceLog(), /* onlyCoursesWithValidWaypointList */ true).analyze(); List> update = new ArrayList<>(); for (Waypoint waypoint : base.getWaypoints()) { update.add(new Util.Pair<>(waypoint.getControlPoint(), waypoint.getPassingInstructions())); @@ -462,7 +462,7 @@ public class RaceLogRaceTracker implements RaceTracker, GPSFixReceivedListener { } BoatClass boatClass = denoteEvent.getBoatClass(); String raceName = denoteEvent.getRaceName(); - CourseBase courseBase = new LastPublishedCourseDesignFinder(raceLog).analyze(); + CourseBase courseBase = new LastPublishedCourseDesignFinder(raceLog, /* onlyCoursesWithValidWaypointList */ true).analyze(); if (courseBase == null) { courseBase = new CourseDataImpl("Default course for " + raceName); logger.log(Level.FINE, "Using empty course in creation of race " + raceName); diff --git a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java index d11b48e86cc..97368304af2 100755 --- a/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java +++ b/java/com.sap.sailing.domain.racelogtrackingadapter/src/com/sap/sailing/domain/racelogtracking/impl/RaceLogTrackingAdapterImpl.java @@ -47,6 +47,7 @@ import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.SharedDomainFactory; import com.sap.sailing.domain.base.Waypoint; import com.sap.sailing.domain.base.impl.CourseDataImpl; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.RegattaIdentifier; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.common.racelog.tracking.CompetitorRegistrationOnRaceLogDisabledException; @@ -194,7 +195,7 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { @Override public void copyCourse(RaceLog fromRaceLog, Set toRaceLogs, SharedDomainFactory baseDomainFactory, RacingEventService service) { - CourseBase course = new LastPublishedCourseDesignFinder(fromRaceLog).analyze(); + CourseBase course = new LastPublishedCourseDesignFinder(fromRaceLog, /* onlyCoursesWithValidWaypointList */ true).analyze(); final Set marks = new HashSet<>(); if (course != null) { course.getWaypoints().forEach(wp -> Util.addAll(wp.getMarks(), marks)); @@ -212,7 +213,7 @@ public class RaceLogTrackingAdapterImpl implements RaceLogTrackingAdapter { int passId = toRaceLog.getCurrentPassId(); RaceLogEvent newCourseEvent = new RaceLogCourseDesignChangedEventImpl(now, - service.getServerAuthor(), passId, newCourse); + service.getServerAuthor(), passId, newCourse, CourseDesignerMode.ADMIN_CONSOLE); toRaceLog.add(newCourseEvent); } diff --git a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/state/test/RaceStateTest.java b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/state/test/RaceStateTest.java index 6d53331d754..a1d5062a69a 100644 --- a/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/state/test/RaceStateTest.java +++ b/java/com.sap.sailing.domain.shared.android.test/src/com/sap/sailing/domain/racelog/state/test/RaceStateTest.java @@ -37,6 +37,7 @@ import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.base.configuration.impl.EmptyRegattaConfiguration; import com.sap.sailing.domain.base.configuration.impl.RegattaConfigurationImpl; import com.sap.sailing.domain.base.configuration.procedures.ESSConfiguration; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; @@ -177,7 +178,7 @@ public class RaceStateTest { state.forceNewStartTime(nowMock, new MillisecondsTimePoint(1)); Thread.sleep(100); state.setFinishedTime(new MillisecondsTimePoint(10)); - state.setCourseDesign(nowMock, mock(CourseBase.class)); + state.setCourseDesign(nowMock, mock(CourseBase.class), CourseDesignerMode.ADMIN_CONSOLE); state.setAdvancePass(mock(TimePoint.class)); diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogCourseDesignChangedEvent.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogCourseDesignChangedEvent.java index 97592723862..c63555fba5d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogCourseDesignChangedEvent.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/RaceLogCourseDesignChangedEvent.java @@ -1,9 +1,12 @@ package com.sap.sailing.domain.abstractlog.race; import com.sap.sailing.domain.base.CourseBase; +import com.sap.sailing.domain.common.CourseDesignerMode; public interface RaceLogCourseDesignChangedEvent extends RaceLogEvent { CourseBase getCourseDesign(); + + CourseDesignerMode getCourseDesignerMode(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java index d5101afd45d..6f7e08bd104 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/analyzing/impl/LastPublishedCourseDesignFinder.java @@ -4,11 +4,33 @@ import com.sap.sailing.domain.abstractlog.race.RaceLog; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.base.CourseBase; +import com.sap.sailing.domain.common.CourseDesignerMode; +/** + * A course design can be defined in the {@link RaceLog} using a {@link RaceLogCourseDesignChangedEvent}. These + * events may carry information about the course designer that was used to create the course. Not all of them + * support defining the waypoint sequence that sets the course. See {@link RaceLogCourseDesignChangedEvent#getCourseDesignerMode()} + * and {@link CourseDesignerMode#isWaypointSequenceValid()}. Callers can tell whether they want to obtain {@link CourseBase} + * objects regardless of whether their waypoint sequence is valid or not. + * + * @author Axel Uhl (d043530) + * + */ public class LastPublishedCourseDesignFinder extends RaceLogAnalyzer { - public LastPublishedCourseDesignFinder(RaceLog raceLog) { + private final boolean onlyCoursesWithValidWaypointList; + + /** + * @param onlyCoursesWithValidWaypointList + * if {@code true}, only {@link RaceLogCourseDesignChangedEvent} objects will be considered whose + * {@link RaceLogCourseDesignChangedEvent#getCourseDesignerMode() course designer mode} + * {@link CourseDesignerMode#isWaypointSequenceValid() guarantees} that the waypoint list is valid and + * shall be applied to a race; otherwise, all other {@link RaceLogCourseDesignChangedEvent} as considered + * as well. + */ + public LastPublishedCourseDesignFinder(RaceLog raceLog, boolean onlyCoursesWithValidWaypointList) { super(raceLog); + this.onlyCoursesWithValidWaypointList = onlyCoursesWithValidWaypointList; } @Override @@ -16,7 +38,10 @@ public class LastPublishedCourseDesignFinder extends RaceLogAnalyzer for (RaceLogEvent event : getAllEventsDescending()) { if (event instanceof RaceLogCourseDesignChangedEvent) { RaceLogCourseDesignChangedEvent courseDesignEvent = (RaceLogCourseDesignChangedEvent) event; - return courseDesignEvent.getCourseDesign(); + if (!onlyCoursesWithValidWaypointList || (courseDesignEvent.getCourseDesignerMode() == null || + courseDesignEvent.getCourseDesignerMode().isWaypointSequenceValid())) { + return courseDesignEvent.getCourseDesign(); + } } } return null; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogCourseDesignChangedEventImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogCourseDesignChangedEventImpl.java index c295cf8d891..11900dd831d 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogCourseDesignChangedEventImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/RaceLogCourseDesignChangedEventImpl.java @@ -6,23 +6,27 @@ import com.sap.sailing.domain.abstractlog.AbstractLogEventAuthor; import com.sap.sailing.domain.abstractlog.race.RaceLogCourseDesignChangedEvent; import com.sap.sailing.domain.abstractlog.race.RaceLogEventVisitor; import com.sap.sailing.domain.base.CourseBase; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sse.common.TimePoint; public class RaceLogCourseDesignChangedEventImpl extends RaceLogEventImpl implements RaceLogCourseDesignChangedEvent { private static final long serialVersionUID = 1565936170747420547L; private final CourseBase courseDesign; + + private final CourseDesignerMode courseDesignerMode; public RaceLogCourseDesignChangedEventImpl(TimePoint createdAt, TimePoint pTimePoint, AbstractLogEventAuthor author, Serializable pId, int pPassId, - CourseBase courseDesign) { + CourseBase courseDesign, CourseDesignerMode courseDesignerMode) { super(createdAt, pTimePoint, author, pId, pPassId); this.courseDesign = courseDesign; + this.courseDesignerMode = courseDesignerMode; } public RaceLogCourseDesignChangedEventImpl(TimePoint logicalTimePoint, AbstractLogEventAuthor author, int pPassId, - CourseBase courseDesign) { - this(now(), logicalTimePoint, author, randId(), pPassId, courseDesign); + CourseBase courseDesign, CourseDesignerMode courseDesignerMode) { + this(now(), logicalTimePoint, author, randId(), pPassId, courseDesign, courseDesignerMode); } @Override @@ -35,8 +39,14 @@ public class RaceLogCourseDesignChangedEventImpl extends RaceLogEventImpl implem return courseDesign; } + @Override + public CourseDesignerMode getCourseDesignerMode() { + return courseDesignerMode; + } + @Override public String getShortInfo() { return "courseDesign=" + courseDesign != null ? courseDesign.getName() : "null"; } -} + +} \ No newline at end of file diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/WeakRaceLogChangedVisitor.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/WeakRaceLogChangedVisitor.java index a056688314a..7940e5f8979 100755 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/WeakRaceLogChangedVisitor.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/impl/WeakRaceLogChangedVisitor.java @@ -27,7 +27,7 @@ public class WeakRaceLogChangedVisitor extends AbstractRaceLogChangedVisitor { private static ReferenceQueue queue = new ReferenceQueue(); private static Map, WeakRaceLogChangedVisitor> referenceToVisitor = new ConcurrentHashMap, WeakRaceLogChangedVisitor>(); static { - new Thread(WeakRaceLogChangedVisitor.class.getSimpleName() + " weak reference cleaner") { + Thread t = new Thread(WeakRaceLogChangedVisitor.class.getSimpleName() + " weak reference cleaner") { @Override public void run() { while (true) { @@ -42,7 +42,9 @@ public class WeakRaceLogChangedVisitor extends AbstractRaceLogChangedVisitor { } } } - }.start(); + }; + t.setDaemon(true); + t.start(); } private final WeakReference listenerRef; diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java index 38c0cfd5e67..0b35b4d0b6f 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/RaceState.java @@ -13,6 +13,7 @@ import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProce import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.RacingProcedurePrerequisite.Resolver; import com.sap.sailing.domain.abstractlog.race.state.racingprocedure.impl.RacingProcedurePrerequisiteAutoResolver; import com.sap.sailing.domain.base.CourseBase; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.racelog.Flags; import com.sap.sailing.domain.common.racelog.RacingProcedureType; @@ -172,8 +173,14 @@ public interface RaceState extends ReadonlyRaceState { /** * Sets a new active course design. + * + * @param courseDesignerMode + * the type of course designer through which the course was created; this decides about whether the + * waypoint specification will be considered at all. For example, the "By Marks" course designer does not + * produce a valid waypoints list which therefore must be ignored instead of using it to update a + * TrackedRace's course. */ - void setCourseDesign(TimePoint now, CourseBase courseDesign); + void setCourseDesign(TimePoint now, CourseBase courseDesign, CourseDesignerMode courseDesignerMode); /** * Enters a new wind fix for this race. diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java index 96ec8bb31cb..0200a3480d5 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/RaceStateImpl.java @@ -37,6 +37,7 @@ import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.configuration.ConfigurationLoader; import com.sap.sailing.domain.base.configuration.RegattaConfiguration; import com.sap.sailing.domain.base.configuration.impl.EmptyRegattaConfiguration; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.abstractlog.NotRevokableException; import com.sap.sailing.domain.common.racelog.Flags; @@ -201,8 +202,8 @@ public class RaceStateImpl extends ReadonlyRaceStateImpl implements RaceState { } @Override - public void setCourseDesign(TimePoint timePoint, CourseBase courseDesign) { - raceLog.add(new RaceLogCourseDesignChangedEventImpl(timePoint, author, raceLog.getCurrentPassId(), courseDesign)); + public void setCourseDesign(TimePoint timePoint, CourseBase courseDesign, CourseDesignerMode courseDesignerMode) { + raceLog.add(new RaceLogCourseDesignChangedEventImpl(timePoint, author, raceLog.getCurrentPassId(), courseDesign, courseDesignerMode)); } @Override diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java index ee24b42e606..73dd9f713bb 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/abstractlog/race/state/impl/ReadonlyRaceStateImpl.java @@ -186,7 +186,7 @@ public class ReadonlyRaceStateImpl implements ReadonlyRaceState, RaceLogChangedL this.protestTimeAnalyzer = new ProtestStartTimeFinder(raceLog); this.finishPositioningListAnalyzer = new FinishPositioningListFinder(raceLog); this.confirmedFinishPositioningListAnalyzer = new ConfirmedFinishPositioningListFinder(raceLog); - this.courseDesignerAnalyzer = new LastPublishedCourseDesignFinder(raceLog); + this.courseDesignerAnalyzer = new LastPublishedCourseDesignFinder(raceLog, /* onlyCoursesWithValidWaypointList */ false); this.lastWindFixAnalyzer = new LastWindFixFinder(raceLog); this.raceStateToObserveListener = new BaseRaceStateChangedListener() { diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SeriesBase.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SeriesBase.java index 73571c1f3d3..726eebefb64 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SeriesBase.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/SeriesBase.java @@ -17,4 +17,21 @@ public interface SeriesBase extends Renamable { * on the scoring scheme (usually, medal races scores are doubled and cannot be discarded). */ boolean isMedal(); + + /** + * For a multi-{@link #getFleets() fleet} series, the races of different fleets may or may not run in parallel. If + * they can not run in parallel, the fleet's ordering as returned by {@link #getFleets()} is assumed to be the order + * in which the fleets' races are to be run. + *

+ * + * For example, if a league event defines a series with three fleets, Yellow, Blue and Red, and does not allow for + * parallel fleet races and the series has race columns F1, F2, ..., then the execution order of those races is + * assumed to be F1-Yellow, F1-Blue, F1-Red, F2-Yellow, F2-Blue, F2-Red, ... + *

+ * + * If the fleets are allowed to run their races in parallel, no assumption about the race execution order can be + * made except that within a fleet the races are usually run in the order as defined by the {@link #getRaceColumns() + * race columns}. + */ + boolean isFleetsRunInParallel(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CourseDataImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CourseDataImpl.java index e07dbbabf31..60fb6398d6b 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CourseDataImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/CourseDataImpl.java @@ -17,7 +17,6 @@ public class CourseDataImpl extends NamedImpl implements CourseBase { public CourseDataImpl(String name) { super(name); - this.waypoints = new ArrayList(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/RaceColumnFactorImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/RaceColumnFactorImpl.java new file mode 100644 index 00000000000..cd810fd8208 --- /dev/null +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/impl/RaceColumnFactorImpl.java @@ -0,0 +1,57 @@ +package com.sap.sailing.domain.base.impl; + +import java.util.HashMap; + +public class RaceColumnFactorImpl { + + private final String leaderboard_name; + private final String leaderboard_display_name; + private final HashMap race_columns; + + public RaceColumnFactorImpl(String leaderboard_name, String leaderboard_display_name) { + this.leaderboard_name = leaderboard_name; + this.leaderboard_display_name = leaderboard_display_name; + race_columns = new HashMap<>(); + } + + public String getLeaderboardName() { + return leaderboard_name; + } + + public String getLeaderboardDisplayName() { + return leaderboard_display_name; + } + + public HashMap getRaceColumns() { + return race_columns; + } + + public void addRaceColumn(String race_column_name, Double explicit_factor, Double factor) { + race_columns.put(race_column_name, new RaceColumn(race_column_name, explicit_factor, factor)); + } + + public class RaceColumn { + + private final String race_column_name; + private final Double explicit_factor; + private final Double factor; + + public RaceColumn(String race_column_name, Double explicit_factor, Double factor) { + this.race_column_name = race_column_name; + this.explicit_factor = explicit_factor; + this.factor = factor; + } + + public String getRaceColumnName() { + return race_column_name; + } + + public Double getExplicitFactor() { + return explicit_factor; + } + + public Double getFactor() { + return factor; + } + } +} diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceCell.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceCell.java index 613bf2f4853..c3dc9f542bd 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceCell.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/RaceCell.java @@ -12,4 +12,8 @@ import com.sap.sse.common.Named; */ public interface RaceCell extends Named { RaceLog getRaceLog(); + + double getFactor(); + + Double getExplicitFactor(); } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceCellImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceCellImpl.java index 5e30b534414..fb56c588657 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceCellImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/RaceCellImpl.java @@ -7,11 +7,23 @@ import com.sap.sse.common.impl.NamedImpl; public class RaceCellImpl extends NamedImpl implements RaceCell { private static final long serialVersionUID = 971598420407273594L; - private RaceLog raceLog; + private final RaceLog raceLog; + + /** + * See {@code RaceColumn.getFactor()} + */ + private final double factor; + + /** + * See {@code RaceColumn.getExplicitFactor()} + */ + private final Double explicitFactor; - public RaceCellImpl(String name, RaceLog raceLog) { + public RaceCellImpl(String name, RaceLog raceLog, double factor, Double explicitFactor) { super(name); this.raceLog = raceLog; + this.factor = factor; + this.explicitFactor = explicitFactor; } @Override @@ -19,4 +31,21 @@ public class RaceCellImpl extends NamedImpl implements RaceCell { return raceLog; } + /** + * Represents the effective factor / multiplier for the scores in this column. This factor may have been determined + * by a default rule or by a factor set explicitly. See {@link #getExplicitFactor()}. + */ + @Override + public double getFactor() { + return factor; + } + + /** + * Represents the explicit factor / multiplier set for the scores in this column. If {@code null}, + * the score multiplying {@link #getFactor() factor} is determined by default rules. + */ + @Override + public Double getExplicitFactor() { + return explicitFactor; + } } diff --git a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/SeriesWithRowsImpl.java b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/SeriesWithRowsImpl.java index cb794fbc088..fa5aa6c7126 100644 --- a/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/SeriesWithRowsImpl.java +++ b/java/com.sap.sailing.domain.shared.android/src/com/sap/sailing/domain/base/racegroup/impl/SeriesWithRowsImpl.java @@ -45,4 +45,9 @@ public class SeriesWithRowsImpl implements SeriesWithRows { this.name = newName; } + @Override + public boolean isFleetsRunInParallel() { + // TODO This is a default implementation so far, allowing for parallel fleet races to not restrict generality. This shall become a configurable series property. See bug 3532 + return true; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java index 698922f3a08..3f5174a7f4d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/AbstractRaceColumn.java @@ -339,7 +339,7 @@ public abstract class AbstractRaceColumn extends SimpleAbstractRaceColumn implem } } else { // if no tracked race is found, use marks from race course if present in racelog - LastPublishedCourseDesignFinder courseDesginFinder = new LastPublishedCourseDesignFinder(getRaceLog(fleet)); + LastPublishedCourseDesignFinder courseDesginFinder = new LastPublishedCourseDesignFinder(getRaceLog(fleet), /* onlyCoursesWithValidWaypointList */ true); final CourseBase courseBase = courseDesginFinder.analyze(); if (courseBase != null) { courseBase.getWaypoints().forEach((waypoint) -> Util.addAll(waypoint.getMarks(), result)); diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java index e8cd4ce23b8..64b283d2476 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/base/impl/SeriesImpl.java @@ -434,4 +434,10 @@ public class SeriesImpl extends RenamableImpl implements Series, RaceColumnListe public boolean hasSplitFleetContiguousScoring() { return hasSplitFleetContiguousScoring; } + + @Override + public boolean isFleetsRunInParallel() { + // TODO This is a default implementation so far, allowing for parallel fleet races to not restrict generality. This shall become a configurable series property. See bug 3532 + return true; + } } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LiveLeaderboardUpdater.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LiveLeaderboardUpdater.java index 5f2db95e2d0..fca7707a2f4 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LiveLeaderboardUpdater.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/leaderboard/caching/LiveLeaderboardUpdater.java @@ -221,6 +221,7 @@ public class LiveLeaderboardUpdater implements Runnable { private synchronized void start() { running = true; thread = new Thread(this, "LiveLeaderboardUpdater for leaderboard "+getLeaderboard().getName()); + thread.setDaemon(true); thread.start(); } diff --git a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java index cc546138856..1886af12f0d 100755 --- a/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java +++ b/java/com.sap.sailing.domain/src/com/sap/sailing/domain/tracking/impl/DynamicTrackedRaceLogListener.java @@ -75,7 +75,7 @@ public class DynamicTrackedRaceLogListener extends BaseRaceLogEventVisitor { } private LastPublishedCourseDesignFinder createCourseDesignFinder(RaceLog raceLog) { - return new LastPublishedCourseDesignFinder(raceLog); + return new LastPublishedCourseDesignFinder(raceLog, /* onlyCoursesWithValidWaypointList */ false); // we also want by-name courses to forward, e.g., to TracTrac } private AbortingFlagFinder createAbortingFlagFinder(RaceLog raceLog) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/place/player/PlayerActivity.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/place/player/PlayerActivity.java index beee0dd84ec..746e4bd55da 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/place/player/PlayerActivity.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/autoplay/client/place/player/PlayerActivity.java @@ -8,8 +8,10 @@ import com.google.gwt.user.client.Window; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AcceptsOneWidget; import com.google.gwt.user.client.ui.RootLayoutPanel; +import com.sap.sailing.gwt.ui.raceboard.RaceBoardEntryPoint; import com.sap.sailing.gwt.ui.raceboard.RaceBoardViewConfiguration; import com.sap.sailing.gwt.ui.shared.EventDTO; +import com.sap.sse.common.Duration; import com.sap.sse.gwt.client.mvp.ErrorView; import com.sap.sse.gwt.client.useragent.UserAgentDetails; import com.sap.sse.gwt.shared.GwtHttpRequestUtils; @@ -77,9 +79,11 @@ public class PlayerActivity extends AbstractActivity { RaceBoardViewConfiguration.PARAM_VIEW_SHOW_COMPETITORSCHART, false /* default */); String activeCompetitorsFilterSetName = GwtHttpRequestUtils.getStringParameter(RaceBoardViewConfiguration.PARAM_VIEW_COMPETITOR_FILTER, null /* default*/); final String defaultMedia = GwtHttpRequestUtils.getStringParameter(RaceBoardViewConfiguration.PARAM_DEFAULT_MEDIA, null /* default */); + final Duration initialDurationAfterRaceStartInReplay = RaceBoardEntryPoint.parseDuration(GwtHttpRequestUtils.getStringParameter( + RaceBoardViewConfiguration.PARAM_TIME_AFTER_RACE_START_AS_HOURS_COLON_MILLIS_COLON_SECONDS, null /* default */)); return new RaceBoardViewConfiguration(activeCompetitorsFilterSetName, showLeaderboard, - showWindChart, showCompetitorsChart, showViewStreamlets, showViewStreamletColors, showViewSimulation, autoSelectMedia, defaultMedia); + showWindChart, showCompetitorsChart, showViewStreamlets, showViewStreamletColors, showViewSimulation, autoSelectMedia, defaultMedia, initialDurationAfterRaceStartInReplay); } private void createErrorView(String errorMessage, Throwable errorReason, AcceptsOneWidget panel) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_ru.properties index a398728f6b2..ef67df24cc6 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_ru.properties @@ -1,222 +1,225 @@ -chartSelectionHint=Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. -chooseALanguage=Choose a language -events=Events -home=Home -aboutUs=About us -contact=Contact -sponsoring=Sponsoring +chartSelectionHint=Совет: таблицу лидеров (на вкладке ТАБЛИЦА ЛИДЕРОВ) также можно использовать для выбора участников, отображаемых в диаграмме. +chooseALanguage=Выбор языка +events=События +home=Главная +aboutUs=О нас +contact=Контакт +sponsoring=Финансовая поддержка solutions=Решения blog=Блог german=Deutsch english=English -fullEventSchedule=Full event schedule -officalEventWebsite=Official event website -leg=Leg -races=Races -moreInfo=More info -viewAnalysis=View analysis -overallLeaderboard=Overall leaderboard -pleaseEnterASearchTerm=Please enter a search term. -pleaseTryAgain=Please try again... -reloadPage=Reload page -errorMessageLoadingData=An error occured while loading the data for this page. -errorMessageNoSuchLeaderboard=Could not find a leaderboard with this name. -raceNotScheduled=Not scheduled. -regattaDetails=Regatta details -regatta=Regatta -competitorsAnalytics=Competitors Analytics -chooseChart=Choose chart type -series=Series -regattaLeaderboards=Regatta leaderboards -features=Features -releaseNotes=Release notes -whatsNew=What''s new -overview=Overview +fullEventSchedule=Полное расписание события +officalEventWebsite=Официальный веб-сайт события +leg=Отрезок +races=Гонки +moreInfo=Больше сведений +viewAnalysis=Просмотреть анализ +overallLeaderboard=Общая таблица лидеров +pleaseEnterASearchTerm=Введите запрос поиска. +pleaseTryAgain=Повторите попытку... +reloadPage=Перезагрузить страницу +errorMessageLoadingData=При загрузке данных для этой страницы возникла ошибка. +errorMessageNoSuchLeaderboard=Не удалось найти таблицу лидеров с этим названием. +raceNotScheduled=Не запланировано. +regattaDetails=Подробности регаты +regatta=Регата +competitorsAnalytics=Анализ участников +chooseChart=Выберите тип диаграммы +series=Серия +regattaLeaderboards=Таблицы лидеров регаты +features=Характеристики +releaseNotes=Примечания к выпуску +whatsNew=Новые возможности +overview=Обзор sapSailing=SAP Sailing -search=Search -startSimulator=Start Simulator -countdownStartingInDays=Days -countdownDays=Days -countdownHours=Hrs -countdownMinutes=Min -countdownSeconds=Sec -countdownDay=Day -countdownHour=Hour -countdownMinute=Min -countdownSecond=Sec -live=Live -finished=Finished -watchNow=Watch now -lastUpdate=Last Update -leaderboard=Leaderboard -boxNewsUpdateMoreLink=Report news -boxNewsUpdateTitle=News Update -boxUpcomingRacesCountdownStarted1=Started -boxUpcomingRacesCountdownStarted2=hrs and -boxUpcomingRacesCountdownStarted3=minutes ago -boxUpcomingRacesCountdownStarting1=Starting in -boxUpcomingRacesCountdownStarting2=hrs and -boxUpcomingRacesCountdownStarting3=minutes -boxUpcomingRacesMoreLink=Event Schedule -boxUpcomingRacesTitle=Upcoming Races Today -boxWeather=Weather -boxWeatherUnit=KTS +search=Поиск +startSimulator=Запустить симулятор +countdownStartingInDays=дн. +countdownDays=дн. +countdownHours=ч. +countdownMinutes=мин. +countdownSeconds=сек. +countdownDay=дн. +countdownHour=ч. +countdownMinute=мин. +countdownSecond=сек. +live=Активно +finished=Завершено +watchNow=Смотреть сейчас +lastUpdate=Последнее обновление +leaderboard=Таблица лидеров +boxNewsUpdateMoreLink=Сообщить новости +boxNewsUpdateTitle=Обновление новостей +boxUpcomingRacesCountdownStarted1=Начато +boxUpcomingRacesCountdownStarted2=ч. и +boxUpcomingRacesCountdownStarted3=мин. назад +boxUpcomingRacesCountdownStarting1=Начало через +boxUpcomingRacesCountdownStarting2=ч. +boxUpcomingRacesCountdownStarting3=мин. +boxUpcomingRacesMoreLink=Расписание событий +boxUpcomingRacesTitle=Предстоящие сегодня гонки +boxWeather=Погода +boxWeatherUnit=уз defaultTitle=SAP Sailing Analytics -eventHeaderMedia=Media -eventHeaderOverview=Overview -eventHeaderRaces=Schedule -eventHeaderRegattas=Regattas -seriesHeaderOverview=About the Series -seriesHeaderUpcoming=Upcoming -seriesHeaderRecent=Recent Events -seriesHeaderLeaderboard=Leaderboard -seriesOverviewHeaderRecent=Latest Series Events -seriesOverviewReadMore=More -eventsOverviewRecentEvents=Events -eventsOverviewRecentCountries=Countries -eventsOverviewRecentSailors=Sailors -eventsOverviewRecentTrackedRaces=Tracked Races -eventResultsHeadline=Winners and Results -eventResultsBoatClassesDropDown=All Boat Classes -eventOverviewMoreEvents=More Events -eventOverviewRecentEvents=Recent Events -eventOverviewUpcomingDate=Date -eventOverviewUpcomingEvent=Event -eventOverviewUpcomingLocation=Location -eventOverviewUpcomingSchedule=Upcoming Schedule -eventOverviewUpcomingSeries=Series -eventOverviewUpcomingTeaser=More Events To Be Announced Soon! -eventQuickfinderTitle=Event Quick-Finder -eventRegattaHeaderLeaderboard=Leaderboard -eventRegattaHeaderRaceRaces=Races -eventRegattaListAllBoatClasses=All boat classes -eventRegattaLeaderboardCompetitor=Competitor -eventRegattaLeaderboardExtendLeaderboard=Extend Leaderboard -eventRegattaLeaderboardFinishedMessage=No more races -eventRegattaLeaderboardLastScoreUpdate=Last Score Update -eventRegattaLeaderboardName=Name -eventRegattaLeaderboardRegattaRank=Regatta Rank -eventRegattaLeaderboardTotalPoints=Total Points -eventRegattaRaceWatch=Watch live -eventRegattaRaceAnalyse=Analyze Race -eventRegattaRaceNotTracked=Not Tracked -eventRegattaRaceFinished=Finished at: -eventRegattaRaceStarted=Started at: -eventRegattaRaceScheduled=Scheduled for: -eventRegattaRaceRace=Race -eventRegattaRaceWind=Wind Strength: -eventRegattaRaceWinner=Winner -eventRegattaRaceLeader=Leader -eventRegattaRacesLegendGps=Tracking -eventRegattaRacesLegendWind=Wind Data -eventRegattaRacesLegendVideo=Video -eventRegattaRacesLegendAudio=Audio -eventSponsorsTitle=Event Sponsorships -footerJobs=Jobs -footerCopyright=\u00A9 2011-2016 SAP Sailing Analytics -footerLanguage=SAP Sailing in -footerLegal=Legal Disclosure -footerPrivacy=Privacy -footerFeedback=Feedback -headerEvents=Events -headerHome=Home +eventHeaderMedia=Мультимедиа +eventHeaderOverview=Обзор +eventHeaderRaces=Расписание +eventHeaderRegattas=Регаты +seriesHeaderOverview=О данной серии +seriesHeaderUpcoming=Предстоит +seriesHeaderRecent=Недавние события +seriesHeaderLeaderboard=Таблица лидеров +seriesOverviewHeaderRecent=События последней серии +seriesOverviewReadMore=Больше +eventsOverviewRecentEvents=События +eventsOverviewRecentCountries=Страны +eventsOverviewRecentSailors=Мореходы +eventsOverviewRecentTrackedRaces=Отслеживаемые гонки +eventResultsHeadline=Победители и результаты +eventResultsBoatClassesDropDown=Все классы лодок +eventOverviewMoreEvents=Больше событий +eventOverviewRecentEvents=Недавние события +eventOverviewUpcomingDate=Дата +eventOverviewUpcomingEvent=Событие +eventOverviewUpcomingLocation=Место +eventOverviewUpcomingSchedule=Расписание предстоящих +eventOverviewUpcomingSeries=Серия +eventOverviewUpcomingTeaser=Скоро будет анонсировано больше событий! +eventQuickfinderTitle=Быстрый поиск событий +eventRegattaHeaderLeaderboard=Таблица лидеров +eventRegattaHeaderRaceRaces=Гонки +eventRegattaListAllBoatClasses=Все классы лодок +eventRegattaLeaderboardCompetitor=Участник +eventRegattaLeaderboardExtendLeaderboard=Расширить таблицу лидеров +eventRegattaLeaderboardFinishedMessage=Больше нет гонок +eventRegattaLeaderboardLastScoreUpdate=Последнее обновление оценок +eventRegattaLeaderboardName=Название +eventRegattaLeaderboardRegattaRank=Ранг в регате +eventRegattaLeaderboardTotalPoints=Всего баллов +eventRegattaRaceWatch=Смотреть в реальном времени +eventRegattaRaceAnalyse=Анализировать гонку +eventRegattaRaceNotTracked=Не отслеживается +eventRegattaRaceFinished=Завершено в: +eventRegattaRaceStarted=Начато в: +eventRegattaRaceScheduled=Запланировано на: +eventRegattaRaceRace=Гонка +eventRegattaRaceWind=Сила ветра: +eventRegattaRaceWinner=Победитель +eventRegattaRaceLeader=Лидер +eventRegattaRacesLegendGps=Отслеживание +eventRegattaRacesLegendWind=Данные о ветре +eventRegattaRacesLegendVideo=Видео +eventRegattaRacesLegendAudio=Аудио +eventSponsorsTitle=Спонсорская поддержка событий +footerJobs=Работа +footerCopyright=\u00A9 SAP Sailing Analytics, 2011–2016. +footerLanguage=SAP Sailing в +footerLegal=Раскрытие юридической информации +footerPrivacy=Конфиденциальность +footerFeedback=Обратная связь +headerEvents=События +headerHome=Главная headerLogo=Sailing Analytics -headerSearch=Search -headerSearchPlaceholder=Search -headerSolutions=Solutions -headerSponsoring=Sponsoring -latestRaceResultsHeadline=Latest Official Race Results -latestRaceResultsIsNew=New -latestRaceResultsIsUpdated=Updated -latestRaceResultsRaceCountUnit=races -latestRaceResultsRefresh=refresh -leaderboardQuickAccessLabel=Leaderboard Quick Access -mainEventShowAll=Show All Events -mainEventTitle=Latest Events from the Sailing World -mainMediaSubtitle=Get lost in the latest and most beautiful impressions from your favorite sailing event. -mainMediaTitle=Sailing loves Photography -mainMediaVideosSubtitle=Immerse yourself in the world of sailing and check out our latest events for more videos. -mainMediaVideosTitle=Recent Video Entries -mainSponsorsReadMore=Read More -mediaTeaserPhotosTitle=Photos -mediaTeaserVideosTitle=Videos -regattaCompetitors=Competitors -regattaRaces=Races -regattaTracked=Tracked -regattaRegattaStarts=Regatta will start -regattaPts=Pts. -regattaCourse=Course -regattaArea=Area -regattaFinishedAt=Finished at -regattaScheduledAt=Scheduled at -regattaStartedAt=Started at -regattasResultsTitle=Winner and Results -searchResultHeaderButton=Search -searchResultHeaderLabel=Your Search -searchResultsFound=result(s) found for -searchResultHeaderPlaceholder=Type in your searchkey -searchResultMore=More -searchResultSearch=Search -searchResultSearchAgain=Search again -searchResultSortLabel=Sort by -searchResultSortNewest=Recent -searchResultSortOldest=Oldest -searchResultSortRelevance=Relevance -searchResultCount=About 2,450 results where found for 'Schnitzel' -sharingEmail=Send an email -sharingFacebook=Share on Facebook -sharingTwitter=Tweet about it -socialFooterShare=Share this on -socialFooterTitle=Recommend SAP Sailing Analytics +headerSearch=Поиск +headerSearchPlaceholder=Поиск +headerSolutions=Решения +headerSponsoring=Финансовая поддержка +latestRaceResultsHeadline=Последние официальные результаты гонок +latestRaceResultsIsNew=Новое +latestRaceResultsIsUpdated=Обновлено +latestRaceResultsRaceCountUnit=гонки +latestRaceResultsRefresh=обновить +leaderboardQuickAccessLabel=Быстрый доступ к таблице лидеров +mainEventShowAll=Показать все события +mainEventTitle=Последние события в мире парусного спорта +mainMediaSubtitle=Погрузитесь в новейшие и прекраснейшие впечатления от избранного события в мире парусного спорта. +mainMediaTitle=Фотографы любят паруса +mainMediaVideosSubtitle=Погрузитесь в мир парусного спорта и просмотрите другие видео наших последних событий. +mainMediaVideosTitle=Последние видеозаписи +mainSponsorsReadMore=См. также +mediaTeaserPhotosTitle=Фото +mediaTeaserVideosTitle=Видео +regattaCompetitors=Участники +regattaRaces=Гонки +regattaTracked=Отслеживаемые +regattaRegattaStarts=Регата начнется +regattaPts=баллов +regattaCourse=Курс +regattaArea=Область +regattaFinishedAt=Завершено в +regattaScheduledAt=Запланировано в +regattaStartedAt=Начато в +regattasResultsTitle=Победитель и результат +searchResultHeaderButton=Поиск +searchResultHeaderLabel=Ваш поиск +searchResultsFound=результ. по запросу +searchResultHeaderPlaceholder=Введите ключ поиска +searchResultMore=Больше +searchResultSearch=Поиск +searchResultSearchAgain=Повторный поиск +searchResultSortLabel=Сортировать по +searchResultSortNewest=Недавние +searchResultSortOldest=Самые старые +searchResultSortRelevance=Релевантность +searchResultCount=Около 2450 результатов по запросу ''Шницель'' +sharingEmail=Отправить эл. почту +sharingFacebook=Поделиться в Facebook +sharingTwitter=Твитнуть об этом +socialFooterShare=Поделиться в +socialFooterTitle=Рекомендовать SAP Sailing Analytics # SOLUTIONS -solutionsSISHeadline=Компания SAP и парусный спорт -solutionsSAPHeadline=Инструмент аналитики парусного спорта от компании SAP -solutionsRaceHeadline=Менеджер регат SAP -solutionsPostHeadline=Пост-регатная аналитика +solutionsSISHeadline=SAP в парусном спорте +solutionsSAPHeadline=SAP Sailing Analytics +solutionsRaceHeadline=SAP Sailing Race Manager +solutionsPostHeadline=Аналитика после гонки solutionsTrainingHeadline=Дневник тренировок -solutionsSimulatorHeadline=Тренажер стратегий +solutionsSimulatorHeadline=Симулятор стратегии -sapInSailing=Компания SAP и парусный спорт -contentSapInSailing1=Парусный спорт предоставляет отличную платформу для компании SAP, демонстрируя возможные решения и помогая этому виду спорта развиваться как никогда. Участие SAP в этом виде спорта изменило впечатления от занятий парусным спортом, предлагая средства, которые: -contentSapInSailing2=Помогают яхтсменам анализировать достижения и оптимизировать стратегию -contentSapInSailing3=Позволяют болельщикам быть ближе к действию -contentSapInSailing4=Обеспечивают СМИ информацией и аналитическими оценками для подачи более информативных комментариев -contentSapInSailing5=Компания SAP имеет давние связи с парусным спортом и ее серьезный портфолио включает сотрудничество с различными командами и регатами, например: -contentSapInSailing6=Официальный технологический партнер Travemьnder Woche -contentSapInSailing7=Технический партнер Европейских лиг парусного спорта -contentSapInSailing8=Генеральный спонсор экстремальной команды по парусному спорту -contentSapInSailing9=Официальный технический партнер экстремальной серии парусного спорта -contentSapInSailing10=Премиум-партнер национальной команды Германии по парусному спорту, Германская команда Audi по парусному спорту -contentSapInSailing11=Премиум-партнер крупнейшей регаты мира, Kieler Woche (Kiel Week) -contentSapInSailing12=Генеральный спонсор чемпионатов мира SAP 5O5 +sapInSailing=SAP в парусном спорте +contentSapInSailing1=Парусный спорт предоставляет отличную платформу для демонстрации решений SAP и беспрецедентной помощи развитию спорта. Вовлеченность SAP преобразила парусный спорт, предоставив инструменты, которые: +contentSapInSailing2=Помогают мореходам анализировать эффективность и оптимизировать стратегию. +contentSapInSailing3=Делают болельщиков ближе к действию. +contentSapInSailing4=Предоставляют информацию и аналитику для более информированного комментирования. +contentSapInSailing5=За немалое время причастности к парусному спорту компанией SAP накоплено солидное портфолио сотрудничества с разными командами регатами, включая: +contentSapInSailing6=Официальный технологический партнер Travemünder Woche +contentSapInSailing7=Технический партнер Европейской лиги парусного спорта +contentSapInSailing8=Титульный спонсор команды SAP Extreme Sailing Team +contentSapInSailing9=Официальный технический партнер серии Extreme Sailing Series +contentSapInSailing10=Премиальный партнер национальной команды Германии по парусному спорту, Audi Sailing Team Germany +contentSapInSailing11=Премиальный партнер крупнейшей в мире регаты Kieler Woche (Кильская неделя) +contentSapInSailing12=Титульный спонсор чемпионатов мира SAP 5O5 -solutionsSAPText1=Предоставляя аналитические данные о рейтинге, скоростях, маневрах, координатах и т.п. регат в реальном времени, компания SAP помогает освещать сложный парусный спорт в более простой и доступной форме. -solutionsSAPText2=Инструмент аналитики парусного спорта от компании SAP предоставляет аналитическую информацию и транспарентность миру парусного спорта, используя Технологию облака и памяти, обрабатывая данные GPS и измерения ветра в реальном времени и визуализируя содержимое в различных внешних интерфейсах, доступных из любой точки мира. -solutionsRaceText=Приложение «Комитет регат» SAP предоставляет возможность организаторам регат действовать эффективнее и лучше управлять ситуацией путем автоматизаци и упрощения задач, которые они делают вручную, а также их общения во время проведения яхтенных регат. Приложение «Комитет регат» помогает улучшить проведение регат и управление ими, чтобы помочь комитетам регат работать с более полной отдачей. -solutionsPostText=Доступ к данным, собираемым во время мероприятий, связанных с парусным спортом, дает яхтсменам возможность оценить и проанализировать свои показатели, что поможет им разработать стратегии и улучшить свои показатели в парусном спорте.
Решения бизнес-аналитики от компании SAP предоставляют яхтсменам, тренерам, болельщикам и средствам массовой информации инструменты для просмотра и анализа архивных данных по многим регатам и гонкам. Платформа SAP HANA позволяет им узнать о типовых действиях, тенденциях и профилях яхтсменов просто, быстро и эффективно с целью оптимизации своих собственных достижений и разработки успешных стратегий для будущих регат. -solutionsTrainingText=Дневник тренировок STG поддерживает работу с ежедневной документацией и анализ физического состояния и тренировочных усилий спортсменов в таких областях как тренировки на воде, физические тренировки, практика хождения под парусом, психическая подготовка, теория, а также другие виды деятельности, такие как образование или путешествия. -solutionsSimulatorText=Выбор правильной стратегии может дать большое конкурентное преимущество во время гонки. Тренажер стратегий SAP упрощает определение лучшей стратегии хождения под парусом для различных ветровых режимов и водных течений. Поскольку ветер и течение в тренажере можно быстро изменять, надежность стратегии можно легко оценить даже в условиях изменчивой погоды. +solutionsSAPText1=Предоставляя аналитику по данным о рангах в гонке, скоростях, маневрах, ветрах и т. д. в режиме реального времени, SAP помогает упростить и демистифицировать сложный парусный спорт. +solutionsSAPText2=SAP Sailing Analytics делает мир парусного спорта понятным и прозрачным, используя облако и технологию In-Memory, обработку данных GPS и параметров ветра в реальном времени, а также визуализацию контекста в разных пользовательских интерфейсах, доступных где угодно. +solutionsRaceText=Приложение SAP Race Committee повышает уровень эффективности и контроля для организаторов гонки за счет автоматизации и упрощения выполняемых вручную задач и общения во время проведения парусных регат. Приложение Race Committee помогает упростить проведение событий и управление ими, освобождая для оргкомитета время на лучшую проработку деталей. +solutionsPostText=Доступ к данным, собранным на парусных событиях, дает мореходам возможность оценить и проанализировать свои показатели, помогая разрабатывать стратегии и повышать мастерство.
Решения SAP Business Analytics предоставляют мореходам, тренерам, болельщикам и СМИ инструменты для просмотра и анализа исторических данных по множеству регат и гонок. SAP HANA позволяет изучать эффективные приемы, тенденции и профили мореходов простым, быстрым и эффективным образом для оптимизации своих показателей и разработки успешных стратегий на будущие регаты. +solutionsTrainingText=Дневник тренировок STG поддерживает ежедневное документирования и анализ физического состояния атлета и его усилий в тренировках на воде, физической подготовке, работе с лодкой, моральной, теоретической подготовке, а также других видах деятельности, таких как образование и путешествия. +solutionsSimulatorText=Выбор правильной стратегии может обеспечить большое конкурентное преимущество во время гонки. Симулятор стратегии упрощает определение лучшей стратегии хождения под парусом для разных атмосферных условий и водных течений. Возможность мгновенного изменения ветра и течения в симуляции позволяет легко оценить надежность стратегии даже для неопределенных погодных условий. -sapSailingAnalytics=Инструмент аналитики парусного спорта от компании SAP -contentSapSailingAnalytics1=Предоставляя аналитические данные о рейтинге, скоростях, маневрах, координатах и т.п. регат в реальном времени, компания SAP помогает освещать сложный парусный спорт в более простой и доступной форме. -contentSapSailingAnalytics2=Инструмент аналитики парусного спорта от компании SAP предоставляет аналитическую информацию и транспарентность миру парусного спорта, используя Технологию облака и памяти, обрабатывая данные GPS и измерения ветра в реальном времени и визуализируя содержимое в различных внешних интерфейсах, доступных из любой точки мира. -sapSailingAnalyticsReadMore=Читать далее +sapSailingAnalytics=SAP Sailing Analytics +contentSapSailingAnalytics1=Предоставляя аналитику по данным о рангах в гонке, скоростях, маневрах, ветрах и т. д. в режиме реального времени, SAP помогает упростить и демистифицировать сложный парусный спорт. +contentSapSailingAnalytics2=SAP Sailing Analytics делает мир парусного спорта понятным и прозрачным, используя облако и технологию In-Memory, обработку данных GPS и параметров ветра в реальном времени, а также визуализацию контекста в разных пользовательских интерфейсах, доступных где угодно. +sapSailingAnalyticsReadMore=См. также -sapSailingRaceManager=Менеджер регат SAP -contentSapSailingRaceManager=Менеджер регат SAP предоставляет возможность организаторам регат действовать эффективнее и лучше управлять ситуацией путем автоматизаци и упрощения задач, которые они делают вручную, а также их общения во время проведения яхтенных регат. Приложение «Комитет регат» помогает улучшить проведение регат и управление ими, чтобы помочь комитетам регат работать с более полной отдачей. -sapSailingRaceManagerReadMore=Читать далее +sapSailingRaceManager=SAP Sailing Race Manager +contentSapSailingRaceManager=Приложение SAP Sailing Race Manager повышает уровень эффективности и контроля для организаторов гонки за счет автоматизации и упрощения выполняемых вручную задач и общения во время проведения парусных регат. Приложение Race Committee помогает упростить проведение событий и управление ими, освобождая для оргкомитета время на лучшую проработку деталей. +sapSailingRaceManagerReadMore=Узнать больше -postRaceAnalytics=Пост-регатная аналитика -contentPostRaceAnalytics1=Доступ к данным собираемым во время мероприятий, связанных с парусным спортом, дает яхтсменам возможность оценить и проанализировать свои показатели, что поможет им разработать стратегии и улучшить свои показатели в парусном спорте. -contentPostRaceAnalytics2=Решения бизнес-аналитики от компании SAP предоставляют яхтсменам, тренерам, болельщикам и средствам массовой информации инструменты для просмотра и анализа архивных данных по многим регатам и гонкам. Платформа SAP HANA позволяет им узнать о типовых действиях, тенденциях и профилях яхтсменов просто, быстро и эффективно с целью оптимизации своих собственных достижений и разработки успешных стратегий для будущих регат. +postRaceAnalytics=Аналитика после гонки +contentPostRaceAnalytics1=Доступ к данным, собранным на парусных событиях, дает мореходам возможность оценить и проанализировать свои показатели, помогая разрабатывать стратегии и повышать мастерство. +contentPostRaceAnalytics2=Решения SAP Business Analytics предоставляют мореходам, тренерам, болельщикам и СМИ инструменты для просмотра и анализа исторических данных по множеству регат и гонок. SAP HANA позволяет изучать паттерны эффективности, тенденции и профили мореходов простым, быстрым и эффективным образом для оптимизации своих показателей и разработки успешных стратегий на будущие регаты. -i18nDeSolutionsTrainingHeadline=Инструмент от SAP "Улучши свои показатели в парусном спорте"– Дневник тренировок STG -i18nDeSolutionsTrainingText=Дневник тренировок STG поддерживает работу с ежедневной документацией и анализ физического состояния и тренировочных усилий спортсменов в таких областях как тренировки на воде, физические тренировки, практика хождения под парусом, психическая подготовка, теория, а также другие виды деятельности, такие как образование или путешествия. +i18nDeSolutionsTrainingHeadline=SAP Sail Better – Дневник тренировок STG +i18nDeSolutionsTrainingText=Дневник тренировок STG поддерживает ежедневное документирования и анализ физического состояния атлета и его усилий в тренировках на воде, физической подготовке, работе с лодкой, моральной, теоретической подготовке, а также других видах деятельности, таких как образование и путешествия. -strategySimulator=Тренажер стратегий -contentStrategySimulator=Выбор правильной стратегии может дать большое конкурентное преимущество во время гонки. Тренажер стратегий SAP упрощает определение лучшей стратегии хождения под парусом для различных ветровых режимов и водных течений. Поскольку ветер и течение в тренажере можно быстро изменять, надежность стратегии можно легко оценить даже в условиях изменчивой погоды. +strategySimulator=Симулятор стратегии +contentStrategySimulator=Выбор правильной стратегии может обеспечить большое конкурентное преимущество во время гонки. Симулятор стратегии упрощает определение лучшей стратегии хождения под парусом для разных атмосферных условий и водных течений. Возможность мгновенного изменения ветра и течения в симуляции позволяет легко оценить надежность стратегии даже для неопределенных погодных условий. + +strategySimulatorReadMore=Узнать больше + +impressum=Печать -strategySimulatorReadMore=Читать далее diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_zh.properties index fd32b13d0b8..7471a4e1992 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_zh.properties @@ -112,8 +112,8 @@ eventRegattaRacesLegendWind=风力数据 eventRegattaRacesLegendVideo=视频 eventRegattaRacesLegendAudio=音频 eventSponsorsTitle=活动赞助 -footerJobs=作业 -footerCopyright=版权所有 © 2011-2016 SAP Sailing Analytics +footerJobs=招贤纳士 +footerCopyright=版权所有 \u00A9 2011-2016 SAP Sailing Analytics footerLanguage=SAP Sailing 语言 footerLegal=法律声明 footerPrivacy=隐私 @@ -128,7 +128,6 @@ headerSponsoring=赞助 latestRaceResultsHeadline=最新官方比赛轮次结果 latestRaceResultsIsNew=新建 latestRaceResultsIsUpdated=已更新 -latestRaceResultsRaceCountLabel=结果 - latestRaceResultsRaceCountUnit=比赛轮次 latestRaceResultsRefresh=刷新 leaderboardQuickAccessLabel=积分榜快速访问 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_zh_CN.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_zh_CN.properties index 6b3049e4004..cbb7e6aa698 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_zh_CN.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/TextMessages_zh_CN.properties @@ -112,7 +112,7 @@ eventRegattaRacesLegendWind=风力数据 eventRegattaRacesLegendVideo=视频 eventRegattaRacesLegendAudio=音频 eventSponsorsTitle=活动赞助 -footerJobs=作业 +footerJobs=招贤纳士 footerCopyright=版权所有 © 2011-2016 SAP Sailing Analytics footerLanguage=SAP Sailing 语言 footerLegal=法律声明 @@ -128,7 +128,6 @@ headerSponsoring=赞助 latestRaceResultsHeadline=最新官方比赛轮次结果 latestRaceResultsIsNew=新建 latestRaceResultsIsUpdated=已更新 -latestRaceResultsRaceCountLabel=结果 - latestRaceResultsRaceCountUnit=比赛轮次 latestRaceResultsRefresh=刷新 leaderboardQuickAccessLabel=积分榜快速访问 @@ -224,10 +223,3 @@ strategySimulatorReadMore=了解更多 impressum=版本说明 -playstoreCampaign=utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions - -playstoreRacecommitteeApp=https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app -playstoreRacecommitteeBadge=https://play.google.com/intl/en/badges/images/generic/en-play-badge.png - -appstoreStgTrainingstagebuch=https://itunes.apple.com/de/app/stg-trainingstagebuch/id779563635?l=en&mt=8 -appstoreBadgeSuffix=_zh diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages.properties.xlf b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages.properties.xlf index a9c4408dd0f..0c8fc014323 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages.properties.xlf +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages.properties.xlf @@ -1,12 +1,12 @@ - +

- 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 - +
@@ -401,9 +401,6 @@ Updated - - Result after - races @@ -648,21 +645,6 @@ Imprint - - utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions - - - https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app - - - https://play.google.com/intl/en/badges/images/generic/en-play-badge.png - - - https://itunes.apple.com/de/app/stg-trainingstagebuch/id779563635?l=en&amp;mt=8 - - - _en -
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_en.properties.xlf b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_en.properties.xlf new file mode 100644 index 00000000000..bf4438d93fe --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_en.properties.xlf @@ -0,0 +1,861 @@ + + + +
+ + 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 + + + + + +
+ + + Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. + Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. + + + Choose a language + Choose a language + + + Events + Events + + + Home + Home + + + About us + About us + + + Contact + Contact + + + Sponsoring + Sponsoring + + + Solutions + Solutions + + + Blog + Blog + + + Deutsch + Deutsch + + + English + English + + + Full event schedule + Full event schedule + + + Official event website + Official event website + + + Leg + Leg + + + Races + Races + + + More info + More info + + + View analysis + View analysis + + + Overall leaderboard + Overall leaderboard + + + Please enter a search term. + Please enter a search term. + + + Please try again... + Please try again... + + + Reload page + Reload page + + + An error occured while loading the data for this page. + An error occured while loading the data for this page. + + + Could not find a leaderboard with this name. + Could not find a leaderboard with this name. + + + Not scheduled. + Not scheduled. + + + Regatta details + Regatta details + + + Regatta + Regatta + + + Competitors Analytics + Competitors Analytics + + + Choose chart type + Choose chart type + + + Series + Series + + + Regatta leaderboards + Regatta leaderboards + + + Features + Features + + + Release notes + Release notes + + + What''s new + What''s new + + + Overview + Overview + + + SAP Sailing + SAP Sailing + + + Search + Search + + + Start Simulator + Start Simulator + + + Days + Days + + + Days + Days + + + Hrs + Hrs + + + Min + Min + + + Sec + Sec + + + Day + Day + + + Hour + Hour + + + Min + Min + + + Sec + Sec + + + Live + Live + + + Finished + Finished + + + Watch now + Watch now + + + Last Update + Last Update + + + Leaderboard + Leaderboard + + + Report news + Report news + + + News Update + News Update + + + Started + Started + + + hrs and + hrs and + + + minutes ago + minutes ago + + + Starting in + Starting in + + + hrs and + hrs and + + + minutes + minutes + + + Event Schedule + Event Schedule + + + Upcoming Races Today + Upcoming Races Today + + + Weather + Weather + + + KTS + KTS + + + SAP Sailing Analytics + SAP Sailing Analytics + + + Media + Media + + + Overview + Overview + + + Schedule + Schedule + + + Regattas + Regattas + + + About the Series + About the Series + + + Upcoming + Upcoming + + + Recent Events + Recent Events + + + Leaderboard + Leaderboard + + + Latest Series Events + Latest Series Events + + + More + More + + + Events + Events + + + Countries + Countries + + + Sailors + Sailors + + + Tracked Races + Tracked Races + + + Winners and Results + Winners and Results + + + All Boat Classes + All Boat Classes + + + More Events + More Events + + + Recent Events + Recent Events + + + Date + Date + + + Event + Event + + + Location + Location + + + Upcoming Schedule + Upcoming Schedule + + + Series + Series + + + More Events To Be Announced Soon! + More Events To Be Announced Soon! + + + Event Quick-Finder + Event Quick-Finder + + + Leaderboard + Leaderboard + + + Races + Races + + + All boat classes + All boat classes + + + Competitor + Competitor + + + Extend Leaderboard + Extend Leaderboard + + + No more races + No more races + + + Last Score Update + Last Score Update + + + Name + Name + + + Regatta Rank + Regatta Rank + + + Total Points + Total Points + + + Watch live + Watch live + + + Analyze Race + Analyze Race + + + Not Tracked + Not Tracked + + + Finished at: + Finished at: + + + Started at: + Started at: + + + Scheduled for: + Scheduled for: + + + Race + Race + + + Wind Strength: + Wind Strength: + + + Winner + Winner + + + Leader + Leader + + + Tracking + Tracking + + + Wind Data + Wind Data + + + Video + Video + + + Audio + Audio + + + Event Sponsorships + Event Sponsorships + + + Jobs + Jobs + + + © 2011-2016 SAP Sailing Analytics + © 2011-2016 SAP Sailing Analytics + + + SAP Sailing in + SAP Sailing in + + + Legal Disclosure + Legal Disclosure + + + Privacy + Privacy + + + Feedback + Feedback + + + Events + Events + + + Home + Home + + + + Search + Search + + + Search + Search + + + Solutions + Solutions + + + Sponsoring + Sponsoring + + + Latest Official Race Results + Latest Official Race Results + + + New + New + + + Updated + Updated + + + races + races + + + refresh + refresh + + + Leaderboard Quick Access + Leaderboard Quick Access + + + Show All Events + Show All Events + + + Latest Events from the Sailing World + Latest Events from the Sailing World + + + Get lost in the latest and most beautiful impressions from your favorite sailing event. + Get lost in the latest and most beautiful impressions from your favorite sailing event. + + + Photographers love Sailing + Photographers love Sailing + + + Immerse yourself in the world of sailing and check out our latest events for more videos. + Immerse yourself in the world of sailing and check out our latest events for more videos. + + + Recent Video Entries + Recent Video Entries + + + Read More + Read More + + + Photos + Photos + + + Videos + Videos + + + Competitors + Competitors + + + Races + Races + + + Tracked + Tracked + + + Regatta will start + Regatta will start + + + Pts. + Pts. + + + Course + Course + + + Area + Area + + + Finished at + Finished at + + + Scheduled at + Scheduled at + + + Started at + Started at + + + Winner and Results + Winner and Results + + + Search + Search + + + Your Search + Your Search + + + result(s) found for + result(s) found for + + + Type in your searchkey + Type in your searchkey + + + More + More + + + Search + Search + + + Search again + Search again + + + Sort by + Sort by + + + Recent + Recent + + + Oldest + Oldest + + + Relevance + Relevance + + + About 2,450 results where found for ''Schnitzel'' + About 2,450 results where found for ''Schnitzel'' + + + Send an email + Send an email + + + Share on Facebook + Share on Facebook + + + Tweet about it + Tweet about it + + + Share this on + Share this on + + + Recommend SAP Sailing Analytics + Recommend SAP Sailing Analytics + + + SAP in Sailing + SAP in Sailing + SOLUTIONS + + + SAP Sailing Analytics + SAP Sailing Analytics + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + Post-Race Analytics + Post-Race Analytics + + + Training Diary + Training Diary + + + Strategy Simulator + Strategy Simulator + + + SAP in Sailing + SAP in Sailing + + + Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which: + Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which: + + + Help sailors analyze performance and optimize strategy + Help sailors analyze performance and optimize strategy + + + Bring fans closer to the action + Bring fans closer to the action + + + Provide the media with information and insights to deliver a greater informed commentary + Provide the media with information and insights to deliver a greater informed commentary + + + SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including: + SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including: + + + Official Technology Partner of Travemünder Woche + Official Technology Partner of Travemünder Woche + + + Technical Partner of the European Sailing Leagues + Technical Partner of the European Sailing Leagues + + + Title sponsor of the SAP Extreme Sailing Team + Title sponsor of the SAP Extreme Sailing Team + + + Official Technical Partner of the Extreme Sailing Series + Official Technical Partner of the Extreme Sailing Series + + + Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany + Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany + + + Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week) + Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week) + + + Title sponsor of the SAP 5O5 World Championships + Title sponsor of the SAP 5O5 World Championships + + + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + + + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + + + The SAP Race Committee App delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + The SAP Race Committee App delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + + + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.<br> SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.<br> SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + + + The STG Training Diary supports the daily documentation and analysis of an athlete''s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + The STG Training Diary supports the daily documentation and analysis of an athlete''s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + + + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + + + SAP Sailing Analytics + SAP Sailing Analytics + + + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + + + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + + + Read More + Read More + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + The SAP Sailing Race Manager delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + The SAP Sailing Race Manager delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + + + Learn More + Learn More + + + Post-Race Analytics + Post-Race Analytics + + + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better. + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better. + + + SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + + + SAP Sail Better – STG Training Diary + SAP Sail Better – STG Training Diary + + + The STG Training Diary supports the daily documentation and analysis of an athlete’s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + The STG Training Diary supports the daily documentation and analysis of an athlete’s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + + + Strategy Simulator + Strategy Simulator + + + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + + + Learn More + Learn More + + + Imprint + Imprint + + +
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_ru.properties.xlf b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_ru.properties.xlf new file mode 100644 index 00000000000..c959dd9c6b4 --- /dev/null +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_ru.properties.xlf @@ -0,0 +1,861 @@ + + + +
+ + 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 + + + + + +
+ + + Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. + Совет: таблицу лидеров (на вкладке ТАБЛИЦА ЛИДЕРОВ) также можно использовать для выбора участников, отображаемых в диаграмме. + + + Choose a language + Выбор языка + + + Events + События + + + Home + Главная + + + About us + О нас + + + Contact + Контакт + + + Sponsoring + Финансовая поддержка + + + Solutions + Решения + + + Blog + Блог + + + Deutsch + Deutsch + + + English + English + + + Full event schedule + Полное расписание события + + + Official event website + Официальный веб-сайт события + + + Leg + Отрезок + + + Races + Гонки + + + More info + Больше сведений + + + View analysis + Просмотреть анализ + + + Overall leaderboard + Общая таблица лидеров + + + Please enter a search term. + Введите запрос поиска. + + + Please try again... + Повторите попытку... + + + Reload page + Перезагрузить страницу + + + An error occured while loading the data for this page. + При загрузке данных для этой страницы возникла ошибка. + + + Could not find a leaderboard with this name. + Не удалось найти таблицу лидеров с этим названием. + + + Not scheduled. + Не запланировано. + + + Regatta details + Подробности регаты + + + Regatta + Регата + + + Competitors Analytics + Анализ участников + + + Choose chart type + Выберите тип диаграммы + + + Series + Серия + + + Regatta leaderboards + Таблицы лидеров регаты + + + Features + Характеристики + + + Release notes + Примечания к выпуску + + + What''s new + Новые возможности + + + Overview + Обзор + + + SAP Sailing + SAP Sailing + + + Search + Поиск + + + Start Simulator + Запустить симулятор + + + Days + дн. + + + Days + дн. + + + Hrs + ч. + + + Min + мин. + + + Sec + сек. + + + Day + дн. + + + Hour + ч. + + + Min + мин. + + + Sec + сек. + + + Live + Активно + + + Finished + Завершено + + + Watch now + Смотреть сейчас + + + Last Update + Последнее обновление + + + Leaderboard + Таблица лидеров + + + Report news + Сообщить новости + + + News Update + Обновление новостей + + + Started + Начато + + + hrs and + ч. и + + + minutes ago + мин. назад + + + Starting in + Начало через + + + hrs and + ч. + + + minutes + мин. + + + Event Schedule + Расписание событий + + + Upcoming Races Today + Предстоящие сегодня гонки + + + Weather + Погода + + + KTS + уз + + + SAP Sailing Analytics + SAP Sailing Analytics + + + Media + Мультимедиа + + + Overview + Обзор + + + Schedule + Расписание + + + Regattas + Регаты + + + About the Series + О данной серии + + + Upcoming + Предстоит + + + Recent Events + Недавние события + + + Leaderboard + Таблица лидеров + + + Latest Series Events + События последней серии + + + More + Больше + + + Events + События + + + Countries + Страны + + + Sailors + Мореходы + + + Tracked Races + Отслеживаемые гонки + + + Winners and Results + Победители и результаты + + + All Boat Classes + Все классы лодок + + + More Events + Больше событий + + + Recent Events + Недавние события + + + Date + Дата + + + Event + Событие + + + Location + Место + + + Upcoming Schedule + Расписание предстоящих + + + Series + Серия + + + More Events To Be Announced Soon! + Скоро будет анонсировано больше событий! + + + Event Quick-Finder + Быстрый поиск событий + + + Leaderboard + Таблица лидеров + + + Races + Гонки + + + All boat classes + Все классы лодок + + + Competitor + Участник + + + Extend Leaderboard + Расширить таблицу лидеров + + + No more races + Больше нет гонок + + + Last Score Update + Последнее обновление оценок + + + Name + Название + + + Regatta Rank + Ранг в регате + + + Total Points + Всего баллов + + + Watch live + Смотреть в реальном времени + + + Analyze Race + Анализировать гонку + + + Not Tracked + Не отслеживается + + + Finished at: + Завершено в: + + + Started at: + Начато в: + + + Scheduled for: + Запланировано на: + + + Race + Гонка + + + Wind Strength: + Сила ветра: + + + Winner + Победитель + + + Leader + Лидер + + + Tracking + Отслеживание + + + Wind Data + Данные о ветре + + + Video + Видео + + + Audio + Аудио + + + Event Sponsorships + Спонсорская поддержка событий + + + Jobs + Работа + + + © 2011-2016 SAP Sailing Analytics + © SAP Sailing Analytics, 2011–2016. + + + SAP Sailing in + SAP Sailing в + + + Legal Disclosure + Раскрытие юридической информации + + + Privacy + Конфиденциальность + + + Feedback + Обратная связь + + + Events + События + + + Home + Главная + + + + Search + Поиск + + + Search + Поиск + + + Solutions + Решения + + + Sponsoring + Финансовая поддержка + + + Latest Official Race Results + Последние официальные результаты гонок + + + New + Новое + + + Updated + Обновлено + + + races + гонки + + + refresh + обновить + + + Leaderboard Quick Access + Быстрый доступ к таблице лидеров + + + Show All Events + Показать все события + + + Latest Events from the Sailing World + Последние события в мире парусного спорта + + + Get lost in the latest and most beautiful impressions from your favorite sailing event. + Погрузитесь в новейшие и прекраснейшие впечатления от избранного события в мире парусного спорта. + + + Photographers love Sailing + Фотографы любят паруса + + + Immerse yourself in the world of sailing and check out our latest events for more videos. + Погрузитесь в мир парусного спорта и просмотрите другие видео наших последних событий. + + + Recent Video Entries + Последние видеозаписи + + + Read More + См. также + + + Photos + Фото + + + Videos + Видео + + + Competitors + Участники + + + Races + Гонки + + + Tracked + Отслеживаемые + + + Regatta will start + Регата начнется + + + Pts. + баллов + + + Course + Курс + + + Area + Область + + + Finished at + Завершено в + + + Scheduled at + Запланировано в + + + Started at + Начато в + + + Winner and Results + Победитель и результат + + + Search + Поиск + + + Your Search + Ваш поиск + + + result(s) found for + результ. по запросу + + + Type in your searchkey + Введите ключ поиска + + + More + Больше + + + Search + Поиск + + + Search again + Повторный поиск + + + Sort by + Сортировать по + + + Recent + Недавние + + + Oldest + Самые старые + + + Relevance + Релевантность + + + About 2,450 results where found for ''Schnitzel'' + Около 2450 результатов по запросу ''Шницель'' + + + Send an email + Отправить эл. почту + + + Share on Facebook + Поделиться в Facebook + + + Tweet about it + Твитнуть об этом + + + Share this on + Поделиться в + + + Recommend SAP Sailing Analytics + Рекомендовать SAP Sailing Analytics + + + SAP in Sailing + SAP в парусном спорте + SOLUTIONS + + + SAP Sailing Analytics + SAP Sailing Analytics + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + Post-Race Analytics + Аналитика после гонки + + + Training Diary + Дневник тренировок + + + Strategy Simulator + Симулятор стратегии + + + SAP in Sailing + SAP в парусном спорте + + + Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which: + Парусный спорт предоставляет отличную платформу для демонстрации решений SAP и беспрецедентной помощи развитию спорта. Вовлеченность SAP преобразила парусный спорт, предоставив инструменты, которые: + + + Help sailors analyze performance and optimize strategy + Помогают мореходам анализировать эффективность и оптимизировать стратегию. + + + Bring fans closer to the action + Делают болельщиков ближе к действию. + + + Provide the media with information and insights to deliver a greater informed commentary + Предоставляют информацию и аналитику для более информированного комментирования. + + + SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including: + За немалое время причастности к парусному спорту компанией SAP накоплено солидное портфолио сотрудничества с разными командами регатами, включая: + + + Official Technology Partner of Travemünder Woche + Официальный технологический партнер Travemünder Woche + + + Technical Partner of the European Sailing Leagues + Технический партнер Европейской лиги парусного спорта + + + Title sponsor of the SAP Extreme Sailing Team + Титульный спонсор команды SAP Extreme Sailing Team + + + Official Technical Partner of the Extreme Sailing Series + Официальный технический партнер серии Extreme Sailing Series + + + Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany + Премиальный партнер национальной команды Германии по парусному спорту, Audi Sailing Team Germany + + + Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week) + Премиальный партнер крупнейшей в мире регаты Kieler Woche (Кильская неделя) + + + Title sponsor of the SAP 5O5 World Championships + Титульный спонсор чемпионатов мира SAP 5O5 + + + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + Предоставляя аналитику по данным о рангах в гонке, скоростях, маневрах, ветрах и т. д. в режиме реального времени, SAP помогает упростить и демистифицировать сложный парусный спорт. + + + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + SAP Sailing Analytics делает мир парусного спорта понятным и прозрачным, используя облако и технологию In-Memory, обработку данных GPS и параметров ветра в реальном времени, а также визуализацию контекста в разных пользовательских интерфейсах, доступных где угодно. + + + The SAP Race Committee App delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + Приложение SAP Race Committee повышает уровень эффективности и контроля для организаторов гонки за счет автоматизации и упрощения выполняемых вручную задач и общения во время проведения парусных регат. Приложение Race Committee помогает упростить проведение событий и управление ими, освобождая для оргкомитета время на лучшую проработку деталей. + + + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.<br> SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + Доступ к данным, собранным на парусных событиях, дает мореходам возможность оценить и проанализировать свои показатели, помогая разрабатывать стратегии и повышать мастерство.<br> Решения SAP Business Analytics предоставляют мореходам, тренерам, болельщикам и СМИ инструменты для просмотра и анализа исторических данных по множеству регат и гонок. SAP HANA позволяет изучать эффективные приемы, тенденции и профили мореходов простым, быстрым и эффективным образом для оптимизации своих показателей и разработки успешных стратегий на будущие регаты. + + + The STG Training Diary supports the daily documentation and analysis of an athlete''s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + Дневник тренировок STG поддерживает ежедневное документирования и анализ физического состояния атлета и его усилий в тренировках на воде, физической подготовке, работе с лодкой, моральной, теоретической подготовке, а также других видах деятельности, таких как образование и путешествия. + + + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + Выбор правильной стратегии может обеспечить большое конкурентное преимущество во время гонки. Симулятор стратегии упрощает определение лучшей стратегии хождения под парусом для разных атмосферных условий и водных течений. Возможность мгновенного изменения ветра и течения в симуляции позволяет легко оценить надежность стратегии даже для неопределенных погодных условий. + + + SAP Sailing Analytics + SAP Sailing Analytics + + + By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. + Предоставляя аналитику по данным о рангах в гонке, скоростях, маневрах, ветрах и т. д. в режиме реального времени, SAP помогает упростить и демистифицировать сложный парусный спорт. + + + SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. + SAP Sailing Analytics делает мир парусного спорта понятным и прозрачным, используя облако и технологию In-Memory, обработку данных GPS и параметров ветра в реальном времени, а также визуализацию контекста в разных пользовательских интерфейсах, доступных где угодно. + + + Read More + См. также + + + SAP Sailing Race Manager + SAP Sailing Race Manager + + + The SAP Sailing Race Manager delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. + Приложение SAP Sailing Race Manager повышает уровень эффективности и контроля для организаторов гонки за счет автоматизации и упрощения выполняемых вручную задач и общения во время проведения парусных регат. Приложение Race Committee помогает упростить проведение событий и управление ими, освобождая для оргкомитета время на лучшую проработку деталей. + + + Learn More + Узнать больше + + + Post-Race Analytics + Аналитика после гонки + + + Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better. + Доступ к данным, собранным на парусных событиях, дает мореходам возможность оценить и проанализировать свои показатели, помогая разрабатывать стратегии и повышать мастерство. + + + SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. + Решения SAP Business Analytics предоставляют мореходам, тренерам, болельщикам и СМИ инструменты для просмотра и анализа исторических данных по множеству регат и гонок. SAP HANA позволяет изучать паттерны эффективности, тенденции и профили мореходов простым, быстрым и эффективным образом для оптимизации своих показателей и разработки успешных стратегий на будущие регаты. + + + SAP Sail Better – STG Training Diary + SAP Sail Better – Дневник тренировок STG + + + The STG Training Diary supports the daily documentation and analysis of an athlete’s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. + Дневник тренировок STG поддерживает ежедневное документирования и анализ физического состояния атлета и его усилий в тренировках на воде, физической подготовке, работе с лодкой, моральной, теоретической подготовке, а также других видах деятельности, таких как образование и путешествия. + + + Strategy Simulator + Симулятор стратегии + + + Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. + Выбор правильной стратегии может обеспечить большое конкурентное преимущество во время гонки. Симулятор стратегии упрощает определение лучшей стратегии хождения под парусом для разных атмосферных условий и водных течений. Возможность мгновенного изменения ветра и течения в симуляции позволяет легко оценить надежность стратегии даже для неопределенных погодных условий. + + + Learn More + Узнать больше + + + Imprint + Печать + + +
+
\ No newline at end of file diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_zh_CN.properties.xlf b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_zh_CN.properties.xlf index 9be9a83ca47..787f4589603 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_zh_CN.properties.xlf +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/common/client/i18n/XLF/TextMessages_zh_CN.properties.xlf @@ -1,884 +1,860 @@ - +
- H4sIAAAAAAAAAO1aa2/curX9rl/BiwLNOYAzzqM5r1veYvxK3DqJ63EaFChQcCTOSLAkCiLlyZxf37U3SUljaZp+aXuLHgPWg9zc3NzPRWrSXLVupUudusLU74raSbr8JP5sOpGqWqjSGtFZLVyuRalVptu1UW0mvjE1t91cLi8u784+Lu8uhFPrb4UzwjJD7k5N1WhXONNakRW2KdVeZ6LwY1OafSHoL0lzY6xe3qh626mtluf8LpQoQ0uiH3XtrLzkW5KbSst3uCRqbTr3ycol3SFrkpraqdTJc39PbGNqa9qi3spV/5hYU3a0aCtX8SlZl2Yrz3BJtrqtVC0vdOdsmie63paFzeWlvyebrixZkFWa66wrtbxCi2ARhQ1tidlsilR5ws96bQun5UdqK1Sk3fnmpNRbeaO3SatSbeUdXZPKtPq63hj5Hg/Q2cYkj4XeLWtV7m1h5Z/wIlR4E4l51K0qy5vBSPKjbxobLmnwYvVl7XS7XGnVpvk91ipvuVloaofWLfcIvFSLMOS+3S+3qqgjqWv3QlHDYrFIWl0ald2S5e74UTRss7Y17XttLV5u0ArFXyin5LIW3CVMmnYtPGKXFyUczJOwc2SgExuQuByrI26LA3YfzKpL8/Fqz01XZqI2TmyKOiPXGfnrrnC5Z1WrCqxI0R9Mb79M4qW3XEYL2irn1IV2qihhEf8qMv8eu2N7MvJzto8rUguBBufvW4Onn5PvRy/nQBBu3+jE6raAB6z4FqcZrXIQZbQ6m2y0clCklVfhgSxCZsKyyKH8CykHXbtcOftB7+RnPDx7BpXoHbsPuRc7DT0kVjUrLJbjZnkrwnPiXUN630msowxSVF2psE65olfRv0MvXe0ys6u5A8Ov6wu1t5IuQ+dM0zvTtVa+a0dN74u6o8XgPuKrEe4ZKSw94EfsDrlJujzlNseMeZXFo5Y3uCRwJoQ8POQqPCQ75dL8g4H+6AFK3SWlsu5TA5/FIDwK/5yMbCRHRkzW5gv0bz0VhfdNUT/ASo2B9mANe0hxXzikGHqPjNH9qYHTQaOcLM4P9KyzlzI8fJXylczhnqr+OuVrWXkLIOzNV6jRGkSgeIaOv0r+j8qB1l6QCWmvSs65Ikb3hM4rNDYJbhP3JoPPgPQzYijXrQz3UdOnunDyD/erJNMb1ZXO8xlFxyjOOcG/Y6O/11mhJF/HzR8nITfqZJlkv4Jxj08AfSawIWk8YerrIaXSkEzGVHHpvQ4Oeu90itmkv4lQcccEN0f82tNEEQ6Y3cBtERhelkOekf4O9GRBLnih3g99xOXyAAPMUbCzcArtn2bpyF7IyzLcZ2nuUSQedOYtEV68r3jyO23hA6wS2F7Lz0Vda+/EIvQdEJ4Z5c6RKay2F61pLuDSconyTO0idPgBUQ5SRFgzg4Dxwmc1c2iyA7po6QtKUnSZ7+ahXsPzBDcmVQSXZHyYJ+uRUR9lh748oT8ofLMk91TD2rEmELPiTCPoahg7hXVWxtT/40f/sSvSB0ICuvVh6nMCNz+/4vZoHQ6jv+/ZU0pyhLsRXBtT3BTWwbIjg7Oh12TodGzou0mBH0DDCD8cI7784nSdjWX2LeKY6KP2WM4CngIAEoQ4RTtdzTCIitsqBdm42HFDrExHBn4A6pJ0OUYQWu4UF0IPcejlGP29caq8NQV5PT8L/3JAT5bhIh1KNVX1CYEH1Fry/WfNET4hAo4KGYCRYniekF09BQtCuZ8mVKGgxho9T9Mj0/6J4PCUkP7lrMzIRxklJYSFa7GFcfl0tM9ZIXVNer2+QyBMei12LHC2t03IjlRGjtAMohD+P0b1pyLTRvL1GMmyywoj+epJwpbOjmM8tuVFA2hsAHrb35u1lXQJ7+em2bfFNnfyL92LF8sfxasXL18+x+U7MV/O/bB+fzomArwJvRC3lHwVF4VNS2OBxUPnbVs8qnQvwz20XmmdraE7GR+SnJV9WOl827t+z+vfb8zWyKmkvnN1ANPHbbcl1JmbkizrW0Tsn9kTh57ZPXTJNZ2d8EkpDNW+3+0STV8TJ8OueTeC/7kun1cyGe5TEnrkYn+j1rqUvlWoDbT7d4gZyvlcNyXSG2yhctn6+xjGc/lYphhm/XSjlORri/C9SYWtsT8jyM0O2V/SXVAZCEbtCbzrBpWFwrZpTeXBW7DvZ9OWGY9hHLnq1o6HvdUO+2YMDIcqfjGMQSpqXmsFS266UhRVg9VYsqpnv8eGSGzUI4zptLBhIo6qxTCTl+42N85sW9XkhHBK7Bb7DWFPyYFre8muqwq0mqexutxECXe0EmE2/YwkK3IcVEeIlYQKi9BBF6b1pemRJ1g8ndFLGKAPN4nLAP2IMmaDHl7Sg2CMWfECGVbwAu1osXbcO57IP8e9+WiTP97wx+4xQghNsY7EGhIp/Y1rwrDL3xVwGN5kR7pb9OJ/MQhA6pX+FhuXrVaSLrEh1qOlG5em2NuXGHQP5WbU7wsV9fYlK/bZEDReOb6QHEBgf2Dg3zx0OuucA4CMRwiTfh9ZfyZPmKGxV4jfDMFJL9/Yb+EfeCcvmWE1Tnb3+4bO0bzfe9IHvT8YNGw/xq2HuXTa48/FQi7lM7FDIuzq/ZLoSaz3k16kPvh7cOFJ70dIj15/m/TS2c6jqlM+efNPBzSc7cJu8NXJb968EF5zVuwQy3rQnnj2DLZHWvxZl8+eJTZXlOQvEUIQnEClqoWmt9h1BdWujXlAZlNgZGoRWyLF/a5wjjS/00hTfFIrCizBUFG44gLIYwMHPp8DmwOCProN8glhmdnynPxKrD7efLq//vhhlQyHu6vrVV+TaCCs359j9TTL2wOaKfOelOJ4lpbr23tVAxq0A/ktEnBPTi/PmW6GMXIBorLe9tSxAThCtfuRsPFobRDDtciW2/3o1I2O7q7r8eHdaN10PM4b4IHkZY8imtZQkrWcqBvdbuggvwFX+EfFTkLc6IwfxSylI8VeMo75XJcNj7V8lNV2NTD3gxY1UnmLWgQOekE8/tIBa/1oIdijKR91Rak71Ac/NFcQolW1pZmRcLgnlqgvDW0T4ekIpiAznxsbU9oTOkxOAXVnFvpKviMBrd/0+8Pzn/1CDR34gyGtwjSuqAp02KDbOV6v5Rm5OAoo1k5QDwuEYkhOxZ9T5gb9BvCPNcx0XGD80TQd70MCGsciFLUldGqJZaZp30LH8ltkdDqg99TQig8KRy4yM9sbtj1pUqFk11vUkTrziHXQOk8/LsVEj0Sj1mUoE4IMsjFlAbM3qma3VGlrLKTTqvKWj9XgBMzTsqNpZk3w3fAJ5F4j3ZjSwHdvUVWobgAVwPMhGaHyTUqbdCAfVKQ5Vt9L5kDfWMYMSLOXXWsarXqvpw3xttN2js0PklOMCN+JIgtSHXbTLbTUcwEYqOZY/PhkUbMiPeEVTjrmwvEFvERXRVeNebzlT1L7GDg1+wqmiaYjU5wI2hkdiBvHzU70cm6iHqPFqUrVbgmOBROfiD8UqDTBMOIbehOftX74dnaOV8fV++bjG49rxXmuqoayCG/ZDnLzvf7iXsqzfQwDWhjCoBSIUe1DmHKpUC0XMoL0uNS0G4Uz2gb7KtyhAt1hNB6BiIkJnNylixMWBGWHMpfPIcICKZfFZs9+nelqbx29xe+Zpf4SctSAYRcTkV/N15KYYYcAp0k40TUogXW6j0lkApOR6jBDWfxML+el6TIee10/f68Bj/ejeDqhaWgXQqRvb1dMuKPtdwU427U+8vkTG5LuWJsZQLbtVJgl2JPStHiE1kzHWwdqzCA5b3SKNYzL+wl4GUOKxWHBJG3I+2ByLoDAyRUBA5TCpol2tX120xxLrAveGmC+1pSkFzauabeqRnbGCKgEuxtDeTMkr2i78BmxaMnyHa1P2Qcb+FVVRyHKyTbrvEd1Pq9FZcd0thAk+YzU5C92cBWyGDJO65nCapEhb8QIGDBX4hN2NVgOV0tuSyNvG7ggXipC2u3iEE6wMv0Ok0sDmTA1JX1wZ1R+uI2DTqFa2xc8LyX5LhTg2NX4MNIrxn9L1kFvo6I4CJuBbWmaWBjpKJ+1Dv6IK8J6i9+u2/9jU591cD/iPTj/ABZiGATJTrAIhWyCB66nrLWhOnJhJyHWrdlZfSAtMCMwD2dc1kaoTJTzeiv6CkWbMAYf4t3yw1KosgQzWm1FrLHJb+uAUceAoFG0rBqSkdfDK8eLRj7DSjZFqTlGlHcITasIm/DozCi0ak80ps08UuhRhte32dUTINKru2OL0y5+pHmCY5uOPvcO7jqFlEP43b8Vh7ASfNkZbPjiXpTIsibtGFL0UKT/iQG8mn4S4vJSO03fjZsc7aR4+mxa9ANcnARrZ+4B2CG/Keay4zCPZCcDn6GJj8qRAh+Qukma8oRYUJYDi53GpphY0Tc5RluPmB0aYayJ3WuIbcOTQIWLGQDNeuEP8PEnB3we2GM+/v1LdFNOTf2vWRBTQmXYajng/ZhBFDuYzxdTTB4zBUmZafpdhVcRzbum4hrjtp+erBtzLqfuXsne/bwS065tKdDh1wV5DVNylvMdvIo1/8Sg3g4/vbFeLlKSX7WCd554LZh1Zx0HLhn8UB/gBBuSn2CnWXZ0IMeZhqWlTzCtgwVhIP5cOhJ5kSSjHxQMv5GY33ANOOLpgP8AJHBc+P9uTDDVx8yJ3IiMim7YUh/fa0+UPR4VQcfcyF9gx9dgx5xKe4vdcLX0JmuMPz0fonrurCNY6vYp8cv/33DmqNw+mH8BOf8OkJMUL3+oL/Tq6PFZjHpxxlYUvJV9PQOBjnH6J6GmuKX+D0JOSQQA41/5TY4cYx6e0P6CsP51CGtiqdl0Hb4DdpW8xlNRO2TwUu0pwehzVTWq2Nayc9VfrenaVEsUgqC6X1MrZSyM7bMcNwbzS/qAvnjxyrdFXgNpE9uKzJMOvBc91UgcSrh9jUL5k7lzjf3p9JQoFltjtqVegOCUqU9V09jT8BPd32EK9NAMizhFO2a3APWRmc5UttVH54LGylNdn66Jyp4WlaLbVtdApCk6ntOA59y7aOptkpBYNMfKbWMmseTX6y7N+1kK1DBkbtCGaTJeD1a2fe6ejjotsu+///HNd6+/e/3md6XU9a+h1/+tnPyhn4zXsOqQmL/Iv+o6+Rs71Hvm6y8AAA== + H4sIAAAAAAAAAO1aW2/cNhZ+16/gYh/SAs4gTptuWywXGN9it07s9TgNCvSFI3FGgjWiIFKeTH79fueQ1MWSN/uyl2JrwBIvh4eH536oSXPVuJUudeoKU10WlZP0+FH8alqRqkqo0hrRWi1crkWpVaabtVFNJr4yFY9dny/Pzu9ObpZ3Z8Kp9dfCGWEZIU+nZldrVzjTWJEVti7VQWei8GtT2n0h6C9Jc2OsXl6ratuqrZan3BdKlGEk0Y+6clae8yvJzU7LSzwStTat+2Dlkt6gNUlN5VTq5Kl/J7Y2lTVNUW3lqmsm1pQtHdrKVWwl69Js5QkeyVY3O1XJM906m+aJrrZlYXN57t/Jpi1LJmSV5jprSy0vMCKYRGHDWGI2myJVHvCjXtvCaXlDY4WKsHs/nJR6K6/1NmlUqq28o2eyM42+qjZGvkMDPNuY5LHQ+2WlyoMtrPwFHaFCTyTmUTeqLK97IckbPzQUXFKjY/V55XSzXGnVpPk9zipveVhoGgfXLc8IdHaLsOS+OSy3qqgiqGsOQtHAYrFIGl0ald2S5O64KWqWWdOY5p22Fp1rjILxZ8opuawETwmTpm0DjdjnRQkF8yCsHBngxAYgLsfpCNtihO69WbVpPjztqWnLTFTGiU1RZaQ6A33dFy73qCq1Aypi9HvTyS+T6HSSy+hAW+WcOtNOFSUk4rsi8/04HceTgZ6zfFyRWhDUK383GjT9lHQ/ajkbgnCHWidWNwU0YMWvuM3glD0pg9PZZKOVAyOtvAgNkgiJCccihfIdYg6m9rly9r3ey49ovHgBlug9qw+pFysNNRKr6hUOy3azvBWhnXjVkF53EuvIgxS7tlQ4p1xRV3R98KWtXGb2FU9g+VV1pg5W0qOfnBm6NG1j5WUzGHpXVC0dBu8BXg1zz4hh6QgfoRtjk/R4im0OGeMqi0ctr/FIoEwweWjIRWgke+XS/L0B/6gBpu6TUln3oYbOYhGawreTgYzkQIjJ2nwC/62HIvO+LqoHSKk24B6kYccQ94WDi6F+RIzpDzWUDhxlZ3E64rPOjmVofBHytcyhnqr6MuQ3cuclALM3X4DGaCCB7Bk8/iL4v0oHRjtCJqAdK9nnimjdEzjP0DgkeEzcmww6A9CPsKFcNzK8B0MfqsLJn+9XSaY3qi2dxzOwjoGds4O/ZKG/01mhJD+HwzcTkxtMMk2yO8FwxjuAzhPY4DSeIPXxkFxpcCZDqHj0jgej2TudYjfpXyJE3CHA9TN67WEiCSNk11BbGIanZYwzwt8BniTIAS/E+36OsJyPcoA5CFYWdqFdaxaO5AW/LMN7FuYeQeJBZ14SoeN1xYPfaQsdYJZA9lp+LKpKeyUWYW4EeGKUO4WnsNqeNaY+g0rLJcIzjYsw4RdEOogR4cycBAwPPsuZschGcFHSZ+Sk6DE/zUs9h+cBrk2qKF2SsTEP1mVGnZWNdXkCPwp8syD3FMOaISdgs+JEw+gqCDuFdFbGVH/yq//eFukDZQK68WbqfQIPv7zg8SgdNqN/rtlTSFKEu0G6NoS4LqyDZAcCZ0GvSdDpUNB3kwDfJw2D/OE54PNPTlfZkGY/Ip4jfTAew1nIp5AACco4RTM9Tb+IgtsqBdgw2PFAjEzPLHyPrEvS4zmAMHKnOBD6FIc6z8HfG6fKW1OQ1nNb+M4IniTDQTqEaorqEwCfUGvJ78+aLXwChDwqeADOFEN7AnbxNFkQyv04gQoBNcboeZguM+1alA5PAelfztIMf5SRU4JZuAYljMunq73PCq5rMuv5HQxhMmtRsUDZ3tbBO1IYeQamJ4Xy/+egfikybSQ/nwNZtllhJD89SCjp7NDG41he1EiNDZLe5ieztpIeoX9q6kNTbHMnf2tfvVr+IF6/Oj5+icd3Yj6c+2VdfToEQnoTZkFuKfkpzgqblsYiFw+Tt03xqNKDDO8weqF1tgbvZGwkOTN7HOn82GVX8/r+tdkaOaXUT65Gafpw7LYEO3NTkmT9iIjzMzVxmJmtoUuO6ayET0JhiPZdtUswXUycLLviagT/c1Per2QyvKcg1ORgz9mZd19TIL1BVZTLxr+HmTlHhGWKZfZarXU59Ps+XAg/m+xQ7fqyPzd7OHRJb0GePcipA/DaGLgQYtWmMTufjwWRfTRNmfEaTg1X7drxsrfaoRTGwnBP4g/DacWOhtdaQTibthTFrsZpLAnKoz+gxhEb9Qj5OC1s2IgNZdHv5Km7zY0z20bVOSUtJQrArsbrINkWbUfZ1W4HWM3bWF1uIoV7Ookwm25HohVuC6yjJJSICofQgRco7DnaPPIGi6c7egpDNsND4jxkcwQZDbzLGKkhOG3c8QE5U+AD2sFh7XB2uJFvx3J7ULcPa/g4PQz6YSiGhhgWIqR/sZvvC/d9AYXhujnC3WIW/4ueAGKv9K84uGy0kvSIAzHELN0w2sTZLmpguo8gg3kfe2i2i0Jxzgaj8czxsWGU1fo7AN/z2dBJ6xxywngrMJn3lvUracIMjL2A/WYwTup8Zb+GfqBPWjKDaui/7g81XY15vfegD/owWtRXFMPRsXuczvirruAe+ZprDIRC3R+JWmJ9mMzCm0HfgwpPZm9APWb9azJL1zWPqkr5Ms23RjDs7UKB9/ro2zevhOecFXvYsu65J168gOzhFj/r8sWLxOaK/PY5TAiEU56oKqGpF6cuwNq1MQ/wbAqITCXiSIS43xfOEef3Gm6KL19FgSMY8vMXHNN4bcDAV25AMwLorNvAn1B6Mhtxkz+L1c31h/urm/erpL+vXV2tujBDCyH97mqqg1nejmCmyDtQsuNZWA5Z71SFaN/04LdwwB04dV4y3Axi+AJYZbXtoOMAUgPVHAbExtuyngzXwFtuD4OLNLqNu6qG93GDc9ONN9e0PchxlxjUjSEna9lR17rZ0N18DazQjx0rCWGja3sEs5RuCTvK2OZzXda81vLtVNNWSKMftKjgyhvEImDQC8LxW4v06QcLwh5N+ah35LpDfPBLcwUiGlVZ2hkOh2diiPpUU+UHTYcxBZr5KtiY0h7R/XCK7HXmoK/lJRFofR3v78M/+4MausMHQjqFqV2xKzBhA2/ncH0jT0jFEUBxdsrecEAwhuhU/IVkbtG3yOiYwwzHAcbfNtONPSigdUxCUVlKOC2hzDSVInTTvoVHpzt3Dw2ueKNwpCIzu71h2RMnFUJ2tUUcqTKfhPZc5+2HoZjg4WjUugxhQpBANqYsIPZaVayWKm2MBXVa7bzkYzQ4AvK0bGmbWRF813/VuNdwN6Y00N1bRBWKG8gKoPmgjBLtTUp1NzIfRKQ5VH+RjIE+mwwREGfP28bUWnVaTzXuttV2Ds33kl2MCJ9+IgpiHQrkBlzqsCAZ2M2h+OHJoWZJeoIrXF7MmeMraIneFe1uiOMtf2U6RMOpWFewTRQdieJIULEzIjeum93oeG6jLkeLW5Wq2VI6FkR8JH4uEGmCYMRX1BMftX74enaP18+z983NG5/XitNc7WryIlyFjXzzvf7kjuXJIZoBHQxmUArYqPYmTL5UqIYDGaX0eFRUYEIZbY1SCW+wQLdYjSYyYkICJXfp4ogJQdghz+V9iLDIlMtic2C9zvTuYB314ifKUn8KPqrPYRcTkl/Px5LoYXsDp03Y0dUIgVV6iE5kkibD1WGHsvhMndPStBmvvapevtNIjw8DezqibagKIdC3tysG3FNFvUM62zbe8vmrGZzukJsZkmzbqrBLkCe5afEIrpmWSwcazEA5FzrFGsLlegJaxinFYhwwiRvyPoicAyDy5B0lBgiFdR3lajvvptmWmBdcGmC/xpTEFxauabaqgnfGCrAE1Y0hvxmcV5Rd+DJYNCT5ls6n7IMN+Ha7lkyUnW3Weo1qvV+LzI7ubCGI8hmqSV9sryokMXicxiOF1CJCLsQoMWCshCdUNTgOR0seSyNuG7DAXnaUaTeLcTrBzPQVJocGEmFqSvqGzln5uIwDT8Fa2wU8TyXpLhjgWNX4ftEzxn8e1oFvg6DYE5sBbWnqGBjpdp65DvywK8r1Fn9dN39jUZ+0UD/C3St/nyxEMwiUHeEQCt4EDY6nzLU+OnJgJyLWjdlbPaIWOSNyHva4zI0QmcjndVL0EYqKME4+xOXy/VKosgQyOu2OUKPIb6qQow4TglrRsSpQRloPrRweGv4MJ9kUpWYbUV4hNJ0iFOFRmRFo1YFgTJP5TKHLMjy/zb6aJCIdu1uWOFXxA85TOrZp6Qtur67TlLI3v/u3YpxWAi8rgw0f0YsSXtakLacUXSrS/WoAWk2/8nB5qZ2mT8F1jnFiPH0JLboFLm6CszP2kNjBvynGsmczj2BHPZ5+iG+/4QIf4LqJmvKIUJCXA4q9RlFMqOgzG2dbj9gdHOFcE9VrsG3Dm4CFi5kEmvnC39Tjrwj4iq/L+fgnLVFN2TV1P1CBTQmVodRyyPejB1GsYN5fTHPy6CmIykzTTyU8i2jfNQXXaLfd9iTd6HPZdXdM9urnmZi2TUOGDr0uSGsYkr2cn+BTrPlXA9W2/zWN9XQRk/ypFbTzyHPBrFvr2HBJ4GN+ABNkSHqCSrNs6Y6NPQ1TS19VGgcJQkD8BXRA8iJJBr8R6H/2MF9w9XnE0wW/g0zgeeL/v3OCKT9mbuQGYBR0Q0n9fK09YfZwVUw65lb+kXZ8Ke2YY2knsWuOll5ktfG3571Vz911BEndPgU+/t9OZ56l2xvzH0nOfyPJSYrj76szvXr2+ixavThhKQouZb+ZSYGew/RvyppiSf07ypySmAAMf7g3uXKMfngC+0eG9Z/LsCaSmnXX4Ttgu5NXaBWVS5J/AD0w/y/bLQAA - +
Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. - 提示:您还可以使用积分榜(在 LEADERBOARD 选项卡中)选择在记录中显示的参赛队。 + 提示:您还可以使用积分榜(在 LEADERBOARD 选项卡中)选择在记录中显示的参赛队。 Choose a language - 选择一种语言 + 选择一种语言 Events - 活动 + 活动 Home - 主页 + 主页 About us - 关于我们 + 关于我们 Contact - 联系信息 + 联系信息 Sponsoring - 赞助 + 赞助 Solutions - 解决方案 + 解决方案 Blog - 博客 + 博客 Deutsch - 德语 + 德语 English - 英语 + 英语 Full event schedule - 详细活动日程安排 + 详细活动日程安排 Official event website - 官方活动网站 + 官方活动网站 Leg - 航段 + 航段 Races - 比赛轮次 + 比赛轮次 More info - 更多信息 + 更多信息 View analysis - 查看分析 + 查看分析 Overall leaderboard - 总积分榜 + 总积分榜 Please enter a search term. - 请输入搜索词。 + 请输入搜索词。 Please try again... - 请重试... + 请重试... Reload page - 重新加载页面 + 重新加载页面 An error occured while loading the data for this page. - 加载此页面数据时出错。 + 加载此页面数据时出错。 Could not find a leaderboard with this name. - 未找到此名称的积分榜。 + 未找到此名称的积分榜。 Not scheduled. - 未日程安排。 + 未日程安排。 Regatta details - 比赛详情 + 比赛详情 Regatta - 比赛 + 比赛 Competitors Analytics - 参赛队分析 + 参赛队分析 Choose chart type - 选择记录类型 + 选择记录类型 Series - 系列 + 系列 Regatta leaderboards - 比赛积分榜 + 比赛积分榜 Features - 特征 + 特征 Release notes - 版本注释 + 版本注释 What''s new - 最新消息 + 最新消息 Overview - 总览 + 总览 SAP Sailing - SAP Sailing + SAP Sailing Search - 搜索 + 搜索 Start Simulator - 启动模拟器 + 启动模拟器 Days - 天 + 天 Days - 天 + 天 Hrs - 小时 + 小时 Min - 分钟 + 分钟 Sec - 秒 + 秒 Day - 天 + 天 Hour - 小时 + 小时 Min - 分钟 + 分钟 Sec - 秒 + 秒 Live - 实时 + 实时 Finished - 已完成 + 已完成 Watch now - 现在观看 + 现在观看 Last Update - 上次更新 + 上次更新 Leaderboard - 积分榜 + 积分榜 Report news - 消息播报 + 消息播报 News Update - 消息更新 + 消息更新 Started - 已开始 + 已开始 hrs and - 小时 + 小时 minutes ago - 分钟前 + 分钟前 Starting in - 距离开始还有 + 距离开始还有 hrs and - 小时 + 小时 minutes - 分钟 + 分钟 Event Schedule - 活动日程安排 + 活动日程安排 Upcoming Races Today - 今天即将进行的比赛轮次 + 今天即将进行的比赛轮次 Weather - 天气 + 天气 KTS - KTS + KTS SAP Sailing Analytics - SAP Sailing Analytics + SAP Sailing Analytics Media - 媒体 + 媒体 Overview - 总览 + 总览 Schedule - 日程安排 + 日程安排 Regattas - 比赛 + 比赛 About the Series - 关于系列 + 关于系列 Upcoming - 即将到来 + 即将到来 Recent Events - 最近活动 + 最近活动 Leaderboard - 积分榜 + 积分榜 Latest Series Events - 最新系列活动 + 最新系列活动 More - 更多 + 更多 Events - 活动 + 活动 Countries - 国家 + 国家 Sailors - 水手 + 水手 Tracked Races - 跟踪的比赛轮次 + 跟踪的比赛轮次 Winners and Results - 获胜者和结果 + 获胜者和结果 All Boat Classes - 所有船只级别 + 所有船只级别 More Events - 更多活动 + 更多活动 Recent Events - 最近活动 + 最近活动 Date - 日期 + 日期 Event - 活动 + 活动 Location - 地点 + 地点 Upcoming Schedule - 即将到来的日程安排 + 即将到来的日程安排 Series - 系列 + 系列 More Events To Be Announced Soon! - 即将公布更多活动! + 即将公布更多活动! Event Quick-Finder - 活动快速查找器 + 活动快速查找器 Leaderboard - 积分榜 + 积分榜 Races - 比赛轮次 + 比赛轮次 All boat classes - 所有船只级别 + 所有船只级别 Competitor - 参赛队 + 参赛队 Extend Leaderboard - 展开积分榜 + 展开积分榜 No more races - 没有更多比赛轮次 + 没有更多比赛轮次 Last Score Update - 上次得分更新 + 上次得分更新 Name - 名称 + 名称 Regatta Rank - 比赛名次 + 比赛名次 Total Points - 总分 + 总分 Watch live - 观看直播 + 观看直播 Analyze Race - 分析比赛轮次 + 分析比赛轮次 Not Tracked - 未跟踪 + 未跟踪 Finished at: - 结束时间: + 结束时间: Started at: - 开始时间: + 开始时间: Scheduled for: - 已日程安排: + 已日程安排: Race - 比赛轮次 + 比赛轮次 Wind Strength: - 风力: + 风力: Winner - 获胜者 + 获胜者 Leader - 第一名 + 第一名 Tracking - 跟踪 + 跟踪 Wind Data - 风力数据 + 风力数据 Video - 视频 + 视频 Audio - 音频 + 音频 Event Sponsorships - 活动赞助 + 活动赞助 Jobs - 作业 + 招贤纳士 © 2011-2016 SAP Sailing Analytics - 版权所有 © 2011-2016 SAP Sailing Analytics + 版权所有 © 2011-2016 SAP Sailing Analytics SAP Sailing in - SAP Sailing 语言 + SAP Sailing 语言 Legal Disclosure - 法律声明 + 法律声明 Privacy - 隐私 + 隐私 Feedback - 反馈 + 反馈 Events - 活动 + 活动 Home - 主页 + 主页 Search - 搜索 + 搜索 Search - 搜索 + 搜索 Solutions - 解决方案 + 解决方案 Sponsoring - 赞助 + 赞助 Latest Official Race Results - 最新官方比赛轮次结果 + 最新官方比赛轮次结果 New - 新建 + 新建 Updated - 已更新 - - - Result after - 结果 - + 已更新 races - 比赛轮次 + 比赛轮次 refresh - 刷新 + 刷新 Leaderboard Quick Access - 积分榜快速访问 + 积分榜快速访问 Show All Events - 显示所有活动 + 显示所有活动 Latest Events from the Sailing World - 来自风帆世界的最新活动 + 来自风帆世界的最新活动 Get lost in the latest and most beautiful impressions from your favorite sailing event. - 徜徉在让人着迷、震撼人心的最新航行活动中。 + 徜徉在让人着迷、震撼人心的最新航行活动中。 Photographers love Sailing - 摄影师酷爱航行 + 摄影师酷爱航行 Immerse yourself in the world of sailing and check out our latest events for more videos. - 沉浸在风帆世界中,并通过更多视频了解最新活动。 + 沉浸在风帆世界中,并通过更多视频了解最新活动。 Recent Video Entries - 最近视频条目 + 最近视频条目 Read More - 更多信息 + 更多信息 Photos - 照片 + 照片 Videos - 视频 + 视频 Competitors - 参赛队 + 参赛队 Races - 比赛轮次 + 比赛轮次 Tracked - 跟踪 + 跟踪 Regatta will start - 比赛即将开始 + 比赛即将开始 Pts. - 得分 + 得分 Course - 场地 + 场地 Area - 区域 + 区域 Finished at - 结束时间 + 结束时间 Scheduled at - 日程安排 + 日程安排 Started at - 开始时间 + 开始时间 Winner and Results - 获胜者和结果 + 获胜者和结果 Search - 搜索 + 搜索 Your Search - 您的搜索 + 您的搜索 result(s) found for - 找到的结果 + 找到的结果 Type in your searchkey - 输入搜索关键字 + 输入搜索关键字 More - 更多 + 更多 Search - 搜索 + 搜索 Search again - 再次搜索 + 再次搜索 Sort by - 排序方式 + 排序方式 Recent - 最近 + 最近 Oldest - 最早 + 最早 Relevance - 相关性 + 相关性 About 2,450 results where found for ''Schnitzel'' - 找到有关“炸肉排”的约 2,450 个结果 + 找到有关“炸肉排”的约 2,450 个结果 Send an email - 发送电子邮件 + 发送电子邮件 Share on Facebook - 在 Facebook 上分享 + 在 Facebook 上分享 Tweet about it - 为其发推文 + 为其发推文 Share this on - 分享到 + 分享到 Recommend SAP Sailing Analytics - 推荐 SAP Sailing Analytics + 推荐 SAP Sailing Analytics SAP in Sailing - SAP in Sailing + SAP in Sailing SOLUTIONS SAP Sailing Analytics - SAP Sailing Analytics + SAP Sailing Analytics SAP Sailing Race Manager - SAP Sailing Race Manager + SAP Sailing Race Manager Post-Race Analytics - 赛后分析 + 赛后分析 Training Diary - 训练日记 + 训练日记 Strategy Simulator - 策略模拟器 + 策略模拟器 SAP in Sailing - SAP in Sailing + SAP in Sailing Sailing provides the perfect platform for SAP to showcase solutions and help the sport run like never before. SAP’s involvement in the sport has transformed the sailing experience by providing tools, which: - SAP 凭借此航行应用提供完美的平台,向用户展示解决方案,并以前所未有的顺畅速度呈现体育赛事。 SAP 通过提供各种工具转换其在参与此项运动中获得的航行经验,这些工具: + SAP 凭借此航行应用提供完美的平台,向用户展示解决方案,并以前所未有的顺畅速度呈现体育赛事。 SAP 通过提供各种工具转换其在参与此项运动中获得的航行经验,这些工具: Help sailors analyze performance and optimize strategy - 帮助水手分析表现并优化策略 + 帮助水手分析表现并优化策略 Bring fans closer to the action - 让粉丝近距离直击运动 + 让粉丝近距离直击运动 Provide the media with information and insights to deliver a greater informed commentary - 为媒体提供信息和见解,从而提供深度评论 + 为媒体提供信息和见解,从而提供深度评论 SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including: - SAP 长期参与航行运动,并成立了跨越团队和比赛的组合,包括: + SAP 长期参与航行运动,并成立了跨越团队和比赛的组合,包括: Official Technology Partner of Travemünder Woche - 特拉沃明德周的官方技术合作伙伴 + 特拉沃明德周的官方技术合作伙伴 Technical Partner of the European Sailing Leagues - 欧洲帆船联盟的技术合作伙伴 + 欧洲帆船联盟的技术合作伙伴 Title sponsor of the SAP Extreme Sailing Team - SAP 极限帆船队的冠名赞助商 + SAP 极限帆船队的冠名赞助商 Official Technical Partner of the Extreme Sailing Series - 极限帆船系列赛的官方技术合作伙伴 + 极限帆船系列赛的官方技术合作伙伴 Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany - 德国国家帆船队 - 德国奥迪帆船队的优选合作伙伴 + 德国国家帆船队 - 德国奥迪帆船队的优选合作伙伴 Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week) - 世界上最大的帆船盛事“基尔周”的优选合作伙伴 + 世界上最大的帆船盛事“基尔周”的优选合作伙伴 Title sponsor of the SAP 5O5 World Championships - SAP 5O5 世界锦标赛的冠名赞助商 + SAP 5O5 世界锦标赛的冠名赞助商 By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. - 通过实时分析比赛轮次排名、速度、操作和航向角等,SAP 可简化此复杂的航行运动,使其浅显易懂。 + 通过实时分析比赛轮次排名、速度、操作和航向角等,SAP 可简化此复杂的航行运动,使其浅显易懂。 SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. - SAP Sailing Analytics 利用云和内存技术实时处理 GPS 和风力测量数据,并在可从任何地方访问的前端显示,让用户全面、透彻地了解航行运动。 + SAP Sailing Analytics 利用云和内存技术实时处理 GPS 和风力测量数据,并在可从任何地方访问的前端显示,让用户全面、透彻地了解航行运动。 The SAP Race Committee App delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. - SAP Race Committee 应用通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。 Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。 + SAP Race Committee 应用通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。 Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。 Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.<br> SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. - 水手通过访问航行活动期间收集的数据评估和分析其表现,帮助他们制定策略和优化航行方案。<br> SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。 SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。 + 水手通过访问航行活动期间收集的数据评估和分析其表现,帮助他们制定策略和优化航行方案。<br> SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。 SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。 The STG Training Diary supports the daily documentation and analysis of an athlete''s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. - STG Training Diary 可每天记录和分析运动员的身体状况,在水上训练、体能训练、船艇工作、心理、理论以及教育或旅行等其他活动领域的训练力度。 + STG Training Diary 可每天记录和分析运动员的身体状况,在水上训练、体能训练、船艇工作、心理、理论以及教育或旅行等其他活动领域的训练力度。 Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. - 选择正确的策略可在比赛期间极大地提高竞争优势。 策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。 由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。 + 选择正确的策略可在比赛期间极大地提高竞争优势。 策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。 由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。 SAP Sailing Analytics - SAP Sailing Analytics + SAP Sailing Analytics By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing. - 通过实时分析比赛轮次排名、速度、操作和航向角等,SAP 可简化此复杂的航行运动,使其浅显易懂。 + 通过实时分析比赛轮次排名、速度、操作和航向角等,SAP 可简化此复杂的航行运动,使其浅显易懂。 SAP Sailing Analytics provide insights and transparency to the world of sailing by utilizing Cloud and In-Memory Technology, processing GPS and wind measurement data in real time and visualizing contents in various frontends accessible from anywhere. - SAP Sailing Analytics 利用云和内存技术实时处理 GPS 和风力测量数据,并在可从任何地方访问的前端显示,让用户全面、透彻地了解航行运动。 + SAP Sailing Analytics 利用云和内存技术实时处理 GPS 和风力测量数据,并在可从任何地方访问的前端显示,让用户全面、透彻地了解航行运动。 Read More - 更多信息 + 更多信息 SAP Sailing Race Manager - SAP Sailing Race Manager + SAP Sailing Race Manager The SAP Sailing Race Manager delivers greater efficiency and control to race organizers by automating and simplifying their manual tasks and communication during running sailing regattas. The Race Committee App helps simplify the operation of running and managing race events to help race committees operate smarter. - SAP Sailing Race Manager 通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。 Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。 + SAP Sailing Race Manager 通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。 Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。 Learn More - 了解更多 + 了解更多 Post-Race Analytics - 赛后分析 + 赛后分析 Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better. - 水手通过访问航行活动期间收集的数据评估和分析其表现,帮助他们制定策略和优化航行方案。 + 水手通过访问航行活动期间收集的数据评估和分析其表现,帮助他们制定策略和优化航行方案。 SAP Business Analytics solutions provide sailors, coaches, fans and media with tools to browse and analyse historical data across many regattas and races. SAP HANA allows them to learn about performance patterns, tendencies and sailor profiles in a simple, fast and efficient way in order to optimize their own performance and develop successful strategies for future regattas. - SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。 SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。 + SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。 SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。 SAP Sail Better – STG Training Diary - SAP Sail Better – STG Training Diary + SAP Sail Better – STG Training Diary The STG Training Diary supports the daily documentation and analysis of an athlete’s physical condition and training efforts in the areas of water training, physical training, boat work, mental, theory as well as other activities like education or travel. - STG Training Diary 可每天记录和分析运动员的身体状况,在水上训练、体能训练、船艇工作、心理、理论以及教育或旅行等其他活动领域的训练力度。 + STG Training Diary 可每天记录和分析运动员的身体状况,在水上训练、体能训练、船艇工作、心理、理论以及教育或旅行等其他活动领域的训练力度。 Strategy Simulator - 策略模拟器 + 策略模拟器 Choosing the right strategy can provide great competitive advantage during a race. The Strategy Simulator simplifies determining the best sailing strategy for various wind conditions and water currents. Since wind and current can be changed in the simulation right away, the robustness of a strategy can be easily evaluated even for uncertain weather conditions. - 选择正确的策略可在比赛期间极大地提高竞争优势。 策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。 由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。 + 选择正确的策略可在比赛期间极大地提高竞争优势。 策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。 由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。 Learn More - 了解更多 + 了解更多 Imprint - 版本说明 - - - utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions - utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions - - - https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app - https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app - - - https://play.google.com/intl/en/badges/images/generic/en-play-badge.png - https://play.google.com/intl/en/badges/images/generic/en-play-badge.png - - - https://itunes.apple.com/de/app/stg-trainingstagebuch/id779563635?l=en&amp;mt=8 - https://itunes.apple.com/de/app/stg-trainingstagebuch/id779563635?l=en&amp;mt=8 - - - _en - _zh + 版本说明
diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MediaPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MediaPanel.java index cb1e435f6cc..5b07cc0fc8f 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MediaPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/adminconsole/MediaPanel.java @@ -123,7 +123,11 @@ public class MediaPanel extends FlowPanel { public List getSearchableStrings(MediaTrack t) { List strings = new ArrayList(); strings.add(t.title); - strings.add(t.startTime.toString()); + if (t.startTime == null) { + GWT.log("startTime of media track "+t.title+" undefined"); + } else { + strings.add(t.startTime.toString()); + } return strings; } }; diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java index fcfea781e43..e5446e7be83 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/RaceTimePanel.java @@ -10,6 +10,7 @@ import com.sap.sailing.domain.common.security.SailingPermissionsForRoleProvider; import com.sap.sailing.gwt.ui.common.client.DateAndTimeFormatterUtil; import com.sap.sailing.gwt.ui.shared.MarkPassingTimesDTO; import com.sap.sailing.gwt.ui.shared.RaceTimesInfoDTO; +import com.sap.sse.common.Duration; import com.sap.sse.common.Util; import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider; import com.sap.sse.gwt.client.player.Timer; @@ -43,16 +44,18 @@ public class RaceTimePanel extends TimePanel implements R */ private boolean redrawAllMarkersPendingForMinMaxBeingInitialized; + private final Duration initialTimeAfterRaceStartInReplayMode; public RaceTimePanel(UserService userService, Timer timer, TimeRangeWithZoomProvider timeRangeProvider, StringMessages stringMessages, RaceTimesInfoProvider raceTimesInfoProvider, boolean canReplayWhileLiveIsPossible, boolean isScreenLargeEnoughToOfferChartSupport, - RegattaAndRaceIdentifier selectedRaceIdentifier) { + RegattaAndRaceIdentifier selectedRaceIdentifier, Duration initialTimeAfterRaceStartInReplayMode) { super(timer, timeRangeProvider, stringMessages, canReplayWhileLiveIsPossible, isScreenLargeEnoughToOfferChartSupport); this.userService = userService; this.raceTimesInfoProvider = raceTimesInfoProvider; selectedRace = null; autoAdjustPlayMode = true; selectedRace = selectedRaceIdentifier; + this.initialTimeAfterRaceStartInReplayMode = initialTimeAfterRaceStartInReplayMode; if (!raceTimesInfoProvider.containsRaceIdentifier(selectedRace)) { raceTimesInfoProvider.addRaceIdentifier(selectedRace, true); } @@ -282,7 +285,8 @@ public class RaceTimePanel extends TimePanel implements R case Replay: // set time to start of race if (newRaceTimesInfo.startOfRace != null) { - timer.setTime(newRaceTimesInfo.startOfRace.getTime()); + timer.setTime(newRaceTimesInfo.startOfRace.getTime() + + (initialTimeAfterRaceStartInReplayMode == null ? 0l : initialTimeAfterRaceStartInReplayMode.asMillis())); } break; } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties index 8b3000b3398..936efd1563b 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_ru.properties @@ -1,178 +1,180 @@ -# If you want new properties translated then sent this over GMR (Mark Angell ) manage2Sail=Manage2Sail -raceCommitteeApp=Race Manager App -tracTracEvents=События Трак Трак -swissTimingEvents=События Swiss Timing -trackedBefore=Ранее Отслеженные -general=Всенаро́дный -listRaces=Перечень Гонок -wind=ветра -maneuverType=Maneuver -windPanelLabel=Это окно информации о ветре, которое до сих пор абсолютно пустое. +raceCommitteeApp=Приложение диспетчера гонок +tracTracEvents=События TracTrac +swissTimingEvents=События SwissTiming +trackedBefore=История отслеживаемых событий +general=Общее +listRaces=Список гонок +listRegattas=Список регат +wind=Ветер +maneuverType=Маневр +windPanelLabel=Это панель ветров, которая пока что совсем пуста. refresh=Обновить remove=Удалить -windSource=Источники информации о ветре -dampeningInterval=Интервал ослабления +windSource=Источник ветра +dampeningInterval=Интервал смягчения map=Карта race=Гонка races=Гонки -tracked=Отслежена +tracked=отслеживаемые +linkedRaces=Связанные гонки time=Время -timeTooltip=Time the competitor sailed on this leg. For the first leg this is counted from when the competitor passed the start line. -# timeTooltip=Учет времени участника, выступавшего на этом этапе. На первом этапе учет времени ведется с начала гонки, а не при пересечении участником линии старта. +timeTooltip=Время плавания данного участника на данном этапе. Для первого этапа отсчитывается от момента пересечения участником стартовой линии. playSpeed=Скорость воспроизведения -playSpeedHelp=Используйте "1" для обычной скорости воспроизведения, "2" для удвоенной скорости воспроизведения и т. д. -playModeLive=В прямом эфире -playModeReplay=Режим повтора +playSpeedHelp="1" — обычная скорость воспроизведения, "2" — удвоенная скорость воспроизведения и т. д. +playModeLive=Активно +playModeReplay=Режим воспроизведения timeDelay=Задержка -timeDelayHelp=Не указывайте, для воспроизведения повтора в любой момент времени; введите секунды (например, "60" для одной минуты или "0" без указания) задержки перед загрузкой данных в режиме реального времени -speedInKnots=Скорость (узлы) -fromDeg=Начиная с (градус) -noRacesYet=Гонок пока нет. +timeDelayHelp=Оставьте пустым для воспроизведения в произвольное время; введите число секунд задержки перед потоком оперативных данных (например, "60" — одна минута задержки, "0" — без задержки) +speedInKnots=Скорость (уз) +fromDeg=Источник (град.) +noRacesYet=Гонок еще нет. total=\u03A3 -carry=Суммарная +carry=Накоплено competitor=Участник competitors=Участники -competitorsSelected={0}/{1} Участники. -noSuchLeaderboard=Такая таблица лидеров отсутствует -leaderboardConfiguration=Форма таблицы лидеров -newDotDotDot=Новый... -editScores=Изменить баллы... +competitorsSelected=Выбрано участников: {0}/{1}. +noSuchLeaderboard=Нет такой таблицы лидеров +leaderboardConfiguration=Конфигурация таблицы лидеров +newDotDotDot=Создать... +editScores=Изменить точки... columnNamesInSelectedLeaderboard=Названия гонок в выбранной таблице лидеров addDotDotDot=Добавить... renameDotDotDot=Переименовать... -trackedRaceConnectedToSelectedRaceName=Отслеженная гонка, соединенная с выбранным названием гонки -linkToColumn=Соединить со столбцом -unlink=Отсоединить -leaderboardName=Имя таблицы лидеров +trackedRaceConnectedToSelectedRaceName=Отслеживаемая гонка связана с выбранным названием гонки +linkToColumn=Связать со столбцом +unlink=Отменить связывание +leaderboardName=Название таблицы лидеров cancel=Отмена -pleaseEnterAName=Пожалуйста, введите имя -pleaseEnterABoatClass=Пожалуйста, введите класс судна -discardRacesFromHowManyStartedRacesOn=Не учитывать еще одну начинающуюся гонку в количестве начавшихся гонок -leaderboardWithThisNameAlreadyExists=Таблица лидеров с таким именем уже существует -discardThresholdsMustBeNumeric=Предельные значения не учитываемых должны быть выражены числом -discardThresholdsMustBeAscending=Предельные значения не учитываемых должны быть возрастающими -discarding=Неучет -startingFromNumberOfRaces=Начиная с количества гонок +pleaseEnterAName=Введите название +pleaseEnterABoatClass=Введите класс лодки +discardRacesFromHowManyStartedRacesOn=Исключить еще одну гонку, начиная с числа стартов в гонках +leaderboardWithThisNameAlreadyExists=Таблица лидеров с таким названием уже существует +discardThresholdsMustBeNumeric=Пороги исключения должны быть числовыми +discardThresholdsMustBeAscending=Пороги исключения должны возрастать +discarding=Исключение +startingFromNumberOfRaces=Начиная с числа гонок renameLeaderboard=Переименовать таблицу лидеров addColumnToLeaderboard=Добавить столбец в таблицу лидеров -pleaseEnterNameForNewRaceColumn=Введите, пожалуйста, имя для столбца новой гонки -ok=OK -medalRace=Медальная гонка +pleaseEnterNameForNewRaceColumn=Введите название для столбца новой гонки +ok=ОК +medalRace=Гонка на медали renameRace=Переименовать гонку openSelectedLeaderboard=Открыть выбранную таблицу лидеров -rank=Занимаемое место -rankTooltip=Место, занимаемое участником в гонке -regattaRank=Место, занимаемое в регате -regattaRankTooltip=Место, занимаемое участником в регате -overallRank=Итоговое место -overallRankTooltip=Место, занимаемое участником на этапах -totalRegattaRank=Итоговое место в регате +rank=Ранг +rankTooltip=Ранг участника в данной гонке +regattaRank=Ранг в регате +regattaRankTooltip=Ранг участника в регате +overallRank=Общий ранг +overallRankTooltip=Ранг участника в серии +totalRegattaRank=Ранг в регате collapse=- expand=+ -leg=L -distanceInMeters=Расстояние +leg=Э +distanceInMeters=Дистанция averageSpeedInKnots=\u2205 Скорость -averageSpeedInKnotsTooltip=Средняя скорость относительно земли в ходе этого этапа,\nрассчитывается путем деления пройденного расстояния на затраченное на это время. -raceAverageSpeedInKnotsTooltip=Средняя скорость относительно земли в ходе этой гонки,\nрассчитывается путем деления пройденного расстояния на затраченное на это время. -rankGain=Улучшение места -rankGainTooltip=Разность между местом, занятым на текущем и предыдущем этапах. -sapSailingAnalytics=Аналитическая информация парусного спорта +averageSpeedInKnotsTooltip=Средняя скорость относительно грунта на данном этапе:\nотношение пройденного расстояния к затраченному времени. +raceAverageSpeedInKnotsTooltip=Средняя скорость в течение гонки,\nвычисляемая делением пройденного расстояния на затраченное время. +rankGain=Повышение ранга +rankGainTooltip=Разница в положении между текущим и предыдущим этапами. +sapSailingAnalytics=Аналитика плавания leaderboard=Таблица лидеров leaderboards=Таблицы лидеров leaderboardSettings=Параметры таблицы лидеров settings=Параметры -selectAtLeastOneLegDetail=Выберите хотя бы одну подробность об этапе -currentSpeedOverGroundInKnots=Скорость относительно земли (SOG) -currentSpeedOverGroundInKnotsTooltip=Текущая скорость относительно земли. -estimatedTimeToNextWaypointInSeconds=Расчетное время прибытия (ETA). -estimatedTimeToNextWaypointInSecondsTooltip= Расчетное время, необходимое участнику для прибытия в следующую промежуточную точку маршрута, исходя из скорости лавирования участника и с учетом истинного направление ветра. +selectAtLeastOneLegDetail=Выберите подробности минимум одного этапа +currentSpeedOverGroundInKnots=SOG +currentSpeedOverGroundInKnotsTooltip=Текущая скорость относительно грунта. +estimatedTimeToNextWaypointInSeconds=ETA +estimatedTimeToNextWaypointInSecondsTooltip=Ожидаемое время достижения участником следующей путевой точки при эффективной скорости лавирования (VMG) с учетом направления истинного ветра. gapToLeaderInSeconds=Отставание от лидера -gapToLeaderInSecondsTooltip=Estimates the (calculated) arrival time at the current position of the boat that is farthest ahead,\nbased on average VMG for the current leg and with performance equal to that of the race leader for subsequent legs.\nThe gap tells how much earlier the competitor would have had to be where she currently is\nin order to rank equal to the race leader at the projected arrival at the current position of the boat farthest ahead. -velocityMadeGoodInKnots=Скорость лавирования (VMG) -velocityMadeGoodInKnotsTooltip=Скорость лавирования, представляет собой скорость продвижения на ветер/ по ветру для этапов движения против ветра/ по ветру соответственно, или скорость в направлении движения при лавировании по ветру -windwardDistanceToGoInMeters=Расстояние, которое необходимо пройти на ветер -windwardDistanceToGoInMetersTooltip=Расстояние движения на ветер/ по ветру от текущего положения участника до конца этапа для этапов движения против ветра/ по ветру соответственно, или скорость в направлении движения при лавировании по ветру. -windwardDistanceToCompetitorFarthestAheadInMeters=Расстояние на ветер до лидера -windwardDistanceToCompetitorFarthestAheadInMetersTooltip=Расстояние на ветер/ под ветер от участника до лидера для этапов движения против ветра/ по ветру соответственно или скорость в направлении движения при лавировании по ветру. -name=Имя -leaveEmptyForDefault=Оставьте пустым по умолчанию. -trackNewEvent=Отследить новое событие -trackableRaces=Отслеживаемые гонки +gapToLeaderInSecondsTooltip=Оценивает самое ранее (расчетное) время прибытия лодки в текущую позицию,\nисходя из среднего значения VMG для текущего этапа и эффективности, равной эффективности лидера гонки, для последующих этапов.\nПоказывает, насколько раньше нужно было прийти в текущую позицию,\nчтобы иметь ранг лидера гонки в расчетное время прибытия в текущую позицию лидирующей лодки. +velocityMadeGoodInKnots=VMG +velocityMadeGoodInKnotsTooltip=Эффективная скорость лавирования, то есть скорость хода переменными галсами или полным ветром на этапах с соответствующими условиями. +windwardDistanceToGoInMeters=Осталось пройти +windwardDistanceToGoInMetersTooltip=Расстояние от текущей позиции участника до конца этапа с учетом направления ветра. +windwardDistanceToCompetitorFarthestAheadInMeters=Отставание +windwardDistanceToCompetitorFarthestAheadInMetersTooltip=Расстояние от участника до первой лодки в гонке с учетом направления ветра.\nПервая лодка не обязательно лидирует в гонке, если применяется ранжирование с гандикапом. +name=Название +leaveEmptyForDefault=Чтобы задать название по умолчанию, оставьте пустым +trackNewEvent=Отслеживать новое событие +trackableRaces=Гонки с возможностью отслеживания trackWind=Отслеживать ветер regattaName=Название регаты eventName=Название события event=Событие -startTime=Время старта +startTime=Время начала +startOfTracking=Начало отслеживания +endOfTracking=Окончание отслеживания regatta=Регата regattas=Регаты startTracking=Начать отслеживание -stopTracking=Остановить отслеживание -connections=Подключения +stopTracking=Прекратить отслеживание +connections=Подключение historyOfConnections=История подключений defineNewConnection=Определить новое подключение -trackedRaces=Отслеженные гонки -canSendRequests=Можно отправить запрос -connectAndReadRaces=Подключиться и прочитать данные о гонке +trackedRaces=Отслеживаемые гонки +canSendRequests=Может отправлять запросы +connectAndReadRaces=Подключиться и считать гонки ports=Порты -liveData=Данные в реальном времени -storedData=Сохраненные данные -uris=URI-адреса -jsonUrl=JSON URL -livePort=Порт данных в реальном времени -storedPort=Порт сохраненных данных -liveUri=Данные пользователя в реальном времени -storedUri=Сохраненные данные пользователя -eventsConnectedTo=Текущие отслеживаемые события -hostname=Имя узла -declinationCheckbox=Корректировка направления ветра с помощью отклонения +liveData=Оперативные данные +storedData=Хранимые данные +uris=URI +jsonUrl=URL-адрес JSON +livePort=Порт оперативных данных +storedPort=Порт хранимых данных +liveUri=URI оперативных данных +storedUri=URI хранимых данных +eventsConnectedTo=Отслеживаемые события +hostname=Имя хоста +declinationCheckbox=Корректировать направление ветра по отклонению raceStartTrackingColumn=Отслеживание начато -pauseAutomaticRefresh=Приостановка автоматического обновления +pauseAutomaticRefresh=Приостановить автоматическое обновление autoRefresh=Обновлять автоматически -delayInSeconds=Задержка (и) -delayBetweenAutoAdvances=Задержка между автоматическими обновлениями в секундах: -delayMustBeNonNegative=Значение задержки должно быть больше нуля -chooseUpdateIntervalOfAtLeastOneSecond=Выберите интервал обновления, он должен быть не менее одной секунды -errorSettingWindForRace=Ошибка при настройке параметра ветер для гонки -errorFetchingWindInformationForRace=Ошибка при получении данных о ветре для гонки -errorWhileTryingToSetWindSourceForRace=Ошибка при попытке установить флажок «начинается встречный ветер» -inEvent=В случае -to=к -toSide=to -showEstimatedWind=Показать оценочный ветер +delayInSeconds=Задержка (с) +delayBetweenAutoAdvances=Задержка между автообновлениями в секундах: +delayMustBeNonNegative=Задержка должна быть больше нуля +chooseUpdateIntervalOfAtLeastOneSecond=Выберите интервал обновления не менее одной секунды +errorSettingWindForRace=Ошибка при установке ветра для гонки +errorFetchingWindInformationForRace=Ошибка при извлечении сведений о ветре для гонки +errorWhileTryingToSetWindSourceForRace=Ошибка при попытке установить флаг "ветер начинается навстречу" +inEvent=в событии +to=на +toSide=на +showEstimatedWind=Показать оценку ветра timing=Хронометраж -raceDetailsToShow=Подробные сведения о гонке -overallDetailsToShow=Общие сведения -legDetailsToShow=Сведения об этапе +raceDetailsToShow=Подробности гонки +overallDetailsToShow=Общие подробности +legDetailsToShow=Подробности columnMoveUp=Вверх columnMoveDown=Вниз port=Порт -raceStartTimeColumn=Гонка началась +raceStartTimeColumn=Гонка начата showOnlySelectedCompetitors=Показать только выбранных участников -showSelectedCompetitorsInfo=Показать окно краткого описания только для выбранных участников -tailLength=Длина (с) хвоста -selectedRaces=Какие гонки вы хотели бы отобразить? +showSelectedCompetitorsInfo=Показать окно сведений для выбранных участников +tailLength=Длина хвоста (с) +selectedRaces=Какие гонки вы хотите просмотреть? lengthInSeconds=Длина (с) -stressTest=Стресс тест +stressTest=Стресс-тест numberOfManeuvers=Маневры -numberOfManeuversTooltip=Количество маневров, выполненных во время этого этапа. -numberOfManeuversInRaceTooltip=Количество маневров, выполненных во время этой гонки. -tacks=Галсы -jibes=Перекладывания паруса -penaltyCircles=Штрафные круги -medalRaceIsNull=Значение медальной гонки недопустимо +numberOfManeuversTooltip=Число совершенных маневров на данном этапе. +numberOfManeuversInRaceTooltip=Число совершенных маневров в данной гонке. +tacks=Поворотов оверштаг +jibes=Поворотов фордевинд +penaltyCircles=Штрафных кругов +medalRaceIsNull=Значение гонки на медали не разрешено configuration=Конфигурация maneuverTypes=Маневры -chooseChart=Выбрать график -distanceTraveled=Пройденное расстояние -distanceTraveledTooltip=Расстояние, пройденное от старта до финиша этапа\ а не до текущего момента времени, если этап не завершен. -raceDistanceTraveledTooltip=Расстояние, пройденное от старта до финиша гонки\ а не до текущего момента времени, если гонка не завершена. -velocityMadeGoodLong=Скорость лавирования -speedOverGroundLong=Скорость относительно земли +chooseChart=Выберите диаграмму +distanceTraveled=Пройденная дистанция +distanceTraveledTooltip=Расстояние, пройденное от старта этапа до конца\nили до текущего момента, если этап не завершен. +raceDistanceTraveledTooltip=Расстояние, пройденное от старта гонки до конца\nили до текущего момента, если гонка не завершена. +velocityMadeGoodLong=Эффективная скорость лавирования (VMG) +speedOverGroundLong=Скорость относительно грунта (SOG) gapToLeaderLong=Отставание от лидера -pointsToLoad=Баллов для нагрузки +pointsToLoad=Точки для загрузки speed=Скорость -distance=Расстояние +distance=Дистанция in=в secondsUnit=с secondsPerNauticalMileUnit=с/NM @@ -183,65 +185,66 @@ compareCompetitors=Сравнить участников description=Описание sailNumber=Номер на парусе country=Страна -no3LetterCodes=Не удалось найти 3-х буквенные коды стран МОК. +no3LetterCodes=Не удалось найти 3-буквенные коды IOC. add=Добавить delete=Удалить -showCharts=Показать графики -raceWithThisNameAlreadyExists=Гонка с таким именем уже существует. -raceWithThisNameAlreadyExistsInRegatta=Гонка с таким именем уже существует в этой регате. -headUp=Заголовок -bearAway=Поворачивать под ветер -tack=Галс -tackTooltip=Количество галсов совершенных во время этой гонки. -jibe=Перебрасывать парус -jibeTooltip=Количество перебрасываний паруса во время этой гонки. +showCharts=Показать диаграммы +raceWithThisNameAlreadyExists=Гонка с таким названием уже существует. +raceWithThisNameAlreadyExistsInRegatta=Гонка с таким названием уже существует в данной регате. +headUp=Приведение к ветру +bearAway=Увал под ветер +tack=Оверштаг +tackTooltip=Число совершенных поворотов оверштаг в данной гонке. +jibe=Фордевинд +jibeTooltip=Число совершенных поворотов фордевинд в данной гонке. penaltyCircle=Штрафной круг -penaltyCircleTooltip=Количество штрафных кругов, пройденных в ходе этой гонки. -markPassing=Проход знака -mark=Знак +penaltyCircleTooltip=Число штрафных кругов, пройденных в данной гонке. +markPassing=Прохождение отметки +mark=Отметка otherManeuver=Неизвестный маневр -douglasPeuckerPoints=Точки алгоритма Дугласа-Пойкера -filterRacesByName=Сортировать гонки по названию -trackSettings=Отслеживать параметры +douglasPeuckerPoints=Точки Дугласа – Пекера +filterRacesByName=Фильтровать гонки по названию +filterMediaByName=Фильтровать носители по названию +trackSettings=Параметры отслеживания actionEdit=Изменить actionEditCompetitors=Изменить участников -actionEditScores=Изменить баллы +actionEditScores=Изменить оценки actionOpenBrowser=Открыть в браузере actionRemove=Удалить -actionEditSeries=Изменить серии +actionEditSeries=Изменить серию actionRaceEdit=Изменить или переименовать гонку -actionRaceUnlink=Отсоединить гонку +actionRaceUnlink=Отменить связывание гонки actionRaceRemove=Удалить гонку -actionExportXML=Экспорт в формате XML -actionOpenDashboard=Open Coach Dashboard -filterLeaderboardsByName=Сортировать таблицы лидеров по названию +actionExportXML=Экспортировать как XML +actionOpenDashboard=Открыть панель тренера +filterLeaderboardsByName=Фильтровать таблицы лидеров по названию actions=Действия -islinked=Соединен +islinked=Связано yes=Да no=Нет -hoverOverAPoint=Наведите курсор на точку для просмотра подробных сведений +hoverOverAPoint=Наведите указатель для просмотра подробностей noSelection=Ничего не выбрано -raceIsKnownToStartUpwind=Гонка начинается с этапа с наветренной стороны +raceIsKnownToStartUpwind=Гонка начинается против ветра events=События -settingsForComponent=Параметры {0} -noEventsFound=События не обнаружены -noEventSelected=События не выбраны -noLeaderboardsFound=Талицы лидеров не обнаружены +settingsForComponent=Параметры для {0} +noEventsFound=События не найдены +noEventSelected=Не выбрано событие +noLeaderboardsFound=Таблицы лидеров не найдены searchEvents=Поиск событий -location=Местонахождение -from=С +location=Место +from=С until=По -onlyLiveEvents=Только события в прямом эфире -locationNotAvailable=Местонахождение недоступно +onlyLiveEvents=Только текущие события +locationNotAvailable=Место недоступно startDateNotAvailable=Дата начала недоступна startDate=Дата начала endDate=Дата окончания unknownManeuver=Неизвестный маневр -tailLengthMustBePositive=Число длины хвоста должно быть больше нуля. -failedToLoadRaceInformation=Сбой при загрузке сведений о гонке: {0} -competitorPassedMarkAtDate={0} прошли {1} в {2} +tailLengthMustBePositive=длина хвоста должна быть задана числом больше нуля. +failedToLoadRaceInformation=Не удалось загрузить сведения о гонке: {0} +competitorPassedMarkAtDate={0} пройдено {1} в {2} valueForCompetitorAt={0} в {1}: {2} -reallyRemoveRace=Вы действительно хотите удалить гонку ''{0}''? Примечание: все записи о гонке будут также удалены без возможности восстановления! +reallyRemoveRace=Действительно удалить гонку ''{0}''? Примечание: все журналы для этой гонки также будут окончательно удалены! showDetails=Показать подробности hideLeaderboard=Скрыть таблицу лидеров hideLeaderboards=Скрыть таблицы лидеров @@ -249,1148 +252,1247 @@ showLeaderboard=Показать таблицу лидеров hideRaces=Скрыть гонки showMap=Показать карту hideMap=Скрыть карту -noLeaderboardSelected=Таблица лидеров не выбрана -leaderboardGroups=Группы таблицы лидеров -filterLeaderboardGroupsByName=Сортировать группы таблицы лидеров по имени -createNewLeaderboardGroup=Создать группу таблицы лидеров -leaderboardGroupConfiguration=Конфигурация группы таблицы лидеров -legs=Этапы -currentLeg=На этапе -currentLegTooltip=Номер этапа, на котором находится участник в данный момент, начиная с 1 -leaderboardGroup=Группа таблицы лидеров -pleaseEnterNonEmptyDescription=Пожалуйста, введите непустое описание -groupWithThisNameAlreadyExists=Группа таблицы лидеров с этим именем уже существует. -detailsOfLeaderboardGroup=Сведения о группе таблицы лидеров +noLeaderboardSelected=Не выбрана таблица лидеров +leaderboardGroups=Группы таблиц лидеров +filterLeaderboardGroupsByName=Фильтровать группы таблиц лидеров по названию +createNewLeaderboardGroup=Создать группу таблиц лидеров +leaderboardGroupConfiguration=Конфигурация группы таблиц лидеров +legs=Отрезки +currentLeg=На отрезке +currentLegTooltip=Номер отрезка, на котором сейчас находится участник, начиная с 1. +leaderboardGroup=Группа таблиц лидеров +pleaseEnterNonEmptyDescription=Введите непустое описание +groupWithThisNameAlreadyExists=Группа таблиц лидеров с таким названием уже существует. +detailsOfLeaderboardGroup=Подробности группы таблиц лидеров edit=Изменить save=Сохранить -abort=Отмена -noLeaderboardGroupWithNameFound=Группа таблицы лидеров с именем {0} не обнаружена +abort=Прервать +noLeaderboardGroupWithNameFound=Группа таблиц лидеров названием {0} не найдена overview=Обзор -welcomeToSailingAnalytics=Добро пожаловать в Аналитическую информацию парусного спорта SAP -welcomeToSailingAnalyticsBody=SAP приближает любителей парусного спорта к происходящим на воде событиям как никогда раньше.\ -\ Таблица лидеров в прямом эфире расширяет возможности для любителей, отображая в режиме реального времени место занимаемое участником, скорости судов, а также победителей с указанием отрыва. Следите за каждой гонкой и благодаря SAP не пропускайте ни одного совершенного маневра.\ -\ Это самый простой способ наблюдать за парусной гонкой в прямом эфире, где бы вы ни находились. +welcomeToSailingAnalytics=Вас приветствует SAP Sailing Analytics +welcomeToSailingAnalyticsBody=SAP позволяет любителям парусного спорта подойти к происходящему на воде ближе, чем когда-либо ранее.\ Онлайн-таблица лидеров содержит обновляемые в режиме реального времени данные о рангах участников, скоростях лодок и преимуществе лидеров. Следите за каждой гонкой и не пропустите ни одного маневра с SAP.\ Это удобный способ наблюдения за парусными гонками в реальном времени откуда угодно. home=Главная -clickAndDragToZoomIn=Щелкните и перетащите область графика для увеличения -windSpeed=Скорость ветра (узлы) -allTimesInUTC=Время указано в универсальном глобальном времени по Гринвичу (UTC) -autoZoomTo=Автоматически увеличить до -autoZoomToBoats=Суден -autoZoomToBuoys=Буев -autoZoomToWindSensors=Датчиков ветра -autoZoomOff=Выкл -autoZoomToTails=Хвостов -autoZoomSelectedCompetitors=Масштабировать только выбранных участников -bearing=Направление (ветра) -zoom=Масштабирование +clickAndDragToZoomIn=Щелкните и перетащите в область визуализации для увеличения +windSpeed=Скорость ветра (уз) +allTimesInUTC=Время UTC +autoZoomTo=Автоувеличение до +autoZoomToBoats=Лодки +autoZoomToBuoys=Буи +autoZoomToWindSensors=Датчики ветра +autoZoomOff=Выкл. +autoZoomToTails=Хвосты +autoZoomSelectedCompetitors=Увеличить только до выбранных участников +bearing=Ветер +zoom=Увеличить stepSizeMustBeGreaterThanNull=Размер шага должен быть больше 0 stepSizeInSeconds=Размер шага в секундах -refreshInterval=Обновить интервал (ы) -refreshIntervalMustBeGreaterThanXSeconds=Обновление интервала должно быть больше, чем {0} секунд -competitorCharts=Графики участника -selectAtLeastOneCompetitor=Для отображения графиков участников, выберите хотя бы одного участника +refreshInterval=Интервал обновления (с) +refreshIntervalMustBeGreaterThanXSeconds=Интервал обновления должен быть больше {0} с +competitorCharts=Диаграмма участника +selectAtLeastOneCompetitor=Чтобы просмотреть диаграммы участника, выберите хотя бы одного участника +selectAtLeastOneCompetitorForInvitation=Чтобы отправить приглашения по эл. почте, выберите хотя бы одного участника directionChange=Изменение направления speedChange=Изменение скорости -degreesShort=градус -untracked=Неотслеженная -delayForLiveMode=Задержка для режима прямого эфира: -notAvailable=Недоступно +degreesShort=град. +untracked=Не отслеживается +delayForLiveMode=Задержка для оперативного режима: +notAvailable=Недоступно details=Подробности -noGroupSelected=Группа не выбрана -combinedWindSourceTypeName=Комбинированная -courseBasedWindSourceTypeName=Проложенный курс -trackBasedEstimationWindSourceTypeName=Расчетный -windSensorWindSourceTypeName=Измеренный +noGroupSelected=Не выбрана группа +combinedWindSourceTypeName=Объединено +courseBasedWindSourceTypeName=Схема курса +trackBasedEstimationWindSourceTypeName=Расчетная +windSensorWindSourceTypeName=Измеренная webWindSourceTypeName=Вручную raceCommitteeWindSourceTypeName=Гоночный комитет -clickChartToSetTime=Щелкните по графику для установки времени -position=Положение -windSourcesUsed=Использованные источники информации о ветре -errorTryingToUpdateWindSourcesToExclude=Ошибка при попытке обновления источников информации о ветре для исключения для гонки {0}: {1} -feedback=Комментарии -startStopPlaying=Начать/Остановить воспроизведение -backToLive=Вернуться к моменту времени в прямом эфире -slowPlaySpeedDown=Замедлить скорость воспроизведения или даже воспроизводить назад. -speedPlaySpeedUp=Увеличить скорость воспроизведения или снова воспроизводить вперед. -showHideComponent=Показать/ Скрыть {0} +clickChartToSetTime=Щелкните диаграмму, чтобы установить время +position=Позиция +windSourcesUsed=Используемые источники ветра +errorTryingToUpdateWindSourcesToExclude=Ошибка при попытке обновить источники ветра к исключению для гонки {0}: {1} +feedback=Обратная связь +startStopPlaying=Начать/остановить воспроизведение +backToLive=Вернуться к текущей отметке времени +slowPlaySpeedDown=Замедлить воспроизведение или даже запустить в обратном направлении +speedPlaySpeedUp=Ускорить воспроизведение или снова запустить в прямом направлении +showHideComponent=Показать/скрыть {0} degreesBoatToTheWind=Угол к ветру racesInLeaderboard=Гонки в таблице лидеров leaderboardsInGroup=Таблицы лидеров в группе -replication=Дублирование -errorFetchingReplicaData=Ошибка получения данных дублирования: {0} -averageCrossTrackErrorInMeters=\u2205 XTE -averageCrossTrackErrorInMetersTooltip=Среднее боковое уклонение от заданного курса по большой дуге окружности, соединяющей начало и конец этапа -raceAverageCrossTrackErrorInMetersTooltip=Среднее боковое уклонение от заданного курса по большой дуге окружности, соединяющей начало и конец этапа в течение этой гонки. -enterMaster=Имя узла ведущего экземпляра -errorStartingReplication=Ошибка начала повтора с узла {0} / обмена {1}: {2} +replication=Репликация +errorFetchingReplicaData=Ошибка извлечения данных реплики: {0} +averageAbsoluteCrossTrackErrorInMeters=\u2205 XTE +averageAbsoluteCrossTrackErrorInMetersTooltip=Среднее боковое уклонение к большому круговому сегменту, соединяющему начало отрезка с концом отрезка +averageSignedCrossTrackErrorInMeters=\u2205 XTE +/- +averageSignedCrossTrackErrorInMetersTooltip=Средняя позиция на курсе как расстояние (со знаком) от средней линии курса; отрицательные значения означают уклонение влево, положительные — вправо. +raceAverageAbsoluteCrossTrackErrorInMetersTooltip=Среднее абсолютное боковое уклонение к большим круговым сегментам, соединяющим начало отрезка с концом отрезка, для всех наветренных отрезках данной гонки без учета стороны участника от средней линии курса +raceAverageSignedCrossTrackErrorInMetersTooltip=Боковое уклонение (со знаком) к большим круговым сегментам, соединяющим начало отрезка с концом отрезка, для всех наветренных отрезков данной гонки; отрицательные значения означают уклонение влево от средней линии курса, положительные — вправо. +enterMaster=Имя хоста главного экземпляра +errorStartingReplication=Ошибка запуска репликации с хоста {0}/Exchange {1}: {2} helpLines=Вспомогательные линии -startLine=Линия старта -finishLine=Линия финиша -advantageLine=Линия преимущества +startLine=Стартовая линия +finishLine=Финишная линия +advantageLine=Лини преимущества courseMiddleLine=Средняя линия курса -messagingPortNumber=Номер порта обмена сообщениями ( по умолчанию 0) +messagingPortNumber=Номер порта обмена сообщениями (0 по умолчанию) servletPortNumber=Номер порта сервлета -registeredAt=Зарегистрирован в {0} -replicatingFromMaster=Replicating from master {0}:{2}, messaging port {3}:{1}, exchange {4} -showWindSpeedSeries=Показать данные о силе ветра -showWindDirectionSeries=Показать данные о направлении ветра +registeredAt=Зарегистрировано в {0} +replicatingFromMaster=Репликация с главного экземпляра {0}:{2}, порт обмена сообщениями {3}:{1}, Exchange {4} +showWindSpeedSeries=Показать данные о скорости ветра +showWindDirectionSeries=Показать данные о направлениях ветра fleet=Флот -boatClass=Класс судна -setDelayToLive=Установить задержку от прямого эфира -pleaseEnterNonEmptyVenue=Введите, пожалуйста, место проведения соревнования. -pleaseEnterStartAndEndDate=Пожалуйста, введите дату начала и дату окончания. -startDateMustBeforeEndDate=Дата начала должна предшествовать дате окончания. -eventWithThisNameAlreadyExists=Событие с этим именем уже существует. -venue=Место проведения -pleaseSelectABoatClass=Выберите, пожалуйста, класс судна. -regattaWithThisNameAlreadyExists=Регата с этим именем уже существует. -seriesWithThisNameAlreadyExists=Серия с этим именем уже существует. -fleetWithThisNameAlreadyExists=Флот с этим именем уже существует. +boatClass=Класс лодок +setDelayToLive=Установить задержку оперативных данных +pleaseEnterNonEmptyVenue=Введите место. +pleaseEnterStartAndEndDate=Введите даты начала и окончания. +startDateMustBeforeEndDate=Дата начала должна быть раньше даты окончания. +eventWithThisNameAlreadyExists=Событие с таким названием уже существует. +venue=Место +pleaseSelectABoatClass=Выберите класс лодки. +regattaWithThisNameAlreadyExists=Регата с таким названием уже существует. +seriesWithThisNameAlreadyExists=Серия с таким названием уже существует. +fleetWithThisNameAlreadyExists=Флот с таким названием уже существует. fleets=Флоты -series=Серии +series=Серия splitFleet=Разделить флот color=Цвет -medalSeries=Медальные серии -noColor=Цвет не указан -pleaseSelectARegatta=Пожалуйста, выберите регату. +medalSeries=Серия на медали +noColor=Без цвета +pleaseSelectARegatta=Выберите регату. addFleet=Добавить флот -doYouReallyWantToRemoveRegatta=Вы действительно хотите удалить регату "{0}"? Это приведет к удалению без возможности восстановления всех таблиц лидеров для этой регаты! -errorLoadingScoreCorrectionProviders=Ошибка при загрузке провайдеров для корректировки очков: {0} -selectResultListToImportFrom=Выберите список результатов для импорта из +doYouReallyWantToRemoveRegatta=Действительно удалить регату "{0}"? При этом также будут удалены все таблицы лидеров для данной регаты! +errorLoadingScoreCorrectionProviders=Ошибка при загрузке поставщиков корректировки оценок: {0} +selectResultListToImportFrom=Выберите список результатов для импорта of=из -errorObtainingScoreCorrections=Ошибка получения корректировки очков от провайдера {0} и события {1} для класса судна {2} опубликованного {3}: {4} -assignRaceNumbersToRaceColumns=Назначение номеров гонок из официальных результатов столбам гонок таблицы лидеров +errorObtainingScoreCorrections=Ошибка при получении корректировок оценок от поставщика {0} и события {1} для класса лодок {2}, опубликованных в {3}: {4} +assignRaceNumbersToRaceColumns=Присвойте номера гонок официальных результатов столбцам гонок таблицы лидеров importOfficialResults=Импорт официальных результатов... selectAll=Выбрать все apply=Применить -successfullyUpdatedScores=Очки обновлены успешно -errorUpdatingScoresForLeaderboard=Ошибка обновления очков для таблицы лидеров {0}: {1} -maneuverTypesToShowWhenCompetitorIsClicked=Типы маневров для отображения при нажатии на участника -simulateAsLiveRace=Simulate as live race -simulateWithOffset=Offset before start in minutes: -boatClassDoesNotMatchSelectedRegatta=Выбранные гонки содержат классы судов не соответствующие классу судов ''{0}'' выбранной регаты. -regattaExistForSelectedBoatClass=Есть только одна регата для выбранных классов судов. +successfullyUpdatedScores=Оценки успешно обновлены +errorUpdatingScoresForLeaderboard=Ошибка при обновлении оценок для таблицы лидеров {0}: {1} +maneuverTypesToShowWhenCompetitorIsClicked=Типы маневров для отображения при щелчке участника +simulateAsLiveRace=Симулировать как текущую гонку +simulateWithOffset=Сдвиг перед стартом в минутах: +boatClassDoesNotMatchSelectedRegatta=Выбранные гонки содержат классы лодок, не совпадающие с классом лодок ''{0}'' выбранной регаты. Гонки не будут загружены. +regattaExistForSelectedBoatClass=Для выбранных классов лодок имеется минимум одна регата. Создать регаты по умолчанию для соответствующих гонок? reload=Перезагрузить addRegatta=Добавить регату... -importRegattas=Import Regattas... -exchangeName=Заменить имя +importRegattas=Импортировать регаты... +exchangeName=Имя Exchange course=Курс -courseLayout=Проложенный курс +courseLayout=Схема курса buoy=Буй gate=Ворота buoys=Буи -waypoint=Точка маршрута +waypoint=Путевая точка showAllCompetitors=Показать всех участников -boatTails=Лодочные хвосты -startFirstMarkTriangle=Start line to first Mark Triangle +boatTails=Хвосты лодок +startFirstMarkTriangle=Линия старта до треугольника первой отметки resultImportUrls=URL-адреса импорта результатов -errorRefreshingResultImportUrlList=Ошибка обновления списка URL-адресов импорта результатов: {0} -successfullyUpdatedResultImportUrls=Список URL-адресов импорта результатов успешно обновлен -errorRemovingResultImportUrls=Ошибка удаления URL-адресов импорта результатов: {0} -pleaseEnterNonEmptyUrl=Пожалуйста, введите URL-адрес -addResultImportUrl=Добавить URL-адрес импорта результатов -errorAddingResultImportUrl=Ошибка добавления URL-адреса импорта результатов: {0} -errorTryingToObtainLeaderboardContents=Ошибка попытки получения содержимого таблицы лидеров: {0} -lastScoreUpdate=Обновление последних очков -warningBrowserUnsupported=Этот веб-сайт не оптимизирован для вашего браузера. Пожалуйста, выберите браузер новой версии, такой как Firefox или Chrome. -newMark=Новый знак -controlPoint=Знак/Ворота -errorUpdatingRaceCourse=Ошибка обновления курса гонки: {0} +errorRefreshingResultImportUrlList=Ошибка при обновлении списка URL-адресов импорта результатов: {0} +successfullyUpdatedResultImportUrls=Успешно обновлен список URL-адресов импорта результатов +errorRemovingResultImportUrls=Ошибка при удалении URL-адресов импорта результатов: {0} +pleaseEnterNonEmptyUrl=Введите URL-адрес. +addResultImportUrl=Добавьте URL-адрес импорта результатов +errorAddingResultImportUrl=Ошибка при добавлении URL-адресов импорта результатов: {0} +remoteServerInstances=Удаленные экземпляры сервера +localServer=Локальный сервер +errorRefreshingSailingServers=Ошибка при обновлении экземпляров SailingServer: {0} +successfullyUpdatedSailingServers=Экземпляры SailingServer успешно обновлены +errorRemovingSailingServers=Ошибка при удалении экземпляров SailingServer: {0} +addSailingServer=Добавить экземпляр SailingServer +errorAddingSailingServer=Ошибка при добавлении экземпляра SailingServer: {0} +errorTryingToObtainLeaderboardContents=Ошибка при попытке получить содержимое таблицы лидеров: {0} +lastScoreUpdate=Последнее обновление оценок +warningBrowserUnsupported=Этот веб-сайт не оптимизирован для вашего браузера. Перейдите на более новый, такой как Firefox или Chrome. +newMark=Новая отметка +controlPoint=Отметка/ворота +errorUpdatingRaceCourse=Ошибка при обновлении курса гонки: {0} successfullyUpdatedCourse=Курс гонки успешно обновлен -selectOneMarkOrTwoMarksForGate=Выберите одну отметку или две отметки для создания ворот -errorTryingToObtainTheMarksOfTheRace=Ошибка попытки получения отметок дистанции гонки: {0} -errorTryingToObtainRaceCourse=Ошибка попытки получения курса гонки: {0} -insertWaypointBeforeSelected=Вставьте ранее выбранную точку маршрута -insertWaypointAfterSelected=Вставьте точку маршрута, выбранную позднее -scoringSchemeLowPointSystem=Низкобальная (линейная) система подсчета очков -scoringSchemeHighPointSystem=Высокобальная система подсчета очков -scoringSchemeHighPointEssOverall=Высокобальная система подсчета, итоговые баллы экстремальной серии ESS -scoringSchemeHighPointLastBreaksTie=Высокобальная система подсчета, тай-брейк на последней гонке -scoringSchemeLowPointWinnerGetsZero=Низкобальная система подсчета очков, победитель получает ноль очков -scoringSchemeWinnerGetsFive=Высокобальная система подсчета, победитель получает 5 очков -scoringSchemeWinnerGetsSix=Высокобальная система подсчета, победитель получает 6 очков -scoringSchemeWinnerGetsEight=Высокобальная система подсчета, победитель получает 8 очков -scoringSchemeWinnerGetsEightAndInterpolation=Высокобальная система подсчета, победитель получает 8 очков, Interpolated -scoringSchemeLowPointWithEliminationsAndRoundsWinnerGets07=Low Point with Eliminations and Rounds, Winner Gets 0.7 Points -scoringSchemeLowPointWithEliminationsAndRoundsWinnerGets07Description=A variant of the low-point scoring scheme, using eliminations consisting of rounds.\nEach round shall be modeled as a series in the regatta, and the fleet ordering counts backwards\nstarting with the highest number for the first round.\nIf a final and losers final take place, use 1 and 2 as their ordering. Start with 3 for the semi-final round. -scoringSchemeLowPointForLeagueOverallLeaderboard=Low Point, ties broken by act point sum, then last act -scoringSchemeLowPointForLeagueOverallLeaderboardDescription=Instead of the usual count-back system used for low point schemes to break ties, competitors with equal point sums are compared by comparing the sum of the points they scored across all acts. If this still leaves a tie, the tie is broken by the last act. -scoringSystem=Система подсчета очков -createFlexibleLeaderboard=Создание адаптивной таблицы лидеров -createRegattaLeaderboard=Создание таблицы лидеров регаты -editFlexibleLeaderboard=Изменение адаптивной таблицы лидеров -editRegattaLeaderboard=Изменение таблицы лидеров регаты +selectTwoMarksForGate=Выберите две отметки, чтобы создать ворота +errorTryingToObtainTheMarksOfTheRace=Ошибка при попытке получить отметки курса гонки: {0} +errorTryingToObtainRaceCourse=Ошибка при попытке получить курс гонки: {0} +insertWaypointBeforeSelected=Вставка путевой точки перед выбранной +insertWaypointAfterSelected=Вставка путевой точки после выбранной +addGate=Добавить ворота +scoringSchemeLowPointSystem=Система низких баллов +scoringSchemeHighPointSystem=Система высоких баллов +scoringSchemeHighPointEssOverall=Итоговая оценка ESS по системе высоких баллов (10) +scoringSchemeHighPointEssOverall12=Итоговая оценка ESS по системе высоких баллов (12) +scoringSchemeHighPointEssOverall12Description=Оценка в баллах. Победитель в акте получает 12 баллов, 2-й — 11 баллов, .... Любая ничья в общей оценке Extreme Sailing Series разрешается в пользу участника с наибольшим числом побед в актах. В случае равенства числа побед для разрешения используется последний акт. +scoringSchemeHighPointLastBreaksTie=Система высоких баллов, последняя гонка разрешает ничью +scoringSchemeLowPointWinnerGetsZero=Система низких баллов, победитель получает ноль +scoringSchemeWinnerGetsFive=Система высоких баллов, победитель получает 5 баллов +scoringSchemeWinnerGetsSix=Система высоких баллов, победитель получает 6 баллов +scoringSchemeWinnerGetsEight=Система высоких баллов, победитель получает 8 баллов +scoringSchemeWinnerGetsEightAndInterpolation=Система высоких баллов, победитель 8 баллов, интерполяция +scoringSchemeLowPointWithEliminationsAndRoundsWinnerGets07=Низкий балл с турами на выбывание, победитель получает 0,7 балла +scoringSchemeLowPointWithEliminationsAndRoundsWinnerGets07Description=Вариант схемы оценки с низкими баллами, использующий туры на выбывание.\nКаждый тур моделируется как серия в регате, и суда ранжируются в обратном порядке,\nначиная с наибольшего числа за первый раунд.\nВ финале и при определении 3-го места используйте ранги 1 и 2. Для полуфинального тура начните с 3. +scoringSchemeLowPointForLeagueOverallLeaderboard=Низкий балл, ничьи разрешаются по сумме актов, затем по последнему акту +scoringSchemeLowPointForLeagueOverallLeaderboardDescription=Вместо обычной системы обратного отчета, используемой для разрешения ничьих в схемах низких баллов, участники с равными суммами баллов сравниваются по сумме баллов, полученных за все акты. Если равенство сохраняется, оно разрешается по последнему акту. +scoringSchemeHighPointFirstGetsOne=Высокий балл, победитель получает 1 балл +scoringSchemeHighPointFirstGetsTen=Высокий балл, победитель получает 10 баллов +scoringSchemeHighPointFirstGetsTenOrEight=Высокий балл, победитель получает 10 баллов (или 8) +scoringSchemeHighPointFirstGetsTenOrEightDescription=Оценка в баллах. Победитель получает 10 баллов, 2-й — 9 баллов, .... Ничья разрешается в пользу участника, имеющего больше побед в гонках, если равенство сохраняется, оно разрешается по рангу в последней гонке. +scoringSchemeHighPointFirstGetsTwelveOrEight=Высокий балл, победитель получает 12 баллов (или 8) +scoringSchemeHighPointFirstGetsTwelveOrEightDescription=Оценка в баллах. Победитель получает 12 баллов, 2-й — 11 баллов, .... Ничья разрешается в пользу участника, имеющего больше побед в гонках, если равенство сохраняется, оно разрешается по рангу в последней гонке. +scoringSystem=Система оценок +createFlexibleLeaderboard=Создать гибкую таблицу лидеров +createRegattaLeaderboard=Создать таблицу лидеров регаты +createDefaultRegattaLeaderboard=Создать таблицу лидеров регаты по умолчанию +editFlexibleLeaderboard=Изменить гибкую таблицу лидеров +editRegattaLeaderboard=Изменить таблицу лидеров регаты defaultRegatta=Регата по умолчанию -useOverallLeaderboard=Использование общей таблицы лидеров -overallStandings=Общий зачет +useOverallLeaderboard=Использовать итоговую таблицу лидеров +overallStandings=Итоговые позиции type=Тип actionAddRaces=Добавить гонки -racesWithNamePrefix=Гонки с именем-префиксом -maximumSpeedOverGroundInKnots=Максимальная скорость относительно земли -maximumSpeedOverGroundInKnotsTooltip=Самая большая скорость относительно земли участника, измеренная в ходе регаты. -totalTimeSailedDownwindInSeconds=Общее время под ветером -totalTimeSailedDownwindInSecondsTooltip=Общее время, которое в течение регаты участник шел под ветер. -totalTimeSailedUpwindInSeconds=Общее время против ветер -totalTimeSailedUpwindInSecondsTooltip=Общее время, которое в течение регаты участник шел против ветер. -totalTimeSailedReachingInSeconds=Общее время лавирования по ветру -totalTimeSailedReachingInSecondsTooltip=Общее время этапов лавирования по ветру участником в ходе регаты. +racesWithNamePrefix=гонки с префиксом названия +maximumSpeedOverGroundInKnots=Макс. SOG +maximumSpeedOverGroundInKnotsTooltip=Максимальная скорость участника относительно грунта в ходе данной регаты. +totalTimeSailedDownwindInSeconds=Общее время по ветру +totalTimeSailedDownwindInSecondsTooltip=Общее время хода участника по ветру в данной регате. +totalTimeSailedUpwindInSeconds=Общее время против ветра +totalTimeSailedUpwindInSecondsTooltip=Общее время хода участника против ветра в данной регате. +totalTimeSailedReachingInSeconds=Общее время полным ветром +totalTimeSailedReachingInSecondsTooltip=Общее время хода участника полным ветром в данной регате. totalTimeSailedInSeconds=Общее время -totalTimeSailedInSecondsTooltip=Общее время, которое участник проплыл в регате. +totalTimeSailedInSecondsTooltip=Общее время хода участника в данной регате, отсчитываемое от времени старта регаты. totalDistanceTraveled=Общее расстояние -totalDistanceTraveledTooltip=Общее расстояние, пройденное во время регаты. -totalAverageSpeedOverGround=\u2205 Скорость относительно земли -totalAverageSpeedOverGroundTooltip=Средняя скорость относительно земли на протяжении регаты. +totalDistanceTraveledTooltip=Общее пройденное расстояние в данной регате. +totalAverageSpeedOverGround=\u2205 SOG +totalAverageSpeedOverGroundTooltip=Средняя скорость относительно грунта в течение данной регаты. hhmmssUnit=чч:мм:сс actionAddWindData=Добавить данные о ветре -valueMustBeBetweenMinMax=Значение ''{0}''должно быть в пределах от {1} до {2}. -valueMustBeGreaterThan=The value of ''{0}'' must be greater than {1}. -optional=Дополнительно -pleaseEnterAValue=Введите, пожалуйста, значение. +valueMustBeBetweenMinMax=Значение ''{0}'' должно быть между {1} и {2}. +valueMustBeGreaterThan=Значение ''{0}'' должно быть больше {1}. +optional=необязательно +pleaseEnterAValue=Введите значение. latitude=Широта longitude=Долгота actionAddEvent=Добавить событие -publicationUrl=URL-адрес для публикации -suppress=скрыть -isPublic=является открытым -unsuppress=Отобразить -suppressedCompetitors=Скрытые участники -mediaPanel=Аудио и Видео -url=URL -mimeType=MIME-тип -title=Заголовок -duration=Продолжительность (ч:мм:сс.мс) +publicationUrl=URL-адрес публикации +suppress=Подавлять +isPublic=Общедоступно +unsuppress=Отменить подавление +suppressedCompetitors=Подавляемые участники +mediaPanel=Аудио и видео +url=URL-адрес +mimeType=Тип MIME +title=Название +duration=Длительность (ч:мм:сс.мс) addMediaTrack=Добавить аудио/видео addYoutubeTrack=Добавить Youtube -youtubeId=Идентификатор Youtube -reallyRemoveMediaTrack=Вы действительно хотите удалить медиа трек''{0}''? -pleaseSelectASeries=Пожалуйста, выберите серию -pleaseSelectARace=Пожалуйста, выберите гонку -displayGroupsInReverseOrder=Отобразить группы в обратном порядке +youtubeId=Ид. Youtube +reallyRemoveMediaTrack=Действительно удалить объект мультимедиа ''{0}''? +pleaseSelectASeries=Выберите серию +pleaseSelectARace=Выберите гонку +displayGroupsInReverseOrder=Показывать группы в обратном порядке actionConfigureUrl=Настроить URL-адрес -configureLeaderboardUrlDescription=Настроить таблицу лидеров и получить результирующий URL-адрес по ссылке -embedded=Внедренный +configureLeaderboardUrlDescription=Настройте таблицу лидеров и получите разультирующий URL-адрес из ссылки +embedded=Внедрено additionalUrlSettings=Дополнительные параметры URL-адреса restrictToSingleSelectedRace=Ограничить одной выбранной гонкой -expandSelectedRace=Расширить выбранную гонку -showRaceDetails=Разрешить подробности для гонки -numberOfRaces=Количество гонок -numberOfRacesMustBeNonNegativeNumber=Пожалуйста, введите количество последних гонок, которые должны отображаться +expandSelectedRace=Развернуть выбранную гонку +showRaceDetails=Разрешить подробности гонки +numberOfRaces=Число гонок +numberOfRacesMustBeNonNegativeNumber=Введите число последних гонок для просмотра chooseTheWayYouSelectRaces=Выберите способ выбора гонок -selectFromAllRaces=Выбрать все гонки -selectANumberOfRaces=Выбрать несколько гонок -numberOfLastNRaces=Количество самых последних гонок для отображения -expandLastRace=Всегда раскрывать последнюю отображенную гонку +selectFromAllRaces=Выбрать из всех гонок +selectANumberOfRaces=Выберите число гонок +numberOfLastNRaces=Число последних гонок для просмотра +expandLastRace=Всегда развертывать посленюю отображаемую гонку factor=Фактор -errorUpdatingIsMedalRace=Ошибка обновления параметров медальной гонки: {0} -maneuverLoss=Потеря при выполнении маневра -averageManeuverLossInMeters=\u2205 Потеря при выполнение маневра -averageManeuverLossInMetersTooltip=Усредненная потеря расстояния при выполнении маневра. -averageTackLossInMeters=\u2205 Потеря при смене галса -averageTackLossInMetersTooltip=Усредненная потеря расстояния при смене галса. -averageJibeLossInMeters=\u2205 Потеря при перекладывании паруса -averageJibeLossInMetersTooltip=Усредненная потеря расстояния при перекладывании паруса. +errorUpdatingIsMedalRace=Ошибка при обновлении параметра гонки на медали: {0} +maneuverLoss=Потеря маневра +averageManeuverLossInMeters=\u2205 Потеря маневра +averageManeuverLossInMetersTooltip=Средняя потеря дистанции в ходе маневра. +averageTackLossInMeters=\u2205 Потеря на оверштаг +averageTackLossInMetersTooltip=Средняя потеря дистанции при поворотах оверштаг. +averageJibeLossInMeters=\u2205 Потеря на фордевинд +averageJibeLossInMetersTooltip=Средняя потеря дистанции при поворотах фордевинд. shape=Форма -pattern=Модель -legend=Легенда -live=Прямой эфир -swissTimingArchiveConnector=события SwissTiming, помещенные в архив -errorFetchingChartData=Ошибка получения данных графика: {0} +pattern=Образец +legend=Условные знаки +live=активно +swissTimingArchiveConnector=Архив событий SwissTiming +errorFetchingChartData=Ошибка при извлечении данных диаграммы: {0} loadingCompetitorData=Загрузка данных участника... competitorRegattaDataAfterRaceN={0} после гонки {1} -rankChart=Рейтинг -totalPoints=Итоговое количество очков -raceTotalPointsTooltip=Итоговое количество очков участника в гонке -regattaTotalPointsTooltip=Итоговое количество очков участника в регате -showRankChart=Показать таблицу рейтинга +rankChart=Ранг +totalPoints=Всего баллов +raceTotalPointsTooltip=Общий балл участника в данной гонке +regattaTotalPointsTooltip=Общий балл участника в данной регате +showRankChart=Показать диаграмму ранга overallLeaderboardSelection=Итоговая таблица лидеров -errorTryingToObtainOverallLeaderboards=Ошибка получения итоговых таблиц лидеров: {0} -finished=Завершившиеся -upcoming=upcoming -next=Next -inProgress=in progress -passedTo=Переданные в {0} +errorTryingToObtainOverallLeaderboards=Ошибка при попытке получить итоговые таблицы лидеров: {0} +finished=завершено +upcoming=предстоит +next=Далее +inProgress=выполняется +passedTo=передано {0} gapChangeSinceLegStartInSeconds=Изменение отставания -gapChangeSinceLegStartInSecondsTooltip=Изменение отставания от лидера с начала последнего этапа.\nОтрицательное число означает, что отставание уменьшилось;\nположительное число означает, что отставание увеличилось. -sideToWhichMarkAtLegStartWasRounded=Отметка округленная до -sideToWhichMarkAtLegStartWasRoundedTooltip=Сторона в которую округляется отметка на старте этапа. -raceIsLive=Гонка {0} в прямом эфире -racesAreLive=Гонки {0} в прямом эфире -regattaIsLive=Регата {0} в прямом эфире -regattasAreLive=Регаты {0} в прямом эфире -knotsUnit=Узлы -knotsValue={0,number,#0.0} Узлы -knotsRange={0,number,#0.0} - {1,number,#0.0} Узлы -scoringSchemeHighPointFirstGetsOne=Самый лучший результат, победитель получает 1 очко -scoringSchemeHighPointFirstGetsTen=Самый лучший результат, победитель получает 10 очков -generatePolarSheet=Создать полярную электронную таблицу -polars=Полярная диаграмма -polarSheetChart=Полярная электронная таблица -polarSheetMinimumDataSizePerGraph=Минимальное количество данных на графике -polarSheetMinimumDataSizePerGraphTooltip=Все графики с меньшим количеством точек данных визуально не отображаются.\nТаким образом, не отображаются отвлекающие внимание диаграммы для \nскоростей ветра, в которых отсутствует достаточный объем данных. -polarSheetMinimumDataSizePerAngle=Минимальное количество точек данных в расчете на угол -polarSheetMinimumDataSizePerAngleTooltip=На каждом графике будут отображаться только данные об углах с указанным числом\nбазовых точек данных. Не имеющие важного значения\nчасти графика могут быть скрыты с помощью задания этой пороговой величины. -polarSheetMinimumWindConfidence=Минимальное значение достоверных данных о ветре -polarSheetMinimumWindConfidenceTooltip=Только фиксированные значения ветра с достоверностью, превышающей указанное пороговое значение\nприменяются. Эта достоверность от 0 до 1. -polarSheetMinimumConfidenceMeasure=Минимально допустимое измерение достоверности -polarSheetMinimumConfidenceMeasureTooltip=Минимальная степень достоверности для точки, указанной на графике.\nЕсли она ниже установленного порогового значения, то точка не отображается.\nЗначение лежит от 0 до 1 и детерминируется \nс использованием статистических мер. -polarSheetUseOnlyWindGaugeData=Для определения скорости ветра используйте только данные, полученные с помощью анемометра -polarSheetUseOnlyWindGaugeDataTooltip=Благодаря учету данных о скорости ветра, полученных с помощью анемометра\nмы исключаем примерные значения скорости ветра, введенные вручную, которые могли бы исказить данные, отображенные на полярной диаграмме. -polarSheetUseOnlyEstimationData=Используйте, определенные на глаз значения только для направления ветра -polarSheetUseOnlyEstimationDataTooltip=Использование точных расчетных значений о направлении ветра,\nпозволяет нам устранить ошибки полярных диаграмм, которые вращаются из-за неправильных данных, полученных с анемометра\n. -polarSheetRemoveOutliers=Удалите сильно отличающиеся значения (Подход основан на расстоянии) -polarSheetRemoveOutliersTooltip=Сильно отличающиеся значения удаляются с помощью применения подхода, основанного на расстоянии.\nПараметры могут быть отрегулированы ниже. -polarSheetOutlierDetectionRadius=Соседний радиус, определяющий сильно отличающееся значение -polarSheetOutlierDetectionRadiusTooltip=Радиус, используемый в алгоритме определения сильно отличающегося значения\nна основании расстояния. -polarSheetOutlierDetectionMinimumPerc=Минимальный процент соседних точек, определяющий сильно отличающееся значение -polarSheetOutlierDetectionMinimumPercTooltip=Процент соседних точек данных /всего точек данных\nдолжен быть ниже указанного значения для того, чтобы считаться сильно отличающимся значением. -polarSheetNumberOfHistogramColumns=Количество столбцов гистограммы -polarSheetWindSteppingInKnots=Шаг значения ветра в узлах -polarSheetWindSteppingMaxDistance=Максимальное расстояние до уровня ветра -polarSheetWindSteppingMaxDistanceTooltip=Устанавливает максимальный радиус, для которого уровни ветра будут фиксированными. -polarSheetSplitByWindGauges=Разделить источники данных о ветре -polarSheetSplitByWindGaugesTooltip=Разделение источников данных о ветре позволяет найти неисправные анемометры.\nСтатистическая правильность не гарантируется. Такое исправление может \nбыть учтено в полярной диаграмме результатов несколько раз (для разных анемомтеров). -pleaseSeeToolTips=Пожалуйста, наведите курсор на свойства, чтобы ознакомиться с всплывающими подсказками, при их наличии. -competitorColumnTooltip=Имена членов команды этого участника. -sailIdColumnTooltip=Отображает флаг страны и номер на парусе участника. -rankColumnTooltip=Итоговое место этого участника в регате. -carryColumnTooltip=Очки, перенесенные из предыдущих гонок. -totalsColumnTooltip=Итоговое количество очков участника в регате. +gapChangeSinceLegStartInSecondsTooltip=Изменение отставания от лидера с момента начала последнего отрезка.\nОтрицательное число означает уменьшение отставания;\nположительное — увеличение. +sideToWhichMarkAtLegStartWasRounded=Обход отметки +sideToWhichMarkAtLegStartWasRoundedTooltip=Сторона, с которой была обойдена отметка в начале отрезка. +raceIsLive=Гонка {0} активна +racesAreLive=Гонки {0} активны +regattaIsLive=Регата {0} активна +regattasAreLive=Регаты {0} активны +knotsUnit=уз +knotsValue={0,number,#0.0} уз +knotsRange={0,number,#0.0}–{1,number,#0.0} уз +generatePolarSheet=Генерировать полярные данные +polars=Полярные диаграммы +polarSheetChart=Полярные данные +polarSheetMinimumDataSizePerGraph=Минимум точек данных на граф +polarSheetMinimumDataSizePerGraphTooltip=Все графы с меньшим объемом базовых данных не визуализируются.\nЭто устраняет отображение диаграмм\nпо скоростям ветра с недостаточным объемом данных. +polarSheetMinimumDataSizePerAngle=Минимум точек данных на угол +polarSheetMinimumDataSizePerAngleTooltip=В каждом графе будут показаны только данные об углах с объемом\nбазовых данных не меньше указанного. Этот порог\n позволяет скрыть незначимые части диаграммы. +polarSheetMinimumWindConfidence=Минимальное значение достоверности ветра +polarSheetMinimumWindConfidenceTooltip=Учитываются только замеры ветра с достоверностью выше указанного порога.\nДостоверность изменяется от 0 до 1. +polarSheetMinimumConfidenceMeasure=Минимальный показатель достоверности +polarSheetMinimumConfidenceMeasureTooltip=Минимальный показатель достоверности для точки на графе.\nЕсли оно ниже указанного порога, точка не отображается.\nПоказатель изменяется от 0 до 1 и определяется\nпо статистическим показателям. +polarSheetUseOnlyWindGaugeData=Использовать для скорости ветра только данные анемометра +polarSheetUseOnlyWindGaugeDataTooltip=Учитывая только данные скорости с датчиков ветра,\nмы исключаем скорости ветра, вводимые вручную на глаз, способные исказить полярную диаграмму. +polarSheetUseOnlyEstimationData=Использовать только расчетное направление ветра +polarSheetUseOnlyEstimationDataTooltip=Используя точный расчет направления ветра,\nмы исправляем полярные диаграммы, повернутые из-за неверных данных\nдатчика ветра. +polarSheetRemoveOutliers=Удалять выбросы (подход на базе дистанции) +polarSheetRemoveOutliersTooltip=Выбросы удаляются на основании дистанции.\nПараметры можно настроить ниже. +polarSheetOutlierDetectionRadius=Радиус обнаружения выбросов +polarSheetOutlierDetectionRadiusTooltip=Радиус, используемый в алгоритме обнаружения\nвыбросов на базе дистанции. +polarSheetOutlierDetectionMinimumPerc=Минимальный процент окрестности обнаружения выбросов +polarSheetOutlierDetectionMinimumPercTooltip=Процент точек данных окрестности от общего числа точек данных\nдолжен быть не меньше указанного значения, чтобы считать точку выбросом. +polarSheetNumberOfHistogramColumns=Число столбцов гистограммы на диапазон ветра +polarSheetWindSteppingInKnots=Скорость ветра в узлах +polarSheetWindSteppingMaxDistance=Макс. дистанция до уровня ветра +polarSheetWindSteppingMaxDistanceTooltip=Задает максимальный радиус, замеры для которого будут присваиваться уровням ветра. +polarSheetSplitByWindGauges=Разделить источники ветра +polarSheetSplitByWindGaugesTooltip=Разделение источников ветра улучшает поиск поврежденных датчиков ветра.\nСтатистическая корректность не гарантируется. Один и тот же замер\nможет быть учтен в результирующих полярных данных несколько раз (для разных датчиков). +applyMinimumWindConfidence=Применить минимальную достоверность ветра +applyMinimumWindConfidenceTooltip=Если установлено, указанное выше значение будет использоваться как минимально допустимая достоверность ветра при генерировании. +windRangeDistribution=Распределение в диапазоне ветра. +pleaseSeeToolTips=Наведите указатель на параметр, чтобы просмотреть всплывающую подсказку (если доступна). +competitorColumnTooltip=Имена членов данного участника. +sailIdColumnTooltip=Показывает флаг страны и хвостовой номер участника. +rankColumnTooltip=Общий ранг данного участника в регате. +carryColumnTooltip=Баллы, перенесенные из других гонок. +totalsColumnTooltip=Общая сумма всех баллов участника в регате.\nСортировка по рангу, не по баллам. windData=Данные о ветре -gpsData=GPS-данные +gpsData=Данные GPS status=Статус -noDataFound=Данные не обнаружены -displayName=Отобразить имя +noDataFound=Данные не найдены +displayName=Отображаемое имя histogram=Гистограмма -numberOfDataPoints=Количество точек данных -angleAndTotalNumberOfDataPointsAndCovAndCm=Угол: {0}; Общее количество точек данных: {1}; Коэффициент отклонения: {2}; Степень достоверности: {3} +numberOfDataPoints=Число точек данных +angleAndTotalNumberOfDataPointsAndCovAndCm=Угол: {0}; общее число точек данных: {1}; коэффициент вариации: {2}; показатель достоверности: {3} buoyZone=Зона буя radiusInMeters=Радиус (м) -filterRegattasByName=Сортировка регат по имени -noRegattasYet=Пока регат нет. -addCourseArea=Добавить зону курса -courseAreas=Зоны курса -courseArea=Зона курса -pleaseEnterNonEmptyCourseArea=Пожалуйста, выведите зону курса. -pleaseSelectACourseArea=Пожалуйста, выберите зону курса. -lastUpperFlag=Верхний флажок -lastLowerFlag=Нижний флажок +filterRegattasByName=Фильтровать регаты по названию +noRegattasYet=Регат еще нет. +addCourseArea=Добавить зону гонки +courseAreas=Зоны гонок +courseArea=Зона гонки +pleaseEnterNonEmptyCourseArea=Введите зону гонки. +pleaseSelectACourseArea=Выберите зону гонки. +lastUpperFlag=Верхний флаг +lastLowerFlag=Нижний флаг cannotAddRacesToRegattaLeaderboardButOnlyToRegatta=Это таблица лидеров регаты. Вы можете добавлять гонки в эту таблицу лидеров только непосредственно в определении регаты. -correctScore=Исправить очки -correctScoreFor=Исправить очки для участника {0} в гонке {1} -penaltyOrRedress=Штраф/Корректировка -netScore=Чистые очки -timePointMustBeAfterStartOfTracking=Момент времени должен быть после начала отслеживания. -timePointMustBeBeforeEndOfTracking=Момент времени должен быть до окончания отслеживания. +correctScore=Правильная оценка +correctScoreFor=Правильная оценка для участника {0} в гонке {1} +penaltyOrRedress=Взыскание/компенсация +netScore=Точки сети +timePointMustBeAfterStartOfTracking=Отметка времени должна быть после начала отслеживания. +timePointMustBeBeforeEndOfTracking=Отметка времени должна быть раньше окончания отслеживания. regattaUsedForTheTrackedRace=Регата, используемая для отслеживаемой гонки -tracTracUpdateUrl=Обновление URl-адреса сервера ТракТрак -passingInstructions=Инструкции по передаче +tracTracUpdateUrl=URI обновления сервера TracTrac +passingInstructions=Передача инструкций refreshNow=Обновить сейчас -stopUpdating=Остановить обновление +stopUpdating=Прекратить обновление startUpdating=Начать обновление currentTime=Текущее время: -tractracUsername=Имя пользователя ТракТрак -tractracPassword=Пароль ТракТрак +tractracUsername=Имя пользователя TracTrac +tractracPassword=Пароль TracTrac operatorEquals=Равно operatorNotEqualTo=Не равно operatorLessThan=Меньше operatorLessThanEquals=Меньше или равно -operatorGreaterThan=Больше чем +operatorGreaterThan=Больше operatorGreaterThanEquals=Больше или равно operatorContains=Содержит operatorNotContains=Не содержит operatorStartsWith=Начинается с operatorEndsWith=Заканчивается на nationality=Гражданство -numberMustBePositive=Цифра должна быть больше нуля. -distanceToLineAtRaceStart=Расстояние до линии «Старт» -distanceToLineFiveSecondsBeforeStart=Расстояние до линии 5с до старта -speedOverGroundAtRaceStart=Скорость относительно земли на линии «Старт» -speedOverGroundFiveSecondsBeforeStart=Скорость относительно земли на линии 5с до старта -speedOverGroundWhenPassingStart=Скорость относительно земли во время старта -distanceToLineAtRaceStartTooltip=Расстояние до стартовой линии во время начала гонки -distanceToLineFiveSecondsBeforeStartTooltip=Расстояние до стартовой линии за пять секунд до начала гонки -speedOverGroundAtRaceStartTooltip=Скорость относительно земли во время начала гонки -speedOverGroundFiveSecondsBeforeStartTooltip=Скорость относительно земли за пять секунд до начала гонки -speedOverGroundWhenPassingStartTooltip=Скорость относительно земли при пересечении участником линии старта -startTack=Сменить галс -startTackTooltip=галс, на котором участник начал -portTack=Левый галс -starboardTack=Правый галс -portSide=Левый борт -starboardSide=Правый борт -pleaseEnterANumber=Пожалуйста, введите номер. -competitorsFilter=Сортировать участников -flagStatus=Флажок состояния -additionalInformation=Информация -windFixListingDescription=Исправления для ветра (первые 3, последние 3, фактические значения) -noWindFixesAvailable=Исправления для ветра недоступны. -distanceToStarboardEndOfStartlineWhenPassingStart=Расстояние от линии до правого борта во время прохождения старта -distanceToStarboardEndOfStartlineWhenPassingStartTooltip=Расстояние до правого борта от стартовой линии или одной отметки начала, когда участник пересек линию старта +numberMustBePositive=Число должна быть больше нуля. +distanceToLineAtRaceStart=Дистанция до линии при старте +distanceToLineFiveSecondsBeforeStart=Дистанция до линии за 5 с до старта +speedOverGroundAtRaceStart=SOG при старте +speedOverGroundFiveSecondsBeforeStart=SOG за 5 с до старта +speedOverGroundWhenPassingStart=SOG при старте +distanceToLineAtRaceStartTooltip=Дистанция до линии старта во время старта гонки +distanceToLineFiveSecondsBeforeStartTooltip=Дистанция до линии старта за пять секунд до старта +speedOverGroundAtRaceStartTooltip=Скорость относительно грунта во время старта гонки +speedOverGroundFiveSecondsBeforeStartTooltip=Скорость относительно грунта за пять секунд до старта +speedOverGroundWhenPassingStartTooltip=Скорость относительно грунта при прохождении старта участником +startTack=Стартовый галс +startTackTooltip=Галс, на котором стартовал участник +portTack=Левый +starboardTack=Правый +portSide=Левый +starboardSide=Правый +pleaseEnterANumber=Введите число. +competitorsFilter=Фильтр участников +flagStatus=Статус флага +additionalInformation=Инфо +windFixListingDescription=Замеры ветра (первые 3, последние 3, истинные значения) +noWindFixesAvailable=Нет доступных замеров ветра. +distanceToStarboardEndOfStartlineWhenPassingStart=До правой стороны линии при старте +distanceToStarboardEndOfStartlineWhenPassingStartTooltip=Дистанция до правой стороны линии старта или отметки старта при прохождении старта участником actionAddFilter=Добавить фильтр actionEditFilter=Изменить фильтр availableFilters=Доступные фильтры -createFilterHint=Создать набор фильтров для сортировки списка участников. -filterThisNameAlreadyExists=Фильтр с таким именем уже существует. -addAtLeastOneFilterCriteria=Добавьте хотя бы один критерий сортировки. -filterCriteria=Критерий сортировки -selectAFilterCriteria=Выбрать критерий сортировки -filterName=Имя фильтра -operator=Оператор -value=Значение -nationalityMustBeISOorIOCcode=Гражданство должно содержать двухбуквенный код МОК или трехбуквенный код МОК. -raceRank=Рейтинг гонки -waypoints=Точки маршрута +createFilterHint=Создание набора фильтров для фильтрации списка участников. +filterThisNameAlreadyExists=Фильтр с таким названием уже существует. +addAtLeastOneFilterCriteria=Добавьте минимум один критерий фильтра. +filterCriteria=Критерии фильтра +selectAFilterCriteria=Выберите критерии фильтра +filterName=Название фильтра +operator=оператор +value=значение +nationalityMustBeISOorIOCcode=Гражданство должно быть указан двузначным кодом ISO или трехзначным кодом IOC. +raceRank=Ранг гонки +waypoints=Путевые точки disableRaceFilter=Отключить фильтр enableRaceFilter=Включить фильтр raceStatusColumn=Статус гонки -loading=Загрузка (при медленном соединении с Интернетом процесс может занять несколько минут)... -racesWithHiddenState=Гонки со статусом «СКРЫТЫ» -mediaDateFormatError=Недействительный формат даты. Использовать: {0} +loading=Загрузка (при медленном подключении к Интернету может занять несколько минут)... +racesWithHiddenState=Гонки с состоянием СКРЫТО +mediaDateFormatError=Недопустимый формат даты. Используйте формат: {0} selectedCompetitors=Выбранные участники -filterNothing=Нечего сортировать -topNCompetitorsByRaceRank=Лидеры гонки {0} -topNCompetitorsByTotalRank=Лидеры в общем зачете {0} -simulator=Модель -optionsBar=Панель опций -simulateButton=Прогнозировать -setup=Установка -strength=Сила (в узлах) +filterNothing=Не фильтровать +topNCompetitorsByRaceRank=Первые {0} в гонке +topNCompetitorsByTotalRank=Первые {0} в общем зачете +simulator=Симулятор +optionsBar=Панель параметров +simulateButton=Прогноз +setup=Настройка +strength=Сила (кН) oscillation=Колебание -oscillating=Колеблющийся -amplitude=Амплитуда(в градусах) -frequency=Частота (в 1/ч) +oscillating=Колебания +amplitude=Амплитуда (в град.) +frequency=Частота (1/ч) noise=Шум -sailing=Плавание под парусом -optimality=Оптимальность -maximumTurns=Максимальное количество галсов +sailing=Плавание +optimality=Оптимум +maximumTurns=Максимум поворотов raceDirection=Направление гонки upWind=Против ветра downWind=По ветру strategies=Стратегии -omniscient=Всезнающий -opportunistic=Оппортунист -mixed=Смешанный +omniscient=Всезнайка +opportunistic=Авантюрист +mixed=Смешанная maps=Карты -startEnd=Старт-Финиш -racecourse=Курс -summary=Сводная информация -replay=Повтор -display=Отобразить -simulatorPolarHeader = Полярная диаграмма +startEnd=Начало-конец +racecourse=Курс +summary=Сводка +replay=Воспроизвести +display=Просмотреть +simulatorPolarHeader=Полярная диаграмма show=Показать hide=скрыть leftWind=Ветер слева rightWind=Ветер справа -strategyOption1=стратегияВариант1 -strategyOption2=стратегияВариант2 -strategyOption3=стратегияВариант3 +strategyOption1=strategyOption1 +strategyOption2=strategyOption2 +strategyOption3=strategyOption3 legLabel=Этап raceLabel=Гонка competitorLabel=Участник -freemode=Сохранять направления -whatIfCourse=Что если курс +freemode=Держать направление +whatIfCourse=Подбирать курс editRegatta=Изменить регату... -selectSailingEvent=Пожалуйста, выберите событие парусного спорта... -selectCourseArea=Пожалуйста, выберите зону курса.. +selectSailingEvent=Выбрать событие... +selectCourseArea=Выбрать зону гонки... courseAreaOverview=Обзор зоны -courseDesignOverview=Обзор создания курса +courseDesignOverview=Обзор схемы курса regattaOverview=Обзор регаты additionalSettings=Дополнительные параметры -showFollowingCourseAreas=Показать следующие зоны курса +showFollowingCourseAreas=Показать следующие зоны гонок showFollowingRegattas=Показать следующие регаты -showOnlyRacesOfSameDay=Показать только гонки, проходившие в один и тот же день -showOnlyCurrentlyRunningRaces=Показать только проходящие гонки -seriesDefinesResultDiscardingRule=Серии определяют правила исключения результатов -addSeries=Все серии +showOnlyRacesOfSameDay=Показать только гонки того же дня +showOnlyCurrentlyRunningRaces=Показать текущие гонки +seriesDefinesResultDiscardingRule=Серия определяет правила исключения результатов +addSeries=Добавить серию regattaDefinesResultDiscardingRules=Регата определяет правила исключения результатов -startsWithZeroScore=Серия начинается с нуля очков -masterDataImportPanel=Импорт основных данных -importSuccess=Успех\nСозданная {0} группа таблиц (ы) лидеров и {1} таблиц (ы) и {2} события (й) и {3} регат (ы). -importSuccessOverwriteInfo=Пришлось перезаписать следующие регаты, необходимо повторно проложить их гонки: -regattaOverviewConfiguration=Обзор конфигурации регаты -firstRaceIsNonDiscardableCarryForward=Начиная с не исключаемых переносов в другую графу -addReplicationMaster=Подключение к главному серверу дублирования +startsWithZeroScore=Серия начинается с нулевым баллом +masterDataImportPanel=Импорт мастер-данных +importSuccess=Спех\nСоздано групп таблиц лидеров: {0}, таблиц лидеров: {1}, событий: {2}, регат: {3}. +importSuccessOverwriteInfo=Следующие регаты перезаписаны, потребуется повторное отслеживанием их гонок: +regattaOverviewConfiguration=Конфигурация обзора регаты +firstRaceIsNonDiscardableCarryForward=Начинается с неисключаемого переноса +addReplicationMaster=Подключиться к главному серверу репликации connect=Подключиться -connectToMaster=Подключиться к Главному -exchangeHost=Имя узла обмена сообщениями -explainExchangeHostName=Имя узла, где сообщения ставятся в очередь ожидания. -explainReplicationHostname=Имя узла, где работает главный сервер дублирования. -explainReplicationExchangeName=Имя очереди ожидания обмена сообщениями. Она должна быть настроена как главный сервер. -explainReplicationExchangePort=Порт очереди ожидания обмена сообщениями. Он используется после первоначальной загрузки для всех данных. -explainReplicationServletPort=Номер порта сервлета, используемого для подключения для регистрации этой копии и получения первоначальной загрузки. -explainReplicasRegistered=Копии зарегистрированы (этот сервер главный ): -explainConnectionsToMaster=Подключения к главному серверу (это сервер копий): -explainNoConnectionsToMaster=Не настроенных подключений к главному серверу.Для настройки одного соединения щелкните «Подключиться к главному серверу» . -explainNoConnectionsFromReplicas=Подключений к серверу копий не обнаружено. Копии можно подключить используя их Консоль администрирования. -stopConnectionToMaster=Остановить копирование -asLink=Показать в ссылке +connectToMaster=Подключиться к главному серверу +exchangeHost=Имя хоста обмена сообщениями +explainExchangeHostName=Имя хоста, на котором выполняется очередь сообщений. +explainReplicationHostname=Имя хоста, на котором выполняется главный сервер репликации. +explainReplicationExchangeName=Имя очереди Exchange. Должно совпадать с указанным на главном сервере. +explainReplicationExchangePort=Порт очереди обмена сообщениями Exchange. Используется для всех данных после начальной загрузки. +explainReplicationServletPort=Номер порта сервлета, используемый для подключения для регистрации данной реплики и получения начальной загрузки. +explainReplicasRegistered=Зарегистрированные реплики (это главный сервер): +explainConnectionsToMaster=Подключение к главному серверу (это сервер реплики): +explainNoConnectionsToMaster=Подключения к главному серверу не настроены. Нажмите кнопку "Подключиться к главному серверу", чтобы настроить подключение. +explainNoConnectionsFromReplicas=Подключения от реплик не найдены. Реплики можно подключить с помощью их консоли администрирования. +stopConnectionToMaster=Остановить репликацию +asLink=Как ссылка noStarttimeAnnouncedYet=Ожидание -raceIsRunning=Проходящая -raceIsFinishing=Завершающаяся -raceIsFinished=Завершенная -raceIsScheduled=Запланированная -raceIsInStartphase=Этап старта -generalRecall=Общая отмена -startPostponed=Отложенная -raceAbandoned=Прекращенная -stopAllReplicas=Разъединить соединение со всеми копиями (Опасно!) -warningServerIsReplica=ВНИМАНИЕ: Этот сервер настроек может быть сервером копий. НЕ ВНОСИТЕ никаких изменений или это приведет к нежелательным последствиям! -dropReplicaConnection=Разъединить соединение -timePanelName=Контроль времени -competitorFilterExplanation=Фильтр отображает всех участников, соответствующих критериям: -dropReplicaConnection=Разъединить соединения -protestTime=Protest time -protestTimeFinishesAt=Срок подачи протеста истекает в -protestTimeFinishedAt=Срок подачи протеста истек в +raceIsRunning=Выполнение +raceIsFinishing=Завершение +raceIsFinished=Завершено +raceIsScheduled=Запланировано +raceIsInStartphase=Стартовая фаза +generalRecall=Общий отзыв +startPostponed=Отложено +raceAbandoned=Отменено +stopAllReplicas=Сбросить подключение ко всем репликам (Опасно!) +warningServerIsReplica=ВНИМАНИЕ: этот сервер настроен как реплика. НЕ изменяйте ничего, иначе возможны непредвиденные последствия! +dropReplicaConnection=Сбросить подключение +timePanelName=Управление временем +competitorFilterExplanation=Фильтр покажет всех участников, отвечающих следующим критериям: +protestTime=Время протеста +protestTimeFinishesAt=заканчивается +protestTimeFinishedAt=закончилось flags=Флаги -lastUpdate=Последние обновления -noMoreRacingToday=Сегодня больше нет гонок -furtherSignalsAshore=Дальнейшие сигналы на берегу -earlyStarters=Совершивших фальшстар -showingDetailsOfRace=Отобразить подробности для гонки {0} -startAt=Старт в -finishAt=Финиш в -protestEndsAt=Срок подачи протеста завершается в +lastUpdate=Последнее обновление +noMoreRacingToday=Больше никаких гонок сегодня +furtherSignalsAshore=Дальнейшие сигналы на суше +earlyStarters=Рано стартовавшие +showingDetailsOfRace=Отображение подробностей для гонки {0} +startAt=Старт в +finishAt=Финиш в +protestEndsAt=Протест заканчивается в unknown=Неизвестно -raceLog=Запись о гонке -regattaLog=Regatta log -refreshRaceLog=Обновить запись о гонке -raceLogReloaded=Запись о гонке успешно повторно загружена из базы данных -reloadAllRaceLogs=Повторно загрузить все записи о гонке -export=Эскпорт +raceLog=Журнал гонки +regattaLog=Журнал регаты +refreshRaceLog=Обновить журнал гонки +raceLogReloaded=Журнал гонки успешно перезагружен из базы данных +reloadAllRaceLogs=Перезагрузить все журналы гонок +export=Экспорт sideline=Боковая линия -classAndGolfUp=Флаг поднят – восемь минут до старта – процедура старта – через стартовые ворота -classDisplayed=Флаг поднят – пять минут до старта -papaDisplayed=Флаг режима старта четыре минуты до старта -blackDisplayed=Флаг режима старта – дисквалификация совершивших фальшстарт – четыре минуты до старта -zuluIndiaDisplayed=Флаг режима старта – штрафы для совершивших фальшстарт – четыре минуты до старта -papaRemoved=Флаг режима старта - одна минута до старта -blackRemoved=Флаг режима старта – дисквалификация для совершивших фальшстарт - одна минута до старта -zuluIndiaRemoved=Флаг режима старта – старт со штрафами совершившим фальшстарт – одна минута до старта -classFlagRemoved=Флаг убран – сигнал начала гонки -xray=Индивидуальная отмена – есть совершившие фальшстарт -firstSubstitute=Общая отмена – слишком много совершивших фальшстарт – процедура старта будет повторена -blueFlagDisplayed=Флаг отображается – первый участник пересек линию финиша -blueFlagRemoved=Флаг убран – последний участник пересек линию финиша или предельное время финиша прошло -golfRemoved=Флаг убран –ворота закрыты -answeringPennantOverAlphaDisplayed=Флаг отображается - старт отложен - сегодня больше нет гонок -answeringPennantOverHotelDisplayed=Флаг отображается – старт отложен - дальнейшие сигналы на берегу -answeringPennantDisplayed=Флаг отображается – старт отложен -answeringPennantRemoved=Флаг убран – процедура старта начинается через одну минуту -novemberOverAlphaDisplayed=Флаг поднят - гонка отменена – сегодня гонок больше нет -novemberOverHotelDisplayed=Флаг поднят – гонка отменена - дальнейшие сигналы на берегу -novemberDisplayed=Флаг поднят – гонка отменена -bravoDisplayed=Срок подачи протеста начался -bravoRemoved=Срок подачи протеста закончился +classAndGolfUp=Флаг установлен – восемь минут до старта – процедура старта через ворота +classDisplayed=Флаг установлен – пять минут до старта +papaDisplayed=Флаг стартового режима – четыре минуты до старта +blackDisplayed=Флаг стартового режима – дисквалификация для рано стартовавших – четыре минуты до старта +zuluIndiaDisplayed=Флаг стартового режима – штрафы для рано стартовавших – четыре минуты до старта +papaRemoved=Флаг стартового режима – одна минута до старта +blackRemoved=Флаг стартового режима – дисквалификация для рано стартовавших – одна минута до старта +zuluIndiaRemoved=Флаг стартового режима – старт со штрафами для рано стартовавших – одна минута до старта +classFlagRemoved=Флаг снят – сигнал о старте гонки +xray=Индивидуальный отзыв – были рано стартовавшие +firstSubstitute=Общий отзыв – слишком много рано стартовавших – процедура старта будет повторена +blueFlagDisplayed=Флаг установлен – первый участник перешел финишную линию +blueFlagRemoved=Флаг снят – последний участник перешел финишную линию либо истек лимит времени финиширования +golfRemoved=Флаг снят – ворота закрыты +answeringPennantOverAlphaDisplayed=Флаг установлен – старт отложен – больше никаких гонок сегодня +answeringPennantOverHotelDisplayed=Флаг установлен – старт отложен – дальнейшие сигналы на суше +answeringPennantDisplayed=Флаг установлен – старт отложен +answeringPennantRemoved=Флаг снят – запуск процедуры старта через одну минуту +novemberOverAlphaDisplayed=Флаг показан – гонка отменена – больше никаких гонок сегодня +novemberOverHotelDisplayed=Флаг установлен – гонка отменена – дальнейшие сигналы на суше +novemberDisplayed=Флаг установлен – гонка отменена +bravoDisplayed=Время протеста началось +bravoRemoved=Время протеста закончилось essThreeDisplayed=Три минуты до старта essTwoDisplayed=Две минуты до старта -essOneDisplayed=Одна минуты до старта -essOneRemoved=Сигнал начала гонки -dataBeforeAfter=Данные до/после гонки -rawFixes=Все значения (включая сильно отличающиеся значения) -importRemoteHost=Удаленный узел: -importFetchRemoteLgs=Получить список группы таблицы лидеров -importUrlInvalid=Недействительный URL-адрес для получения групп таблицы лидеров: {0} -importGetLeaderboardsFailed=Запрос ПОЛУЧИТЬ группы таблиц лидеров выполнить не удалось для узла {0} с ошибкой {1} -importNoDataReturned=Данные сервером не возвращены -importServerError=Запрос ПОЛУЧИТЬ группы таблиц лидеров выполнить не удалось с ошибкой Сервера. Дополнительные сведения, см. в журнале сервера. +essOneDisplayed=Одна минута до старта +essOneRemoved=Сигнал о старте гонки +dataBeforeAfter=Данные из до/после гонки +rawFixes=Все замеры (включая выбросы) +importRemoteHost=Удаленный хост: +importFetchRemoteLgs=Извлечь список группы таблиц лидеров +importUrlInvalid=Недействительный URL-адрес для извлечения групп таблиц лидеров: {0} +importGetLeaderboardsFailed=Сбой GET-запроса групп таблиц лидеров для хоста {0} с ошибкой {1} +importNoDataReturned=Сервер не вернул никаких данных +importServerError=Сбой GET-запроса групп таблиц лидеров с ошибкой сервера. Дополнительные сведения см. в журналах сервера. importLeaderboardGroups=Группы таблиц лидеров: -importOverrideSwitchLabel=Перезаписать существующие данные, если имена и идентификационные данные совпадают +importOverrideSwitchLabel=Переопределять существующие данные при совпадении названий и идентификаторов importSelectedLeaderboardGroups=Импорт выбранных групп таблиц лидеров -importSelectAtLeastOne=Нужно выбрать хотя бы одну группу таблиц лидеров для импорта -deselectAll=Отменить выбор всех +importSelectAtLeastOne=Выберите не менее одной группы таблиц лидеров для импорта +deselectAll=Отменить все polarDiagramButton=Полярная диаграмма -ratioBetweenTimeSinceLastPositionFixAndAverageSamplingInterval=Запаздывание GPS -ratioBetweenTimeSinceLastPositionFixAndAverageSamplingIntervalTooltip=Соотношение между последними полученными с помощью GPS данными о положении и усредненным интервалом выборки +ratioBetweenTimeSinceLastPositionFixAndAverageSamplingInterval=Задержка GPS +ratioBetweenTimeSinceLastPositionFixAndAverageSamplingIntervalTooltip=Отношение между временем с момента последнего получения позиции GPS и средним интервалом дискретизации trackingQuality=Качество отслеживания -legType=Тип этапа +legType=Тип отрезка sailID=Номер на парусе -seriesLeaderboard=Серия таблиц лидеров -regattaLeaderboards=Таблица лидеров регаты -clearSelection=Отменить выбор -running=Проходящая в настоящее время -runAsSubstantive=Начать +seriesLeaderboard=Таблица лидеров серии +regattaLeaderboards=Таблицы лидеров регаты +clearSelection=Очистить выбор +running=Выполнение +runAsSubstantive=Выполнить done=Готово -lastFinished=Последняя завершенная -run=Начать +lastFinished=Последний финиш +run=Выполнить times=раз -dataAmount=Data amount -averageCleanedServerTime=\u2205 Чистое время на сервере -averageCleanedOverallTime=\u2205 Чистое итоговое время -dataMiningBenchmarkResults=Результаты сравнительного теста сбора данных -serverTime=Время на сервере -confidenceShouldBeBetween=Достоверность данных должна быть от 0 до 1. -minDataValuesNeedToBeAtLeastZero=Минимальные значения объема данных не могут быть отрицательными. -numberOfColumnsAtLeast2=Количество столбцов гистограммы должно быть больше одного. -outlierRadiusNeedsToBePositiveString=Сильно отличающееся значение радиуса должно быть положительным числом. -outlierMinimumNeighborhoodPctString=Сильно отличающееся значение в процентах соседней точки должно быть положительным и максимально равно 1. -oneOrMoreParametersAreEmpty=Поле параметра не может быть пустым. -errorWhileAddingSeriesToChart=При добавлении \nновой серии в график возникла ошибка -generatingPolarSheet=Создание полярной таблицы... -dataCount=Объем данных -generationFinished=Создание завершено! -generating=Создание +dataAmount=Объем данных +averageCleanedServerTime=\u2205 Очищенное время сервера +averageCleanedOverallTime=\u2205 Очищенное общее время +dataMiningBenchmarkResults=Результаты сравнительного анализа добычи данных +serverTime=Время сервера +confidenceShouldBeBetween=Значения достоверности должны быть между 0 и 1 +minDataValuesNeedToBeAtLeastZero=Значения минимального размера данных не могут быть отрицательными. +numberOfColumnsAtLeast2=Число столбцов гистограммы должно быть больше единицы. +outlierRadiusNeedsToBePositiveString=Радиус выбросов должен быть положительным числом. +outlierMinimumNeighborhoodPctString=Процент окрестности выброса должен быть положительным и не более 1. +oneOrMoreParametersAreEmpty=Поля параметров не могут быть пустыми. +errorWhileAddingSeriesToChart=Ошибка при попытке добавить\nновую серию в диаграмму. +generatingPolarSheet=Генерирование полярных данных... +dataCount=Размер данных +generationFinished=Генерирование завершено! +generating=Генерирование removeAllSheets=Удалить все листы removeAll=Удалить все selectSheet=Выбрать лист -cleanedServerTime=Чистое время на сервере +cleanedServerTime=Очищенное время сервера overallTime=Общее время -cleanedOverallTime=Чистое итоговое время -dataMiningResult=Результат сбора данных +cleanedOverallTime=Очищенное общее время +dataMiningResult=Результат добычи данных groupBy=Группировать по statisticToCalculate=Рассчитать статистику -queryResultsChartSubtitle=Обработанные {0} элементы данных через {1} секунд -noQuerySelected=Запросы не выбраны -runAutomatically=Запустить автоматически -windImport_Upload=Загрузить -windImport_Title=Импортировать данные о ветре от экспедиции -windImport_BoatId=Идентификационный номер судна: -windImport_SelectedRacesWarning=Вы действительно хотите импортировать данные о ветре в выбранные {0} гонки?\nЭто в любом случае повлияет только на гонки с применимым временным окном. -windImport_AllRacesWarning=Вы действительно хотите импортировать данные о ветре во все гонки?\nЭто в любом случае повлияет только на гонки с применимым временным окном. -windImport_ResultHeader=Импортированные данные с: {0} по: {1}. {2} повлияли на гонки. -windImport_ResultEntry=Гонка: {0} ({1}) - {2} корректировка с: {3} по: {4} +queryResultsChartSubtitle=Обработано {0} зап. данных за {1} с +noQuerySelected=Не выбран запрос +runAutomatically=Выполнить автоматически +windImport_Upload=Отправить +windImport_Title=Импортировать ветер из Expedition +windImport_BoatId=Ид. лодки: +windImport_SelectedRacesWarning=Вы действительно хотите импортировать ветер в выбранные гонки ({0})?\nЗатронуты будут только гонки с применимым окном времени. +windImport_AllRacesWarning=Вы действительно хотите импортировать ветер во все гонки ()?\nЗатронуты будут только гонки с применимым окном времени. +windImport_ResultHeader=Импортирован ветер из {0} в {1}. Затронуто гонок: {2}. +windImport_ResultEntry=Гонка: {0} ({1}) – {2} зам. из: {3} в: {4} windImport_ResultError=Ошибка: {0} showWindSpeedSeriesTooltip=Переключает видимость скорости ветра для всех источников данных showWindDirectionSeriesTooltip=Переключает видимость направления ветра для всех источников данных -combinedWindSourceTypeTooltip=Объединяет данные из всех других источников данных о ветре в один набор данных -courseBasedWindSourceTypeTooltip=Значение основано на прокладке курса гонки (с учетом предположения, что гонка начнется с этапа против ветра) -trackBasedEstimationWindSourceTypeTooltip=Расчетные данные из маршрута участника -expeditionWindSourceTypeTooltip=Данные, полученные из мобильных систем измерения -webWindSourceTypeTooltip=Значения данных, установленные вручную -raceCommitteeWindSourceTypeTooltip=Значения данных, установленные вручную, полученные от официальных лиц гонки -sheetName=Имя листа -sheetNameTooltip=Вы можете присвоить имя своему полярному листу используя текстовое поле.\nИмя будет создано с использованием класса судна\nесли имя не предоставлено. +combinedWindSourceTypeTooltip=Объединяет все другие источники ветра в один набор данных +courseBasedWindSourceTypeTooltip=Значение, основанное на схеме курса (предполагается, что гонка начинается против ветра) +trackBasedEstimationWindSourceTypeTooltip=Расчетные данные из отслеживаний участника +windSensorWindSourceTypeTooltip=Данные из мобильных измеряющих систем +webWindSourceTypeTooltip=Вручную установить значения данных +raceCommitteeWindSourceTypeTooltip=Данные, заданные вручную персоналом гонки +sheetName=Название листа +sheetNameTooltip=В этом текстовом поле можно указать название для\nлиста полярных данных. Если имя не указано,\nоно будет сгенерировано на базе класса лодки. timeDownwind=Время по ветру -timeReaching=Время лавирования по ветру +timeReaching=Время полным ветром timeUpwind=Время против ветра -raceTimeTooltip=Total time traveled in this race, starting to measure when competitor passes start waypoint\n(not when the race starts) -raceTimeDownwindTooltip=Общее время движения по ветру в этой гонке -raceTimeReachingTooltip=Общее время лавирования по ветру в этой гонке -raceTimeUpwindTooltip=Общее время движения против ветра в этой гонке -noStatisticSelectedError=Статистических данных для расчета не выбрано -noCustomGrouperScriptTextError=Скрипт блока группирования пустой -noDimensionToGroupBySelectedError=Размер для группировки по не выбран -noGrouperSelectedError=Тип блока группирования не выбран -noDataRetrieverChainDefinitonSelectedError=No data retriever is selected -queryNotValidBecause=Запрос не возможен, т.к. -dataMining=Сбор данных -errorRunningDataMiningQuery=Ошибка при выполнении запроса +raceTimeTooltip=Общее время хода в данной гонке, отсчитываемое с момента прохождения участником стартовой путевой точки\n(не от старта гонки) +raceTimeDownwindTooltip=Общее время хода по ветру в данной гонке +raceTimeReachingTooltip=Общее время хода полным ветром в данной гонке +raceTimeUpwindTooltip=Общее время хода против ветра в данной гонке +noStatisticSelectedError=Не выбрана статистика для расчета +noCustomGrouperScriptTextError=Скрипт группирования пуст +noDimensionToGroupBySelectedError=Не выбрано базовое измерение для группировки +noGrouperSelectedError=Не выбран тип группирования +noDataRetrieverChainDefinitonSelectedError=Не выбрано средство извлечения данных +queryNotValidBecause=Запрос невозможен, так как +dataMining=Добыча данных +errorRunningDataMiningQuery=При выполнении запроса возникла ошибка hideToolbar=Скрыть панель инструментов -showSeriesLeaderboards=Показать таблицу лидеров серии -showOverallLeaderboard=Показать общую таблицу лидеров -lineAngleToWindAndAdvantage=длина: {0}м\nугол к ветру: {1}градус\n{2} борт {3}м имеет преимущество -doYouReallyWantToRemoveEvents=Вы действительно хотите удалить все события? -doYouReallyWantToRemoveEvent=Вы действительно хотите удалить событие {0}? -line=Строка -offset=Смещение -doYouReallyWantToRemoveCompetitors=Вы действительно хотите удалить всех выбранных участников? -doYouReallyWantToRemoveCompetitor=Вы действительно хотите удалить выбранного участника {0}? -filterCompetitors=Сортировать по имени, классу судна или номеру на парусе +showSeriesLeaderboards=Показать таблицы лидеров серии +showOverallLeaderboard=Показать итоговую таблицу лидеров +lineAngleToWindAndAdvantage=длина: {0} м\nугол к ветру: {1}°\n{2} сторона имеет преимущество {3} м +doYouReallyWantToRemoveEvents=Действительно удалить эти события? +doYouReallyWantToRemoveEvent=Действительно удалить событие {0}? +line=Линия +offset=Сдвиг +doYouReallyWantToRemoveCompetitors=Действительно удалить выбранных участников? +doYouReallyWantToRemoveCompetitor=Действительно удалить участника {0}? +filterCompetitors=Фильтрация участников по названию, классу лодки, номеру на парусе или идентификатору editCompetitor=Изменить участника -pleaseEnterASailNumber=Пожалуйста, введите номер на парусе -successfullyAllowedCompetitorReset=Перезагрузка участника (ов) {0} разрешена. -id=Идентификатор +pleaseEnterASailNumber=Введите номер на парусе +successfullyAllowedCompetitorReset=Успешно разрешена перезагрузка участников {0}. +id=Ид. allowReload=Разрешить перезагрузку compress=Сжать -compressTooltip=Используйте только, если на экземпляре сервера, с которого выполняется экспорт, хотя бы\nзапущена операция подтверждения 0fbf6071dea125bec4a56dee55d61c99def4a62e. -queryRunner=Отправка запросов -rerunQueryAfterRefresh=Повторно выполнить запрос после обновления -refreshIntervalMustntBeEmpty=Интервал обновления не может быть пустым -selectionTables=Выбор таблиц +compressTooltip=Используйте только при выполнении экспортирующего экземпляра\nсервера с commit 0fbf6071dea125bec4a56dee55d61c99def4a62e. +queryRunner=Выполнение запроса +rerunQueryAfterRefresh=Повторить запрос после обновления +refreshIntervalMustntBeEmpty=Интервал обновления не должен быть пустым +selectionTables=Таблица выбора addConfiguration=Добавить конфигурацию -noConfigurations=Конфигурации отсутствуют. -errorRetrievingConfiguration=Ошибка получения данных о конфигурации с сервера. -allowedCourseAreas=Разрешить зоны курса -minimumRoundsForCourse=Минимальное количество кругов для курса гонки -maximumRoundsForCourse=Максимальное количество кругов для курса гонки -resultsMailRecipient=Результаты получателя почты +noConfigurations=Нет конфигураций. +errorRetrievingConfiguration=Ошибка при получении данных конфигурации с сервера. +allowedCourseAreas=Разрешенные зоны гонок +minimumRoundsForCourse=Минимум кругов для курса +maximumRoundsForCourse=Максимум кругов для курса +resultsMailRecipient=Получатель результатов deviceConfiguration=Конфигурация устройства -none=Ни одного -courseDesignerMode=Создатель курсов +none=Нет +courseDesignerMode=Дизайнер курса racingProcedure=Процедура гонки -courseNames=Имена курсов гонок -generate=Создать +courseNames=Названия курса +generate=Генерировать dontoverwrite=Не перезаписывать -setRacingProcedureConfiguration=Настроить конфигурацию регаты +setRacingProcedureConfiguration=Настройка конфигурации регаты racingProcedureConfiguration=Конфигурация регаты -activateIndividualRecall=Активировать индивидуальную отмену +activateIndividualRecall=Активировать индивидуальный отзыв +activateResultEntry=Активировать запись результата rrs26Start=RRS26 старт setConfiguration=Активировать конфигурацию classFlag=Флаг класса -classFlagHelpText=Устанавливает флаг класса, используемый для {0}. Выберите ''Не перезаписывать''для активации флага по умолчанию для процедуры. -individualRecallHelpText=После активации можно обратиться к официальному лицу гонки для индивидуальной отмены. -startmodeFlags=Флаги режима старта -startmodeFlagsHelpText=Устанавливает доступные флаги для режима старта. Выберите «ни один» из предложенных, для включения флагов по умолчанию для этой процедуры. -gateStart=Ворота старта -activatePathfinder=Активировать «Следопыт» -pathfinderHelpText=После активации официальное лицо гонки может настроить судно «Следопыт». +classFlagHelpText=Установка флага класса для {0}. Выберите ''Не перезаписывать'', чтобы активировать соответствующий флаг процедуры по умолчанию. +individualRecallHelpText=При активации руководитель гонок может запросить индивидуальный отзыв. +resultEntryHelpText=При активации руководитель гонок может вводить результаты во время и после фазы финиширования. +startmodeFlags=Флаги режима старта +startmodeFlagsHelpText=Установка доступных флагов режима старта. Выберите "Нет", чтобы активировать флаги процедуры по умолчанию. +gateStart=Старт через ворота +activatePathfinder=Активировать указатель курса +pathfinderHelpText=При активации руководитель гонок может назначить лодку-указатель курса. essStart=Старт ESS -basicStart=Основной старт -leagueStart=League Start -configured=Настроенный +basicStart=Общий старт +leagueStart=Старт лиги +configured=Настроено overwriteRacingProceduresConfiguration=Активировать конфигурацию регаты -overwriteRacingProceduresConfigurationHelpText=Включение этой опции предоставляет базовую конфигурацию регаты для всех опций, не настроенных в специальной конфигурации регаты. +overwriteRacingProceduresConfigurationHelpText=Включение этого параметра предоставит базовую конфигурацию регаты для всех не настроенных параметров в конфигурации данной регаты. setStartTime=Установить время старта -currentPass=Текущий пропуск -setStartTimeDescription=Выбрать новое время старта для гонки -hasAdditionalGolfDownTime=Активировать дополнительное время отсчета -additionalGolfDownTimeHelpText=Активировать дополнительное время отсчета -invalidColor=Недействительный цвет: {0} +currentPass=Текущее прохождение +setStartTimeDescription=Выберите новое время старта для гонки. Если требуется назначить старт на время в прошлом, установите флажок для обновления счетчика прохождений. Учтите, что при изменении числа прохождений будут потеряны все сведения из предыдущих прохождений (такие как события флагов). +setTrackingTimesDescription=Установка времени начала и окончания отслеживания гонки. +hasAdditionalGolfDownTime=Активировать дополнительное время +additionalGolfDownTimeHelpText=Активировать дополнительное время +invalidColor=Недопустимый цвет: {0} igtimiAccounts=Учетные записи Igtimi -errorFetchingIgtimiAccounts=Ошибка получения всех Igtimi учетных записей: {0} +errorFetchingIgtimiAccounts=Ошибка при извлечении всех учетных записей Igtimi: {0} addIgtimiAccount=Добавить учетную запись Igtimi -errorAuthorizingAccessToIgtimiUser=Ошибка авторизации доступа к Igtimi пользователю {0}: {1} -successfullyAuthorizedAccessToIgtimiUser=Успешная авторизация доступа к Igtimi пользователю {0} -couldNotAuthorizedAccessToIgtimiUser=Невозможно авторизовать пользователя {0}; недействительное имя пользователя или пароль -errorGettingIgtimiAuthorizationUrl=Ошибка получения URL-адреса для авторизации Igtimi: {0} +errorAuthorizingAccessToIgtimiUser=Ошибка при авторизации доступа к пользователю Igtimi {0}: {1} +successfullyAuthorizedAccessToIgtimiUser=Успешно авторизован доступа к пользователю Igtimi : {0} +couldNotAuthorizedAccessToIgtimiUser=Не удалось авторизовать пользователя {0}; недействительное имя пользователя и пароль +errorGettingIgtimiAuthorizationUrl=Ошибка при получении URL-адреса авторизации Igtimi: {0} addIgtimiUser=Добавить пользователя Igtimi -doYouReallyWantToRemoveLeaderboards=Вы действительно хотите удалить таблицы лидеров? -errorTryingToRemoveIgtimiAccount=Ошибка попытки удаления учетной записи Igtimi для пользователя {0} -successfullyRemoveIgtimiAccount=Учетная запись Igtimi для пользователя {0} удалена успешно -eMailMustNotBeEmpty=Адрес электронной почты не должен быть пустым -emailAddress=адрес электронной почты +doYouReallyWantToRemoveLeaderboards=Действительно удалить эти таблицы лидеров? +errorTryingToRemoveIgtimiAccount=Ошибка при попытке удалить учетную запись Igtimi для пользователя {0} +successfullyRemoveIgtimiAccount=Успешно удалена учетная запись Igtimi для пользователя {0} +eMailMustNotBeEmpty=Адрес эл. почты не должен быть пустым +emailAddress=адрес эл. почты password=Пароль -searchTag=Search tag -doYouReallyWantToRemoveLeaderboard=Вы действительно хотите удалить таблицу лидеров: ''{0}''? -metaLeaderboardCannotBeChanged=Это мета таблица лидеров. Ее нельзя изменить здесь. -failedToSetNewStartTime=Ошибка при установке нового времени старта. -doYouReallyWantToRemoveIgtimiAccount=Вы действительно хотите удалить учетную запись Igtimi, предоставляющую доступ к данным пользователя {0}? -igtimiWindImport=Импорт данных о ветре из Igtimi -seeIgtimiTabForAccountSettings=См. вкладку ''Igtimi'' для параметров учетной записи, определяющих какие данные из Igtimi будут учитываться. -importWindFromIgtimi=Импорт данных о ветре из Igtimi -errorImportingIgtimiWind=Ошибка импорта данных о ветре из Igtimi: {0} -resultFromIgtimiWindImport=Следующее количество фиксированных точек было импортировано для перечисленных гонок: {0} +doYouReallyWantToRemoveLeaderboard=Действительно удалить таблицу лидеров ''{0}''? +metaLeaderboardCannotBeChanged=Это метатаблица лидеров. Изменить ее здесь невозможно. +failedToSetNewStartTime=Не удалось установить новое время старта. Возможно, такое же время старта уже присутствует в журнале гонки или кто-то добавить более новое (ид. прохождения и логическое время) время старта, чем добавленное вами. +doYouReallyWantToRemoveIgtimiAccount=Действительно удалить учетную запись Igtimi, предоставляющую доступ к данным пользователя {0}? +igtimiWindImport=Импортировать ветер из Igtimi +seeIgtimiTabForAccountSettings=Параметры учетной записи, определяющие учитываемые данные из Igtimi см. на вкладке ''Igtimi''. +importWindFromIgtimi=Импортировать ветер из Igtimi +errorImportingIgtimiWind=Ошибка при импорте данных о ветре из Igtimi: {0} +resultFromIgtimiWindImport=Для перечисленных гонок импортировано следующее число замеров: {0} timeToStart={0} до старта -timeSinceStart={0} со старта -distanceToLine=Растояние до линии старта -beatAngleTooltip=Угол между направлением движения участника и ветром -beatAngle=Угол лавирования -runAutomaticallyTooltip=Запустить запрос автоматически, например, после изменения статистических данных или группировки. -showBoatClassChartsLabel=You can also view the overall diagram for the available boat classes. -showDiagram=Show Diagram -rerunQueryAfterRefreshTooltip=Повторно запускает запрос после обновления таблиц. +timeSinceStart={0} от старта +distanceToLine=Дистанция до линии старта +beatAngleTooltip=Угол между направлением участников и ветром +beatAngle=Угол удара +showBoatClassChartsLabel=Также можно просмотреть общую диаграмму для доступных классов лодок. +showDiagram=Показать диаграмму +runAutomaticallyTooltip=Автоматически выполнять запрос после изменения, например, статистики или группирования. +rerunQueryAfterRefreshTooltip=Повторно выполняет запрос после обновления таблиц. queryDefinitionProvider=Поставщик определения запроса -statisticProvider=Поставщик статистических данных -remoteServerInstances=Remote Server Instances -localServer=Local Server -calculateThe=Calculate the -groupingProvider=Поставщик группировки +statisticProvider=Поставщик статистики +calculateThe=Рассчитать +groupingProvider=Поставщик группирования releaseNotes=Новости и история выпусков -hasSplitFleetContiguousScoring=Разделить флоты, имеющие близкие количества очков -overallProgress=Итоговое улучшение +hasSplitFleetContiguousScoring=Разделенные флоты получили сходные оценки +addRaceLogTracker=Добавить средство отслеживания журнала гонки +addRaceLogTrackers=Добавить средства отслеживания журнала гонки +denoteForRaceLogTracking=Отменить отслеживание журнала гонки +startRaceLogTracking=Начать отслеживание журнала гонки +filterByLeaderboard=Фильтровать по таблице лидеров +removeLeaderboardFilter=Удалить фильтр таблицы лидеров +competitorRegistrations=Регистрации участников +trackerStatus=Статус средства отслеживания +canOnlyBeEditedBeforeStartingTracking=Редактирование возможно только до начала отслеживания +defineCourse=Определить схему курса +mapDevices=Сопоставить устройства с участниками и отметками +edit_what=Изменить {0} +add_what=Добавить {0} +remove_what=Удалить {0} +pleaseEnterA=Введите {0} +pingPosition=Проверить связь с позицией {0} +pleaseEnterAValidValueFor=Введите допустимое значение для {0} ({1}) +copyCourseAndCompetitors=Копировать курс и участников для других гонок +setTrackingTimes=Установить время отслеживания +nowSelectRaceColumnAndFleetToCopyTo=Выберите столбец гонки и флот для копирования курса. +selectRowInTableToCopyCourse=Выберите в таблице одну строку для копирования курса. +deviceId=Ид. устройства +deviceType=Тип устройства +mappedToType=Сопоставлено с типом +mappedTo=Сопоставлено с +deviceMappings=Сопоставления устройств +atMostOneEndOfTheTimeRangeMayBeOpen=Открытым (не указанным) можно оставить не более одного конца диапазона времени сопоставления +pleaseSelectAnItemToMapTo=Выберите элемент для сопоставления с устройством +device=Устройство +timeRange=Диапазон времени +closeTimeRange=Закрыть открытый конец диапазона времени +setClosingTimePoint=Установите время, закрывающее диапазон времени +startOfTimeRangeMustLieBeforeEnd=Начало диапазона времени должно быть раньше его окончания +overallProgress=Общий ход выполнения eventOverview=Обзор события -start=Старт -showAddedScores=Показать добавленные очки для каждой записи таблицы лидеров -ratio=коэффициент -importWind=Имопрт данных о ветре -importWindTooltip=Снятие флажка с этой опции значительно снизит объем передаваемых данных. -importDeviceConfigurations=Конфигурации Импорт устройств -importDeviceConfigurationsTooltip=Все конфигурации устройства ввозятся. +start=Начать +showAddedScores=Показать добавленные баллы для каждой записи в таблице лидеров +ratio=отношение +importWind=Импортировать ветер +importWindTooltip=Снятие этого параметра существенно понизит объем передаваемых данных. +importDeviceConfigurations=Импортировать конфигурации устройств +importDeviceConfigurationsTooltip=Установка этого параметра импортирует ВСЕ конфигурации устройств на удаленный сервер. authorName=Имя автора authorPriority=Приоритет автора -removeDenotation=Remove Denotation -competitorRegistrationsMissingProceed=At least one of the selected races ({0}) is missing competitor registrations. Proceed anyway? -pleaseSelectAControlPoint=Please select a control point -twoMarkControlPoint=2-mark-controlpoint -registeredCompetitors=Registered Competitors -competitorPool=Competitor Pool -selectAtLeastOne=Select at least one -selectRaces=Select the Races -importFixes=Import Fixes -noSailingServerInstancesYet=No remote server instances registered yet. -registeredSailingServerInstances=Registered remote server instances -filterEventsByName=Filter Events by name: -leaderboardsExceptFromSelectedGroup=Leaderboards (except those of selected group) -availableLeaderboardGroups=Available Leaderboard Groups -leaderboardGroupsOfSelectedEvent=Leaderboard Groups Assigned to Event -addRaces=Add races -withNamePrefix=with name prefix -pleaseSelectASeriesFirst=Please select a series first. -upcommingEventStartsInDays=в {0,number} дней +removeDenotation=Удалить обозначение +competitorRegistrationsMissingProceed=По крайней мере в одной из выбранных гонок ({0}) отсутствуют регистрации участников. Продолжить? +pleaseSelectAControlPoint=Выберите контрольную точку +twoMarkControlPoint=2-отметочная контрольная точка +registeredCompetitors=Зарегистрированные участники +competitorPool=Пул участников +selectAtLeastOne=Выберите не менее одного +selectRaces=Выберите гонки +importFixes=Импортировать замеры +noSailingServerInstancesYet=Удаленные инстанции сервера еще не зарегистрированы. +registeredSailingServerInstances=Зарегистрированные удаленные инстанции сервера +filterEventsByName=Фильтровать события по названию: +leaderboardsExceptFromSelectedGroup=Таблицы лидеров (кроме выбранных групп) +availableLeaderboardGroups=Доступные группы таблиц лидеров +leaderboardGroupsOfSelectedEvent=Присвоенные событию группы таблиц лидеров +addRaces=Добавить гонки +withNamePrefix=с префиксом названия +pleaseSelectASeriesFirst=Сначала выберите серию. +upcommingEventStartsInDays=Через {0,number} дн. upcommingEventStartsInDays[one]=завтра upcommingEventStartsInDays[none]=сегодня -sharingMailTooltip=Share by mail -sharingTwitterTooltip=Share on Twitter -sharingFacebookTooltip=Share on Facebook +sharingMailTooltip=Поделиться по почте +sharingTwitterTooltip=Поделиться в Twitter +sharingFacebookTooltip=Поделиться в Facebook #String eventSharingShortText(String eventName, String venue, String dateString); -eventSharingShortText={0} in {1} on {2} +eventSharingShortText={0} в {1} на {2} #String eventSharingLongText(String eventName, String venue, String dateString, String url); -eventSharingLongText=I''d like to share {0} in {1} on {2}. Details on: \n{3} +eventSharingLongText=Хочу поделиться {0} в {1} на {2}. Подробно: \n{3} #String seriesSharingLongText(String seriesName, String url); -seriesSharingLongText=I''d like to share series {0}. Details: {1} +seriesSharingLongText=Хочу поделиться серией {0}. Подробно: \n{1} #String seriesSharingShortText(String seriesName); seriesSharingShortText={0} -competitorsAnalytics=Competitors Analytics -mediaNoContent=There are no photos or videos available yet. -media=Media -photos=Photos -videos=Videos -image=Image -images=Images -video=Video -flagImageURL=Flag image URL (image renders with 18x12px) -imageURLs=Image URLs -videoURLs=Video URLs -sponsorImageURLs=Sponsor Image URLs -pleaseSelectAScoringResult=Please select a scoring result... -timeZone=Time zone -eventOfficialWebsiteURL=Official Website URL -eventSailorsInfoWebsiteURL=Sailors Info Website URL -eventOverviewURL=Event Overview URL -eventLogoImageURL=Logo Image URL -showPingMarkMappings=Show Mappings for pinged Marks -errorFetchingWindStreamletData=Error fetching wind streamlet data: {0} -showWindStreamletOverlay=Show wind streamlets overlay -showWindStreamletOverlay=Color streamlets according to wind speed -showSimulationOverlay=Show simulation overlay -simulationLegendTooltip=Time Comparison:\nRace is the leg duration measured from GPS, Omniscient is the course if one would know everything about the wind, Opportunist are courses if one decides to take a turn measuring the distance to the next mark, 1-Turners are the courses if one knows everything about the wind and just takes one turn -showNumberOfRacesScored=Показать количество завершенных гонок -racesScored=Завершенные гонки -racesScoredTooltip=Количество гонок завершенное участником в данной таблице лидеров -regattaNameMustNotContainSlashes=Regatta name must not contain slashes -averageNumberOfOperationsPerMessage=Average number of operations per message -showUncorrectedNetPoints=Show uncorrected net points -useStartTimeInference=Use start time inference from start mark passings -numberOfQueueMessagesSent=Number of queue messages sent -totalSize=Total Size -averageMessageSize=Average Size per message -totalNumberOfOperations=Total number of operations -currentOrAverageSpeedOverGroundInKnotsTooltip=Current speed over ground in knots while leg is still running; average speed over ground when leg is completed -currentOrAverageSpeedOverGroundInKnots=SOG (\u2205 at end) -connectors=Connectors -scoringSchemeHighPointFirstGetsTenOrEight=High Point, winner gets 10 points (or 8) -videoComponentShortName=Video -competitorSearchFilter=Competitor Search Filter -searchCompetitorsBySailNumberOrName=Search -goToEventOverview=Go to the event overview -goToOverviewAndSeeLeaderboard=Go to the overview and see all Races in one Leaderboard -noSuchEvent=No such event -leaderboardNotContainedInLeaderboardGroup=The leaderboard {0} is not contained in leaderboard group {1}. -leaderboardGroupNotContainedInEvent=The leaderboard group {0} is not contained in event {1}. -raceIsInLiveTimePanelMode=Race is Live -backToLiveTimePanelMode=Back to Live -windChart=Wind Chart -mediaNoVideosCaption=No Videos -mediaShowVideoCaption=Show Video -mediaShowVideoTooltip=Click to show video: {0} -mediaHideVideoCaption=Hide Video -mediaHideVideoTooltip=Click to hide video -mediaSelectVideoCaption={0} Videos -mediaSelectVideoTooltip=Click to select video -mediaManageMediaCaption=Manage Media -mediaManageMediaTooltip=Configure audio and video clips, synchronize times -showAll=Show all -raceVisibilityColumn=Visibility -enterCarryValueFor=Enter carried points for competitor {0} -advanced=Advanced -enterCourseAreaName=Enter course area name... -enterCourseName=Enter course name... -enterImageURL=Enter image URL... -enterVideoURL=Enter video URL... -enterSponsorImageURL=Enter sponsor image URL... -enterRaceName=Enter race name... -scoringSchemeHighPointFirstGetsTenOrEightDescription=Score in points. Winner scores 10 points, 2nd - 9 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. -serverError=An error occurred while attempting to contact the server. Please check your network connection and try again. -remoteProcedureCall=Remote Procedure Call -serverReplies=Server replies -errorCommunicatingWithServer=Error communicating with server -userManagement=User Management -regattaStructureImport=Regatta structure import -editSeries=Edit Series -filteredBy=filtered by -pleaseSelectAtLeastOneRegatta=Please select at least one regatta -pleaseSelectAnEvent=Please select an event -errorTryingToGetEvents=Error trying to get events: {0} -createDefaultSettingsForAllRegattas=Create default settings for all regattas... -noOverallEventSelected=No overall event selected... -errorTryingToCreateNewEvent=Error trying to create new event {0}: {1} -createNewEvent=Create New Event -noFleetsDefined=No fleets defined. -successfullyCreatedRegattas=Successfully created regattas -errorTryingToRegisterRacesForTracking=Error trying to register races {0} for tracking: {1}. Check live/stored URI syntax. -errorDeterminingPolarAvailability=Error determining availability of polar / VPP data for race {0}: {1} -error=Error -fileStorage=File Storage -active=Active -scoringSchemeHighPointEssOverallDescription=Score in points. Winner of an act scores 10 points, 2nd - 9 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. -timeBetweenRaceStartAndCompetitorStartInSeconds=Start delay -timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=Time between the start of the race and the time the competitor passed the start waypoint. Negative time suggests OCS. -useInternalAlgorithm=Use internal mark passing algorithm -editMarkPassings=Edit Mark Passings -editMarkPositions=Edit Mark Positions -removeFixedPassings=Remove fixed mark passing -setFixedPassing=Set time as mark passing -setSuppressedPassing=Suppress mark passing starting with current -removeSuppressedPassing=Remove suppressed mark passing -errorRemovingFixedPassing=Error removing fixed mark passing: {0} -errorSettingFixedPassing=Error setting fixed mark passing: {0} -errorSuppressingPassing=Error suppressing mark passings: {0} -errorRemovingSupressedPassing=Error removing suppressed mark passings: {0} -errorTryingToObtainMarkPassing=Error trying to obtain mark passings: {0} -errorTryingToObtainRaceLogMarkPassingData=Error trying to obtain race log mark passing data: {0} -email=эмаль -pleaseEnterAnEmail=Пожалуйста, введите эмаль -inviteCompetitors=приглашать Участники -inviteSelectedCompetitors=Invite selected competitors -notAllCompetitorsProvideEmail=Not all competitors provide an E-Mail -sendingMailsFailed=Sending Mails failed -sendingMailsSuccessful=Successfully sent E-Mails -selectEventForInvitation=Select Event for Invitation -imageURL=Image URL -upload=Upload -removeResult=Remove operation: {0} {1} -uploadSuccessful=Upload successful -fileUploadResult=File upload: {0} {1}.\nIn case of error please check that your File Storage service is properly configured. -removeUploadedFile=Remove uploaded file -showCompetitorSailIdColumn=Show Competitor Sail Id -showCompetitorFullNameColumn=Show Competitor Full Name -loadingDimensionValues=Loading dimension values -runningQuery=Running Query -inviteBuoyTenders=Invite Buoy Tenders -orMultipleEmails=or multiple E-Mails separated by comma -courseOverGroundTrueDegreesTooltip=True course over ground in degrees +competitorsAnalytics=Анализ участников +mediaNoContent=Фото или видео пока недоступны. +media=Мультимедиа +photos=Фото +videos=Видео +image=Изображение +images=Изображения +video=Видео +flagImageURL=URL-адрес изображения флага (визуализируется с разрешением 18x12 пикс.) +imageURLs=URL-адреса изображений +videoURLs=URL-адреса видео +sponsorImageURLs=URL-адреса изображений спонсоров +invalidSelection=Текущий выбор недопустим. +advancePassId=Ид. досрочного прохождения +pleaseSelectAScoringResult=Выберите результат оценки... +timeZone=Часовой пояс +eventOfficialWebsiteURL=URL-адрес официального веб-сайта +eventSailorsInfoWebsiteURL=URL-адрес веб-сайта сведений о мореходах +eventOverviewURL=URL-адрес обзора события +eventLogoImageURL=URL-адрес изображения логотипа +showPingMarkMappings=Показать сопоставления для проверенных отметок +regattaNameMustNotContainSlashes=Название регаты не должно содержать символы косой черты +showNumberOfRacesScored=Число оцененных гонок +errorFetchingWindStreamletData=Ошибка при извлечении данных потока ветра: {0} +showWindStreamletOverlay=Показать наложение потоков ветра +showWindStreamletColors=Цвет потока соответствует скорости ветра +showSimulationOverlay=Показать наложение симуляции +simulationLegendTooltip=Сравнение времени:\nгонка — это продолжительность отрезка, измеренная по данным GPS, "Всезнайка" — курс при наличии всех сведений о ветре, "Авантюрист" — курсы при принятии решения сделать поворот для измерения дистанции до следующей отметки, "1 поворот" — курсы с одним поворотом при наличии всех сведений о ветре +racesScored=Оцененные гонки +racesScoredTooltip=Число гонок, которые участник завершил или за которые имеет оценки в данной таблице лидеров. +averageNumberOfOperationsPerMessage=Среднее число операций на сообщение +showUncorrectedNetPoints=Показать неисправленные точки сети +setStartTimeReceived=Установить полученное время старта +setStartTimeReceivedDescription=Устанавливает полученное время старта для выбранной отслеживаемой гонки, которое не хранится постоянно. Это значит, что после перезагрузки сервера новое значение будет забыто. +lastScoreCorrectionsTime=Последнее время исправления оценки +lastScoreCorrectionsComment=Комментарий последнего исправления оценки +setTimeToNow=Установить время "сейчас" +useStartTimeInference=Использовать вывод о времени старта из прохождений стартовой отметки +numberOfQueueMessagesSent=Число отправленных сообщений очереди +totalSize=Общий размер +averageMessageSize=Средний размер сообщения в байтах +totalNumberOfOperations=Общее число операций +currentOrAverageSpeedOverGroundInKnotsTooltip=Текущая скорость относительно грунта в узлах во время прохождения отрезка; средняя скорость относительно грунта по завершении отрезка +currentOrAverageSpeedOverGroundInKnots=SOG (\u2205 в конце) +connectors=Соединители +videoComponentShortName=Видео +competitorSearchFilter=Фильтр поиска участников +searchCompetitorsBySailNumberOrName=Поиск +goToEventOverview=Перейти к обзору события +goToOverviewAndSeeLeaderboard=Переход к обзору и просмотр всех гонок в одной таблице лидеров +noSuchEvent=Нет такого события +leaderboardNotContainedInLeaderboardGroup=Таблица лидеров {0} не входит в группу таблиц лидеров {1}. +leaderboardGroupNotContainedInEvent=Группа таблиц лидеров {0} не содержится в событии {1}. +raceIsInLiveTimePanelMode=Гонка активна +backToLiveTimePanelMode=Вернуться в оперативный режим +windChart=Диаграмма ветра +mediaNoVideosCaption=Нет видео +mediaShowVideoCaption=Показать видео +mediaShowVideoTooltip=Щелкните, чтобы показать видео: {0} +mediaHideVideoCaption=Скрыть видео +mediaHideVideoTooltip=Щелкните, чтобы скрыть видео +mediaSelectVideoCaption={0} видео +mediaSelectVideoTooltip=Щелкните, чтобы выбрать видео +mediaManageMediaCaption=Управление мультимедиа +mediaManageMediaTooltip=Настройка аудио- и видеоклипов, синхронизация времени +showAll=Показать все +raceVisibilityColumn=Видимость +enterCarryValueFor=Введите перенесенные баллы для участника {0} +advanced=Дополнительно +basedOn=на базе +retrieveWith=Получить с помощью +mappingDetails=Подробности сопоставления +deviceMappingQrCodeExplanation=Если используется приложение отслеживания, можно добавить также сопоставление устройства, выбрав участника/отметку, установив интервал времени, а затем отсканировав этот QR-код. +qrCode=QR-код +enterCourseAreaName=Ввести название зоны гонки... +enterCourseName=Ввести название курса... +enterImageURL=Ввести URL-адрес изображения... +enterVideoURL=Ввести URL-адрес видео... +enterSponsorImageURL=Ввести URL-адрес изображения спонсора... +enterRaceName=Ввести название гонки... +serverError=При попытке обратиться к серверу возникла ошибка. Проверьте подключение к сети и повторите попытку. +remoteProcedureCall=Удаленный вызов процедуры +serverReplies=Ответы сервера +errorCommunicatingWithServer=Ошибка связи с сервером +userManagement=Управление пользователями +regattaStructureImport=Импорт структуры регаты +filteredBy=отфильтровано по +editSeries=Изменить серию +pleaseSelectAtLeastOneRegatta=Выберите не менее одной регаты +pleaseSelectAnEvent=Выберите событие +errorTryingToGetEvents=Ошибка при попытке получить события: {0} +showXYDiagram=Показать диаграмму x-y +xyDiagram=Диаграмма x-y +boatSpeed=Скорость лодки +confidence=Достоверность +createDefaultSettingsForAllRegattas=Создать настройки по умолчанию для всех регат... +noOverallEventSelected=Не выбрано общее событие... +errorTryingToCreateNewEvent=Ошибка при попытке создать новое событие {0}: {1} +createNewEvent=Создать новое событие +noFleetsDefined=Не определены флоты. +successfullyCreatedRegattas=Регаты успешно созданы +errorTryingToRegisterRacesForTracking=Ошибка при попытке зарегистрировать гонки {0} для отслеживания: {1}. проверьте синтаксис URI оперативных/хранимых данных. +errorDeterminingPolarAvailability=Ошибка при определении доступности полярных/VPP данных для гонки {0}: {1} +error=Ошибка +fileStorage=Хранилище файлов +active=Активно +scoringSchemeHighPointEssOverallDescription=Оценка в баллах. Победитель в акте получает 10 баллов, 2-й — 9 баллов, .... Любая ничья в общей оценке Extreme Sailing Series разрешается в пользу участника с наибольшим числом побед в актах. В случае равенства числа побед для разрешения используется последний акт. +timeBetweenRaceStartAndCompetitorStartInSeconds=Задержка старта +timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=Время между стартом гонки и временем, когда участник проходит путевую точку старта. Отрицательное время означает ранний старт (OCS). +useInternalAlgorithm=Использовать внутренний алгоритм прохождения отметки +editMarkPassings=Изменить прохождения отметок +editMarkPositions=Изменить позиции отметок +removeFixedPassings=Удалить прохождение фиксированной отметки +setFixedPassing=Установить время как прохождение отметки +setSuppressedPassing=Подавить прохождение отметки, начиная с текущей +removeSuppressedPassing=Удалить подавленное прохождение отметки +errorRemovingFixedPassing=Ошибка при удалении прохождения фиксированной отметки: {0} +errorSettingFixedPassing=Ошибка при настройке прохождение фиксированной отметки: {0} +errorSuppressingPassing=Ошибка при подавлении прохождений отметок: {0} +errorRemovingSupressedPassing=Ошибка при удалении подавленных прохождений отметок: {0} +errorTryingToObtainMarkPassing=Ошибка при попытке получить прохождения отметок: {0} +errorTryingToObtainRaceLogMarkPassingData=Ошибка при попытке получить данные журнала гонки о прохождении отметок: {0} +email=Эл. почта +pleaseEnterAnEmail=Введите электронную почту. +inviteCompetitors=Пригласить участников +inviteSelectedCompetitors=Пригласить выбранных участников +notAllCompetitorsProvideEmail=Не все участники указали эл. почту +sendingMailsFailed=Сбой отправки сообщений +sendingMailsSuccessful=Сообщения эл. почты успешно отправлены +selectEventForInvitation=Выберите событие для приглашения +imageURL=URL-адрес изображения +upload=Отправить +removeResult=Удалить операцию: {0} {1} +uploadSuccessful=Отправлено успешно +fileUploadResult=Отправка файла: {0} {1}.\nВ случае ошибки проверьте правильность конфигурации службы хранилища файлов. +removeUploadedFile=Удалить отправленный файл +showCompetitorSailIdColumn=Ид. паруса +showCompetitorFullNameColumn=Полное имя участника +loadingDimensionValues=Загрузка значений измерения +runningQuery=Выполнение запроса +inviteBuoyTenders=Пригласить лоцманов +orMultipleEmails=или несколько адресов эл. почты через запятую +courseOverGroundTrueDegreesTooltip=Истинный курс относительно грунта в градусах courseOverGroundTrueDegrees=COG -distanceIncludingGateStartInMeters=Distance (w/ Gate Start) -distanceTraveledIncludingGateStartTooltip=The distance traveled from the leg start to the end\nor to the current time point, if the leg isn''t finished.\nIf the leg includes a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. -raceDistanceTraveledIncludingGateStartTooltip=The distance traveled from the race start to the end\nor to the current time point, if the race isn''t finished. For a gate start, the distance from the pin end to the starting position is included\nto make competitors comparable even when started at different times. -results=Results -groupName=Group Name -valueAscending=Value (Ascending) -valueDescending=Value (Descending) -sortBy=Sort by -dashboardHeader=Dashboard -dashboardNoWindBotAvailableHeader=Wind Bot not available. -dashboardNoWindBotAvailableMessage=To receive live wind data from wind measurement units, ensure that the wind bot is switched on and connected to the SAP Sailing Analytics. -dashboardWindBot=Wind Bot +distanceIncludingGateStartInMeters=Дистанция (при старте через ворота) +distanceTraveledIncludingGateStartTooltip=Дистанция, пройденная от начала отрезка до конца\nили до текущего момента времени, если отрезок не завершен.\nЕсли отрезок включает старт через ворота, дистанция от отметки до стартовой позиции включается,\nчтобы обеспечить сравнение участников даже при старте в разное время. +raceDistanceTraveledIncludingGateStartTooltip=Дистанция, пройденная от начала гонки до конца\nили до текущего момента времени, если гонка не завершена.\nДля старта через ворота включается дистанция от привязки до стартовой позиции,\nчтобы обеспечить сравнение участников даже при старте в разное время. +results=Результаты +groupName=Название группы +valueAscending=Значение (по возрастанию) +valueDescending=Значение (по убыванию) +sortBy=Сортировать по +dashboardHeader=Панель +dashboardNoWindBotAvailableHeader=WindBot недоступен. +dashboardNoWindBotAvailableMessage=Чтобы получать оперативные данные от устройств измерения ветра, убедитесь, что WindBot включен и подключен к SAP Sailing Analytics. +dashboardWindBot=WindBot dashboardTrueWindSpeed=TWS dashboardTrueWindDirection=TWD -dashboardTrueWindSpeedUnit=kts -dashboardTrueWindDirectionUnit=deg -dashboardLiveWind=live -dashboardAverageWind=average -dashboardAverageWindMinutes=({0} minutes) -dashboardWindChartHint=Tap on chart to change interval -dashboardStartAnalysesHeader=Start Analyses -dashboardSelectCompetitor=Select Competitor -dashboardNewStartAnalysisAvailable=New start analysis available -dashboardNoStartAnalysesAvailableHeader=No Start Analyses available. -dashboardNoStartAnalysesAvailableMessage=There is a Start Analysis created from each race start. Please stand by till racing has been started. -dashboardNoStartlineAdvantagesByWindAvailableHeader=No Startline Advantages available. -dashboardNoStartlineAdvantagesByWindAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee. -dashboardNoStartlineAdvantagesByGeometryAvailableHeader=No Startline Advantage available. -dashboardNoStartlineAdvantagesByGeometryAvailableMessage=For calculating the startline advantage there needs to be a course set by the race commitee. -dashboardStartlineAdvantagesByWindHeader=Startline Advantages by Wind -dashboardStartlineAdvantageByGeometryHeader=Startline Advantage by Geometry -dashboardRankAtFirstMark=Rank at first mark -dashboardTeam=Team -dashboardDistanceToLineInM=Distance to line in m -dashboardSpeedInKts=Speed in kts -dashboardAdvantageInSeconds = Advantage in m -dashboardSecondsAbreviation = s -dashboardDistanceToRCBoat = Distance to rc boat in m -dashboardPinEnd = Pin End -dashboardRCBoat = RC Boat -fixedMarkPassing=(fixed) -suppressedMarkPassing=(suppressed) -windUp=Wind-Up (show wind from top of map) -filterBy=Filter by -currentFilterSelection=Current filter selection -notCapableOfGeneratingACodeForIdentifier=I''m not capable of generating a code for this identifier. -serverUrl=Server URL -rotatedFromTrueNorthClickToToggleWindUp=Rotated {0} degrees from true north.\nTap/click to toggle between wind-up and north-up map display -startLineToFirstMarkTriangle=Start to first mark ({0}m) -dataMiningComponentsHaveBeenUpdated=The Data-Mining components have been updated -dataMiningComponentsNeedReloadDialogMessage=Click Reload to reload the components now. This will discard the current displayed data and run a default query.\nClick Close to do nothing. The Data-Mining won''t work correctly, until the components have been reloaded. -noDataForEvent=There isn''t any data for the event yet. -countriesCount={0,number} countries -countriesCount[one]={0,number} country -racesCount={0,number} races -racesCount[one]={0,number} race -trackedRacesCount={0,number} tracked races -trackedRacesCount[one]={0,number} tracked race -eventsCount={0,number} events -eventsCount[one]={0,number} event -competitorsCount={0,number} competitors -courseAreaName=Зона курса: {0} -competitorsCount[one]={0,number} competitor -currentOfTotalLegs=Этап {0,number}/{1,number} -clone=Clone -changed=Changed -matcher=Matcher -any=Any -urlProviders=URL-based result providers -pleaseSelectAURLProvider=Please select a URL-based result provider... -sampleURL=Sample URL: {0} -sapSportsOn=SAP Sports on -followSapSports=Follow SAP Sports -liveNow=Прямой эфир -analyseRace=анализировать Гонка -nextRaceStartingIn=Next race starts in -startingIn={0} starts in -raceIsPlanned=Planned -raceIsCanceled=Canceled -raceIsPostponed=Postponed -startingInMinutes=Starts in {0,number} min -startingInMinutes[none]=Starting now -latestNews=Последние Новости -resultsUpdate=Результаты обновление -competitorWonRace={0} won race -showCompetitorTimeOnTimeFactorColumn=Time on Time Factor -showCompetitorTimeOnDistanceAllowanceColumn=Time on Distance Allowance -rankingMetric=Ranking -oneDesignRankingMetric=One-Design -orcPerformanceCurveRankingMetric=ORC Performance Curve -timeOnTimeAndDistanceRankingMetric=Time-on-Time/Time-on-Distance -oneDesignRankingMetricDescription=One-Design: First across the line wins;\nin-race ranks based on windward positions (upwind/downwind) or along-course position (reaching) -orcPerformanceCurveRankingMetricDescription=ORC Performance Curve: Sophisticated handicapping scheme that awards time allowances based on a VPP/polar assuming pre-defined legs'' angles to the wind;\nbased on these allowances, an "implied wind" is calculated which is the basis for ranking.\nImplied wind can be calculated at any time in the race and is therefore the basis for in-race ranking. -timeOnTimeAndDistanceRankingMetricDescription=Time-on-Time / Time-on-Distance: Final ranking by calculated time;\ntime is calculated by optionally applying a factor to the actual time (defaulting to 1.0)\nand subtracting an allowance in seconds per nautical mile,\napplied to the course length.\nIn-race ranks based on expected arrival at fastest boat's current position\nassuming current leg's average VMG/VMC. -timeOnTimeFactor=Time-on-time handicap factor -timeOnDistanceAllowanceInSecondsPerNauticalMile=Time-on-distance handicap allowance in seconds per nautical mile -timeOnTimeFactorTooltip=Time-on-Time factor; actual time is multiplied with this factor in calculated time formula -timeOnDistanceAllowanceInSecondsPerNauticalMileTooltip=Time-on-Distance allowance in seconds per nautical mile;\ndistance sailed is multiplied with this allowance, and the resulting seconds are subtracted from the actual time sailed\n(optionally calculated by applying the time-on-time factor) in the calculated time formula -calculatedTimeTraveled=Calculated Time -calculatedTimeTraveledTooltip=Calculated time according to competitor''s handicap\nbased on time since start of race and (windward) distance traveled -raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSeconds=Calc.Time @ Fastest -raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSecondsTooltip=Calculated time at estimated arrival at the competitor that is currently farthest ahead in the race;\nestimation based on average VMG in current leg and equal (calculated) performance to fastest boat in all subsequent legs -sailorInfo=Моряки информация -sailorInfoLongText=Official Results, Protests,\nNotice Board, Sailor weather: -eventQuickfinder=Event Quickfinder -regattaQuickfinder=Regatta Quickfinder -resultsQuickfinder=Results Quickfinder -racesQuickfinder=Races Quickfinder -statistics=Statistics -impressions=Impressions -notAvailableOnMobileMessage=This content is not available on mobile.\nSwitch to the desktop version? -gotoDesktop=Go to desktop version -goBack=Go back -showAllX=Show all {0} -collapseX=Collapse {0} -numberOfGPSFixes=GPS fixes -fastestSailor=Fastest -numberWindFixes=Wind fixes -sailedMiles=Sailed miles -millionValue={0,number,#0.0} млн -billionValue={0,number,#0.0} млрд -noResults=There are no results available yet. -noNews=There are no news available. -pointsValue={0,number,#0.00} -openLeaderboard=Open Leaderboard -now=в настоящее время -minutesAgo={0} минут назад -hoursAgo={0} h часов назад -winner=победитель +dashboardTrueWindSpeedUnit=уз +dashboardTrueWindDirectionUnit=град. +dashboardLiveWind=активно +dashboardAverageWind=ср. +dashboardAverageWindMinutes=({0} мин.) +dashboardWindChartHint=Коснитесь диаграммы, чтобы изменить интервал +dashboardSelectCompetitor=Выбор участника +dashboardStartAnalysesHeader=Анализы старта +dashboardNewStartAnalysisAvailable=Доступен новый анализ старта +dashboardNoStartAnalysesAvailableHeader=Анализы старта недоступны. +dashboardNoStartAnalysesAvailableMessage=Анализ старта создается из каждого старта гонки. Дождитесь начала гонки. +dashboardNoStartlineAdvantagesByWindAvailableHeader=Преимущества на линии старта недоступны. +dashboardNoStartlineAdvantagesByWindAvailableMessage=Для расчета преимущества на линии старта необходим курс, установленный гоночным комитетом. +dashboardNoStartlineAdvantagesByGeometryAvailableHeader=Преимущество на линии старта недоступно. +dashboardNoStartlineAdvantagesByGeometryAvailableMessage=Для расчета преимущества на линии старта необходим курс, установленный гоночным комитетом +dashboardStartlineAdvantagesByWindHeader=Преимущества в ветре на линии старта +dashboardStartlineAdvantageByGeometryHeader=Преимущества в геометрии на линии старта +dashboardRankAtFirstMark=Ранг на первой отметке +dashboardTeam=Команда +dashboardDistanceToLineInM=Дистанция до линии в км +dashboardSpeedInKts=Скорость в узлах +dashboardAdvantageInSeconds=Преимущество в м +dashboardSecondsAbreviation=с +dashboardDistanceToRCBoat=Дистанция до лодки ГК в км +dashboardPinEnd=Привязка +dashboardRCBoat=Лодка ГК +fixedMarkPassing=(фиксировано) +suppressedMarkPassing=(подавляется) +windUp=На ветер (показать ветер сверху карты) +filterBy=Фильтровать по +currentFilterSelection=Текущий выбор фильтра +notCapableOfGeneratingACodeForIdentifier=Я не могу сгенерировать код для этого идентификатора. +serverUrl=URL-адрес сервера +rotatedFromTrueNorthClickToToggleWindUp=Повернуто на {0} град. от истинного севера.\nКоснитесь/щелкните для переключения между отображением карты с ветром или севером вверху +startLineToFirstMarkTriangle=От старта до первой отметки ({0} м) +dataMiningComponentsHaveBeenUpdated=Компоненты добычи данных обновлены. +dataMiningComponentsNeedReloadDialogMessage=Щелкните "Перезагрузить", чтобы перезагрузить компоненты сейчас. Текущее отображение данных будет сброшено с выполнением запроса по умолчанию. Добыча данных не будет работать правильно до перезагрузки компонентов. +noDataForEvent=Данных для данного события еще нет. +countriesCount={0,number} стран +countriesCount[one]={0,number} страна +racesCount={0,number} гонок +racesCount[one]={0,number} гонка +trackedRacesCount={0,number} отслеживаемых гонок +trackedRacesCount[one]={0,number} отслеживаемая гонка +eventsCount={0,number} событий +eventsCount[one]={0,number} событие +competitorsCount={0,number} участников +courseAreaName=Зона гонки: {0} +competitorsCount[one]={0,number} участник +currentOfTotalLegs=Отрезок {0,number}/{1,number} +clone=Клон +changed=Изменено +matcher=Совпадение +any=Любое +urlProviders=Поставщики результатов на базе URL-адресов +pleaseSelectAURLProvider=Выберите поставщика результатов на базе URL-адреса... +sampleURL=Образец URL-адреса: {0} +sapSportsOn=SAP Sports по адресу +followSapSports=Отслеживать SAP Sports +liveNow=Оперативные данные +analyseRace=Анализировать гонку +nextRaceStartingIn=Следующая гонка начинается через +startingIn={0} начинается через +raceIsPlanned=Запланировано +raceIsCanceled=Отменено +raceIsPostponed=Отложено +startingInMinutes=Начинается через {0,number} мин. +startingInMinutes[none]=Начиная сейчас +latestNews=Последние новости +resultsUpdate=Обновление результата +competitorWonRace=Выиграно гонок: {0} +showCompetitorTimeOnTimeFactorColumn=Фактор время-время (ToT) +showCompetitorTimeOnDistanceAllowanceColumn=Фактор время-дистанция (ToD) +rankingMetric=Ранг +oneDesignRankingMetric=Монотип +orcPerformanceCurveRankingMetric=Кривая эффективности ORC +timeOnTimeAndDistanceRankingMetric=Время-время/Время-дистанция +oneDesignRankingMetricDescription=Монотип: первый пересекший линию побеждает;\nранги в гонке основаны на позиции к ветру (наветренная/подветренная) или позиции на курсе (полный ветер) +orcPerformanceCurveRankingMetricDescription=Кривая эффективности ORC: сложная схема гандикапа, предоставляющая фору с учетом VPP/полярных данных для предварительно определенных углов отрезков к ветру;\nна основе этих допусков рассчитывается "подразумеваемый ветер", используемый как основа для ранжирования.\nПодразумеваемый ветер можно рассчитать в любое время в ходе гонки, поэтому он является основой для ранжирования в гонке. +timeOnTimeAndDistanceRankingMetricDescription=Время-время/Время-дистанция: окончательное ранжирование по расчетному времени;\nвремя рассчитывается путем необязательного применения коэффициента к фактическому времени (по умолчанию 1,0)\nи вычитания допуска в секундах на морскую милю\nк длине курса.\nРанги в гонке основаны на ожидаемом прибытии на текущую позицию самой быстрой лодки\nс учетом средних значений VMG/VMC текущего отрезка. +timeOnTimeFactor=Фактор ToT +timeOnDistanceAllowanceInSecondsPerNauticalMile=Допуск ToD +timeOnTimeFactorTooltip=Фактор время-время; в формуле расчета времени фактическое время умножается на этот коэффициент +timeOnDistanceAllowanceInSecondsPerNauticalMileTooltip=Допуск время-дистанция в секундах на морскую милю;\nв формуле расчета времени пройденная дистанция умножается на этот допуск, и полученное число секунд вычитается из фактического времени хода\n(необязательно рассчитывается применением коэффициента время-время) +calculatedTimeTraveled=Расчетное время +calculatedTimeTraveledTooltip=Расчетное время с учетом гандикапа участника\nна основе времени от старта гонки и пройденной (по ветру) дистанции +raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSeconds=Расч. время самой быстрой лодки +raceCalculatedTimeAtEstimatedArrivalAtCompetitorFarthestAheadInSecondsTooltip=Расчетное время ожидаемого прибытия в позицию текущего лидера гонки;\nоценка основана на среднем значении VMG на текущем отрезке и (расчетной) эффективности, равной эффективности самой быстрой лодки, на всех последующих отрезках +sailorInfo=Сведения о мореходе +sailorInfoLongText=Официальные результаты, протесты,\nдоска уведомлений, погода: +eventQuickfinder=Быстрый поиск событий +regattaQuickfinder=Быстрый поиск регат +resultsQuickfinder=Быстрый поиск результатов +racesQuickfinder=Быстрый поиск гонок +statistics=Статистика +impressions=Впечатления +notAvailableOnMobileMessage=Это содержимое недоступно на мобильных устройствах.\nПерейти на версию для рабочего стола? +gotoDesktop=Перейти на версию для рабочего стола +goBack=Назад +showAllX=Показать все {0} +collapseX=Свернуть {0} + +numberOfGPSFixes=Замеры GPS +fastestSailor=Самый быстрый +numberWindFixes=Замеры ветра +sailedMiles=Пройдено миль +millionValue={0,number,#0.0} mil +billionValue={0,number,#0.0} bil +noResults=Результаты пока недоступны. +noNews=Новости пока недоступны. +pointsValue={0,number,#0.00} +openLeaderboard=Открыть таблицу лидеров +now=Сейчас +minutesAgo={0} мин. назад +hoursAgo={0} ч. назад +winner=Победитель durationPlain=Продолжительность -finishedRaces=Finished Races -selectCompetitor=Please select one competitor -all=All -points=Points -numberOfRacesShort=# Races -courseGeometry=Course Geometry -degreesToWind={0}° to wind -setTrackingTimes=Set tracking times -startOfTracking=Start of tracking -endOfTracking=End of tracking -miniLeeaderboardLegendText=Shows points along with the number of races per competitor +finishedRaces=Завершенные гонки +selectCompetitor=Выберите одного участника +all=Все +points=Баллы +numberOfRacesShort=Гонки +courseGeometry=Геометрия курса +degreesToWind={0}° к ветру +miniLeeaderboardLegendText=Показывает баллы и число гонок каждого участника currentOfTotal={0,number}/{1,number} -noFinishedRaces=There are no finished races yet -racesOverview=Races overview -listFormatLabel=List format -competitionFormatLabel=Competition format -empty=Empty -runAQuery=Run a Query -latestRegattaStandings=Latest Regatta Standings -plainText=Plain Text -columnChart=Column Chart -choosePresentation=Choose Presentation -cantDisplayDataOfType=Can''t display data of type {0} -shownDecimals=Shown Decimals -openFullscreenView=Open fullscreen view -closeFullscreenView=Close fullscreen view -progress=Progress -videosCount={0,number} videos -videosCount[one]={0,number} video -photosCount={0,number} photos -photosCount[one]={0,number} photo -eventsHaveTakenPlace={0} events have taken place -eventsHaveTakenPlace[one]= One event has taken place -raceOffice=Race Office -analyze=Analyze -dataMiningSettings=Data Mining Settings -multiResultsPresenter=Multi Results Presenter -plainResultsPresenter=Plain Results Presenter -resultsChart=Results Chart -tabbedResultsPresenter=Tabbed Results Presenter -polarResultsPresenter=Polar Results Presenter -dataMiningRetrieval=Data Retrieval -actionWatch=Watch -actionAnalyze=Analyze -viewQueryDefinition=View Query Definition -queryDefinitionViewer=Query Definition Viewer -flightsCount={0,number} flights -flightsCount[one]={0,number} flight -groupAverageAscending=Group Average (Ascending) -groupAverageDescending=Group Average (Descending) -groupMedianAscending=Group Median (Ascending) -groupMedianDescending=Group Median (Descending) -resultsFoundForSearch= {0,number} results found for ''{1}'' -resultsFoundForSearch[one]= {0,number} result found for ''{1}'' -runPredefinedQuery=Run Predefined Query -selectPredefinedQuery=Select Predefined Query -predefinedQueryRunner=Predefined Query Runner -developerOptions=Developer Options -copyToClipboard=Copy to Clipboard -code=Code -useClassGetName=Use Class.getName() for type names -useClassGetNameTooltip=More robust against changes in the code base, but the code snippet can only be used in the scope where the classes are available. -useStringLiterals=Use string literals for type names -useStringLiteralsTooltip=The code snippet can be used anywhere, but it will break if the code base changes. -errorLoadingDataWithTryAgain=Error loading data. Trying again in a few moments. -addGalleryPhoto=Add gallery photo -addStageImage=Add stage image -addTeaserImage=Add teaser image -addEventLogo=Add event logo -noImagesDefinedYet=No images defined yet -imageSizeError=The size of the {0} image does not fit. The width should be between {1} and {2} px and the height between {3} and {4} px. -couldNotRetrieveImageSizeYet=The width and height of the image could not be retrieved yet. -pleaseOnlyUploadContentYouHaveAllUsageRightsFor=Please only upload content you have all usage rights for. Remember that content may be cropped. -selectALeaderboardGroup=Select a leaderboard group... -pleaseSelect=Please select -requiresValidRegatta=This page requires a valid regatta, race column and fleet name to identify the race to show. -couldNotObtainRace=Could not obtain a race with name {1} for fleet {2} for a regatta with name {0}: {3} -errorTryingToCreateEmbeddedMap=Error trying to create the embedded map: {0} -topN=Top {0} -transparentBufferLineOnHover=Transparent buffer lines on hover of helplines -bufferLineStrokeWeight=Buffer line stroke weight -profile=профиль -confirmLosingCompetitorEditsWhenTogglingLogBasedView=This will reset your current, unsaved changes to the competitors.\nDo you really want to continue? -removalOfMarkDisabledMayBeUsedInRaces=Removal deavticated, marks are used in races {0} -scoringSchemeHighPointFirstGetsTwelveOrEight=High Point, winner gets 12 points (or 8) -scoringSchemeHighPointFirstGetsTwelveOrEightDescription=Score in points. Winner scores 12 points, 2nd - 11 points, .... A tie is broken in favour of the competitor having won most races, if tie remains then tie is broken by the rank in the last race scored. -scoringSchemeHighPointEssOverall12=High Point System ESS Overall (12) -scoringSchemeHighPointEssOverall12Description=Score in points. Winner of an act scores 12 points, 2nd - 11 points, .... Any tie in the overall Extreme Sailing Series is broken in favour of the competitor with the most Act wins. If that does not break the tie, the result in the last Act will be used. -createDefaultLeaderboardGroup=Would you like to create a default LeaderboardGroup for your event? -pleaseCreateAtLeastOneMappingBy=Please create at least one mapping by first selecting a track on the left hand side and then selecting a mark or competitor on the right hand side -matcherType=Matcher type -matchingDevices=Matching devices -addDevice=Add Device -createDeviceConfiguration=Create Device Configuration -forWhichDeviceShouldConfigurationApply=Specify for which device the new configuration should apply -create=Create -thereIsAlreadyAConfigurationForThisDevice=There is already a configuration for this device. -enterDeviceIdentifierName=Enter an identifier name -administration=Администрация -pleaseSelectALeaderboardGroup=Please select a leaderboard group -linkLeaderboardToLeaderboardGroupOfEvent=Link Leaderboard to Leaderboard Group of Event -doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Link leaderboard {0} to a leaderboard group of event {1} -failedToLinkLeaderboardToLeaderboardGroup=Failed to link leaderboard {0} to leaderboard group {1} -createDefaultRegatta=Create default regatta -doYouWantToCreateADefaultRegatta=Do you want to create a default Regatta? -defaultLocale=Default -defaultSailorsInfoLinkInfoText=The default link is used unless a language specific overwrite exists. If no default exists, there will be no link for languages that do not explicitly have one set. -qrSync=QR-Sync -thereIsNoIdentifierSet=There is no identifier set. -couldNotObtainAccessTokenForUser=Could not obtain access token for user {0} -raceManagerDeviceName=Device Name -serverURLInvalid=Please enter a valid Server URL -playstoreBadge=https://play.google.com/intl/ru/badges/images/generic/ru-play-badge.png -appstoreBadgeSuffix=_ru +noFinishedRaces=Завершенных гонок еще нет +racesOverview=Обзор гонок +listFormatLabel=Формат списка +competitionFormatLabel=Формат соревнования +empty=Пусто +runAQuery=Выполнить запрос +latestRegattaStandings=Позиции в последней регате +plainText=Простой текст +columnChart=Столбчатая диаграмма +choosePresentation=Выберите представление +cantDisplayDataOfType=Невозможно отобразить данные типа {0} +shownDecimals=Отображаемые десятичные разряды +openFullscreenView=Открыть полноэкранный режим +closeFullscreenView=Закрыть полноэкранный режим +progress=Ход выполнения +videosCount={0,number} видео +videosCount[one]={0,number} видео +photosCount={0,number} фото +photosCount[one]={0,number} фото +eventsHaveTakenPlace=Имело место {0} событий +eventsHaveTakenPlace[one]=Имело место одно событие +raceOffice=Служба гонки +analyze=Анализировать +dataMiningSettings=Параметры добычи данных +multiResultsPresenter=Презентатор множества результатов +plainResultsPresenter=Презентатор простых результатов +resultsChart=Диаграмма результатов +tabbedResultsPresenter=Презентатор результатов со вкладками +polarResultsPresenter=Полярный презентатор результатов +dataMiningRetrieval=Извлечение данных +actionWatch=Смотреть +actionAnalyze=Анализировать +denoteAllRacesForRaceLogTrackingShorctut=Ярлык для отмена отслеживания журналов всех гонок +registerCompetitors=Регистрация участников +doYouWantToCreateADefaultRegattaLeaderboard=Создать таблицу лидеров регаты по умолчанию? +copyCourse=Копировать курс +copyCompetitors=Копировать участников +smartphoneTracking=Отслеживание смартфона +flightsCount={0,number} полетов +flightsCount[one]={0,number} полет +viewQueryDefinition=Просмотреть определение запроса +queryDefinitionViewer=Средство просмотра определения запроса +groupAverageAscending=Среднее группы (по возрастанию) +groupAverageDescending=Среднее группы (по убыванию) +groupMedianAscending=Медиана группы (по возрастанию) +groupMedianDescending=Медиана группы (по убыванию) +resultsFoundForSearch=Найдено {0,number} результатов для ''{1}'' +resultsFoundForSearch[one]=Найден {0,number} результат для ''{1}'' +runPredefinedQuery=Выполнить готовый запрос +selectPredefinedQuery=Выбрать готовый запрос +predefinedQueryRunner=Средство выполнения готовых запросов +developerOptions=Параметры разработчика +copyToClipboard=Копировать в буфер обмена +code=Код +useClassGetName=Использовать Class.getName() для имен типов +useClassGetNameTooltip=Более надежно по сравнению с изменениями в основании кода, но фрагмент кода может быть использован только в области с доступными классами. +useStringLiterals=Использовать строковые литералы для имен типов +useStringLiteralsTooltip=Фрагмент кода может использоваться где угодно, но будет нарушен в случае изменения основания кода. +errorLoadingDataWithTryAgain=Ошибка при загрузке данных. Повтор попытки через несколько секунд. +addGalleryPhoto=Добавить фото галереи +addStageImage=Добавить изображение этапа +addTeaserImage=Добавить изображение анонса +addEventLogo=Добавить логотип события +noImagesDefinedYet=Изображения еще не определены +imageSizeError=Размер изображения {0} не подходит. Ширина должна быть между {1} и {2} пикс., а высота между {3} и {4} пикс. +couldNotRetrieveImageSizeYet=Ширину и высоту изображения еще не удалось извлечь. +pleaseOnlyUploadContentYouHaveAllUsageRightsFor=Выкладывайте только контент, на использование которого у вас есть все права. Не забывайте о возможности кадрировать контент. +registerCompetitorsOnRace=Зарегистрировать участников в гонке (например, для гонок с разделением флота) +doYouWantToRegisterCompetitorsDirectlyOnTheRace=Зарегистрировать участников непосредственно в гонке? +doYouWantToDisableCompetitorsRegistrationsOnTheRace=Отключить регистрации участников в гонке? +warningDirectCompetitorRegistration=Внимание! Этот параметр приведет к регистрации участников этой гонки только в данной гонке. При регистрации в соответствующей регате они не будут автоматически зарегистрированы в данной гонке. +warningRegattaCompetitorRegistration=Внимание! Это приведет к повторной активации регистраций участника в регате. Все регистрации участника из регаты будут автоматически использованы как регистрация участника для данной гонки. +competitorRegistrationsOnRaceDisabled=Регистрации участника отключены для данной гонки. Чтобы включить, установите флажок слева. +addMarkToRegatta=Добавить отметку к регате +selectALeaderboardGroup=Выбрать группу таблиц лидеров... +pleaseSelect=Выберите +requiresValidRegatta=Эта страница определяет гонку для отображения по допустимым значениям регаты, столбца гонки и названия флота. +couldNotObtainRace=Не удалось получить гонку с названием {1} для флота {2} для регаты с названием {0}: {3} +errorTryingToCreateEmbeddedMap=Ошибка при попытке создать внедренную карту: {0} +topN=Первые {0} +transparentBufferLineOnHover=Прозрачные буферные линии при наведении на вспомогательные линии +bufferLineStrokeWeight=Вес штриха буферной линии +profile=Профиль +showOnlyCompetitorsOfLog=Показать только участников, зарегистрированных в журнале +confirmLosingCompetitorEditsWhenTogglingLogBasedView=Это приведет к сбросу текущих, не сохраненных изменений участников.\nПродолжить? +removalOfMarkDisabledMayBeUsedInRaces=Удаление деактивировано, отметки используются в гонках {0} +createDefaultLeaderboardGroup=Создать группу таблиц лидеров по умолчанию для вашего события? +pleaseCreateAtLeastOneMappingBy=Создайте хотя бы одно сопоставление, выбрав отслеживание слева, а затем отметку или участника справа +matcherType=Тип сопоставления +matchingDevices=Соответствующие устройства +addDevice=Добавить устройство +createDeviceConfiguration=Создать конфигурацию устройства +forWhichDeviceShouldConfigurationApply=Укажите, для какого устройства следует применить новую конфигурацию +create=Создать +thereIsAlreadyAConfigurationForThisDevice=Для этого устройства уже есть конфигурация. +enterDeviceIdentifierName=Введите имя идентификатора +administration=Администрирование +pleaseSelectALeaderboardGroup=Выберите группу таблиц лидеров +linkLeaderboardToLeaderboardGroupOfEvent=Связать таблицу лидеров с группой таблиц лидеров события +doYouWantToLinkLeaderboardToLeaderboardGroupOfEvent=Связать таблицу лидеров {0} с группой таблиц лидеров события {1} +failedToLinkLeaderboardToLeaderboardGroup=Не удалось связать таблицу лидеров {0} с группой таблиц лидеров {1} +createDefaultRegatta=Создать регату по умолчанию +doYouWantToCreateADefaultRegatta=Создать регату по умолчанию? +defaultLocale=По умолчанию +defaultSailorsInfoLinkInfoText=При отсутствии замен для конкретного языка используется ссылка по умолчанию. Если значения по умолчанию не существует, ссылок для языков, не имеющих одного явно заданного набора, не будет. +qrSync=QR-синхронизация +thereIsNoIdentifierSet=Не задан идентификатор. +couldNotObtainAccessTokenForUser=Не удалось получить токен для пользователя {0} +raceManagerDeviceName=Имя устройства +serverURLInvalid=Введите действительный URL-адрес сервера +serverURLEmpty=URL-адрес сервера пуст +marks=Отметки +addNewFix=Добавить новый замер +pleaseSelectOtherTimepoint=Выберите другой момент времени. На этой отметке шкалы времени уже есть замер. +confirmMove=Подтвердить движение +confirmNewFix=Подтвердить новый замер +selectAFixPositionBy=Выберите позицию замера, перетащив карту. Затем подтвердите или отмените действие с помощью кнопок ниже. +pleaseSelectAMark=Выберите отметку из списка слева. +markFixes=Замеры отметки +playstoreCampaign=utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions +playstoreTrackingApp=https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app +playstoreRacecommitteeApp=https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app +playStoreBuoypositioningApp=https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app +playstoreBadge=https://play.google.com/intl/en/badges/images/generic/en-play-badge.png +appstoreSapSailingInsight=http://appstore.com/sapsailinsight +appstoreStgTrainingstagebuch=http://appstore.com/stgtrainingstagebuch +appstoreBadgeSuffix=_en +distanceFromAveragePosition=Дистанция от средней позиции +useATouchOptimizedUI=Используйте сенсорный UI для перемещения замера +deleteFix=Удалить замер +theDeletionOfThisFix=Удалить этот замер сейчас невозможно. +loadingMarkFixes=Загрузка замеров отметки... +fixSuccessfullyAdded=Замер успешно добавлен. +fixPositionSuccessfullyEdited=Позиция замера успешно изменена. +fixSuccessfullyRemoved=Замер успешно удален. +dragToChangePosition=Позиция изменяется перетаскиванием\nДля удаления вызовите меню щелчком правой кнопкой мыши +moveFix=Переместить замер diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties index 0381fdf9f34..3470236cd97 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh.properties @@ -29,7 +29,7 @@ timeDelayHelp=要在任意时间重播,则留空;输入导入实况数据前 speedInKnots=速度 (kn) fromDeg=自(度) noRacesYet=暂无比赛轮次。 -total=Σ +total=\u03A3 carry=累积 competitor=参赛队 competitors=参赛队 @@ -72,7 +72,7 @@ collapse=- expand=+ leg=L distanceInMeters=距离 -averageSpeedInKnots=∅ 速度 +averageSpeedInKnots=\u2205 速度 averageSpeedInKnotsTooltip=此航段的平均实际速度,\n通过航行的距离除以所需的时间计算得出。 raceAverageSpeedInKnotsTooltip=此比赛轮次的平均实际速度,\n通过航行的距离除以所需的时间计算得出。 rankGain=名次进阶 @@ -320,15 +320,15 @@ racesInLeaderboard=积分榜中的比赛轮次 leaderboardsInGroup=分组中的积分榜 replication=复制 errorFetchingReplicaData=获取重复数据出错: {0} -averageAbsoluteCrossTrackErrorInMeters=∅ XTE +averageAbsoluteCrossTrackErrorInMeters=\u2205 XTE averageAbsoluteCrossTrackErrorInMetersTooltip=连接航段起点和终点的大圆弧的平均交叉轨道误差 -averageSignedCrossTrackErrorInMeters=∅ XTE +/- +averageSignedCrossTrackErrorInMeters=\u2205 XTE +/- averageSignedCrossTrackErrorInMetersTooltip=赛场中的平均位置 - 从场地中线开始计算的符号距离;0 代表场地中线;负数代表左侧,正数代表右侧。 raceAverageAbsoluteCrossTrackErrorInMetersTooltip=所有比赛轮次中迎风航段连接航段起点和终点的大圆弧的平均绝对交叉轨道误差,忽略参赛队所在的场地中线 raceAverageSignedCrossTrackErrorInMetersTooltip=所有比赛轮次中迎风航段连接航段起点和终点的大圆弧的符号平均交叉轨道误差;负数代表场地中线的左侧,正数代表右侧。 enterMaster=主实例的主机名称 errorStartingReplication=从主机{0}/交换机{1}开始复制出错: {2} -helpLines=帮助线 +helpLines=辅助线 startLine=起航线 finishLine=终点线 advantageLine=优势航线 @@ -460,7 +460,7 @@ totalTimeSailedInSeconds=总时间 totalTimeSailedInSecondsTooltip=从比赛轮次开始时间算起,参赛队在比赛中航行的总时间。 totalDistanceTraveled=总距离 totalDistanceTraveledTooltip=比赛中航行的总距离。 -totalAverageSpeedOverGround=∅ 实际速度 +totalAverageSpeedOverGround=\u2205 实际速度 totalAverageSpeedOverGroundTooltip=比赛中的平均实际速度。 hhmmssUnit=hh:mm:ss actionAddWindData=添加风力数据 @@ -505,11 +505,11 @@ expandLastRace=始终展开显示的最后比赛轮次 factor=系数 errorUpdatingIsMedalRace=更新奖牌轮设置出错: {0} maneuverLoss=操作损失 -averageManeuverLossInMeters=∅ 操作损失 +averageManeuverLossInMeters=\u2205 操作损失 averageManeuverLossInMetersTooltip=任何操作中的平均距离损失。 -averageTackLossInMeters=∅ 迎风转向损失 +averageTackLossInMeters=\u2205 迎风转向损失 averageTackLossInMetersTooltip=迎风转向中的平均距离损失。 -averageJibeLossInMeters=∅ 顺风转向损失 +averageJibeLossInMeters=\u2205 顺风转向损失 averageJibeLossInMetersTooltip=顺风转向中的平均距离损失。 shape=形状 pattern=模式 @@ -837,8 +837,8 @@ lastFinished=最后完成 run=运行 times=次数 dataAmount=数据量 -averageCleanedServerTime=∅ 清理服务器时间 -averageCleanedOverallTime=∅ 清理总时间 +averageCleanedServerTime=\u2205 清理服务器时间 +averageCleanedOverallTime=\u2205 清理总时间 dataMiningBenchmarkResults=数据挖掘基准结果 serverTime=服务器时间 confidenceShouldBeBetween=置信度需要介于 0 和 1。 @@ -907,7 +907,7 @@ line=线 offset=分支 doYouReallyWantToRemoveCompetitors=是否确定移除所选的参赛队? doYouReallyWantToRemoveCompetitor=是否确定移除参赛队 {0}? -filterCompetitors=按名称、船只级别或帆号筛选参赛队 +filterCompetitors=按名称、船只级别或帆号或编号筛选参赛队 editCompetitor=编辑参赛队 pleaseEnterASailNumber=请输入帆号 successfullyAllowedCompetitorReset=已成功允许重新加载参赛队{0}。 @@ -915,7 +915,7 @@ id=编号 allowReload=允许重新加载 compress=压缩 compressTooltip=仅在导出服务器实例至少通过\n任务 0fbf6071dea125bec4a56dee55d61c99def4a62e 运行时使用。 -queryRunner=Query Runner +queryRunner=查询执行器 rerunQueryAfterRefresh=在刷新后重新运行查询 refreshIntervalMustntBeEmpty=刷新间隔不得为空 selectionTables=选择表 @@ -1118,7 +1118,7 @@ totalSize=总大小 averageMessageSize=各消息的平均大小(字节) totalNumberOfOperations=操作的总数 currentOrAverageSpeedOverGroundInKnotsTooltip=在航段航行时的当前实际速度(节);航段完成时的平均数实际速度 -currentOrAverageSpeedOverGroundInKnots=实际速度(∅ 终点) +currentOrAverageSpeedOverGroundInKnots=实际速度(\u2205 终点) connectors=连接器 videoComponentShortName=视频 competitorSearchFilter=参赛队搜索筛选器 @@ -1186,6 +1186,7 @@ timeBetweenRaceStartAndCompetitorStartInSeconds=起航延迟 timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=比赛轮次开始与参赛队越过起航航路点之间的时间。负值表示“抢航”。 useInternalAlgorithm=使用内部绕标算法 editMarkPassings=编辑绕标 +editMarkPositions=编辑标位 removeFixedPassings=移除固定的绕标 setFixedPassing=设置绕标时间 setSuppressedPassing=从当前开始禁止绕标 @@ -1289,7 +1290,7 @@ any=任何 urlProviders=基于 URL 的结果提供方 pleaseSelectAURLProvider=请选择基于 URL 的结果提供方... sampleURL=示例 URL: {0} -sapSportsOn=SAP Sports on +sapSportsOn=SAP Sports - followSapSports=关注 SAP Sports liveNow=现在直播 analyseRace=分析比赛轮次 @@ -1407,7 +1408,7 @@ resultsFoundForSearch=找到 "{1}" 的 {0,number} 个结果 resultsFoundForSearch[one]=找到 "{1}" 的 {0,number} 个结果 runPredefinedQuery=运行预定义的查询 selectPredefinedQuery=选择预定义的查询 -predefinedQueryRunner=预定义的 Query Runner +predefinedQueryRunner=预定义的查询执行器 developerOptions=开发人员选项 copyToClipboard=复制到剪贴板 code=代码 @@ -1437,7 +1438,7 @@ requiresValidRegatta=此页面需要有效的比赛、比赛轮次列和船队 couldNotObtainRace=无法为名称为{0}的比赛获取船队{2}名称为{1}的比赛轮次: {3} errorTryingToCreateEmbeddedMap=尝试创建嵌入式地图出错: {0} topN=前{0} -transparentBufferLineOnHover=鼠标移到帮助线显示透明的缓冲线 +transparentBufferLineOnHover=鼠标移到辅助线显示透明的缓冲线 bufferLineStrokeWeight=缓冲线线条粗细 profile=概要 showOnlyCompetitorsOfLog=仅显示在日志中注册的参赛队 @@ -1467,4 +1468,24 @@ thereIsNoIdentifierSet=未设置标识符。 couldNotObtainAccessTokenForUser=无法获取用户{0}的访问令牌 raceManagerDeviceName=设备名称 playstoreBadge=https://play.google.com/intl/zh-cn/badges/images/generic/zh-cn-play-badge.png -appstoreBadgeSuffix=_zh \ No newline at end of file +appstoreBadgeSuffix=_zh +serverURLInvalid=请输入有效的服务器 URL +serverURLEmpty=服务器 URL 为空 +marks=标志 +addNewFix=新增修复 +pleaseSelectOtherTimepoint=请选择其他时间点。时间滑块中的此时间点已有修复。 +confirmMove=确认移动 +confirmNewFix=确认新修复 +selectAFixPositionBy=通过拖动地图选择修复位置。然后利用下方的按钮确认或取消。 +pleaseSelectAMark=请从左侧的清单中选择一个标志。 +markFixes=标志修复 +distanceFromAveragePosition=与平均位置的距离 +useATouchOptimizedUI=使用触摸优化的 UI 移动修复 +deleteFix=删除修复 +theDeletionOfThisFix=目前无法删除此修复。 +loadingMarkFixes=正在加载标志修复... +fixSuccessfullyAdded=已成功添加修复。 +fixPositionSuccessfullyEdited=已成功编辑修复位置。 +fixSuccessfullyRemoved=已成功移除修复。 +dragToChangePosition=拖动更改位置\n右键点击获取菜单以删除 +moveFix=移动修复 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties index a46facf641d..8965d3606a4 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages_zh_CN.properties @@ -328,7 +328,7 @@ raceAverageAbsoluteCrossTrackErrorInMetersTooltip=所有比赛轮次中迎风航 raceAverageSignedCrossTrackErrorInMetersTooltip=所有比赛轮次中迎风航段连接航段起点和终点的大圆弧的符号平均交叉轨道误差;负数代表场地中线的左侧,正数代表右侧。 enterMaster=主实例的主机名称 errorStartingReplication=从主机{0}/交换机{1}开始复制出错: {2} -helpLines=帮助线 +helpLines=辅助线 startLine=起航线 finishLine=终点线 advantageLine=优势航线 @@ -610,7 +610,7 @@ passingInstructions=绕标说明 refreshNow=现在刷新 stopUpdating=停止更新 startUpdating=开始更新 -currentTime=当前时间: +currentTime=当前时间: tractracUsername=TracTrac 用户名 tractracPassword=TracTrac 密码 operatorEquals=等于 @@ -907,7 +907,7 @@ line=线 offset=分支 doYouReallyWantToRemoveCompetitors=是否确定移除所选的参赛队? doYouReallyWantToRemoveCompetitor=是否确定移除参赛队 {0}? -filterCompetitors=按名称、船只级别或帆号筛选参赛队 +filterCompetitors=按名称、船只级别或帆号或编号筛选参赛队 editCompetitor=编辑参赛队 pleaseEnterASailNumber=请输入帆号 successfullyAllowedCompetitorReset=已成功允许重新加载参赛队{0}。 @@ -915,7 +915,7 @@ id=编号 allowReload=允许重新加载 compress=压缩 compressTooltip=仅在导出服务器实例至少通过\n任务 0fbf6071dea125bec4a56dee55d61c99def4a62e 运行时使用。 -queryRunner=Query Runner +queryRunner=查询执行器 rerunQueryAfterRefresh=在刷新后重新运行查询 refreshIntervalMustntBeEmpty=刷新间隔不得为空 selectionTables=选择表 @@ -936,11 +936,13 @@ dontoverwrite=不要覆盖 setRacingProcedureConfiguration=设置比赛配置 racingProcedureConfiguration=比赛配置 activateIndividualRecall=激活个别召回 +activateResultEntry=激活结果条目 rrs26Start=RRS26 开始 setConfiguration=激活配置 classFlag=级别旗标 classFlagHelpText=设置用于{0}的级别旗标。 选择“不要覆盖”,激活程序的默认旗标。 individualRecallHelpText=激活后,裁判长能够执行个别召回。 +resultEntryHelpText=激活后,裁判长能够在结束阶段期间和之后输入结果。 startmodeFlags=起航模式旗标 startmodeFlagsHelpText=设置可用的起航模式旗标。选择无,启用程序的默认旗标。 gateStart=起航门标 @@ -1186,6 +1188,7 @@ timeBetweenRaceStartAndCompetitorStartInSeconds=起航延迟 timeBetweenRaceStartAndCompetitorStartInSecondsTooltip=比赛轮次开始与参赛队越过起航航路点之间的时间。负值表示“抢航”。 useInternalAlgorithm=使用内部绕标算法 editMarkPassings=编辑绕标 +editMarkPositions=编辑标位 removeFixedPassings=移除固定的绕标 setFixedPassing=设置绕标时间 setSuppressedPassing=从当前开始禁止绕标 @@ -1289,7 +1292,7 @@ any=任何 urlProviders=基于 URL 的结果提供方 pleaseSelectAURLProvider=请选择基于 URL 的结果提供方... sampleURL=示例 URL: {0} -sapSportsOn=SAP Sports on +sapSportsOn=SAP Sports - followSapSports=关注 SAP Sports liveNow=现在直播 analyseRace=分析比赛轮次 @@ -1408,7 +1411,7 @@ resultsFoundForSearch=找到 "{1}" 的 {0,number} 个结果 resultsFoundForSearch[one]=找到 "{1}" 的 {0,number} 个结果 runPredefinedQuery=运行预定义的查询 selectPredefinedQuery=选择预定义的查询 -predefinedQueryRunner=预定义的 Query Runner +predefinedQueryRunner=预定义的查询执行器 developerOptions=开发人员选项 copyToClipboard=复制到剪贴板 code=代码 @@ -1438,7 +1441,7 @@ requiresValidRegatta=此页面需要有效的比赛、比赛轮次列和船队 couldNotObtainRace=无法为名称为{0}的比赛获取船队{2}名称为{1}的比赛轮次: {3} errorTryingToCreateEmbeddedMap=尝试创建嵌入式地图出错: {0} topN=前{0} -transparentBufferLineOnHover=鼠标移到帮助线显示透明的缓冲线 +transparentBufferLineOnHover=鼠标移到辅助线显示透明的缓冲线 bufferLineStrokeWeight=缓冲线线条粗细 profile=概要 showOnlyCompetitorsOfLog=仅显示在日志中注册的参赛队 @@ -1467,3 +1470,31 @@ qrSync=QR-Sync thereIsNoIdentifierSet=未设置标识符。 couldNotObtainAccessTokenForUser=无法获取用户{0}的访问令牌 raceManagerDeviceName=设备名称 +serverURLInvalid=请输入有效的服务器 URL +serverURLEmpty=服务器 URL 为空 +marks=标志 +addNewFix=新增修复 +pleaseSelectOtherTimepoint=请选择其他时间点。时间滑块中的此时间点已有修复。 +confirmMove=确认移动 +confirmNewFix=确认新修复 +selectAFixPositionBy=通过拖动地图选择修复位置。然后利用下方的按钮确认或取消。 +pleaseSelectAMark=请从左侧的清单中选择一个标志。 +markFixes=标志修复 +playstoreCampaign=utm_source=sapsailing&utm_medium=solutions&utm_content=2016.02&utm_campaign=solutions&pcampaignid=2016.sapsailing.solutions +playstoreTrackingApp=https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app +playstoreRacecommitteeApp=https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app +playStoreBuoypositioningApp=https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app +playstoreBadge=https://play.google.com/intl/en/badges/images/generic/en-play-badge.png +appstoreSapSailingInsight=http://appstore.com/sapsailinsight +appstoreStgTrainingstagebuch=http://appstore.com/stgtrainingstagebuch +appstoreBadgeSuffix=_en +distanceFromAveragePosition=与平均位置的距离 +useATouchOptimizedUI=使用触摸优化的 UI 移动修复 +deleteFix=删除修复 +theDeletionOfThisFix=目前无法删除此修复。 +loadingMarkFixes=正在加载标志修复... +fixSuccessfullyAdded=已成功添加修复。 +fixPositionSuccessfullyEdited=已成功编辑修复位置。 +fixSuccessfullyRemoved=已成功移除修复。 +dragToChangePosition=拖动更改位置\n右键点击获取菜单以删除 +moveFix=移动修复 diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaManagementControl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaManagementControl.java index ff0b33c47b8..3dff4d15c38 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaManagementControl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/media/MediaManagementControl.java @@ -138,24 +138,28 @@ public class MediaManagementControl extends AbstractMediaSelectionControl implem Collection reachableAudioTracks) { for (MediaTrack mediaTrack : mediaPlayerManager.getAssignedMediaTracks()) { if (isPotentiallyPlayable(mediaTrack)) { - switch (mediaTrack.mimeType.mediaType) { - case video: - reachableVideoTracks.add(mediaTrack); - case audio: // intentional fall through - if (mediaPlayerManager.getUserAgent().getType().equals(AgentTypes.FIREFOX)) { - if (mediaTrack.isYoutube()) { - // only youtube audio tracks work with firefox + if (mediaTrack.mimeType == null) { + reachableVideoTracks.add(mediaTrack); // allow user to remove this strange artifact + } else { + switch (mediaTrack.mimeType.mediaType) { + case video: + reachableVideoTracks.add(mediaTrack); + case audio: // intentional fall through + if (mediaPlayerManager.getUserAgent().getType().equals(AgentTypes.FIREFOX)) { + if (mediaTrack.isYoutube()) { + // only youtube audio tracks work with firefox + reachableAudioTracks.add(mediaTrack); + } + } else { reachableAudioTracks.add(mediaTrack); } - } else { - reachableAudioTracks.add(mediaTrack); + case image: // images don't play as video tracks + break; + case unknown: // unknown formats won't be played either + break; + default: + break; } - case image: // images don't play as video tracks - break; - case unknown: // unknown formats won't be played either - break; - default: - break; } } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java index a8a5f6abb19..1b6f153f552 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardEntryPoint.java @@ -25,6 +25,8 @@ import com.sap.sailing.gwt.ui.client.RaceTimesInfoProvider; import com.sap.sailing.gwt.ui.client.RemoteServiceMappingConstants; import com.sap.sailing.gwt.ui.shared.RaceWithCompetitorsDTO; import com.sap.sailing.gwt.ui.shared.RaceboardDataDTO; +import com.sap.sse.common.Duration; +import com.sap.sse.common.impl.MillisecondsDurationImpl; import com.sap.sse.gwt.client.EntryPointHelper; import com.sap.sse.gwt.client.async.AsyncActionsExecutor; import com.sap.sse.gwt.client.player.Timer; @@ -88,8 +90,10 @@ public class RaceBoardEntryPoint extends AbstractSailingEntryPoint { final boolean autoSelectMedia = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_AUTOSELECT_MEDIA, true); final String defaultMedia = GwtHttpRequestUtils.getStringParameter(RaceBoardViewConfiguration.PARAM_DEFAULT_MEDIA, null /* default*/); final boolean showMapControls = GwtHttpRequestUtils.getBooleanParameter(RaceBoardViewConfiguration.PARAM_VIEW_SHOW_MAPCONTROLS, true /* default*/); + final Duration initialDurationAfterRaceStartInReplay = parseDuration(GwtHttpRequestUtils.getStringParameter(RaceBoardViewConfiguration.PARAM_TIME_AFTER_RACE_START_AS_HOURS_COLON_MILLIS_COLON_SECONDS, null /* default*/)); raceboardViewConfig = new RaceBoardViewConfiguration(activeCompetitorsFilterSetName, showLeaderboard, - showWindChart, showCompetitorsChart, showViewStreamlets, showViewStreamletColors, showViewSimulation, autoSelectMedia, defaultMedia); + showWindChart, showCompetitorsChart, showViewStreamlets, showViewStreamletColors, showViewSimulation, autoSelectMedia, defaultMedia, + initialDurationAfterRaceStartInReplay); sailingService.getRaceboardData(regattaName, raceName, leaderboardName, leaderboardGroupName, eventId, new AsyncCallback() { @Override public void onSuccess(RaceboardDataDTO result) { @@ -107,6 +111,24 @@ public class RaceBoardEntryPoint extends AbstractSailingEntryPoint { }); } + /** + * Understands [hh:[mm:]]ss and parses into a {@link Duration}. If {@code durationAsString} is {@code null} then + * so is the result. + */ + public static Duration parseDuration(String durationAsString) { + final Duration result; + if (durationAsString == null) { + result = null; + } else { + long seconds = 0; + for (final String hhmmss : durationAsString.split(":")) { + seconds = 60*seconds + Long.valueOf(hhmmss); + } + result = new MillisecondsDurationImpl(1000l * seconds); + } + return result; + } + private void createErrorPage(String message) { final DockLayoutPanel vp = new DockLayoutPanel(Unit.PX); LogoAndTitlePanel logoAndTitlePanel = new LogoAndTitlePanel(getStringMessages(), this, getUserService()); diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java index 60f2fa80031..0ea4c8f0b8c 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardPanel.java @@ -234,7 +234,7 @@ public class RaceBoardPanel extends SimplePanel implements LeaderboardUpdateList } } timePanel = new RaceTimePanel(userService, timer, timeRangeWithZoomModel, stringMessages, raceTimesInfoProvider, - false, isScreenLargeEnoughToOfferChartSupport, selectedRaceIdentifier); + false, isScreenLargeEnoughToOfferChartSupport, selectedRaceIdentifier, getConfiguration().getInitialDurationAfterRaceStartInReplay()); timeRangeWithZoomModel.addTimeZoomChangeListener(timePanel); raceTimesInfoProvider.addRaceTimesInfoProviderListener(timePanel); } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardViewConfiguration.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardViewConfiguration.java index 3d49c69dfa5..6ce85822512 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardViewConfiguration.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/raceboard/RaceBoardViewConfiguration.java @@ -1,5 +1,7 @@ package com.sap.sailing.gwt.ui.raceboard; +import com.sap.sse.common.Duration; + /** * Represents the parameters for configuring the raceboard view * @author Frank @@ -15,6 +17,7 @@ public class RaceBoardViewConfiguration { private final boolean showViewStreamlets; private final boolean showViewStreamletColors; private final boolean showViewSimulation; + private final Duration initialDurationAfterRaceStartInReplay; public static final String PARAM_VIEW_MODE = "viewMode"; public static final String PARAM_VIEW_SHOW_LEADERBOARD = "viewShowLeaderboard"; @@ -29,16 +32,17 @@ public class RaceBoardViewConfiguration { public static final String PARAM_CAN_REPLAY_DURING_LIVE_RACES = "canReplayDuringLiveRaces"; public static final String PARAM_AUTOSELECT_MEDIA = "autoSelectMedia"; public static final String PARAM_DEFAULT_MEDIA = "defaultMedia"; + public static final String PARAM_TIME_AFTER_RACE_START_AS_HOURS_COLON_MILLIS_COLON_SECONDS = "t"; public RaceBoardViewConfiguration() { this(/* activeCompetitorsFilterSetName */ null, /* showLeaderboard */ true, /* showWindChart */ false, /* showCompetitorsChart */ false, /* showViewStreamlets */ false, /* showViewStreamletColors */ false, /* showViewSimulation */ false, - /* autoSelectMedia */false, null); + /* autoSelectMedia */false, null, /* initialDurationAfterRaceStartInReplay */ null); } public RaceBoardViewConfiguration(String activeCompetitorsFilterSetName, boolean showLeaderboard, boolean showWindChart, boolean showCompetitorsChart, boolean showViewStreamlets, boolean showViewStreamletColors, boolean showViewSimulation, - boolean autoSelectMedia, String defaultMedia) { + boolean autoSelectMedia, String defaultMedia, Duration initialDurationAfterRaceStartInReplay) { this.activeCompetitorsFilterSetName = activeCompetitorsFilterSetName; this.showLeaderboard = showLeaderboard; this.showWindChart = showWindChart; @@ -48,6 +52,7 @@ public class RaceBoardViewConfiguration { this.showViewSimulation = showViewSimulation; this.autoSelectMedia = autoSelectMedia; this.defaultMedia = defaultMedia; + this.initialDurationAfterRaceStartInReplay = initialDurationAfterRaceStartInReplay; } public boolean isShowLeaderboard() { @@ -86,4 +91,7 @@ public class RaceBoardViewConfiguration { return defaultMedia; } + public Duration getInitialDurationAfterRaceStartInReplay() { + return initialDurationAfterRaceStartInReplay; + } } diff --git a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java index fd8c29a3dc2..5005c9466e8 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java +++ b/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/server/SailingServiceImpl.java @@ -144,6 +144,7 @@ import com.sap.sailing.domain.base.impl.SailingServerConfigurationImpl; import com.sap.sailing.domain.base.impl.SeriesImpl; import com.sap.sailing.domain.base.impl.TeamImpl; import com.sap.sailing.domain.common.Bearing; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.DataImportProgress; import com.sap.sailing.domain.common.DetailType; import com.sap.sailing.domain.common.Distance; @@ -4642,7 +4643,9 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } finally { // close the connection, set all objects to null getService().setDataImportDeleteProgressFromMapTimerWithReplication(importOperationId); - connection.disconnect(); + if (connection != null) { + connection.disconnect(); + } connection = null; long timeToImport = System.currentTimeMillis() - startTime; logger.info(String.format("Took %s ms overall to import master data.", timeToImport)); @@ -5227,10 +5230,10 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S List> courseDTO) throws NotFoundException { RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); String courseName = "Course of " + raceColumnName; - if(!LeaderboardNameConstants.DEFAULT_FLEET_NAME.equals(fleetName)) { - courseName += "- " + fleetName; + if (!LeaderboardNameConstants.DEFAULT_FLEET_NAME.equals(fleetName)) { + courseName += " - " + fleetName; } - CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog).analyze(); + CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog, /* onlyCoursesWithValidWaypointList */ false).analyze(); if (lastPublishedCourse == null) { lastPublishedCourse = new CourseDataImpl(courseName); } @@ -5248,7 +5251,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S } RaceLogEvent event = new RaceLogCourseDesignChangedEventImpl(MillisecondsTimePoint.now(), - getService().getServerAuthor(), raceLog.getCurrentPassId(), course); + getService().getServerAuthor(), raceLog.getCurrentPassId(), course, CourseDesignerMode.ADMIN_CONSOLE); raceLog.add(event); } @@ -5297,7 +5300,8 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S @Override public RaceCourseDTO getLastCourseDefinitionInRaceLog(final String leaderboardName, String raceColumnName, String fleetName) throws NotFoundException { final RaceLog raceLog = getRaceLog(leaderboardName, raceColumnName, fleetName); - CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog).analyze(); + // only look for course definitions that really define waypoints; ignore by-name course updates + CourseBase lastPublishedCourse = new LastPublishedCourseDesignFinder(raceLog, /* onlyCoursesWithValidWaypointList */ true).analyze(); if (lastPublishedCourse == null) { lastPublishedCourse = new CourseDataImpl(""); } @@ -6054,7 +6058,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S for (Fleet fleet : raceColumn.getFleets()) { RaceLog raceLog = raceColumn.getRaceLog(fleet); if (raceLog != raceLogToIgnore) { - LastPublishedCourseDesignFinder finder = new LastPublishedCourseDesignFinder(raceLog); + LastPublishedCourseDesignFinder finder = new LastPublishedCourseDesignFinder(raceLog, /* onlyCoursesWithValidWaypointList */ true); CourseBase course = finder.analyze(); if (course != null) { for (Waypoint waypoint : course.getWaypoints()) { diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html index 197c0c519b1..48dfa3eafcc 100644 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/com/sap/sailing/gwt/home/solutions/SailingAnalyticsNotes.html @@ -22,6 +22,16 @@ +
April 2016
+
    +
  • The /gwt/RaceBoard.html entry point now accepts an optional parameter "t" in the form + [[hh:]mm:]ss, for example t=12:34 to place the timer so much after the race start + if the viewer comes up in Replay mode. You may also use just seconds, as in t=1234 which + makes specifying a time before the start somewhat easier (t=-123 instead of + t=-02:-03). +
  • +
+
January 2016
  • Show maneuver markers on the race board by default diff --git a/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini b/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini index c2bbf60d55c..dd27c83e30d 100755 --- a/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini +++ b/java/com.sap.sailing.gwt.ui/src/main/resources/shiro.ini @@ -19,6 +19,8 @@ sessionManager = com.sap.sse.security.SecurityWebSessionManager securityManager.sessionManager = $sessionManager sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO securityManager.sessionManager.sessionDAO = $sessionDAO +# 24h timeout +securityManager.sessionManager.globalSessionTimeout = 86400000 cacheManager = com.sap.sse.security.SessionCacheManager securityManager.cacheManager = $cacheManager diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java index 8bd6033f7e4..519b83672b6 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInLeaderboards.java @@ -62,6 +62,7 @@ import com.sap.sailing.domain.base.CourseBase; import com.sap.sailing.domain.base.DomainFactory; import com.sap.sailing.domain.base.Fleet; import com.sap.sailing.domain.base.RaceColumn; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.racelog.Flags; @@ -514,7 +515,7 @@ public class TestStoringAndRetrievingRaceLogInLeaderboards extends RaceLogMongoD @Test public void testStoreAndRetrieveSimpleLeaderboardWithRaceLogCourseDesignChangedEvent() { CourseBase course = createCourseBase(); - RaceLogCourseDesignChangedEvent event = new RaceLogCourseDesignChangedEventImpl(now, author, 0, course); + RaceLogCourseDesignChangedEvent event = new RaceLogCourseDesignChangedEventImpl(now, author, 0, course, CourseDesignerMode.ADMIN_CONSOLE); addAndStoreRaceLogEvent(leaderboard, raceColumnName, event); diff --git a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java index 796528a1c40..8d7d476a755 100644 --- a/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java +++ b/java/com.sap.sailing.mongodb.test/src/com/sap/sailing/mongodb/test/TestStoringAndRetrievingRaceLogInRegatta.java @@ -53,6 +53,7 @@ import com.sap.sailing.domain.base.RaceColumn; import com.sap.sailing.domain.base.Regatta; import com.sap.sailing.domain.base.Series; import com.sap.sailing.domain.base.impl.FleetImpl; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.MaxPointsReason; import com.sap.sailing.domain.common.Wind; import com.sap.sailing.domain.common.racelog.Flags; @@ -387,7 +388,7 @@ public class TestStoringAndRetrievingRaceLogInRegatta extends AbstractTestStorin @Test public void testStoreAndRetrieveRegattaWithRaceLogCourseDesignChangedEvent() { CourseBase course = createCourseBase(); - RaceLogCourseDesignChangedEvent event = new RaceLogCourseDesignChangedEventImpl(now, author, 0, course); + RaceLogCourseDesignChangedEvent event = new RaceLogCourseDesignChangedEventImpl(now, author, 0, course, CourseDesignerMode.ADMIN_CONSOLE); addAndStoreRaceLogEvent(regatta, raceColumnName, event); diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/RaceColumnFactorJsonDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/RaceColumnFactorJsonDeserializer.java new file mode 100644 index 00000000000..51049583e32 --- /dev/null +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/impl/RaceColumnFactorJsonDeserializer.java @@ -0,0 +1,29 @@ +package com.sap.sailing.server.gateway.deserialization.impl; + +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.sap.sailing.domain.base.impl.RaceColumnFactorImpl; +import com.sap.sailing.domain.common.impl.RaceColumnConstants; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; +import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; + +public class RaceColumnFactorJsonDeserializer implements JsonDeserializer { + + @Override + public RaceColumnFactorImpl deserialize(JSONObject object) throws JsonDeserializationException { + String leaderboard_name = (String) object.get(RaceColumnConstants.LEADERBOARD_NAME); + String leaderboard_display_name = (String) object.get(RaceColumnConstants.LEADERBOARD_DISPLAY_NAME); + RaceColumnFactorImpl raceColumnFactor = new RaceColumnFactorImpl(leaderboard_name, leaderboard_display_name); + JSONArray race_columns = (JSONArray) object.get(RaceColumnConstants.RACE_COLUMNS); + int size = race_columns.size(); + for (int i = 0; i < size; i++) { + JSONObject data = (JSONObject) race_columns.get(i); + String race_column_name = (String) data.get(RaceColumnConstants.RACE_COLUMN_NAME); + Double explicit_factor = (Double) data.get(RaceColumnConstants.EXPLICIT_FACTOR); + Double factor = (Double) data.get(RaceColumnConstants.FACTOR); + raceColumnFactor.addRaceColumn(race_column_name, explicit_factor, factor); + } + return raceColumnFactor; + } +} diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racegroup/impl/RaceCellDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racegroup/impl/RaceCellDeserializer.java index 7e2dd1e4419..018da384eb0 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racegroup/impl/RaceCellDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racegroup/impl/RaceCellDeserializer.java @@ -20,13 +20,13 @@ public class RaceCellDeserializer implements JsonDeserializer { public RaceCell deserialize(JSONObject object) throws JsonDeserializationException { - String name = object.get(RaceCellJsonSerializer.FIELD_NAME).toString(); - + final String name = object.get(RaceCellJsonSerializer.FIELD_NAME).toString(); + final Object factorJson = object.get(RaceCellJsonSerializer.FIELD_FACTOR); + final double factor = factorJson == null ? 1 : ((Number) factorJson).doubleValue(); + final Double explicitFactor = (Double) object.get(RaceCellJsonSerializer.FIELD_EXPLICIT_FACTOR); JSONObject logJson = Helpers.getNestedObjectSafe(object, RaceCellJsonSerializer.FIELD_RACE_LOG); RaceLog log = logDeserializer.deserialize(logJson); - - - return new RaceCellImpl(name, log); + return new RaceCellImpl(name, log, factor, explicitFactor); } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java index 2f61f1af5be..49b536a7338 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/deserialization/racelog/impl/RaceLogCourseDesignChangedEventDeserializer.java @@ -10,6 +10,7 @@ import com.sap.sailing.domain.abstractlog.race.RaceLogEvent; import com.sap.sailing.domain.abstractlog.race.impl.RaceLogCourseDesignChangedEventImpl; import com.sap.sailing.domain.base.Competitor; import com.sap.sailing.domain.base.CourseBase; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; import com.sap.sailing.server.gateway.deserialization.JsonDeserializer; import com.sap.sailing.server.gateway.deserialization.coursedata.impl.CourseBaseDeserializer; @@ -31,8 +32,9 @@ public class RaceLogCourseDesignChangedEventDeserializer extends BaseRaceLogEven JSONObject jsonCourseDesign = (JSONObject) object.get(RaceLogCourseDesignChangedEventSerializer.FIELD_COURSE_DESIGN); CourseBase courseData = courseDataDeserializer.deserialize(jsonCourseDesign); - - return new RaceLogCourseDesignChangedEventImpl(createdAt, timePoint, author, id, passId, courseData); + final String courseDesignerModeName = (String) object.get(RaceLogCourseDesignChangedEventSerializer.FIELD_COURSE_DESIGNER_MODE); + return new RaceLogCourseDesignChangedEventImpl(createdAt, timePoint, author, id, passId, courseData, + courseDesignerModeName == null ? null : CourseDesignerMode.valueOf(courseDesignerModeName)); } } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racegroup/impl/RaceCellJsonSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racegroup/impl/RaceCellJsonSerializer.java index 6d61ad8cd5a..38369bde1a4 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racegroup/impl/RaceCellJsonSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racegroup/impl/RaceCellJsonSerializer.java @@ -10,7 +10,9 @@ public class RaceCellJsonSerializer implements JsonSerializer { public static final String FIELD_NAME = "name"; public static final String FIELD_RACE_LOG = "raceLog"; public static final String FIELD_COMPETITORS = "competitors"; - + public static final Object FIELD_FACTOR = "factor"; + public static final Object FIELD_EXPLICIT_FACTOR = "explicitfactor"; + private JsonSerializer logSerializer; public RaceCellJsonSerializer(JsonSerializer logSerializer) { @@ -20,10 +22,10 @@ public class RaceCellJsonSerializer implements JsonSerializer { @Override public JSONObject serialize(RaceCell object) { JSONObject result = new JSONObject(); - result.put(FIELD_NAME, object.getName()); + result.put(FIELD_FACTOR, object.getFactor()); + result.put(FIELD_EXPLICIT_FACTOR, object.getExplicitFactor()); result.put(FIELD_RACE_LOG, logSerializer.serialize(object.getRaceLog())); - return result; } diff --git a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCourseDesignChangedEventSerializer.java b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCourseDesignChangedEventSerializer.java index 9b104f509c1..1c62b0ff6d3 100644 --- a/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCourseDesignChangedEventSerializer.java +++ b/java/com.sap.sailing.server.gateway.serialization.shared.android/src/com/sap/sailing/server/gateway/serialization/racelog/impl/RaceLogCourseDesignChangedEventSerializer.java @@ -12,6 +12,7 @@ public class RaceLogCourseDesignChangedEventSerializer extends BaseRaceLogEventS public static final String VALUE_CLASS = RaceLogCourseDesignChangedEvent.class.getSimpleName(); public static final String FIELD_COURSE_DESIGN = "courseDesign"; + public static final String FIELD_COURSE_DESIGNER_MODE = "courseDesignerMode"; private final JsonSerializer courseBaseSerializer; @@ -30,10 +31,9 @@ public class RaceLogCourseDesignChangedEventSerializer extends BaseRaceLogEventS @Override public JSONObject serialize(RaceLogEvent object) { RaceLogCourseDesignChangedEvent courseChangedEvent = (RaceLogCourseDesignChangedEvent) object; - JSONObject result = super.serialize(courseChangedEvent); result.put(FIELD_COURSE_DESIGN, courseBaseSerializer.serialize(courseChangedEvent.getCourseDesign())); - + result.put(FIELD_COURSE_DESIGNER_MODE, courseChangedEvent.getCourseDesignerMode() == null ? null : courseChangedEvent.getCourseDesignerMode().name()); return result; } diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java index aa606905231..7a05e55e1ba 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogCourseDesignChangedEventSerializerTest.java @@ -23,6 +23,7 @@ import com.sap.sailing.domain.base.impl.ControlPointWithTwoMarksImpl; import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.base.impl.MarkImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.server.gateway.deserialization.JsonDeserializationException; @@ -63,7 +64,7 @@ public class RaceLogCourseDesignChangedEventSerializerTest { factory), new GateDeserializer(factory, new MarkDeserializer(factory)))))); now = MillisecondsTimePoint.now(); - event = new RaceLogCourseDesignChangedEventImpl(now, author, 0, createCourseData()); + event = new RaceLogCourseDesignChangedEventImpl(now, author, 0, createCourseData(), CourseDesignerMode.BY_MARKS); } @Test @@ -75,6 +76,7 @@ public class RaceLogCourseDesignChangedEventSerializerTest { assertEquals(event.getId(), deserializedEvent.getId()); assertEquals(event.getPassId(), deserializedEvent.getPassId()); assertEquals(event.getLogicalTimePoint(), deserializedEvent.getLogicalTimePoint()); + assertEquals(event.getCourseDesignerMode(), deserializedEvent.getCourseDesignerMode()); assertEquals(0, Util.size(event.getInvolvedBoats())); assertEquals(0, Util.size(deserializedEvent.getInvolvedBoats())); diff --git a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java index ea6d4a1f70f..6ba877577eb 100644 --- a/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java +++ b/java/com.sap.sailing.server.gateway.serialization.test/src/com/sap/sailing/server/gateway/serialization/test/racelog/RaceLogEventSerializerTest.java @@ -29,6 +29,7 @@ import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogDenoteForTra import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogRegisterCompetitorEventImpl; import com.sap.sailing.domain.abstractlog.race.tracking.impl.RaceLogStartTrackingEventImpl; import com.sap.sailing.domain.base.DomainFactory; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; import com.sap.sailing.domain.common.racelog.RacingProcedureType; import com.sap.sailing.server.gateway.serialization.JsonSerializer; @@ -149,7 +150,7 @@ public class RaceLogEventSerializerTest { @Test public void testChoosesCourseDesignChangedSerializer() { // we use the real event type here because we do not want to re-implement the dispatching. - RaceLogEvent event = new RaceLogCourseDesignChangedEventImpl(null, author, 0, null); + RaceLogEvent event = new RaceLogCourseDesignChangedEventImpl(null, author, 0, null, CourseDesignerMode.ADMIN_CONSOLE); serializer.serialize(event); verify(courseDesignChangedEventSerializer).serialize(event); } diff --git a/java/com.sap.sailing.server.gateway/resources/shiro.ini b/java/com.sap.sailing.server.gateway/resources/shiro.ini index e9cbc7eb091..fb4f41acf4a 100755 --- a/java/com.sap.sailing.server.gateway/resources/shiro.ini +++ b/java/com.sap.sailing.server.gateway/resources/shiro.ini @@ -21,6 +21,8 @@ sessionManager = com.sap.sse.security.SecurityWebSessionManager securityManager.sessionManager = $sessionManager sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO securityManager.sessionManager.sessionDAO = $sessionDAO +# 24h timeout +securityManager.sessionManager.globalSessionTimeout = 86400000 cacheManager = com.sap.sse.security.SessionCacheManager securityManager.cacheManager = $cacheManager diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupFactory.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupFactory.java index 1fe32f5c094..9141af9f724 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupFactory.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/impl/rc/RaceGroupFactory.java @@ -103,7 +103,7 @@ public class RaceGroupFactory { skippedFirst = true; } else { Fleet fleet = raceColumn.getFleetByName(fleetName); - cells.add(new RaceCellImpl(raceColumn.getName(), raceColumn.getRaceLog(fleet))); + cells.add(new RaceCellImpl(raceColumn.getName(), raceColumn.getRaceLog(fleet), raceColumn.getFactor(), raceColumn.getExplicitFactor())); } } } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompetitorsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompetitorsResource.java index 0606a8301d6..17c7ca42125 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompetitorsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/CompetitorsResource.java @@ -80,7 +80,7 @@ public class CompetitorsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } else { String jsonString = getCompetitorJSON(competitor).toJSONString(); - response = Response.ok(jsonString, MediaType.APPLICATION_JSON).build(); + response = Response.ok(jsonString).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } return response; } @@ -110,7 +110,7 @@ public class CompetitorsResource extends AbstractSailingServerResource { JSONObject teamJson = teamJsonSerializer.serialize(team); String json = teamJson.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } /** diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/DataMiningResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/DataMiningResource.java index 472489eaca3..25cd86be5b8 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/DataMiningResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/DataMiningResource.java @@ -1,325 +1,356 @@ -package com.sap.sailing.server.gateway.jaxrs.api; - -import java.io.Serializable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.UUID; -import java.util.function.Function; - -import javax.ws.rs.Path; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - -import org.apache.commons.lang.StringEscapeUtils; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; -import org.osgi.util.tracker.ServiceTracker; - -import com.sap.sailing.datamining.data.HasTrackedRaceContext; -import com.sap.sailing.domain.common.Distance; -import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; -import com.sap.sailing.server.gateway.jaxrs.RestServletContainer; -import com.sap.sailing.server.gateway.serialization.NotJsonSerializableException; -import com.sap.sse.datamining.DataMiningServer; -import com.sap.sse.datamining.Query; -import com.sap.sse.datamining.StatisticQueryDefinition; -import com.sap.sse.datamining.data.QueryResult; -import com.sap.sse.datamining.shared.DataMiningSession; -import com.sap.sse.datamining.shared.GroupKey; -import com.sap.sse.datamining.shared.impl.CompoundGroupKey; -import com.sap.sse.datamining.shared.impl.GenericGroupKey; -import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier; -import com.sap.sse.datamining.shared.impl.UUIDDataMiningSession; -import com.sap.sse.datamining.shared.impl.dto.FunctionDTO; -import com.sap.sse.datamining.shared.impl.dto.ModifiableStatisticQueryDefinitionDTO; - -/** - * REST-API to run predefined queries and get the result as JSON. - * @author Lennart Hensler (D054527) - */ -@Path("/v1/datamining") -public class DataMiningResource extends AbstractSailingServerResource { - - private static final String AVG_SPEED_PER_COMPETITOR_LEG_TYPE = "AvgSpeed_Per_Competitor-LegType"; - private static final String SUM_DISTANCE_PER_COMPETITOR_LEG_TYPE = "SumDistance_Per_Competitor-LegType"; - private static final String SUM_MANEUVERS_PER_COMPETITOR = "SumManeuvers_Per_Competitor"; - - private static final Function distanceMetersExtractor = (distance) -> distance.getMeters(); - - public DataMiningServer getDataMiningServer() { - @SuppressWarnings("unchecked") - ServiceTracker dataMiningServerTracker = (ServiceTracker) getServletContext().getAttribute(RestServletContainer.DATA_MINING_SERVER_TRACKER_NAME); - return dataMiningServerTracker.getService(); - } - - private Response getBadIdentifierErrorResponse(String identifier) { - return Response.status(Status.NOT_FOUND).entity("Couldn't find a predefined query with the identifier '" + identifier + "'.") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getBadQueryDefinitionErrorResponse(ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO) { - return Response.status(Status.BAD_REQUEST).entity("Couldn't create a query for definition '" + StringEscapeUtils.escapeHtml(queryDefinitionDTO.toString()) + "'.") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getNoDataFoundErrorResponse() { - return Response.status(Status.NOT_FOUND).entity("No data found.").type(MediaType.TEXT_PLAIN).build(); - } - - private Response getNotSerializableErrorResponse(Class type) { - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Can't serialize values of type '" + type.getName() + "'."). - type(MediaType.TEXT_PLAIN).build(); - } - -// @GET -// @Produces("application/json;charset=UTF-8") -// public Response getPredefinedQueries() { -// return predefinedQueryIdentifiersToJSON(getDataMiningServer().getPredefinedQueryIdentifiers()); -// } - - public Response predefinedQueryIdentifiersToJSON(Iterable identifiers) { - JSONArray predefinedQueryNames = new JSONArray(); - for (PredefinedQueryIdentifier identifier : identifiers) { - JSONObject jsonId = new JSONObject(); - jsonId.put("Identifier", identifier.getIdentifier()); - jsonId.put("Description", identifier.getDescription()); - predefinedQueryNames.add(jsonId); - } - - String json = predefinedQueryNames.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - -// @GET -// @Produces("application/json;charset=UTF-8") -// @Path("{identifier}") -// public Response runPredefinedQuery(@PathParam("identifier") String identifier) { -// Response response; -// ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(identifier); -// if (queryDefinitionDTO == null) { -// response = getBadIdentifierErrorResponse(identifier); -// } else { -// response = runQuery(queryDefinitionDTO); -// } -// return response; -// } - - public Response avgSpeedPerCompetitorAndLegType(String regattaName) { - Response response; - ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(AVG_SPEED_PER_COMPETITOR_LEG_TYPE); - - if (queryDefinitionDTO == null) { - response = getBadIdentifierErrorResponse(AVG_SPEED_PER_COMPETITOR_LEG_TYPE); - } else { - FunctionDTO getRegattaName = new FunctionDTO(true, "getRegatta().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - HashSet getRegattaName_FilterSelection = new HashSet<>(); - getRegattaName_FilterSelection.add(regattaName); - - HashMap> race_FilterSelection = new HashMap<>(); - race_FilterSelection.put(getRegattaName, getRegattaName_FilterSelection); - queryDefinitionDTO.setFilterSelectionFor(queryDefinitionDTO.getDataRetrieverChainDefinition().getRetrieverLevel(2), race_FilterSelection); - response = runQuery(queryDefinitionDTO, regattaName, null, null, "kn", 2); - } - return response; - } - - public Response avgSpeedPerCompetitorAndLegType(String regattaName, String raceName) { - Response response; - ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(AVG_SPEED_PER_COMPETITOR_LEG_TYPE); - - if (queryDefinitionDTO == null) { - response = getBadIdentifierErrorResponse(AVG_SPEED_PER_COMPETITOR_LEG_TYPE); - } else { - FunctionDTO getRegattaName = new FunctionDTO(true, "getRegatta().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - HashSet getRegattaName_FilterSelection = new HashSet<>(); - getRegattaName_FilterSelection.add(regattaName); - - FunctionDTO getRaceName = new FunctionDTO(true, "getRace().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - HashSet getRaceName_FilterSelection = new HashSet<>(); - getRaceName_FilterSelection.add(raceName); - - HashMap> race_FilterSelection = new HashMap<>(); - race_FilterSelection.put(getRegattaName, getRegattaName_FilterSelection); - race_FilterSelection.put(getRaceName, getRaceName_FilterSelection); - queryDefinitionDTO.setFilterSelectionFor(queryDefinitionDTO.getDataRetrieverChainDefinition().getRetrieverLevel(2), race_FilterSelection); - response = runQuery(queryDefinitionDTO, regattaName, raceName, null, "kn", 2); - } - return response; - } - - public Response sumDistancePerCompetitorAndLegType(String regattaName) { - Response response; - ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(SUM_DISTANCE_PER_COMPETITOR_LEG_TYPE); - - if (queryDefinitionDTO == null) { - response = getBadIdentifierErrorResponse(SUM_DISTANCE_PER_COMPETITOR_LEG_TYPE); - } else { - FunctionDTO getRegattaName = new FunctionDTO(true, "getRegatta().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - HashSet getRegattaName_FilterSelection = new HashSet<>(); - getRegattaName_FilterSelection.add(regattaName); - - HashMap> race_FilterSelection = new HashMap<>(); - race_FilterSelection.put(getRegattaName, getRegattaName_FilterSelection); - queryDefinitionDTO.setFilterSelectionFor(queryDefinitionDTO.getDataRetrieverChainDefinition().getRetrieverLevel(2), race_FilterSelection); - response = runQuery(queryDefinitionDTO, regattaName, null, distanceMetersExtractor, "m", 2); - } - return response; - } - - public Response sumDistancePerCompetitorAndLegType(String regattaName, String raceName) { - Response response; - ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(SUM_DISTANCE_PER_COMPETITOR_LEG_TYPE); - - if (queryDefinitionDTO == null) { - response = getBadIdentifierErrorResponse(SUM_DISTANCE_PER_COMPETITOR_LEG_TYPE); - } else { - FunctionDTO getRegattaName = new FunctionDTO(true, "getRegatta().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - HashSet getRegattaName_FilterSelection = new HashSet<>(); - getRegattaName_FilterSelection.add(regattaName); - - FunctionDTO getRaceName = new FunctionDTO(true, "getRace().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - HashSet getRaceName_FilterSelection = new HashSet<>(); - getRaceName_FilterSelection.add(raceName); - - HashMap> race_FilterSelection = new HashMap<>(); - race_FilterSelection.put(getRegattaName, getRegattaName_FilterSelection); - race_FilterSelection.put(getRaceName, getRaceName_FilterSelection); - queryDefinitionDTO.setFilterSelectionFor(queryDefinitionDTO.getDataRetrieverChainDefinition().getRetrieverLevel(2), race_FilterSelection); - response = runQuery(queryDefinitionDTO, regattaName, raceName, distanceMetersExtractor, "m", 2); - } - return response; - } - - public Response sumManeuversPerCompetitor(String regattaName) { - Response response; - ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(SUM_MANEUVERS_PER_COMPETITOR); - - if (queryDefinitionDTO == null) { - response = getBadIdentifierErrorResponse(SUM_MANEUVERS_PER_COMPETITOR); - } else { - FunctionDTO getRegattaName = new FunctionDTO(true, "getRegatta().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - HashSet getRegattaName_FilterSelection = new HashSet<>(); - getRegattaName_FilterSelection.add(regattaName); - - HashMap> race_FilterSelection = new HashMap<>(); - race_FilterSelection.put(getRegattaName, getRegattaName_FilterSelection); - queryDefinitionDTO.setFilterSelectionFor(queryDefinitionDTO.getDataRetrieverChainDefinition().getRetrieverLevel(2), race_FilterSelection); - response = runQuery(queryDefinitionDTO, regattaName, null, null, null, 0); - } - return response; - } - - public Response sumManeuversPerCompetitor(String regattaName, String raceName) { - Response response; - ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(SUM_MANEUVERS_PER_COMPETITOR); - - if (queryDefinitionDTO == null) { - response = getBadIdentifierErrorResponse(SUM_MANEUVERS_PER_COMPETITOR); - } else { - FunctionDTO getRegattaName = new FunctionDTO(true, "getRegatta().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - HashSet getRegattaName_FilterSelection = new HashSet<>(); - getRegattaName_FilterSelection.add(regattaName); - - FunctionDTO getRaceName = new FunctionDTO(true, "getRace().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); - HashSet getRaceName_FilterSelection = new HashSet<>(); - getRaceName_FilterSelection.add(raceName); - - HashMap> race_FilterSelection = new HashMap<>(); - race_FilterSelection.put(getRegattaName, getRegattaName_FilterSelection); - race_FilterSelection.put(getRaceName, getRaceName_FilterSelection); - queryDefinitionDTO.setFilterSelectionFor(queryDefinitionDTO.getDataRetrieverChainDefinition().getRetrieverLevel(2), race_FilterSelection); - - response = runQuery(queryDefinitionDTO, regattaName, raceName, null, null, 0); - } - return response; - } - - private ModifiableStatisticQueryDefinitionDTO getPredefinedQuery(String identifier) { - DataMiningServer dataMiningServer = getDataMiningServer(); - PredefinedQueryIdentifier queryIdentifier = new PredefinedQueryIdentifier(identifier, ""); - return dataMiningServer.getPredefinedQueryDefinitionDTO(queryIdentifier); - } - - private Response runQuery(ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO, String regattaName, String raceName, - Function numberExtractor, String resultUnit, int resultPlaces) { - Response response; - DataMiningServer dataMiningServer = getDataMiningServer(); - - StatisticQueryDefinition queryDefinition = dataMiningServer.getQueryDefinitionForDTO(queryDefinitionDTO); - Query query = queryDefinition == null ? null : dataMiningServer.createQuery(queryDefinition); - if (query == null) { - response = getBadQueryDefinitionErrorResponse(queryDefinitionDTO); - } else { - DataMiningSession session = new UUIDDataMiningSession(UUID.randomUUID()); - long requestTimepoint = System.currentTimeMillis(); - @SuppressWarnings("unchecked") - QueryResult result = (QueryResult) dataMiningServer.runNewQueryAndAbortPreviousQueries(session, query); - - if (result == null || result.isEmpty()) { - response = getNoDataFoundErrorResponse(); - } else { - try { - JSONObject jsonResult = new JSONObject(); - jsonResult.put("state", result.getState()); - jsonResult.put("requestTimepoint", requestTimepoint); - jsonResult.put("calculationDuration-s", roundDouble(result.getCalculationTimeInSeconds(), 2)); - jsonResult.put("description", result.getResultSignifier()); - if (regattaName != null && !regattaName.isEmpty()) { - jsonResult.put("regatta", regattaName); - } - if (raceName != null && !raceName.isEmpty()) { - jsonResult.put("race", raceName); - } - jsonResult.put("resultUnit", resultUnit != null && !resultUnit.isEmpty() ? resultUnit : "None"); - jsonResult.put("results", resultValuesToJSON(result, numberExtractor, resultPlaces)); - response = Response.ok(jsonResult.toJSONString(), MediaType.APPLICATION_JSON).build(); - } catch (NotJsonSerializableException e) { - response = getNotSerializableErrorResponse(e.getNotSerializableClass()); - } - } - } - return response; - } - - private JSONArray resultValuesToJSON(QueryResult result, Function numberExtractor, - int places) throws NotJsonSerializableException { - if (!Number.class.isAssignableFrom(result.getResultType()) && numberExtractor == null) { - throw new NotJsonSerializableException(result.getResultType()); - } - - // TODO see Bug 3334 - Map values = result.getResults(); - JSONArray jsonResultValues = new JSONArray(); - for (GroupKey groupKey : values.keySet()) { - JSONObject jsonResultEntry = new JSONObject(); - jsonResultEntry.put("groupKey", groupKeyToJSON(groupKey)); - Number value = numberExtractor != null ? numberExtractor.apply(values.get(groupKey)) : (Number) values.get(groupKey); - jsonResultEntry.put("value", roundDouble(value.doubleValue(), places)); - jsonResultValues.add(jsonResultEntry); - } - return jsonResultValues; - } - - private JSONArray groupKeyToJSON(GroupKey groupKey) throws NotJsonSerializableException { - // TODO Convert the concrete key values and not just the string represantation - JSONArray jsonResultEntryGroupKeys = new JSONArray(); - if (groupKey instanceof GenericGroupKey) { - jsonResultEntryGroupKeys.add(simpleGroupKeyToJSON(groupKey)); - } else if (groupKey instanceof CompoundGroupKey) { - for (GroupKey key : groupKey.getKeys()) { - jsonResultEntryGroupKeys.add(groupKeyToJSON(key)); - } - } else { - throw new NotJsonSerializableException(groupKey.getClass()); - } - return jsonResultEntryGroupKeys; - } - - private Object simpleGroupKeyToJSON(GroupKey groupKey) { - return groupKey.asString(); - } - -} +package com.sap.sailing.server.gateway.jaxrs.api; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.function.Function; + +import javax.ws.rs.Path; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.apache.commons.lang.StringEscapeUtils; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; +import org.osgi.util.tracker.ServiceTracker; + +import com.sap.sailing.datamining.SailingPredefinedQueries; +import com.sap.sailing.datamining.data.HasTrackedRaceContext; +import com.sap.sailing.domain.common.Distance; +import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; +import com.sap.sailing.server.gateway.jaxrs.RestServletContainer; +import com.sap.sailing.server.gateway.serialization.NotJsonSerializableException; +import com.sap.sse.datamining.DataMiningServer; +import com.sap.sse.datamining.Query; +import com.sap.sse.datamining.StatisticQueryDefinition; +import com.sap.sse.datamining.data.QueryResult; +import com.sap.sse.datamining.shared.DataMiningSession; +import com.sap.sse.datamining.shared.GroupKey; +import com.sap.sse.datamining.shared.impl.CompoundGroupKey; +import com.sap.sse.datamining.shared.impl.GenericGroupKey; +import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier; +import com.sap.sse.datamining.shared.impl.UUIDDataMiningSession; +import com.sap.sse.datamining.shared.impl.dto.FunctionDTO; +import com.sap.sse.datamining.shared.impl.dto.ModifiableStatisticQueryDefinitionDTO; + +/** + * REST-API to run predefined queries and get the result as JSON. + * @author Lennart Hensler (D054527) + */ +@Path("/v1/datamining") +public class DataMiningResource extends AbstractSailingServerResource { + + private SailingPredefinedQueries predefinedDataMiningQueries; + + private static final Function distanceMetersExtractor = (distance) -> distance.getMeters(); + + public final static String QUERY_AVERAGE_SPEED_PER_REGATTA_RACE = "AvgSpeed_Per_Regatta-Race"; + public final static String QUERY_AVERAGE_SPEED_PER_COMPETITOR_LEGTYPE = "AvgSpeed_Per_Competitor-LegType"; + public final static String QUERY_AVERAGE_SPEED_PER_COMPETITOR = "AvgSpeed_Per_Competitor"; + public final static String QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE = "DistanceTraveled_Per_Competitor-LegType"; + public final static String QUERY_DISTANCE_TRAVELED_PER_COMPETITOR = "DistanceTraveled_Per_Competitor"; + public final static String QUERY_MANEUVERS_PER_COMPETITOR = "Maneuvers_Per_Competitor"; + + public List getPredefinedRegattaDataMiningQueries() { + return getPredefinedQueriesByNames( + QUERY_AVERAGE_SPEED_PER_COMPETITOR_LEGTYPE, + QUERY_AVERAGE_SPEED_PER_COMPETITOR, + QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE, + QUERY_DISTANCE_TRAVELED_PER_COMPETITOR, + QUERY_MANEUVERS_PER_COMPETITOR); + } + + public List getPredefinedRaceDataMiningQueries() { + return getPredefinedQueriesByNames( + QUERY_AVERAGE_SPEED_PER_REGATTA_RACE, + QUERY_AVERAGE_SPEED_PER_COMPETITOR_LEGTYPE, + QUERY_AVERAGE_SPEED_PER_COMPETITOR, + QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE, + QUERY_DISTANCE_TRAVELED_PER_COMPETITOR, + QUERY_MANEUVERS_PER_COMPETITOR); + } + + public List getPredefinedQueriesByNames(String... names) { + List result = new ArrayList<>(); + SailingPredefinedQueries predefinedMiningQueries = getPredefinedMiningQueries(); + for(PredefinedQueryIdentifier id: predefinedMiningQueries.getQueries().keySet()) { + for(String name: names) { + if(id.getIdentifier().equals(name)) { + result.add(id); + } + } + } + return result; + } + + public DataMiningServer getDataMiningServer() { + @SuppressWarnings("unchecked") + ServiceTracker dataMiningServerTracker = (ServiceTracker) getServletContext().getAttribute(RestServletContainer.DATA_MINING_SERVER_TRACKER_NAME); + return dataMiningServerTracker.getService(); + } + + private Response getBadIdentifierErrorResponse(String identifier) { + return Response.status(Status.NOT_FOUND).entity("Couldn't find a predefined query with the identifier '" + identifier + "'.") + .type(MediaType.TEXT_PLAIN).build(); + } + + private Response getBadQueryDefinitionErrorResponse(ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO) { + return Response.status(Status.BAD_REQUEST).entity("Couldn't create a query for definition '" + StringEscapeUtils.escapeHtml(queryDefinitionDTO.toString()) + "'.") + .type(MediaType.TEXT_PLAIN).build(); + } + + private Response getNoDataFoundErrorResponse() { + return Response.status(Status.NOT_FOUND).entity("No data found.").type(MediaType.TEXT_PLAIN).build(); + } + + private Response getNotSerializableErrorResponse(Class type) { + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Can't serialize values of type '" + type.getName() + "'."). + type(MediaType.TEXT_PLAIN).build(); + } + + private SailingPredefinedQueries getPredefinedMiningQueries() { + if (predefinedDataMiningQueries == null) { + predefinedDataMiningQueries = new SailingPredefinedQueries(); + } + return predefinedDataMiningQueries; + } + + public Response predefinedQueryIdentifiersToJSON(Iterable identifiers) { + JSONArray predefinedQueryNames = new JSONArray(); + for (PredefinedQueryIdentifier identifier : identifiers) { + JSONObject jsonId = new JSONObject(); + jsonId.put("Identifier", identifier.getIdentifier()); + jsonId.put("Description", identifier.getDescription()); + predefinedQueryNames.add(jsonId); + } + + String json = predefinedQueryNames.toJSONString(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + + public Response avgSpeedPerCompetitorAndLegType(String regattaName) { + return avgSpeedPerCompetitorQuery(SailingPredefinedQueries.QUERY_AVERAGE_SPEED_PER_COMPETITOR_LEGTYPE, regattaName); + } + + public Response avgSpeedPerCompetitor(String regattaName) { + return avgSpeedPerCompetitorQuery(SailingPredefinedQueries.QUERY_AVERAGE_SPEED_PER_COMPETITOR, regattaName); + } + + public Response avgSpeedPerCompetitorAndLegType(String regattaName, String raceName) { + return avgSpeedPerCompetitorQuery(SailingPredefinedQueries.QUERY_AVERAGE_SPEED_PER_COMPETITOR_LEGTYPE, regattaName, raceName); + } + + public Response avgSpeedPerCompetitor(String regattaName, String raceName) { + return avgSpeedPerCompetitorQuery(SailingPredefinedQueries.QUERY_AVERAGE_SPEED_PER_COMPETITOR, regattaName, raceName); + } + + private Response avgSpeedPerCompetitorQuery(String predefinedQueriesName, String regattaName) { + return avgSpeedPerCompetitorQuery(predefinedQueriesName, regattaName, null); + } + + private Response avgSpeedPerCompetitorQuery(String predefinedQueriesName, String regattaName, String raceName) { + Response response; + ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(predefinedQueriesName); + + if (queryDefinitionDTO == null) { + response = getBadIdentifierErrorResponse(predefinedQueriesName); + } else { + HashMap> race_FilterSelection = new HashMap<>(); + + FunctionDTO getRegattaName = new FunctionDTO(true, "getRegatta().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + HashSet getRegattaName_FilterSelection = new HashSet<>(); + getRegattaName_FilterSelection.add(regattaName); + race_FilterSelection.put(getRegattaName, getRegattaName_FilterSelection); + + if(raceName != null) { + FunctionDTO getRaceName = new FunctionDTO(true, "getRace().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + HashSet getRaceName_FilterSelection = new HashSet<>(); + getRaceName_FilterSelection.add(raceName); + + race_FilterSelection.put(getRaceName, getRaceName_FilterSelection); + } + + queryDefinitionDTO.setFilterSelectionFor(queryDefinitionDTO.getDataRetrieverChainDefinition().getRetrieverLevel(2), race_FilterSelection); + response = runQuery(queryDefinitionDTO, regattaName, raceName, null, "kn", 2); + } + return response; + } + + public Response sumDistanceTraveledPerCompetitor(String regattaName) { + return sumDistanceTraveledPerCompetitorQuery(SailingPredefinedQueries.QUERY_DISTANCE_TRAVELED_PER_COMPETITOR, regattaName); + } + + public Response sumDistanceTraveledPerCompetitorAndLegType(String regattaName) { + return sumDistanceTraveledPerCompetitorQuery(SailingPredefinedQueries.QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE, regattaName); + } + + public Response sumDistanceTraveledPerCompetitor(String regattaName, String raceName) { + return sumDistanceTraveledPerCompetitorQuery(SailingPredefinedQueries.QUERY_DISTANCE_TRAVELED_PER_COMPETITOR, regattaName, raceName); + } + + public Response sumDistanceTraveledPerCompetitorAndLegType(String regattaName, String raceName) { + return sumDistanceTraveledPerCompetitorQuery(SailingPredefinedQueries.QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE, regattaName, raceName); + } + + private Response sumDistanceTraveledPerCompetitorQuery(String predefinedQueriesName, String regattaName) { + return sumDistanceTraveledPerCompetitorQuery(predefinedQueriesName, regattaName, null); + } + + private Response sumDistanceTraveledPerCompetitorQuery(String predefinedQueriesName, String regattaName, String raceName) { + Response response; + ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(predefinedQueriesName); + + if (queryDefinitionDTO == null) { + response = getBadIdentifierErrorResponse(predefinedQueriesName); + } else { + HashMap> race_FilterSelection = new HashMap<>(); + + FunctionDTO getRegattaName = new FunctionDTO(true, "getRegatta().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + HashSet getRegattaName_FilterSelection = new HashSet<>(); + getRegattaName_FilterSelection.add(regattaName); + race_FilterSelection.put(getRegattaName, getRegattaName_FilterSelection); + + if(raceName != null) { + FunctionDTO getRaceName = new FunctionDTO(true, "getRace().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + HashSet getRaceName_FilterSelection = new HashSet<>(); + getRaceName_FilterSelection.add(raceName); + + race_FilterSelection.put(getRaceName, getRaceName_FilterSelection); + } + + queryDefinitionDTO.setFilterSelectionFor(queryDefinitionDTO.getDataRetrieverChainDefinition().getRetrieverLevel(2), race_FilterSelection); + response = runQuery(queryDefinitionDTO, regattaName, raceName, distanceMetersExtractor, "m", 2); + } + return response; + } + + public Response sumManeuversPerCompetitor(String regattaName) { + return sumManeuversPerCompetitorQuery(SailingPredefinedQueries.QUERY_MANEUVERS_PER_COMPETITOR, regattaName); + } + + public Response sumManeuversPerCompetitor(String regattaName, String raceName) { + return sumManeuversPerCompetitorQuery(SailingPredefinedQueries.QUERY_MANEUVERS_PER_COMPETITOR, regattaName, raceName); + } + + private Response sumManeuversPerCompetitorQuery(String predefinedQueriesName, String regattaName) { + return sumManeuversPerCompetitorQuery(predefinedQueriesName, regattaName, null); + } + + private Response sumManeuversPerCompetitorQuery(String predefinedQueriesName, String regattaName, String raceName) { + Response response; + ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO = getPredefinedQuery(predefinedQueriesName); + + if (queryDefinitionDTO == null) { + response = getBadIdentifierErrorResponse(predefinedQueriesName); + } else { + HashMap> race_FilterSelection = new HashMap<>(); + + FunctionDTO getRegattaName = new FunctionDTO(true, "getRegatta().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + HashSet getRegattaName_FilterSelection = new HashSet<>(); + getRegattaName_FilterSelection.add(regattaName); + race_FilterSelection.put(getRegattaName, getRegattaName_FilterSelection); + + if (raceName != null) { + FunctionDTO getRaceName = new FunctionDTO(true, "getRace().getName()", HasTrackedRaceContext.class.getName(), String.class.getName(), new ArrayList(), "", 0); + HashSet getRaceName_FilterSelection = new HashSet<>(); + getRaceName_FilterSelection.add(raceName); + race_FilterSelection.put(getRaceName, getRaceName_FilterSelection); + } + + queryDefinitionDTO.setFilterSelectionFor(queryDefinitionDTO.getDataRetrieverChainDefinition().getRetrieverLevel(2), race_FilterSelection); + response = runQuery(queryDefinitionDTO, regattaName, raceName, null, null, 0); + } + return response; + } + + private ModifiableStatisticQueryDefinitionDTO getPredefinedQuery(String identifier) { + DataMiningServer dataMiningServer = getDataMiningServer(); + PredefinedQueryIdentifier queryIdentifier = new PredefinedQueryIdentifier(identifier, ""); + return dataMiningServer.getPredefinedQueryDefinitionDTO(queryIdentifier); + } + + private Response runQuery(ModifiableStatisticQueryDefinitionDTO queryDefinitionDTO, String regattaName, String raceName, + Function numberExtractor, String resultUnit, int resultPlaces) { + Response response; + DataMiningServer dataMiningServer = getDataMiningServer(); + + StatisticQueryDefinition queryDefinition = dataMiningServer.getQueryDefinitionForDTO(queryDefinitionDTO); + Query query = queryDefinition == null ? null : dataMiningServer.createQuery(queryDefinition); + if (query == null) { + response = getBadQueryDefinitionErrorResponse(queryDefinitionDTO); + } else { + DataMiningSession session = new UUIDDataMiningSession(UUID.randomUUID()); + long requestTimepoint = System.currentTimeMillis(); + @SuppressWarnings("unchecked") + QueryResult result = (QueryResult) dataMiningServer.runNewQueryAndAbortPreviousQueries(session, query); + + if (result == null || result.isEmpty()) { + response = getNoDataFoundErrorResponse(); + } else { + try { + JSONObject jsonResult = new JSONObject(); + jsonResult.put("state", result.getState()); + jsonResult.put("requestTimepoint", requestTimepoint); + jsonResult.put("calculationDuration-s", roundDouble(result.getCalculationTimeInSeconds(), 2)); + jsonResult.put("description", result.getResultSignifier()); + if (regattaName != null && !regattaName.isEmpty()) { + jsonResult.put("regatta", regattaName); + } + if (raceName != null && !raceName.isEmpty()) { + jsonResult.put("race", raceName); + } + jsonResult.put("resultUnit", resultUnit != null && !resultUnit.isEmpty() ? resultUnit : "None"); + jsonResult.put("results", resultValuesToJSON(result, numberExtractor, resultPlaces)); + response = Response.ok(jsonResult.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } catch (NotJsonSerializableException e) { + response = getNotSerializableErrorResponse(e.getNotSerializableClass()); + } + } + } + return response; + } + + private JSONArray resultValuesToJSON(QueryResult result, Function numberExtractor, + int places) throws NotJsonSerializableException { + if (!Number.class.isAssignableFrom(result.getResultType()) && numberExtractor == null) { + throw new NotJsonSerializableException(result.getResultType()); + } + + // TODO see Bug 3334 + Map values = result.getResults(); + JSONArray jsonResultValues = new JSONArray(); + for (GroupKey groupKey : values.keySet()) { + JSONObject jsonResultEntry = new JSONObject(); + jsonResultEntry.put("groupKey", groupKeyToJSON(groupKey)); + Number value = numberExtractor != null ? numberExtractor.apply(values.get(groupKey)) : (Number) values.get(groupKey); + jsonResultEntry.put("value", roundDouble(value.doubleValue(), places)); + jsonResultValues.add(jsonResultEntry); + } + return jsonResultValues; + } + + private JSONArray groupKeyToJSON(GroupKey groupKey) throws NotJsonSerializableException { + // TODO Convert the concrete key values and not just the string representation + JSONArray jsonResultEntryGroupKeys = new JSONArray(); + if (groupKey instanceof GenericGroupKey) { + jsonResultEntryGroupKeys.add(simpleGroupKeyToJSON(groupKey)); + } else if (groupKey instanceof CompoundGroupKey) { + for (GroupKey key : groupKey.getKeys()) { + jsonResultEntryGroupKeys.add(groupKeyToJSON(key)); + } + } else { + throw new NotJsonSerializableException(groupKey.getClass()); + } + return jsonResultEntryGroupKeys; + } + + private Object simpleGroupKeyToJSON(GroupKey groupKey) { + return groupKey.asString(); + } + +} diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java index 49a8cd60e58..82b7a96edba 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/EventsResource.java @@ -46,7 +46,7 @@ public class EventsResource extends AbstractSailingServerResource { } } String json = result.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } @GET @@ -71,7 +71,7 @@ public class EventsResource extends AbstractSailingServerResource { JSONObject eventJson = eventSerializer.serialize(event); String json = eventJson.toJSONString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } return response; } @@ -98,7 +98,7 @@ public class EventsResource extends AbstractSailingServerResource { filterByLeaderboard, filterByDayOffset, getService()); JSONObject raceStatesJson = eventRaceStatesSerializer.serialize(new Pair>(event, getService().getLeaderboards().values())); String json = raceStatesJson.toJSONString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } return response; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/FileStorageResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/FileStorageResource.java index bb027ede091..0ee8667a9cd 100755 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/FileStorageResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/FileStorageResource.java @@ -13,6 +13,7 @@ import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.Response.Status; @@ -65,7 +66,7 @@ public class FileStorageResource extends AbstractSailingServerResource { getService().getFileStorageManagementService().getActiveFileStorageService() .removeFile(new URI(uri)); result.put("status", Status.OK.name()); - response = Response.ok().entity(result.toJSONString()).build(); + response = Response.ok().entity(result.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } catch (NoCorrespondingServiceRegisteredException | OperationFailedException | InvalidPropertiesException | URISyntaxException | IOException e) { final String errorMessage = "Could not delete file with URI "+uri+": "+e.getMessage(); diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java index 96d6fa865d3..46bd91cf41c 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardGroupsResource.java @@ -52,7 +52,7 @@ public class LeaderboardGroupsResource extends AbstractSailingServerResource { // header option is set to allow communication between two sapsailing servers, especially for // the master data import functionality - return Response.ok(json, MediaType.APPLICATION_JSON).header("Access-Control-Allow-Origin", "*").build(); + return Response.ok(json).header("Access-Control-Allow-Origin", "*").header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } @GET @@ -154,7 +154,7 @@ public class LeaderboardGroupsResource extends AbstractSailingServerResource { } } String json = jsonLeaderboardGroup.toJSONString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } return response; } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java index 248172548a1..1e04efb451c 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/LeaderboardsResource.java @@ -57,6 +57,7 @@ import com.sap.sailing.domain.common.dto.LeaderboardDTO; import com.sap.sailing.domain.common.dto.LeaderboardEntryDTO; import com.sap.sailing.domain.common.dto.LeaderboardRowDTO; import com.sap.sailing.domain.common.dto.RaceColumnDTO; +import com.sap.sailing.domain.common.impl.RaceColumnConstants; import com.sap.sailing.domain.common.racelog.RaceLogServletConstants; import com.sap.sailing.domain.common.racelog.tracking.DeviceMappingConstants; import com.sap.sailing.domain.common.security.Permission; @@ -103,7 +104,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { jsonLeaderboards.add(leaderboardName); } String json = jsonLeaderboards.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } @GET @@ -137,7 +138,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { jsonLeaderboard.writeJSONString(sw); String json = sw.getBuffer().toString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } catch (NoWindException | InterruptedException | ExecutionException | IOException e) { response = Response.status(Status.INTERNAL_SERVER_ERROR).entity(e.getMessage()) .type(MediaType.TEXT_PLAIN).build(); @@ -508,7 +509,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { } else { JSONObject json = CompetitorsResource.getCompetitorJSON(competitor); json.put("displayName", leaderboard.getDisplayName(competitor)); - response = Response.ok(json.toJSONString(), MediaType.APPLICATION_JSON).build(); + response = Response.ok(json.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } return response; } @@ -579,7 +580,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { } JSONObject result = new JSONObject(); result.put("marks", array); - return Response.ok(result.toJSONString(), MediaType.APPLICATION_JSON).build(); + return Response.ok(result.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } private final MarkJsonSerializer markSerializer = new MarkJsonSerializer(); @@ -670,7 +671,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { .type(MediaType.TEXT_PLAIN).build(); } else { final JSONObject json = getJsonForColumnFactors(leaderboard, raceColumns); - response = Response.ok(json.toJSONString(), MediaType.APPLICATION_JSON).build(); + response = Response.ok(json.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } } return response; @@ -678,16 +679,16 @@ public class LeaderboardsResource extends AbstractSailingServerResource { private JSONObject getJsonForColumnFactors(final Leaderboard leaderboard, final Iterable raceColumns) { final JSONObject json = new JSONObject(); - json.put("leaderboard_name", leaderboard.getName()); - json.put("leaderboard_display_name", leaderboard.getDisplayName()); + json.put(RaceColumnConstants.LEADERBOARD_NAME, leaderboard.getName()); + json.put(RaceColumnConstants.LEADERBOARD_DISPLAY_NAME, leaderboard.getDisplayName()); final JSONArray raceColumnsAsJson = new JSONArray(); - json.put("race_columns", raceColumnsAsJson); + json.put(RaceColumnConstants.RACE_COLUMNS, raceColumnsAsJson); for (final RaceColumn rc : raceColumns) { final JSONObject raceColumnAsJson = new JSONObject(); raceColumnsAsJson.add(raceColumnAsJson); - raceColumnAsJson.put("race_column_name", rc.getName()); - raceColumnAsJson.put("explicit_factor", rc.getExplicitFactor()); - raceColumnAsJson.put("factor", rc.getFactor()); + raceColumnAsJson.put(RaceColumnConstants.RACE_COLUMN_NAME, rc.getName()); + raceColumnAsJson.put(RaceColumnConstants.EXPLICIT_FACTOR, rc.getExplicitFactor()); + raceColumnAsJson.put(RaceColumnConstants.FACTOR, rc.getFactor()); } return json; } @@ -724,7 +725,7 @@ public class LeaderboardsResource extends AbstractSailingServerResource { } else { raceColumn.setFactor(explicitFactor); final JSONObject json = getJsonForColumnFactors(leaderboard, Collections.singleton(raceColumn)); - response = Response.ok(json.toJSONString(), MediaType.APPLICATION_JSON).build(); + response = Response.ok(json.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } } return response; diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PingResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PingResource.java index cc94de5933a..a8c96f038b9 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PingResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PingResource.java @@ -3,6 +3,7 @@ package com.sap.sailing.server.gateway.jaxrs.api; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; @@ -12,6 +13,6 @@ public class PingResource extends AbstractSailingServerResource { @GET @Produces("application/json;charset=UTF-8") public Response ping() { - return Response.ok().build(); + return Response.ok().header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } } diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PolarResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PolarResource.java index ec832b06767..b60212a857b 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PolarResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/PolarResource.java @@ -170,7 +170,7 @@ public class PolarResource extends AbstractSailingServerResource { } finally { maneuverBasedWindEstimationTrackImpl.unlockAfterRead(); } - response = Response.ok(resultAsJson.toJSONString(), MediaType.APPLICATION_JSON).build(); + response = Response.ok(resultAsJson.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } } return response; diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java index e08f2deb2ce..3466bf85592 100644 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/RegattasResource.java @@ -1,1169 +1,1235 @@ -package com.sap.sailing.server.gateway.jaxrs.api; - -import java.util.ArrayList; -import java.util.Date; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.logging.Level; -import java.util.logging.Logger; - -import javax.ws.rs.DefaultValue; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.QueryParam; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - -import org.apache.commons.lang.StringEscapeUtils; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - -import com.sap.sailing.domain.base.Competitor; -import com.sap.sailing.domain.base.Course; -import com.sap.sailing.domain.base.Mark; -import com.sap.sailing.domain.base.RaceDefinition; -import com.sap.sailing.domain.base.Regatta; -import com.sap.sailing.domain.base.Waypoint; -import com.sap.sailing.domain.common.Distance; -import com.sap.sailing.domain.common.NoWindException; -import com.sap.sailing.domain.common.RegattaName; -import com.sap.sailing.domain.common.Speed; -import com.sap.sailing.domain.common.Tack; -import com.sap.sailing.domain.common.WindSource; -import com.sap.sailing.domain.common.tracking.GPSFix; -import com.sap.sailing.domain.common.tracking.GPSFixMoving; -import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException; -import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo; -import com.sap.sailing.domain.tracking.DynamicTrackedRace; -import com.sap.sailing.domain.tracking.GPSFixTrack; -import com.sap.sailing.domain.tracking.TrackedLeg; -import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; -import com.sap.sailing.domain.tracking.TrackedRace; -import com.sap.sailing.domain.tracking.WindPositionMode; -import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; -import com.sap.sailing.server.gateway.jaxrs.UnitSerializationUtil; -import com.sap.sailing.server.gateway.serialization.JsonSerializer; -import com.sap.sailing.server.gateway.serialization.coursedata.impl.ControlPointJsonSerializer; -import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseBaseJsonSerializer; -import com.sap.sailing.server.gateway.serialization.coursedata.impl.GateJsonSerializer; -import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer; -import com.sap.sailing.server.gateway.serialization.coursedata.impl.WaypointJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.BoatClassJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.BoatJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.ColorJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.DurationJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.FleetJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.NationalityJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.RegattaJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.SeriesJsonSerializer; -import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer; -import com.sap.sse.InvalidDateException; -import com.sap.sse.common.Duration; -import com.sap.sse.common.TimePoint; -import com.sap.sse.common.Util; -import com.sap.sse.common.impl.MillisecondsTimePoint; -import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier; - -@Path("/v1/regattas") -public class RegattasResource extends AbstractSailingServerResource { - private static final Logger logger = Logger.getLogger(RegattasResource.class.getName()); - - private Response getBadRegattaErrorResponse(String regattaName) { - return Response.status(Status.NOT_FOUND).entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getBadRaceErrorResponse(String regattaName, String raceName) { - return Response.status(Status.NOT_FOUND) - .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "' in regatta '" + StringEscapeUtils.escapeHtml(regattaName) + "'.") - .type(MediaType.TEXT_PLAIN).build(); - } - - - private Response getNoTrackedRaceErrorResponse(String regattaName, String raceName) { - return Response.status(Status.NOT_FOUND) - .entity("No tracked race for race with name '" + StringEscapeUtils.escapeHtml(raceName) + "' in regatta '" + StringEscapeUtils.escapeHtml(regattaName) + "'.") - .type(MediaType.TEXT_PLAIN).build(); - } - - private Response getNotEnoughDataAvailabeErrorResponse(String regattaName, String raceName) { - return Response.status(Status.NOT_FOUND) - .entity("No wind or polar data for race with name '" + StringEscapeUtils.escapeHtml(raceName) + "' in regatta '" + StringEscapeUtils.escapeHtml(regattaName) + "'.") - .type(MediaType.TEXT_PLAIN).build(); - } - - @GET - @Produces("application/json;charset=UTF-8") - public Response getRegattas() { - RegattaJsonSerializer regattaJsonSerializer = new RegattaJsonSerializer(); - - JSONArray regattasJson = new JSONArray(); - for (Regatta regatta : getService().getAllRegattas()) { - regattasJson.add(regattaJsonSerializer.serialize(regatta)); - } - String json = regattasJson.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}") - public Response getRegatta(@PathParam("regattaname") String regattaName) { - Response response; - Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - SeriesJsonSerializer seriesJsonSerializer = new SeriesJsonSerializer(new FleetJsonSerializer( - new ColorJsonSerializer())); - JsonSerializer regattaSerializer = new RegattaJsonSerializer(seriesJsonSerializer, null); - JSONObject serializedRegatta = regattaSerializer.serialize(regatta); - - String json = serializedRegatta.toJSONString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - return response; - } - - /** - * Gets all entries for a regatta. - * - * @param regattaName - * the name of the regatta - * @return - */ - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/entries") - public Response getEntries(@PathParam("regattaname") String regattaName) { - Response response; - Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - NationalityJsonSerializer nationalityJsonSerializer = new NationalityJsonSerializer(); - CompetitorJsonSerializer competitorJsonSerializer = new CompetitorJsonSerializer(new TeamJsonSerializer( - new PersonJsonSerializer(nationalityJsonSerializer)), new BoatJsonSerializer( - new BoatClassJsonSerializer())); - JsonSerializer regattaSerializer = new RegattaJsonSerializer(null, competitorJsonSerializer); - JSONObject serializedRegatta = regattaSerializer.serialize(regatta); - - String json = serializedRegatta.toJSONString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - return response; - } - - /** - * Gets all GPS positions of the competitors for a given race. - * - * @param regattaName - * the name of the regatta - * @param tack - * whether or not to include the tack in the output for each fix. Determining tack requires an expensive - * wind calculation for the competitor's position for each fix's time point. If this value is not - * absolutely required, false should be provided here which is also the default. - * @return - */ - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/competitors/positions") - public Response getCompetitorPositions(@PathParam("regattaname") String regattaName, - @PathParam("racename") String raceName, @QueryParam("fromtime") String fromtime, - @QueryParam("fromtimeasmillis") Long fromtimeasmillis, @QueryParam("totime") String totime, - @QueryParam("totimeasmillis") Long totimeasmillis, @QueryParam("withtack") Boolean withTack, - @QueryParam("competitorId") Set competitorIds) { - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = getBadRaceErrorResponse(regattaName, raceName); - } else { - TrackedRace trackedRace = findTrackedRace(regattaName, raceName); - - TimePoint from; - TimePoint to; - try { - from = parseTimePoint(fromtime, fromtimeasmillis, - trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) : - /* 24h before race start */new MillisecondsTimePoint(trackedRace.getStartOfRace() - .asMillis() - 24 * 3600 * 1000)); - } catch (InvalidDateException e1) { - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.") - .type(MediaType.TEXT_PLAIN).build(); - } - try { - to = parseTimePoint(totime, totimeasmillis, MillisecondsTimePoint.now()); - } catch (InvalidDateException e1) { - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'to' time.") - .type(MediaType.TEXT_PLAIN).build(); - } - - JSONObject jsonRace = new JSONObject(); - jsonRace.put("name", trackedRace.getRace().getName()); - jsonRace.put("regatta", regatta.getName()); - JSONArray jsonCompetitors = new JSONArray(); - for (Competitor competitor : trackedRace.getRace().getCompetitors()) { - if (competitorIds == null || competitorIds.isEmpty() - || competitorIds.contains(competitor.getId().toString())) { - JSONObject jsonCompetitor = new JSONObject(); - jsonCompetitor.put("id", competitor.getId() != null ? competitor.getId().toString() : null); - jsonCompetitor.put("name", competitor.getName()); - jsonCompetitor.put("sailNumber", competitor.getBoat().getSailID()); - jsonCompetitor.put("color", competitor.getColor() != null ? competitor.getColor().getAsHtml() : null); - if(competitor.getFlagImage() != null) { - jsonCompetitor.put("flagImage", competitor.getFlagImage().toString()); - } - GPSFixTrack track = trackedRace.getTrack(competitor); - JSONArray jsonFixes = new JSONArray(); - track.lockForRead(); - try { - Iterator fixIter; - if (from == null) { - fixIter = track.getFixes().iterator(); - } else { - fixIter = track.getFixesIterator(from, /* inclusive */true); - } - while (fixIter.hasNext()) { - GPSFixMoving fix = fixIter.next(); - if (to != null && fix.getTimePoint() != null && to.compareTo(fix.getTimePoint()) < 0) { - break; - } - JSONObject jsonFix = new JSONObject(); - jsonFix.put("timepoint-ms", fix.getTimePoint().asMillis()); - jsonFix.put("lat-deg", UnitSerializationUtil.latLngDecimalFormatter.format(fix - .getPosition().getLatDeg())); - jsonFix.put("lng-deg", UnitSerializationUtil.latLngDecimalFormatter.format(fix - .getPosition().getLngDeg())); - jsonFix.put("truebearing-deg", fix.getSpeed().getBearing().getDegrees()); - jsonFix.put("speed-kts", - UnitSerializationUtil.knotsDecimalFormatter.format(fix.getSpeed().getKnots())); - if (withTack != null && withTack) { - String tackName; - try { - final Tack tack = trackedRace.getTack(competitor, fix.getTimePoint()); - if (tack != null) { - tackName = tack.name(); - jsonFix.put("tack", tackName); - } - } catch (NoWindException e) { - // don't output tack - } - } - jsonFixes.add(jsonFix); - } - } finally { - track.unlockAfterRead(); - } - jsonCompetitor.put("track", jsonFixes); - jsonCompetitors.add(jsonCompetitor); - } - } - jsonRace.put("competitors", jsonCompetitors); - - String json = jsonRace.toJSONString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - } - return response; - } - - /** - * Gets all GPS positions of the course marks for a given race. - * - * @param regattaName - * the name of the regatta - * @return - */ - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/marks/positions") - public Response getMarkPositions(@PathParam("regattaname") String regattaName, - @PathParam("racename") String raceName, @QueryParam("fromtime") String fromtime, - @QueryParam("fromtimeasmillis") Long fromtimeasmillis, @QueryParam("totime") String totime, - @QueryParam("totimeasmillis") Long totimeasmillis, - @DefaultValue("false") @QueryParam("lastknown") boolean addLastKnown) { - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - return getBadRegattaErrorResponse(regattaName); - } - - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - return getBadRaceErrorResponse(regattaName, raceName); - } - - TrackedRace trackedRace = findTrackedRace(regattaName, raceName); - - TimePoint from; - TimePoint to; - try { - from = parseTimePoint(fromtime, fromtimeasmillis, - trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) : - /* 24h before race start */new MillisecondsTimePoint( - trackedRace.getStartOfRace().asMillis() - 24 * 3600 * 1000)); - } catch (InvalidDateException e1) { - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.") - .type(MediaType.TEXT_PLAIN).build(); - } - try { - to = parseTimePoint(totime, totimeasmillis, MillisecondsTimePoint.now()); - } catch (InvalidDateException e1) { - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'to' time.") - .type(MediaType.TEXT_PLAIN).build(); - } - - JSONObject jsonRace = new JSONObject(); - jsonRace.put("name", trackedRace.getRace().getName()); - jsonRace.put("regatta", regatta.getName()); - JSONArray jsonMarks = new JSONArray(); - Set marks = new HashSet(); - Course course = trackedRace.getRace().getCourse(); - for (Waypoint waypoint : course.getWaypoints()) { - for (Mark mark : waypoint.getMarks()) { - marks.add(mark); - } - } - - for (Mark mark : marks) { - JSONObject jsonMark = new JSONObject(); - jsonMark.put("name", mark.getName()); - jsonMark.put("id", mark.getId() != null ? mark.getId().toString() : null); - GPSFixTrack track = trackedRace.getOrCreateTrack(mark); - JSONArray jsonFixes = new JSONArray(); - track.lockForRead(); - try { - Iterator fixIter; - if (from == null) { - fixIter = track.getFixes().iterator(); - } else { - fixIter = track.getFixesIterator(from, /* inclusive */true); - } - GPSFix fix = null; - boolean lastAdded = false; - while (fixIter.hasNext()) { - fix = fixIter.next(); - if (to != null && fix.getTimePoint() != null && to.compareTo(fix.getTimePoint()) < 0) { - lastAdded = false; - break; - } - addFixToJsonFixes(jsonFixes, fix); - lastAdded = true; - } - - if (addLastKnown && !lastAdded) { - // find a fix earlier than the interval requested: - Iterator earlierFixIter = track.getFixesDescendingIterator(from, /* inclusive */false); - final GPSFix earlierFix; - if (earlierFixIter.hasNext()) { - earlierFix = earlierFixIter.next(); - } else { - earlierFix = null; - } - if (earlierFix != null && (fix == null || earlierFix.getTimePoint().until(from).compareTo(to.until(fix.getTimePoint())) <= 0)) { - addFixToJsonFixes(jsonFixes, earlierFix); // the earlier fix is closer to the interval's beginning than fix is to its end - } else if (fix != null) { - addFixToJsonFixes(jsonFixes, fix); - } - } - - } finally { - track.unlockAfterRead(); - } - jsonMark.put("track", jsonFixes); - jsonMarks.add(jsonMark); - } - jsonRace.put("marks", jsonMarks); - - String json = jsonRace.toJSONString(); - - return Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - - private JSONObject addFixToJsonFixes(JSONArray jsonFixes, GPSFix fix) { - JSONObject jsonFix = constructFixJson(fix); - jsonFixes.add(jsonFix); - return jsonFix; - } - - private JSONObject constructFixJson(GPSFix fix) { - JSONObject jsonFix = new JSONObject(); - jsonFix.put("timepoint-ms", fix.getTimePoint().asMillis()); - jsonFix.put("lat-deg", - UnitSerializationUtil.latLngDecimalFormatter.format(fix.getPosition().getLatDeg())); - jsonFix.put("lng-deg", - UnitSerializationUtil.latLngDecimalFormatter.format(fix.getPosition().getLngDeg())); - return jsonFix; - } - - /** - * Gets the course of the race. - * - * @param regattaName - * the name of the regatta - * @return - */ - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/course") - public Response getCourse(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = getBadRaceErrorResponse(regattaName, raceName); - } else { - Course course = race.getCourse(); - CourseBaseJsonSerializer serializer = new CourseBaseJsonSerializer(new WaypointJsonSerializer( - new ControlPointJsonSerializer(new MarkJsonSerializer(), new GateJsonSerializer( - new MarkJsonSerializer())))); - - JSONObject jsonCourse = serializer.serialize(course); - String json = jsonCourse.toJSONString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - } - return response; - } - - /** - * Gets the target time of the race - * - * @param regattaName - * the name of the regatta - * @return -1 if not enough polar data or no wind information is available - */ - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/targettime") - public Response getTargetTime(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName, - @QueryParam("timeasmillis") Long timeasmillis) { - if (timeasmillis == null) { - timeasmillis = System.currentTimeMillis(); - } - TimePoint timePoint = new MillisecondsTimePoint(timeasmillis); - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = getBadRaceErrorResponse(regattaName, raceName); - } else { - DynamicTrackedRace trackedRace = getService().getTrackedRace(regatta, race); - if (trackedRace != null) { - Duration targetTime; - try { - targetTime = trackedRace.getEstimatedTimeToComplete(timePoint); - - DurationJsonSerializer serializer = new DurationJsonSerializer(); - - JSONObject jsonCourse = serializer.serialize(targetTime); - String json = jsonCourse.toJSONString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); - } catch (NotEnoughDataHasBeenAddedException | NoWindException e) { - response = getNotEnoughDataAvailabeErrorResponse(regattaName, raceName); - } - } else { - response = getNoTrackedRaceErrorResponse(regattaName, raceName); - } - - } - } - return response; - } - - /** - * Gets the relevant times of the race. - * - * @param regattaName - * the name of the regatta - * @return - */ - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/times") - public Response getTimes(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { - Response response = null; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = getBadRaceErrorResponse(regattaName, raceName); - } else { - TrackedRace trackedRace = findTrackedRace(regattaName, raceName); - - JSONObject jsonRaceTimes = new JSONObject(); - jsonRaceTimes.put("name", trackedRace.getRace().getName()); - jsonRaceTimes.put("regatta", regatta.getName()); - - jsonRaceTimes.put("startOfRace-ms", trackedRace.getStartOfRace() == null ? null : trackedRace - .getStartOfRace().asMillis()); - jsonRaceTimes.put("startOfTracking-ms", trackedRace.getStartOfTracking() == null ? null : trackedRace - .getStartOfTracking().asMillis()); - jsonRaceTimes.put("newestTrackingEvent-ms", trackedRace.getTimePointOfNewestEvent() == null ? null - : trackedRace.getTimePointOfNewestEvent().asMillis()); - jsonRaceTimes.put("endOfTracking-ms", trackedRace.getEndOfTracking() == null ? null : trackedRace - .getEndOfTracking().asMillis()); - jsonRaceTimes.put("endOfRace-ms", trackedRace.getEndOfRace() == null ? null : trackedRace - .getEndOfRace().asMillis()); - jsonRaceTimes.put("delayToLive-ms", trackedRace.getDelayToLiveInMillis()); - - JSONArray jsonMarkPassingTimes = new JSONArray(); - List firstPassingTimepoints = new ArrayList<>(); - Iterable>> markPassingsTimes = trackedRace - .getMarkPassingsTimes(); - synchronized (markPassingsTimes) { - int numberOfWaypoints = Util.size(markPassingsTimes); - int wayPointNumber = 1; - for (com.sap.sse.common.Util.Pair> markPassingTimes : markPassingsTimes) { - JSONObject jsonMarkPassing = new JSONObject(); - String name = "M" + (wayPointNumber - 1); - if (wayPointNumber == numberOfWaypoints) { - name = "F"; - } - jsonMarkPassing.put("name", name); - com.sap.sse.common.Util.Pair timesPair = markPassingTimes.getB(); - TimePoint firstPassingTime = timesPair.getA(); - TimePoint lastPassingTime = timesPair.getB(); - jsonMarkPassing.put("firstPassing-ms", - firstPassingTime == null ? null : firstPassingTime.asMillis()); - jsonMarkPassing.put("lastPassing-ms", - lastPassingTime == null ? null : lastPassingTime.asMillis()); - - firstPassingTimepoints.add(firstPassingTime); - - jsonMarkPassingTimes.add(jsonMarkPassing); - wayPointNumber++; - } - } - jsonRaceTimes.put("markPassings", jsonMarkPassingTimes); - - JSONArray jsonLegInfos = new JSONArray(); - trackedRace.getRace().getCourse().lockForRead(); - try { - Iterable trackedLegs = trackedRace.getTrackedLegs(); - int legNumber = 1; - for (TrackedLeg trackedLeg : trackedLegs) { - JSONObject jsonLegInfo = new JSONObject(); - jsonLegInfo.put("name", "L" + legNumber); - - try { - TimePoint firstPassingTime = firstPassingTimepoints.get(legNumber - 1); - if (firstPassingTime != null) { - jsonLegInfo.put("type", trackedLeg.getLegType(firstPassingTime)); - jsonLegInfo.put( - "bearing-deg", - UnitSerializationUtil.bearingDecimalFormatter.format(trackedLeg.getLegBearing( - firstPassingTime).getDegrees())); - } - } catch (NoWindException e) { - // do nothing - } - jsonLegInfos.add(jsonLegInfo); - - legNumber++; - } - } finally { - trackedRace.getRace().getCourse().unlockAfterRead(); - } - jsonRaceTimes.put("legs", jsonLegInfos); - - Date now = new Date(); - jsonRaceTimes.put("currentServerTime-ms", now.getTime()); - - String json = jsonRaceTimes.toJSONString(); - response = Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/windsources") - public Response getWindSources(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - TrackedRace trackedRace = findTrackedRace(regattaName, raceName); - JSONArray windSourcesAvailable = new JSONArray(); - if (trackedRace != null) { - for (WindSource windSource : trackedRace.getWindSources()) { - JSONObject windSourceJson = new JSONObject(); - windSourceJson.put("typeName", windSource.getType().name()); - windSourceJson.put("id", windSource.getId() != null ? windSource.getId().toString() : ""); - windSourcesAvailable.add(windSourceJson); - } - } - return Response.ok(windSourcesAvailable.toString(), MediaType.APPLICATION_JSON).build(); - } - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/wind") - public Response getWind(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName, - @DefaultValue("COMBINED") @QueryParam("windsource") String windSource, - @QueryParam("windsourceid") String windSourceId, @QueryParam("fromtime") String fromtime, - @QueryParam("fromtimeasmillis") Long fromtimeasmillis, @QueryParam("totime") String totime, - @QueryParam("totimeasmillis") Long totimeasmillis) { - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - TrackedRace trackedRace = findTrackedRace(regattaName, raceName); - - TimePoint from; - TimePoint to; - try { - from = parseTimePoint(fromtime, fromtimeasmillis, - trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) : - /* 24h before race start */new MillisecondsTimePoint(trackedRace.getStartOfRace() - .asMillis() - 24 * 3600 * 1000)); - } catch (InvalidDateException e1) { - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.") - .type(MediaType.TEXT_PLAIN).build(); - } - try { - to = parseTimePoint(totime, totimeasmillis, MillisecondsTimePoint.now()); - } catch (InvalidDateException e1) { - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'to' time.") - .type(MediaType.TEXT_PLAIN).build(); - } - // Crop request interval to startOfTracking / [endOfTracking|timePointOfLastEvent] - from = Util.getLatestOfTimePoints(from, trackedRace.getStartOfTracking()); - to = Util.getEarliestOfTimePoints(to, Util.getEarliestOfTimePoints(trackedRace.getEndOfTracking(), trackedRace.getTimePointOfNewestEvent())); - TrackedRaceJsonSerializer serializer = new TrackedRaceJsonSerializer( - new DefaultWindTrackJsonSerializer()); - serializer.setWindSource(windSource); - serializer.setWindSourceId(windSourceId); - serializer.setFromTime(from); - serializer.setToTime(to); - - JSONObject jsonWindTracks = serializer.serialize(trackedRace); - String json = jsonWindTracks.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/firstlegbearing") - public Response getFirstLegBearing(@PathParam("regattaname") String regattaName, - @PathParam("racename") String raceName, @QueryParam("time") String time, - @QueryParam("timeasmillis") Long timeasmillis) { - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - TrackedRace trackedRace = findTrackedRace(regattaName, raceName); - final TimePoint timePoint; - try { - timePoint = parseTimePoint( - time, - timeasmillis, - trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) : trackedRace - .getStartOfRace()); - } catch (InvalidDateException e1) { - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.") - .type(MediaType.TEXT_PLAIN).build(); - } - - BearingJsonSerializer serializer = new BearingJsonSerializer(); - JSONObject jsonBearing = serializer.serialize(trackedRace.getDirectionFromStartToNextMark(timePoint) - .getFrom()); - String json = jsonBearing.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/markpassings") - public Response getMarkPassings(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - TrackedRace trackedRace = findTrackedRace(regattaName, raceName); - MarkPassingsJsonSerializer serializer = new MarkPassingsJsonSerializer(); - JSONObject jsonMarkPassings = serializer.serialize(trackedRace); - String json = jsonMarkPassings.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races") - public Response getRaces(@PathParam("regattaname") String regattaName) { - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - JSONObject jsonRaceResults = new JSONObject(); - jsonRaceResults.put("regatta", regatta.getName()); - JSONArray jsonRaces = new JSONArray(); - jsonRaceResults.put("races", jsonRaces); - for (RaceDefinition race : regatta.getAllRaces()) { - JSONObject jsonRace = new JSONObject(); - jsonRaces.add(jsonRace); - jsonRace.put("name", race.getName()); - jsonRace.put("id", race.getId().toString()); - } - String json = jsonRaceResults.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/competitors/legs") - public Response getCompetitorRanks(@PathParam("regattaname") String regattaName, - @PathParam("racename") String raceName) { - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - TrackedRace trackedRace = findTrackedRace(regattaName, raceName); - TimePoint timePoint = trackedRace.getTimePointOfNewestEvent() == null ? MillisecondsTimePoint.now() - : trackedRace.getTimePointOfNewestEvent(); - final RankingInfo rankingInfo = trackedRace.getRankingMetric().getRankingInfo(timePoint); - JSONObject jsonRaceResults = new JSONObject(); - jsonRaceResults.put("name", trackedRace.getRace().getName()); - jsonRaceResults.put("regatta", regatta.getName()); - jsonRaceResults.put("startOfRace-ms", trackedRace.getStartOfRace() == null ? null : trackedRace - .getStartOfRace().asMillis()); - - JSONArray jsonLegs = new JSONArray(); - Course course = trackedRace.getRace().getCourse(); - course.lockForRead(); - try { - for (TrackedLeg leg : trackedRace.getTrackedLegs()) { - JSONObject jsonLeg = new JSONObject(); - jsonLeg.put("from", leg.getLeg().getFrom().getName()); - jsonLeg.put("fromWaypointId", leg.getLeg().getFrom().getId() != null ? leg.getLeg().getFrom().getId().toString() : null); - jsonLeg.put("to", leg.getLeg().getTo().getName()); - jsonLeg.put("toWaypointId", leg.getLeg().getTo().getId() != null ? leg.getLeg().getTo().getId().toString() : null); - try { - jsonLeg.put("upOrDownwindLeg", leg.isUpOrDownwindLeg(timePoint)); - } catch (NoWindException e) { - // no wind, then it's simply no upwind or downwind leg - jsonLeg.put("upOrDownwindLeg", "false"); - } - JSONArray jsonCompetitors = new JSONArray(); - Map ranks = leg.getRanks(timePoint); - for (Competitor competitor : trackedRace.getRace().getCompetitors()) { - JSONObject jsonCompetitorInLeg = new JSONObject(); - TrackedLegOfCompetitor trackedLegOfCompetitor = leg.getTrackedLeg(competitor); - if (trackedLegOfCompetitor != null) { - jsonCompetitorInLeg.put("id", competitor.getId() != null ? competitor.getId() - .toString() : null); - jsonCompetitorInLeg.put("name", competitor.getName()); - jsonCompetitorInLeg.put("sailNumber", competitor.getBoat().getSailID()); - jsonCompetitorInLeg.put("color", competitor.getColor() != null ? competitor.getColor() - .getAsHtml() : null); - - Speed averageSpeedOverGround = trackedLegOfCompetitor - .getAverageSpeedOverGround(timePoint); - if (averageSpeedOverGround != null) { - jsonCompetitorInLeg.put("averageSOG-kts", - UnitSerializationUtil.knotsDecimalFormatter.format(averageSpeedOverGround - .getKnots())); - } - try { - Integer numberOfTacks = trackedLegOfCompetitor.getNumberOfTacks(timePoint, /* waitForLatest */ - false); - Integer numberOfJibes = trackedLegOfCompetitor.getNumberOfJibes(timePoint, /* waitForLatest */ - false); - Integer numberOfPenaltyCircles = trackedLegOfCompetitor.getNumberOfPenaltyCircles( - timePoint, /* waitForLatest */false); - jsonCompetitorInLeg.put("tacks", numberOfTacks); - jsonCompetitorInLeg.put("jibes", numberOfJibes); - jsonCompetitorInLeg.put("penaltyCircles", numberOfPenaltyCircles); - } catch (NoWindException e) { - logger.log(Level.FINE, - "No wind information while trying to determing maneuvers for competitor " - + competitor.getName(), e); - } - - TimePoint startTime = trackedLegOfCompetitor.getStartTime(); - TimePoint finishTime = trackedLegOfCompetitor.getFinishTime(); - TimePoint startOfRace = trackedRace.getStartOfRace(); - // between the start of the race and the start of the first leg we have no - // 'timeSinceGun' - // for the competitor - if (startOfRace != null && startTime != null) { - long timeSinceGun = -1; - if (finishTime != null) { - timeSinceGun = finishTime.asMillis() - startOfRace.asMillis(); - } else { - timeSinceGun = timePoint.asMillis() - startOfRace.asMillis(); - } - if (timeSinceGun > 0) { - jsonCompetitorInLeg.put("timeSinceGun-ms", timeSinceGun); - } - Distance distanceSinceGun = trackedRace.getTrack(competitor).getDistanceTraveled( - startOfRace, finishTime != null ? finishTime : timePoint); - if (distanceSinceGun != null) { - jsonCompetitorInLeg.put("distanceSinceGun-m", distanceSinceGun.getMeters()); - } - } - - Distance distanceTraveled = trackedLegOfCompetitor.getDistanceTraveled(timePoint); - if (distanceTraveled != null) { - jsonCompetitorInLeg.put("distanceTraveled-m", - UnitSerializationUtil.distanceDecimalFormatter.format(distanceTraveled - .getMeters())); - } - Distance distanceTraveledIncludingGateStart = trackedLegOfCompetitor - .getDistanceTraveledConsideringGateStart(timePoint); - if (distanceTraveledIncludingGateStart != null) { - jsonCompetitorInLeg.put("distanceTraveledIncludingGateStart-m", - UnitSerializationUtil.distanceDecimalFormatter - .format(distanceTraveledIncludingGateStart.getMeters())); - } - try { - Integer rank = ranks.get(competitor); - jsonCompetitorInLeg.put("rank", rank); - } catch (RuntimeException re) { - if (re.getCause() != null && re.getCause() instanceof NoWindException) { - // well, we don't know the wind direction, so we can't compute a ranking - } else { - throw re; - } - } - Duration gapToLeaderDuration = trackedLegOfCompetitor.getGapToLeader(timePoint, rankingInfo, WindPositionMode.LEG_MIDDLE); - jsonCompetitorInLeg.put("gapToLeader-s", gapToLeaderDuration != null ? gapToLeaderDuration.asSeconds() : 0.0); - jsonCompetitorInLeg.put("started", trackedLegOfCompetitor.hasStartedLeg(timePoint)); - jsonCompetitorInLeg.put("finished", trackedLegOfCompetitor.hasFinishedLeg(timePoint)); - jsonCompetitors.add(jsonCompetitorInLeg); - } - } - jsonLeg.put("competitors", jsonCompetitors); - jsonLegs.add(jsonLeg); - } - } finally { - course.unlockAfterRead(); - } - jsonRaceResults.put("legs", jsonLegs); - - String json = jsonRaceResults.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/competitors/live") - public Response getCompetitorLiveRanks(@PathParam("regattaname") String regattaName, - @PathParam("racename") String raceName, @DefaultValue("-1") @QueryParam("topN") Integer topN) { - Response response; - Regatta regatta = findRegattaByName(regattaName); - if (regatta == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = Response.status(Status.NOT_FOUND) - .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) - .build(); - } else { - TrackedRace trackedRace = findTrackedRace(regattaName, raceName); - Course course = trackedRace.getRace().getCourse(); - Waypoint lastWaypoint = course.getLastWaypoint(); - - TimePoint timePoint = MillisecondsTimePoint.now().minus(trackedRace.getDelayToLiveInMillis()); - final RankingInfo rankingInfo = trackedRace.getRankingMetric().getRankingInfo(timePoint); - JSONObject jsonLiveData = new JSONObject(); - jsonLiveData.put("name", trackedRace.getRace().getName()); - jsonLiveData.put("regatta", regatta.getName()); - - if (trackedRace.getStartOfRace() != null) { - TimePoint startOfRace = trackedRace.getStartOfRace(); - TimePoint now = MillisecondsTimePoint.now(); - jsonLiveData.put("startTime", startOfRace.asMillis()); - jsonLiveData.put("liveTime", now.asMillis()); - if (startOfRace.before(now)) { - jsonLiveData.put("timeSinceStart-s", (now.asMillis() - startOfRace.asMillis()) / 1000.0); - } else { - jsonLiveData.put("timeToStart-s", (startOfRace.asMillis() - now.asMillis()) / 1000.0); - } - } - - JSONArray jsonCompetitors = new JSONArray(); - List competitorsFromBestToWorst = trackedRace.getCompetitorsFromBestToWorst(timePoint); - Integer rank = 1; - for (Competitor competitor : competitorsFromBestToWorst) { - JSONObject jsonCompetitorInLeg = new JSONObject(); - - if (topN != null && topN > 0 && rank > topN) { - break; - } - jsonCompetitorInLeg.put("id", competitor.getId() != null ? competitor.getId().toString() : null); - jsonCompetitorInLeg.put("name", competitor.getName()); - jsonCompetitorInLeg.put("sailNumber", competitor.getBoat().getSailID()); - jsonCompetitorInLeg.put("color", competitor.getColor() != null ? competitor.getColor().getAsHtml() - : null); - jsonCompetitorInLeg.put("rank", rank++); - - TrackedLegOfCompetitor currentLegOfCompetitor = trackedRace.getCurrentLeg(competitor, timePoint); - if (currentLegOfCompetitor != null) { - int indexOfWaypoint = course.getIndexOfWaypoint(currentLegOfCompetitor.getLeg().getFrom()); - jsonCompetitorInLeg.put("leg", indexOfWaypoint + 1); - - Speed speedOverGround = currentLegOfCompetitor.getSpeedOverGround(timePoint); - if (speedOverGround != null) { - jsonCompetitorInLeg.put("speedOverGround-kts", roundDouble(speedOverGround.getKnots(), 2)); - } - - Distance distanceTraveled = currentLegOfCompetitor.getDistanceTraveled(timePoint); - if (distanceTraveled != null) { - jsonCompetitorInLeg.put("distanceTraveled-m", roundDouble(distanceTraveled.getMeters(), 2)); - } - Distance distanceTraveledConsideringGateStart = currentLegOfCompetitor - .getDistanceTraveledConsideringGateStart(timePoint); - if (distanceTraveledConsideringGateStart != null) { - jsonCompetitorInLeg.put("distanceTraveledConsideringGateStart-m", - roundDouble(distanceTraveledConsideringGateStart.getMeters(), 2)); - } - - Duration gapToLeader = currentLegOfCompetitor.getGapToLeader(timePoint, - rankingInfo, WindPositionMode.LEG_MIDDLE); - if (gapToLeader != null) { - jsonCompetitorInLeg.put("gapToLeader-s", roundDouble(gapToLeader.asSeconds(), 2)); - } - - Distance windwardDistanceToCompetitorFarthestAhead = currentLegOfCompetitor - .getWindwardDistanceToCompetitorFarthestAhead(timePoint, WindPositionMode.LEG_MIDDLE, rankingInfo); - if (windwardDistanceToCompetitorFarthestAhead != null) { - jsonCompetitorInLeg.put("gapToLeader-m", - roundDouble(windwardDistanceToCompetitorFarthestAhead.getMeters(), 2)); - } - jsonCompetitorInLeg.put("finished", false); - } else { - // we need to distinguish between competitors which did not start and competitors which - // already finished - if (trackedRace.getMarkPassing(competitor, lastWaypoint) != null) { - jsonCompetitorInLeg.put("finished", true); - } else { - jsonCompetitorInLeg.put("finished", false); - } - } - jsonCompetitors.add(jsonCompetitorInLeg); - } - jsonLiveData.put("competitors", jsonCompetitors); - String json = jsonLiveData.toJSONString(); - return Response.ok(json, MediaType.APPLICATION_JSON).build(); - } - } - return response; - } - - private DataMiningResource dataMiningResource; - - private DataMiningResource getDataMiningResource() { - if (dataMiningResource == null) { - dataMiningResource = getResourceContext().getResource(DataMiningResource.class); - } - return dataMiningResource; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("datamining") - public Response getRegattaPredefinedQueries() { - // TODO Fetch the predefined queries for regattas dynamically - ArrayList predefinedRegattaQueries = new ArrayList<>(); - predefinedRegattaQueries.add(new PredefinedQueryIdentifier("AvgSpeed_Per_Competitor-LegType", "Average Speed grouped by Competitor Team Name and Leg Type")); - predefinedRegattaQueries.add(new PredefinedQueryIdentifier("SumDistance_Per_Competitor-LegType", "Sum of the traveled Distance grouped by Competitor Team Name and Leg Type")); - predefinedRegattaQueries.add(new PredefinedQueryIdentifier("SumManeuvers_Per_Competitor", "Sum of the performed Maneuvers grouped by Competitor Team Name")); - return getDataMiningResource().predefinedQueryIdentifiersToJSON(predefinedRegattaQueries); - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/datamining/AvgSpeed_Per_Competitor-LegType") - public Response avgSpeedPerCompetitorAndLegType(@PathParam("regattaname") String regattaName) { - Response response; - - Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - response = getDataMiningResource().avgSpeedPerCompetitorAndLegType(regattaName); - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/datamining/AvgSpeed_Per_Competitor-LegType") - public Response avgSpeedPerCompetitorAndLegType(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { - Response response; - - Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = getBadRaceErrorResponse(regattaName, raceName); - } else { - response = getDataMiningResource().avgSpeedPerCompetitorAndLegType(regattaName, raceName); - } - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/datamining/SumDistance_Per_Competitor-LegType") - public Response sumDistancePerCompetitorAndLegType(@PathParam("regattaname") String regattaName) { - Response response; - - Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - response = getDataMiningResource().sumDistancePerCompetitorAndLegType(regattaName); - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/datamining/SumDistance_Per_Competitor-LegType") - public Response sumDistancePerCompetitorAndLegType(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { - Response response; - - Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = getBadRaceErrorResponse(regattaName, raceName); - } else { - response = getDataMiningResource().sumDistancePerCompetitorAndLegType(regattaName, raceName); - } - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/datamining/SumManeuvers_Per_Competitor") - public Response sumManeuversPerCompetitor(@PathParam("regattaname") String regattaName) { - Response response; - - Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - response = getDataMiningResource().sumManeuversPerCompetitor(regattaName); - } - return response; - } - - @GET - @Produces("application/json;charset=UTF-8") - @Path("{regattaname}/races/{racename}/datamining/SumManeuvers_Per_Competitor") - public Response sumManeuversPerCompetitor(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { - Response response; - - Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); - if (regatta == null) { - response = getBadRegattaErrorResponse(regattaName); - } else { - RaceDefinition race = findRaceByName(regatta, raceName); - if (race == null) { - response = getBadRaceErrorResponse(regattaName, raceName); - } else { - response = getDataMiningResource().sumManeuversPerCompetitor(regattaName, raceName); - } - } - return response; - } - -} +package com.sap.sailing.server.gateway.jaxrs.api; + +import java.util.ArrayList; +import java.util.Date; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.apache.commons.lang.StringEscapeUtils; +import org.json.simple.JSONArray; +import org.json.simple.JSONObject; + +import com.sap.sailing.datamining.SailingPredefinedQueries; +import com.sap.sailing.domain.base.Competitor; +import com.sap.sailing.domain.base.Course; +import com.sap.sailing.domain.base.Mark; +import com.sap.sailing.domain.base.RaceDefinition; +import com.sap.sailing.domain.base.Regatta; +import com.sap.sailing.domain.base.Waypoint; +import com.sap.sailing.domain.common.Distance; +import com.sap.sailing.domain.common.NoWindException; +import com.sap.sailing.domain.common.RegattaName; +import com.sap.sailing.domain.common.Speed; +import com.sap.sailing.domain.common.Tack; +import com.sap.sailing.domain.common.WindSource; +import com.sap.sailing.domain.common.tracking.GPSFix; +import com.sap.sailing.domain.common.tracking.GPSFixMoving; +import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException; +import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo; +import com.sap.sailing.domain.tracking.DynamicTrackedRace; +import com.sap.sailing.domain.tracking.GPSFixTrack; +import com.sap.sailing.domain.tracking.TrackedLeg; +import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor; +import com.sap.sailing.domain.tracking.TrackedRace; +import com.sap.sailing.domain.tracking.WindPositionMode; +import com.sap.sailing.server.gateway.jaxrs.AbstractSailingServerResource; +import com.sap.sailing.server.gateway.jaxrs.UnitSerializationUtil; +import com.sap.sailing.server.gateway.serialization.JsonSerializer; +import com.sap.sailing.server.gateway.serialization.coursedata.impl.ControlPointJsonSerializer; +import com.sap.sailing.server.gateway.serialization.coursedata.impl.CourseBaseJsonSerializer; +import com.sap.sailing.server.gateway.serialization.coursedata.impl.GateJsonSerializer; +import com.sap.sailing.server.gateway.serialization.coursedata.impl.MarkJsonSerializer; +import com.sap.sailing.server.gateway.serialization.coursedata.impl.WaypointJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.BoatClassJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.BoatJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.ColorJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.CompetitorJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.DurationJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.FleetJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.NationalityJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.PersonJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.RegattaJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.SeriesJsonSerializer; +import com.sap.sailing.server.gateway.serialization.impl.TeamJsonSerializer; +import com.sap.sse.InvalidDateException; +import com.sap.sse.common.Duration; +import com.sap.sse.common.TimePoint; +import com.sap.sse.common.Util; +import com.sap.sse.common.impl.MillisecondsTimePoint; +import com.sap.sse.datamining.shared.impl.PredefinedQueryIdentifier; + +@Path("/v1/regattas") +public class RegattasResource extends AbstractSailingServerResource { + private static final Logger logger = Logger.getLogger(RegattasResource.class.getName()); + + private DataMiningResource dataMiningResource; + + private DataMiningResource getDataMiningResource() { + if (dataMiningResource == null) { + dataMiningResource = getResourceContext().getResource(DataMiningResource.class); + } + return dataMiningResource; + } + + private Response getBadRegattaErrorResponse(String regattaName) { + return Response.status(Status.NOT_FOUND).entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.") + .type(MediaType.TEXT_PLAIN).build(); + } + + private Response getBadRaceErrorResponse(String regattaName, String raceName) { + return Response.status(Status.NOT_FOUND) + .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "' in regatta '" + StringEscapeUtils.escapeHtml(regattaName) + "'.") + .type(MediaType.TEXT_PLAIN).build(); + } + + + private Response getNoTrackedRaceErrorResponse(String regattaName, String raceName) { + return Response.status(Status.NOT_FOUND) + .entity("No tracked race for race with name '" + StringEscapeUtils.escapeHtml(raceName) + "' in regatta '" + StringEscapeUtils.escapeHtml(regattaName) + "'.") + .type(MediaType.TEXT_PLAIN).build(); + } + + private Response getNotEnoughDataAvailabeErrorResponse(String regattaName, String raceName) { + return Response.status(Status.NOT_FOUND) + .entity("No wind or polar data for race with name '" + StringEscapeUtils.escapeHtml(raceName) + "' in regatta '" + StringEscapeUtils.escapeHtml(regattaName) + "'.") + .type(MediaType.TEXT_PLAIN).build(); + } + + @GET + @Produces("application/json;charset=UTF-8") + public Response getRegattas() { + RegattaJsonSerializer regattaJsonSerializer = new RegattaJsonSerializer(); + + JSONArray regattasJson = new JSONArray(); + for (Regatta regatta : getService().getAllRegattas()) { + regattasJson.add(regattaJsonSerializer.serialize(regatta)); + } + String json = regattasJson.toJSONString(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}") + public Response getRegatta(@PathParam("regattaname") String regattaName) { + Response response; + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + SeriesJsonSerializer seriesJsonSerializer = new SeriesJsonSerializer(new FleetJsonSerializer( + new ColorJsonSerializer())); + JsonSerializer regattaSerializer = new RegattaJsonSerializer(seriesJsonSerializer, null); + JSONObject serializedRegatta = regattaSerializer.serialize(regatta); + + String json = serializedRegatta.toJSONString(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + return response; + } + + /** + * Gets all entries for a regatta. + * + * @param regattaName + * the name of the regatta + * @return + */ + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/entries") + public Response getEntries(@PathParam("regattaname") String regattaName) { + Response response; + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + NationalityJsonSerializer nationalityJsonSerializer = new NationalityJsonSerializer(); + CompetitorJsonSerializer competitorJsonSerializer = new CompetitorJsonSerializer(new TeamJsonSerializer( + new PersonJsonSerializer(nationalityJsonSerializer)), new BoatJsonSerializer( + new BoatClassJsonSerializer())); + JsonSerializer regattaSerializer = new RegattaJsonSerializer(null, competitorJsonSerializer); + JSONObject serializedRegatta = regattaSerializer.serialize(regatta); + + String json = serializedRegatta.toJSONString(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + return response; + } + + /** + * Gets all GPS positions of the competitors for a given race. + * + * @param regattaName + * the name of the regatta + * @param tack + * whether or not to include the tack in the output for each fix. Determining tack requires an expensive + * wind calculation for the competitor's position for each fix's time point. If this value is not + * absolutely required, false should be provided here which is also the default. + * @return + */ + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/competitors/positions") + public Response getCompetitorPositions(@PathParam("regattaname") String regattaName, + @PathParam("racename") String raceName, @QueryParam("fromtime") String fromtime, + @QueryParam("fromtimeasmillis") Long fromtimeasmillis, @QueryParam("totime") String totime, + @QueryParam("totimeasmillis") Long totimeasmillis, @QueryParam("withtack") Boolean withTack, + @QueryParam("competitorId") Set competitorIds) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + + TimePoint from; + TimePoint to; + try { + from = parseTimePoint(fromtime, fromtimeasmillis, + trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) : + /* 24h before race start */new MillisecondsTimePoint(trackedRace.getStartOfRace() + .asMillis() - 24 * 3600 * 1000)); + } catch (InvalidDateException e1) { + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.") + .type(MediaType.TEXT_PLAIN).build(); + } + try { + to = parseTimePoint(totime, totimeasmillis, MillisecondsTimePoint.now()); + } catch (InvalidDateException e1) { + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'to' time.") + .type(MediaType.TEXT_PLAIN).build(); + } + + JSONObject jsonRace = new JSONObject(); + jsonRace.put("name", trackedRace.getRace().getName()); + jsonRace.put("regatta", regatta.getName()); + JSONArray jsonCompetitors = new JSONArray(); + for (Competitor competitor : trackedRace.getRace().getCompetitors()) { + if (competitorIds == null || competitorIds.isEmpty() + || competitorIds.contains(competitor.getId().toString())) { + JSONObject jsonCompetitor = new JSONObject(); + jsonCompetitor.put("id", competitor.getId() != null ? competitor.getId().toString() : null); + jsonCompetitor.put("name", competitor.getName()); + jsonCompetitor.put("sailNumber", competitor.getBoat().getSailID()); + jsonCompetitor.put("color", competitor.getColor() != null ? competitor.getColor().getAsHtml() : null); + if(competitor.getFlagImage() != null) { + jsonCompetitor.put("flagImage", competitor.getFlagImage().toString()); + } + GPSFixTrack track = trackedRace.getTrack(competitor); + JSONArray jsonFixes = new JSONArray(); + track.lockForRead(); + try { + Iterator fixIter; + if (from == null) { + fixIter = track.getFixes().iterator(); + } else { + fixIter = track.getFixesIterator(from, /* inclusive */true); + } + while (fixIter.hasNext()) { + GPSFixMoving fix = fixIter.next(); + if (to != null && fix.getTimePoint() != null && to.compareTo(fix.getTimePoint()) < 0) { + break; + } + JSONObject jsonFix = new JSONObject(); + jsonFix.put("timepoint-ms", fix.getTimePoint().asMillis()); + jsonFix.put("lat-deg", UnitSerializationUtil.latLngDecimalFormatter.format(fix + .getPosition().getLatDeg())); + jsonFix.put("lng-deg", UnitSerializationUtil.latLngDecimalFormatter.format(fix + .getPosition().getLngDeg())); + jsonFix.put("truebearing-deg", fix.getSpeed().getBearing().getDegrees()); + jsonFix.put("speed-kts", + UnitSerializationUtil.knotsDecimalFormatter.format(fix.getSpeed().getKnots())); + if (withTack != null && withTack) { + String tackName; + try { + final Tack tack = trackedRace.getTack(competitor, fix.getTimePoint()); + if (tack != null) { + tackName = tack.name(); + jsonFix.put("tack", tackName); + } + } catch (NoWindException e) { + // don't output tack + } + } + jsonFixes.add(jsonFix); + } + } finally { + track.unlockAfterRead(); + } + jsonCompetitor.put("track", jsonFixes); + jsonCompetitors.add(jsonCompetitor); + } + } + jsonRace.put("competitors", jsonCompetitors); + + String json = jsonRace.toJSONString(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + + /** + * Gets all GPS positions of the course marks for a given race. + * + * @param regattaName + * the name of the regatta + * @return + */ + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/marks/positions") + public Response getMarkPositions(@PathParam("regattaname") String regattaName, + @PathParam("racename") String raceName, @QueryParam("fromtime") String fromtime, + @QueryParam("fromtimeasmillis") Long fromtimeasmillis, @QueryParam("totime") String totime, + @QueryParam("totimeasmillis") Long totimeasmillis, + @DefaultValue("false") @QueryParam("lastknown") boolean addLastKnown) { + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + return getBadRegattaErrorResponse(regattaName); + } + + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + return getBadRaceErrorResponse(regattaName, raceName); + } + + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + + TimePoint from; + TimePoint to; + try { + from = parseTimePoint(fromtime, fromtimeasmillis, + trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) : + /* 24h before race start */new MillisecondsTimePoint( + trackedRace.getStartOfRace().asMillis() - 24 * 3600 * 1000)); + } catch (InvalidDateException e1) { + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.") + .type(MediaType.TEXT_PLAIN).build(); + } + try { + to = parseTimePoint(totime, totimeasmillis, MillisecondsTimePoint.now()); + } catch (InvalidDateException e1) { + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'to' time.") + .type(MediaType.TEXT_PLAIN).build(); + } + + JSONObject jsonRace = new JSONObject(); + jsonRace.put("name", trackedRace.getRace().getName()); + jsonRace.put("regatta", regatta.getName()); + JSONArray jsonMarks = new JSONArray(); + Set marks = new HashSet(); + Course course = trackedRace.getRace().getCourse(); + for (Waypoint waypoint : course.getWaypoints()) { + for (Mark mark : waypoint.getMarks()) { + marks.add(mark); + } + } + + for (Mark mark : marks) { + JSONObject jsonMark = new JSONObject(); + jsonMark.put("name", mark.getName()); + jsonMark.put("id", mark.getId() != null ? mark.getId().toString() : null); + GPSFixTrack track = trackedRace.getOrCreateTrack(mark); + JSONArray jsonFixes = new JSONArray(); + track.lockForRead(); + try { + Iterator fixIter; + if (from == null) { + fixIter = track.getFixes().iterator(); + } else { + fixIter = track.getFixesIterator(from, /* inclusive */true); + } + GPSFix fix = null; + boolean lastAdded = false; + while (fixIter.hasNext()) { + fix = fixIter.next(); + if (to != null && fix.getTimePoint() != null && to.compareTo(fix.getTimePoint()) < 0) { + lastAdded = false; + break; + } + addFixToJsonFixes(jsonFixes, fix); + lastAdded = true; + } + + if (addLastKnown && !lastAdded) { + // find a fix earlier than the interval requested: + Iterator earlierFixIter = track.getFixesDescendingIterator(from, /* inclusive */false); + final GPSFix earlierFix; + if (earlierFixIter.hasNext()) { + earlierFix = earlierFixIter.next(); + } else { + earlierFix = null; + } + if (earlierFix != null && (fix == null || earlierFix.getTimePoint().until(from).compareTo(to.until(fix.getTimePoint())) <= 0)) { + addFixToJsonFixes(jsonFixes, earlierFix); // the earlier fix is closer to the interval's beginning than fix is to its end + } else if (fix != null) { + addFixToJsonFixes(jsonFixes, fix); + } + } + + } finally { + track.unlockAfterRead(); + } + jsonMark.put("track", jsonFixes); + jsonMarks.add(jsonMark); + } + jsonRace.put("marks", jsonMarks); + + String json = jsonRace.toJSONString(); + + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + + private JSONObject addFixToJsonFixes(JSONArray jsonFixes, GPSFix fix) { + JSONObject jsonFix = constructFixJson(fix); + jsonFixes.add(jsonFix); + return jsonFix; + } + + private JSONObject constructFixJson(GPSFix fix) { + JSONObject jsonFix = new JSONObject(); + jsonFix.put("timepoint-ms", fix.getTimePoint().asMillis()); + jsonFix.put("lat-deg", + UnitSerializationUtil.latLngDecimalFormatter.format(fix.getPosition().getLatDeg())); + jsonFix.put("lng-deg", + UnitSerializationUtil.latLngDecimalFormatter.format(fix.getPosition().getLngDeg())); + return jsonFix; + } + + /** + * Gets the course of the race. + * + * @param regattaName + * the name of the regatta + * @return + */ + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/course") + public Response getCourse(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + Course course = race.getCourse(); + CourseBaseJsonSerializer serializer = new CourseBaseJsonSerializer(new WaypointJsonSerializer( + new ControlPointJsonSerializer(new MarkJsonSerializer(), new GateJsonSerializer( + new MarkJsonSerializer())))); + + JSONObject jsonCourse = serializer.serialize(course); + String json = jsonCourse.toJSONString(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + + /** + * Gets the target time of the race + * + * @param regattaName + * the name of the regatta + * @return -1 if not enough polar data or no wind information is available + */ + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/targettime") + public Response getTargetTime(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName, + @QueryParam("timeasmillis") Long timeasmillis) { + if (timeasmillis == null) { + timeasmillis = System.currentTimeMillis(); + } + TimePoint timePoint = new MillisecondsTimePoint(timeasmillis); + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + DynamicTrackedRace trackedRace = getService().getTrackedRace(regatta, race); + if (trackedRace != null) { + Duration targetTime; + try { + targetTime = trackedRace.getEstimatedTimeToComplete(timePoint); + + DurationJsonSerializer serializer = new DurationJsonSerializer(); + + JSONObject jsonCourse = serializer.serialize(targetTime); + String json = jsonCourse.toJSONString(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } catch (NotEnoughDataHasBeenAddedException | NoWindException e) { + response = getNotEnoughDataAvailabeErrorResponse(regattaName, raceName); + } + } else { + response = getNoTrackedRaceErrorResponse(regattaName, raceName); + } + + } + } + return response; + } + + /** + * Gets the relevant times of the race. + * + * @param regattaName + * the name of the regatta + * @return + */ + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/times") + public Response getTimes(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response = null; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + + JSONObject jsonRaceTimes = new JSONObject(); + jsonRaceTimes.put("name", trackedRace.getRace().getName()); + jsonRaceTimes.put("regatta", regatta.getName()); + + jsonRaceTimes.put("startOfRace-ms", trackedRace.getStartOfRace() == null ? null : trackedRace + .getStartOfRace().asMillis()); + jsonRaceTimes.put("startOfTracking-ms", trackedRace.getStartOfTracking() == null ? null : trackedRace + .getStartOfTracking().asMillis()); + jsonRaceTimes.put("newestTrackingEvent-ms", trackedRace.getTimePointOfNewestEvent() == null ? null + : trackedRace.getTimePointOfNewestEvent().asMillis()); + jsonRaceTimes.put("endOfTracking-ms", trackedRace.getEndOfTracking() == null ? null : trackedRace + .getEndOfTracking().asMillis()); + jsonRaceTimes.put("endOfRace-ms", trackedRace.getEndOfRace() == null ? null : trackedRace + .getEndOfRace().asMillis()); + jsonRaceTimes.put("delayToLive-ms", trackedRace.getDelayToLiveInMillis()); + + JSONArray jsonMarkPassingTimes = new JSONArray(); + List firstPassingTimepoints = new ArrayList<>(); + Iterable>> markPassingsTimes = trackedRace + .getMarkPassingsTimes(); + synchronized (markPassingsTimes) { + int numberOfWaypoints = Util.size(markPassingsTimes); + int wayPointNumber = 1; + for (com.sap.sse.common.Util.Pair> markPassingTimes : markPassingsTimes) { + JSONObject jsonMarkPassing = new JSONObject(); + String name = "M" + (wayPointNumber - 1); + if (wayPointNumber == numberOfWaypoints) { + name = "F"; + } + jsonMarkPassing.put("name", name); + com.sap.sse.common.Util.Pair timesPair = markPassingTimes.getB(); + TimePoint firstPassingTime = timesPair.getA(); + TimePoint lastPassingTime = timesPair.getB(); + jsonMarkPassing.put("firstPassing-ms", + firstPassingTime == null ? null : firstPassingTime.asMillis()); + jsonMarkPassing.put("lastPassing-ms", + lastPassingTime == null ? null : lastPassingTime.asMillis()); + + firstPassingTimepoints.add(firstPassingTime); + + jsonMarkPassingTimes.add(jsonMarkPassing); + wayPointNumber++; + } + } + jsonRaceTimes.put("markPassings", jsonMarkPassingTimes); + + JSONArray jsonLegInfos = new JSONArray(); + trackedRace.getRace().getCourse().lockForRead(); + try { + Iterable trackedLegs = trackedRace.getTrackedLegs(); + int legNumber = 1; + for (TrackedLeg trackedLeg : trackedLegs) { + JSONObject jsonLegInfo = new JSONObject(); + jsonLegInfo.put("name", "L" + legNumber); + + try { + TimePoint firstPassingTime = firstPassingTimepoints.get(legNumber - 1); + if (firstPassingTime != null) { + jsonLegInfo.put("type", trackedLeg.getLegType(firstPassingTime)); + jsonLegInfo.put( + "bearing-deg", + UnitSerializationUtil.bearingDecimalFormatter.format(trackedLeg.getLegBearing( + firstPassingTime).getDegrees())); + } + } catch (NoWindException e) { + // do nothing + } + jsonLegInfos.add(jsonLegInfo); + + legNumber++; + } + } finally { + trackedRace.getRace().getCourse().unlockAfterRead(); + } + jsonRaceTimes.put("legs", jsonLegInfos); + + Date now = new Date(); + jsonRaceTimes.put("currentServerTime-ms", now.getTime()); + + String json = jsonRaceTimes.toJSONString(); + response = Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/windsources") + public Response getWindSources(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + JSONArray windSourcesAvailable = new JSONArray(); + if (trackedRace != null) { + for (WindSource windSource : trackedRace.getWindSources()) { + JSONObject windSourceJson = new JSONObject(); + windSourceJson.put("typeName", windSource.getType().name()); + windSourceJson.put("id", windSource.getId() != null ? windSource.getId().toString() : ""); + windSourcesAvailable.add(windSourceJson); + } + } + return Response.ok(windSourcesAvailable.toString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/wind") + public Response getWind(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName, + @DefaultValue("COMBINED") @QueryParam("windsource") String windSource, + @QueryParam("windsourceid") String windSourceId, @QueryParam("fromtime") String fromtime, + @QueryParam("fromtimeasmillis") Long fromtimeasmillis, @QueryParam("totime") String totime, + @QueryParam("totimeasmillis") Long totimeasmillis) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + + TimePoint from; + TimePoint to; + try { + from = parseTimePoint(fromtime, fromtimeasmillis, + trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) : + /* 24h before race start */new MillisecondsTimePoint(trackedRace.getStartOfRace() + .asMillis() - 24 * 3600 * 1000)); + } catch (InvalidDateException e1) { + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.") + .type(MediaType.TEXT_PLAIN).build(); + } + try { + to = parseTimePoint(totime, totimeasmillis, MillisecondsTimePoint.now()); + } catch (InvalidDateException e1) { + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'to' time.") + .type(MediaType.TEXT_PLAIN).build(); + } + // Crop request interval to startOfTracking / [endOfTracking|timePointOfLastEvent] + from = Util.getLatestOfTimePoints(from, trackedRace.getStartOfTracking()); + to = Util.getEarliestOfTimePoints(to, Util.getEarliestOfTimePoints(trackedRace.getEndOfTracking(), trackedRace.getTimePointOfNewestEvent())); + TrackedRaceJsonSerializer serializer = new TrackedRaceJsonSerializer( + new DefaultWindTrackJsonSerializer()); + serializer.setWindSource(windSource); + serializer.setWindSourceId(windSourceId); + serializer.setFromTime(from); + serializer.setToTime(to); + + JSONObject jsonWindTracks = serializer.serialize(trackedRace); + String json = jsonWindTracks.toJSONString(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/firstlegbearing") + public Response getFirstLegBearing(@PathParam("regattaname") String regattaName, + @PathParam("racename") String raceName, @QueryParam("time") String time, + @QueryParam("timeasmillis") Long timeasmillis) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + final TimePoint timePoint; + try { + timePoint = parseTimePoint( + time, + timeasmillis, + trackedRace.getStartOfRace() == null ? new MillisecondsTimePoint(0) : trackedRace + .getStartOfRace()); + } catch (InvalidDateException e1) { + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("Could not parse the 'from' time.") + .type(MediaType.TEXT_PLAIN).build(); + } + + BearingJsonSerializer serializer = new BearingJsonSerializer(); + JSONObject jsonBearing = serializer.serialize(trackedRace.getDirectionFromStartToNextMark(timePoint) + .getFrom()); + String json = jsonBearing.toJSONString(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/markpassings") + public Response getMarkPassings(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + MarkPassingsJsonSerializer serializer = new MarkPassingsJsonSerializer(); + JSONObject jsonMarkPassings = serializer.serialize(trackedRace); + String json = jsonMarkPassings.toJSONString(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races") + public Response getRaces(@PathParam("regattaname") String regattaName) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + JSONObject jsonRaceResults = new JSONObject(); + jsonRaceResults.put("regatta", regatta.getName()); + JSONArray jsonRaces = new JSONArray(); + jsonRaceResults.put("races", jsonRaces); + for (RaceDefinition race : regatta.getAllRaces()) { + JSONObject jsonRace = new JSONObject(); + jsonRaces.add(jsonRace); + jsonRace.put("name", race.getName()); + jsonRace.put("id", race.getId().toString()); + } + String json = jsonRaceResults.toJSONString(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/competitors/legs") + public Response getCompetitorRanks(@PathParam("regattaname") String regattaName, + @PathParam("racename") String raceName) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + TimePoint timePoint = trackedRace.getTimePointOfNewestEvent() == null ? MillisecondsTimePoint.now() + : trackedRace.getTimePointOfNewestEvent(); + final RankingInfo rankingInfo = trackedRace.getRankingMetric().getRankingInfo(timePoint); + JSONObject jsonRaceResults = new JSONObject(); + jsonRaceResults.put("name", trackedRace.getRace().getName()); + jsonRaceResults.put("regatta", regatta.getName()); + jsonRaceResults.put("startOfRace-ms", trackedRace.getStartOfRace() == null ? null : trackedRace + .getStartOfRace().asMillis()); + + JSONArray jsonLegs = new JSONArray(); + Course course = trackedRace.getRace().getCourse(); + course.lockForRead(); + try { + for (TrackedLeg leg : trackedRace.getTrackedLegs()) { + JSONObject jsonLeg = new JSONObject(); + jsonLeg.put("from", leg.getLeg().getFrom().getName()); + jsonLeg.put("fromWaypointId", leg.getLeg().getFrom().getId() != null ? leg.getLeg().getFrom().getId().toString() : null); + jsonLeg.put("to", leg.getLeg().getTo().getName()); + jsonLeg.put("toWaypointId", leg.getLeg().getTo().getId() != null ? leg.getLeg().getTo().getId().toString() : null); + try { + jsonLeg.put("upOrDownwindLeg", leg.isUpOrDownwindLeg(timePoint)); + } catch (NoWindException e) { + // no wind, then it's simply no upwind or downwind leg + jsonLeg.put("upOrDownwindLeg", "false"); + } + JSONArray jsonCompetitors = new JSONArray(); + Map ranks = leg.getRanks(timePoint); + for (Competitor competitor : trackedRace.getRace().getCompetitors()) { + JSONObject jsonCompetitorInLeg = new JSONObject(); + TrackedLegOfCompetitor trackedLegOfCompetitor = leg.getTrackedLeg(competitor); + if (trackedLegOfCompetitor != null) { + jsonCompetitorInLeg.put("id", competitor.getId() != null ? competitor.getId() + .toString() : null); + jsonCompetitorInLeg.put("name", competitor.getName()); + jsonCompetitorInLeg.put("sailNumber", competitor.getBoat().getSailID()); + jsonCompetitorInLeg.put("color", competitor.getColor() != null ? competitor.getColor() + .getAsHtml() : null); + + Speed averageSpeedOverGround = trackedLegOfCompetitor + .getAverageSpeedOverGround(timePoint); + if (averageSpeedOverGround != null) { + jsonCompetitorInLeg.put("averageSOG-kts", + UnitSerializationUtil.knotsDecimalFormatter.format(averageSpeedOverGround + .getKnots())); + } + try { + Integer numberOfTacks = trackedLegOfCompetitor.getNumberOfTacks(timePoint, /* waitForLatest */ + false); + Integer numberOfJibes = trackedLegOfCompetitor.getNumberOfJibes(timePoint, /* waitForLatest */ + false); + Integer numberOfPenaltyCircles = trackedLegOfCompetitor.getNumberOfPenaltyCircles( + timePoint, /* waitForLatest */false); + jsonCompetitorInLeg.put("tacks", numberOfTacks); + jsonCompetitorInLeg.put("jibes", numberOfJibes); + jsonCompetitorInLeg.put("penaltyCircles", numberOfPenaltyCircles); + } catch (NoWindException e) { + logger.log(Level.FINE, + "No wind information while trying to determing maneuvers for competitor " + + competitor.getName(), e); + } + + TimePoint startTime = trackedLegOfCompetitor.getStartTime(); + TimePoint finishTime = trackedLegOfCompetitor.getFinishTime(); + TimePoint startOfRace = trackedRace.getStartOfRace(); + // between the start of the race and the start of the first leg we have no + // 'timeSinceGun' + // for the competitor + if (startOfRace != null && startTime != null) { + long timeSinceGun = -1; + if (finishTime != null) { + timeSinceGun = finishTime.asMillis() - startOfRace.asMillis(); + } else { + timeSinceGun = timePoint.asMillis() - startOfRace.asMillis(); + } + if (timeSinceGun > 0) { + jsonCompetitorInLeg.put("timeSinceGun-ms", timeSinceGun); + } + Distance distanceSinceGun = trackedRace.getTrack(competitor).getDistanceTraveled( + startOfRace, finishTime != null ? finishTime : timePoint); + if (distanceSinceGun != null) { + jsonCompetitorInLeg.put("distanceSinceGun-m", distanceSinceGun.getMeters()); + } + } + + Distance distanceTraveled = trackedLegOfCompetitor.getDistanceTraveled(timePoint); + if (distanceTraveled != null) { + jsonCompetitorInLeg.put("distanceTraveled-m", + UnitSerializationUtil.distanceDecimalFormatter.format(distanceTraveled + .getMeters())); + } + Distance distanceTraveledIncludingGateStart = trackedLegOfCompetitor + .getDistanceTraveledConsideringGateStart(timePoint); + if (distanceTraveledIncludingGateStart != null) { + jsonCompetitorInLeg.put("distanceTraveledIncludingGateStart-m", + UnitSerializationUtil.distanceDecimalFormatter + .format(distanceTraveledIncludingGateStart.getMeters())); + } + try { + Integer rank = ranks.get(competitor); + jsonCompetitorInLeg.put("rank", rank); + } catch (RuntimeException re) { + if (re.getCause() != null && re.getCause() instanceof NoWindException) { + // well, we don't know the wind direction, so we can't compute a ranking + } else { + throw re; + } + } + Duration gapToLeaderDuration = trackedLegOfCompetitor.getGapToLeader(timePoint, rankingInfo, WindPositionMode.LEG_MIDDLE); + jsonCompetitorInLeg.put("gapToLeader-s", gapToLeaderDuration != null ? gapToLeaderDuration.asSeconds() : 0.0); + jsonCompetitorInLeg.put("started", trackedLegOfCompetitor.hasStartedLeg(timePoint)); + jsonCompetitorInLeg.put("finished", trackedLegOfCompetitor.hasFinishedLeg(timePoint)); + jsonCompetitors.add(jsonCompetitorInLeg); + } + } + jsonLeg.put("competitors", jsonCompetitors); + jsonLegs.add(jsonLeg); + } + } finally { + course.unlockAfterRead(); + } + jsonRaceResults.put("legs", jsonLegs); + + String json = jsonRaceResults.toJSONString(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/competitors/live") + public Response getCompetitorLiveRanks(@PathParam("regattaname") String regattaName, + @PathParam("racename") String raceName, @DefaultValue("-1") @QueryParam("topN") Integer topN) { + Response response; + Regatta regatta = findRegattaByName(regattaName); + if (regatta == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a regatta with name '" + StringEscapeUtils.escapeHtml(regattaName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = Response.status(Status.NOT_FOUND) + .entity("Could not find a race with name '" + StringEscapeUtils.escapeHtml(raceName) + "'.").type(MediaType.TEXT_PLAIN) + .build(); + } else { + TrackedRace trackedRace = findTrackedRace(regattaName, raceName); + Course course = trackedRace.getRace().getCourse(); + Waypoint lastWaypoint = course.getLastWaypoint(); + + TimePoint timePoint = MillisecondsTimePoint.now().minus(trackedRace.getDelayToLiveInMillis()); + final RankingInfo rankingInfo = trackedRace.getRankingMetric().getRankingInfo(timePoint); + JSONObject jsonLiveData = new JSONObject(); + jsonLiveData.put("name", trackedRace.getRace().getName()); + jsonLiveData.put("regatta", regatta.getName()); + + if (trackedRace.getStartOfRace() != null) { + TimePoint startOfRace = trackedRace.getStartOfRace(); + TimePoint now = MillisecondsTimePoint.now(); + jsonLiveData.put("startTime", startOfRace.asMillis()); + jsonLiveData.put("liveTime", now.asMillis()); + if (startOfRace.before(now)) { + jsonLiveData.put("timeSinceStart-s", (now.asMillis() - startOfRace.asMillis()) / 1000.0); + } else { + jsonLiveData.put("timeToStart-s", (startOfRace.asMillis() - now.asMillis()) / 1000.0); + } + } + + JSONArray jsonCompetitors = new JSONArray(); + List competitorsFromBestToWorst = trackedRace.getCompetitorsFromBestToWorst(timePoint); + Integer rank = 1; + for (Competitor competitor : competitorsFromBestToWorst) { + JSONObject jsonCompetitorInLeg = new JSONObject(); + + if (topN != null && topN > 0 && rank > topN) { + break; + } + jsonCompetitorInLeg.put("id", competitor.getId() != null ? competitor.getId().toString() : null); + jsonCompetitorInLeg.put("name", competitor.getName()); + jsonCompetitorInLeg.put("sailNumber", competitor.getBoat().getSailID()); + jsonCompetitorInLeg.put("color", competitor.getColor() != null ? competitor.getColor().getAsHtml() + : null); + jsonCompetitorInLeg.put("rank", rank++); + + TrackedLegOfCompetitor currentLegOfCompetitor = trackedRace.getCurrentLeg(competitor, timePoint); + if (currentLegOfCompetitor != null) { + int indexOfWaypoint = course.getIndexOfWaypoint(currentLegOfCompetitor.getLeg().getFrom()); + jsonCompetitorInLeg.put("leg", indexOfWaypoint + 1); + + Speed speedOverGround = currentLegOfCompetitor.getSpeedOverGround(timePoint); + if (speedOverGround != null) { + jsonCompetitorInLeg.put("speedOverGround-kts", roundDouble(speedOverGround.getKnots(), 2)); + } + + Distance distanceTraveled = currentLegOfCompetitor.getDistanceTraveled(timePoint); + if (distanceTraveled != null) { + jsonCompetitorInLeg.put("distanceTraveled-m", roundDouble(distanceTraveled.getMeters(), 2)); + } + Distance distanceTraveledConsideringGateStart = currentLegOfCompetitor + .getDistanceTraveledConsideringGateStart(timePoint); + if (distanceTraveledConsideringGateStart != null) { + jsonCompetitorInLeg.put("distanceTraveledConsideringGateStart-m", + roundDouble(distanceTraveledConsideringGateStart.getMeters(), 2)); + } + + Duration gapToLeader = currentLegOfCompetitor.getGapToLeader(timePoint, + rankingInfo, WindPositionMode.LEG_MIDDLE); + if (gapToLeader != null) { + jsonCompetitorInLeg.put("gapToLeader-s", roundDouble(gapToLeader.asSeconds(), 2)); + } + + Distance windwardDistanceToCompetitorFarthestAhead = currentLegOfCompetitor + .getWindwardDistanceToCompetitorFarthestAhead(timePoint, WindPositionMode.LEG_MIDDLE, rankingInfo); + if (windwardDistanceToCompetitorFarthestAhead != null) { + jsonCompetitorInLeg.put("gapToLeader-m", + roundDouble(windwardDistanceToCompetitorFarthestAhead.getMeters(), 2)); + } + jsonCompetitorInLeg.put("finished", false); + } else { + // we need to distinguish between competitors which did not start and competitors which + // already finished + if (trackedRace.getMarkPassing(competitor, lastWaypoint) != null) { + jsonCompetitorInLeg.put("finished", true); + } else { + jsonCompetitorInLeg.put("finished", false); + } + } + jsonCompetitors.add(jsonCompetitorInLeg); + } + jsonLiveData.put("competitors", jsonCompetitors); + String json = jsonLiveData.toJSONString(); + return Response.ok(json).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("datamining") + public Response getRegattaPredefinedQueries() { + List predefinedRegattaQueries = getDataMiningResource().getPredefinedRegattaDataMiningQueries(); + return getDataMiningResource().predefinedQueryIdentifiersToJSON(predefinedRegattaQueries); + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/datamining/" + SailingPredefinedQueries.QUERY_AVERAGE_SPEED_PER_COMPETITOR_LEGTYPE) + public Response avgSpeedPerCompetitorAndLegType(@PathParam("regattaname") String regattaName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + response = getDataMiningResource().avgSpeedPerCompetitorAndLegType(regattaName); + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/datamining/" + SailingPredefinedQueries.QUERY_AVERAGE_SPEED_PER_COMPETITOR_LEGTYPE) + public Response avgSpeedPerCompetitorAndLegType(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + response = getDataMiningResource().avgSpeedPerCompetitorAndLegType(regattaName, raceName); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/datamining/" + SailingPredefinedQueries.QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE) + public Response sumDistancePerCompetitorAndLegType(@PathParam("regattaname") String regattaName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + response = getDataMiningResource().sumDistanceTraveledPerCompetitorAndLegType(regattaName); + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/datamining/" + SailingPredefinedQueries.QUERY_DISTANCE_TRAVELED_PER_COMPETITOR_LEGTYPE) + public Response sumDistancePerCompetitorAndLegType(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + response = getDataMiningResource().sumDistanceTraveledPerCompetitorAndLegType(regattaName, raceName); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/datamining/" + SailingPredefinedQueries.QUERY_MANEUVERS_PER_COMPETITOR) + public Response sumManeuversPerCompetitor(@PathParam("regattaname") String regattaName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + response = getDataMiningResource().sumManeuversPerCompetitor(regattaName); + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/datamining/" + SailingPredefinedQueries.QUERY_MANEUVERS_PER_COMPETITOR) + public Response sumManeuversPerCompetitor(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + response = getDataMiningResource().sumManeuversPerCompetitor(regattaName, raceName); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/datamining/" + SailingPredefinedQueries.QUERY_AVERAGE_SPEED_PER_COMPETITOR) + public Response avgSpeedPerCompetitor(@PathParam("regattaname") String regattaName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + response = getDataMiningResource().avgSpeedPerCompetitor(regattaName); + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/datamining/" + SailingPredefinedQueries.QUERY_AVERAGE_SPEED_PER_COMPETITOR) + public Response avgSpeedPerCompetitor(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + response = getDataMiningResource().avgSpeedPerCompetitor(regattaName, raceName); + } + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/datamining/"+ SailingPredefinedQueries.QUERY_DISTANCE_TRAVELED_PER_COMPETITOR) + public Response sumDistancePerCompetitor(@PathParam("regattaname") String regattaName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + response = getDataMiningResource().sumDistanceTraveledPerCompetitor(regattaName); + } + return response; + } + + @GET + @Produces("application/json;charset=UTF-8") + @Path("{regattaname}/races/{racename}/datamining/" + SailingPredefinedQueries.QUERY_DISTANCE_TRAVELED_PER_COMPETITOR) + public Response sumDistancePerCompetitor(@PathParam("regattaname") String regattaName, @PathParam("racename") String raceName) { + Response response; + + Regatta regatta = getService().getRegatta(new RegattaName(regattaName)); + if (regatta == null) { + response = getBadRegattaErrorResponse(regattaName); + } else { + RaceDefinition race = findRaceByName(regatta, raceName); + if (race == null) { + response = getBadRaceErrorResponse(regattaName, raceName); + } else { + response = getDataMiningResource().sumDistanceTraveledPerCompetitor(regattaName, raceName); + } + } + return response; + } +} diff --git a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/SearchResource.java b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/SearchResource.java index dc926cb8c94..07a4a06de54 100755 --- a/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/SearchResource.java +++ b/java/com.sap.sailing.server.gateway/src/com/sap/sailing/server/gateway/jaxrs/api/SearchResource.java @@ -43,6 +43,6 @@ public class SearchResource extends AbstractSailingServerResource { for (LeaderboardSearchResult searchResult : searchResults) { jsonSearchResults.add(serializer.serialize(searchResult)); } - return Response.ok(jsonSearchResults.toJSONString(), MediaType.APPLICATION_JSON).build(); + return Response.ok(jsonSearchResults.toJSONString()).header("Content-Type", MediaType.APPLICATION_JSON + ";charset=UTF-8").build(); } } diff --git a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RaceLogReplicationTest.java b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RaceLogReplicationTest.java index 1c639b6bf6e..a4711c69dcb 100755 --- a/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RaceLogReplicationTest.java +++ b/java/com.sap.sailing.server.replication.test/src/com/sap/sailing/server/replication/test/RaceLogReplicationTest.java @@ -33,6 +33,7 @@ import com.sap.sailing.domain.base.impl.CourseDataImpl; import com.sap.sailing.domain.base.impl.MarkImpl; import com.sap.sailing.domain.base.impl.RegattaImpl; import com.sap.sailing.domain.base.impl.WaypointImpl; +import com.sap.sailing.domain.common.CourseDesignerMode; import com.sap.sailing.domain.common.MarkType; import com.sap.sailing.domain.common.PassingInstruction; import com.sap.sailing.domain.common.racelog.RaceLogRaceStatus; @@ -133,11 +134,11 @@ public class RaceLogReplicationTest extends AbstractLogReplicationTest - +
    H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA== - +
    diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_en.properties.xlf b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_en.properties.xlf new file mode 100644 index 00000000000..8fe49e0ce62 --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_en.properties.xlf @@ -0,0 +1,124 @@ + + + +
    + + H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA== + + + + + +
    + + + Save + Save + + + Remove + Remove + + + OK + OK + + + Cancel + Cancel + + + Add + Add + + + Edit + Edit + + + An error occurred while attempting to contact the server. Please check your network connection and try again. + An error occurred while attempting to contact the server. Please check your network connection and try again. + + + Close + Close + + + Remote Procedure Call + Remote Procedure Call + + + Server replies + Server replies + + + Error communicating with server + Error communicating with server + + + Active + Active + + + Set as active + Set as active + + + Could not test properties + Could not test properties + + + Could not set properties + Could not set properties + + + Could not set active service + Could not set active service + + + Could not load active service + Could not load active service + + + Could not load available services + Could not load available services + + + Refresh + Refresh + + + Name + Name + + + Value + Value + + + Description + Description + + + Error + Error + + + Configuration + Configuration + + + Settings + Settings + + + Settings for {0} + Settings for {0} + + + Please select + Please select + + +
    +
    \ No newline at end of file diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ru.properties.xlf b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ru.properties.xlf new file mode 100644 index 00000000000..38633f9b8cb --- /dev/null +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_ru.properties.xlf @@ -0,0 +1,124 @@ + + + +
    + + H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA== + + + + + +
    + + + Save + Сохранить + + + Remove + Удалить + + + OK + ОК + + + Cancel + Отмена + + + Add + Добавить + + + Edit + Изменить + + + An error occurred while attempting to contact the server. Please check your network connection and try again. + При попытке обратиться к серверу возникла ошибка. Проверьте сетевое подключение и повторите попытку. + + + Close + Закрыть + + + Remote Procedure Call + Удалить вызов процедуры + + + Server replies + Ответы сервера + + + Error communicating with server + Ошибка связи с сервером + + + Active + Активно + + + Set as active + Установить как активное + + + Could not test properties + Не удалось проверить свойства + + + Could not set properties + Не удалось установить свойства + + + Could not set active service + Не удалось установить активную службу + + + Could not load active service + Не удалось загрузить активную службу + + + Could not load available services + Не удалось загрузить доступные службы + + + Refresh + Обновить + + + Name + Имя + + + Value + Значение + + + Description + Описание + + + Error + Ошибка + + + Configuration + Конфигурация + + + Settings + Параметры + + + Settings for {0} + Параметры для {0} + + + Please select + Выберите + + +
    +
    \ No newline at end of file diff --git a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_zh_CN.properties.xlf b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_zh_CN.properties.xlf index 9d02a747f3d..a011fb40119 100644 --- a/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/XLF/StringMessages_zh_CN.properties.xlf @@ -1,12 +1,12 @@ - +
    H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA== - +
    diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties new file mode 100644 index 00000000000..ebefc56379f --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages_ru.properties @@ -0,0 +1,96 @@ +name=Имя +company=Компания +password=Пароль +passwordRepeat=Повторите пароль +loggedIn=Выполнен вход пользователя {0}! +signIn=Войти +signUp=Зарегистрироваться +signOut=Выйти +invalidUsername=Недопустимое имя пользователя +couldNotSignOut=Не удалось выйти: {0} +createUser=Создать пользователя +settings=Параметры +filterUsers=Фильтр пользователей... +welcome=Добро пожаловать, {0}! +tryingToVerifyUser=Попытка проверить пользователя... +fetchingUserInformation=Извлечение сведений пользователя... +signedInAs=Выполнен вход пользователя {0} +signedInAsTitle=В системе как: +close=Закрыть +loading=Загрузка... +user=Пользователь +users=Пользователи +addURLFilter=Добавить фильтр URL-адреса +ok=ОК +cancel=Отмена +username=Имя пользователя +email=эл. почта +usernameMustHaveAtLeastNCharacters=Введите имя пользователя длиной не менее {0} символов +passwordMustHaveAtLeastNCharacters=Используйте пароль длиной не менее {0} символов +passwordsDontMatch=Пароли должны совпадать +couldNotCreateUser=Не удалось создать пользователя: {0} +changePassword=Изменить пароль +userDetails=Сведения пользователя +deleteUser=Удалить пользователя +deleteUserQuestion=Удалить пользователя? +doYouReallyWantToDeleteUser=Действительно удалить пользователя {0}? +errorDeletingUser=При удалении пользователя возникла ошибка +account={0}-учетная запись +save=Сохранить +remove=Удалить +add=Добавить +edit=Изменить +errorUpdatingRoles=Ошибка при обновлении ролей для пользователя {0}: {1} +errorUpdatingPermissions=Ошибка при обновлении разрешений для пользователя {0}: {1} +enterRoleName=Введите название роли... +enterPermissionName=Введите название разрешения... +errorCreatingUser=Ошибка при входе с именем пользователя {0}: {1} +signedUpSuccessfully=Успешно выполнен вход пользователя {0}. Проверьте почту для подтверждения учетной записи электронной почты. +unknownErrorCreatingUser=Неизвестная ошибка при попытке входа пользователя с именем {0}. Возможно, уже существует другой пользователь с таким именем. +userAlreadyExists=Пользователь с именем {0} уже существует +currentPassword=Текущий пароль +passwordSuccessfullyChanged=Пароль успешно изменен +passwordDoesNotMeetRequirements=Пароль не отвечает требованиям +errorChangingPassword=Ошибка при изменении пароля: {0} +invalidCredentials=Недействительные учетные данные +editEmail=Изменить адрес эл. почты +errorUpdatingEmail=Ошибка при обновлении адреса эл. почты: {0} +successfullyUpdatedEmail=Успешно обновлен адрес эл. почты для пользователя {0}.\nСсылка для подтверждения отправлена по адресу {1}. +errorUpdatingUserProperties=Ошибка при обновлении свойств пользователя: {0} +successfullyUpdatedUserProperties=Успешно обновлены свойства для пользователя {0}. +forgotPassword=Не помню пароль +errorDuringPasswordReset=Ошибка при сбросе пароля: {0} +cannotResetPasswordWithoutValidatedEmail=Сброс пароля невозможен, так как у пользователя {0} нет подтвержденного адреса эл. почты +passwordResetLinkSent=Ссылка для сброса пароля отправлена на подтвержденный адрес эл. почты пользователя {0} +errorValidatingEmail=Ошибка при подтверждении адреса эл. почты пользователя {0}: {1} +emailValidatedSuccessfully=адрес эл. почты пользователя {0} подтвержден успешно +errorResettingPassword=Ошибка при сброе пароля для пользователя {0}: {1} +successfullyResetPassword=Успешно сброшен пароль для пользователя {0}. Отправлено сообщение эл. почты. +failedToSignIn=Не удалось выполнить вход. Проверьте учетные данные. +emailValidationUnsuccessful=Не удалось подтвердить адрес эл. почты для пользователя {0}. Вы действительно используете последний код подтверждения? +roles=Роли +permissions=Разрешения +signInWith=Выполнить вход как... +generalWelcome=Добро пожаловать! +newUser=Вы здесь впервые? +pleaseSignIn=Входите, пожалуйста. +enterUsernameOrEmail=Введите имя пользователя или адрес эл. почты +serverError=При попытке обратиться к серверу возникла ошибка. Проверьте сетевое подключение и повторите попытку. +remoteProcedureCall=Удалить вызов процедуры +serverReplies=Ответы сервера +errorCommunicatingWithServer=Ошибка связи с сервером +editProfile=Изменить профиль пользователя +allPermissions=Все разрешения (включая предоставляемые ролями) +configuration=Конфигурация +settingsForComponent=Параметры для {0} +pleaseSelect=Выберите +oldPassword=Старый пароль +newPasswordPlaceholder=Введите новый пароль +oldPasswordPlaceholder=Введите старый пароль +passwordRepeatPlaceholder=Повторите новый пароль +resetPassword=Сбросить пароль +youAreNotSignedIn=Вход в систему не выполнен. +youDontHaveRequiredPermission=У вас нет необходимого разрешения. +accountConfirmation=Подтверждение учетной записи +error=Неизвестная ошибка +refresh=Обновить diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages.properties.xlf b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages.properties.xlf index d4787adfeb1..f91763df506 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages.properties.xlf +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages.properties.xlf @@ -1,12 +1,12 @@ - +
    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 - +
    diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_en.properties.xlf b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_en.properties.xlf new file mode 100644 index 00000000000..7b91b794ec0 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_en.properties.xlf @@ -0,0 +1,400 @@ + + + +
    + + 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 + + + + + +
    + + + Name + Name + + + Company + Company + + + Password + Password + + + Repeat password + Repeat password + + + Logged in as user {0}! + Logged in as user {0}! + + + Sign in + Sign in + + + Sign up + Sign up + + + Sign out + Sign out + + + Invalid username + Invalid username + + + Could not sign out: {0} + Could not sign out: {0} + + + Create user + Create user + + + Settings + Settings + + + Filter users... + Filter users... + + + Welcome, {0}! + Welcome, {0}! + + + Trying to verify user... + Trying to verify user... + + + Fetching user information... + Fetching user information... + + + Signed in as {0} + Signed in as {0} + + + Signed in as: + Signed in as: + + + Close + Close + + + Loading... + Loading... + + + User + User + + + Users + Users + + + Add URL filter + Add URL filter + + + OK + OK + + + Cancel + Cancel + + + Username + Username + + + e-mail + e-mail + + + Please enter a username with at least {0} characters + Please enter a username with at least {0} characters + + + Please use a password that has at least {0} characters + Please use a password that has at least {0} characters + + + Passwords must match + Passwords must match + + + Could not create user: {0} + Could not create user: {0} + + + Change password + Change password + + + User details + User details + + + Delete user + Delete user + + + Delete user? + Delete user? + + + Do you really want to delete user {0}? + Do you really want to delete user {0}? + + + An error happened while deleting the user + An error happened while deleting the user + + + {0}-Account + {0}-Account + + + Save + Save + + + Remove + Remove + + + Add + Add + + + Edit + Edit + + + Error updating roles for user {0}: {1} + Error updating roles for user {0}: {1} + + + Error updating permissions for user {0}: {1} + Error updating permissions for user {0}: {1} + + + Enter role name... + Enter role name... + + + Enter permission name... + Enter permission name... + + + Error signing up with username {0}: {1} + Error signing up with username {0}: {1} + + + Successfully signed up user {0}. Please check you e-mails to validate your e-mail account. + Successfully signed up user {0}. Please check you e-mails to validate your e-mail account. + + + Unknown error trying to sign up user with name {0}. Perhaps another user with that name already exists. + Unknown error trying to sign up user with name {0}. Perhaps another user with that name already exists. + + + A user with name {0} already exists + A user with name {0} already exists + + + Current password + Current password + + + Password successfully changed + Password successfully changed + + + Password does not meet requirements + Password does not meet requirements + + + Error changing password: {0} + Error changing password: {0} + + + Invalid credentials + Invalid credentials + + + Edit e-mail address + Edit e-mail address + + + Error updating e-mail address: {0} + Error updating e-mail address: {0} + + + Successfully updated e-mail address for user {0}.\nValidation check sent to {1}. + Successfully updated e-mail address for user {0}.\nValidation check sent to {1}. + + + Error updating user properties: {0} + Error updating user properties: {0} + + + Successfully updated properties for user {0}. + Successfully updated properties for user {0}. + + + Forgot password + Forgot password + + + Error during password reset: {0} + Error during password reset: {0} + + + Cannot reset password because user {0} does not have a validated e-mail address + Cannot reset password because user {0} does not have a validated e-mail address + + + A link for resetting the password has been sent to {0}''s validated e-mail address + A link for resetting the password has been sent to {0}''s validated e-mail address + + + Error validating e-mail address of user {0}: {1} + Error validating e-mail address of user {0}: {1} + + + e-mail address of user {0} validated successfully + e-mail address of user {0} validated successfully + + + Error resetting password for user {0}: {1} + Error resetting password for user {0}: {1} + + + Successfully reset password for user {0}. e-Mail has been sent. + Successfully reset password for user {0}. e-Mail has been sent. + + + Failed to sign in. Check your credentials. + Failed to sign in. Check your credentials. + + + Validation of e-mail address for user {0} failed. Did you really use the latest validation code? + Validation of e-mail address for user {0} failed. Did you really use the latest validation code? + + + Roles + Roles + + + Permissions + Permissions + + + Sign in with... + Sign in with... + + + Welcome! + Welcome! + + + New here? + New here? + + + Please sign in. + Please sign in. + + + Enter user name or e-mail address + Enter user name or e-mail address + + + An error occurred while attempting to contact the server. Please check your network connection and try again. + An error occurred while attempting to contact the server. Please check your network connection and try again. + + + Remote Procedure Call + Remote Procedure Call + + + Server replies + Server replies + + + Error communicating with server + Error communicating with server + + + Edit user profile + Edit user profile + + + All permissions (including inferred from roles) + All permissions (including inferred from roles) + + + Configuration + Configuration + + + Settings for {0} + Settings for {0} + + + Please select + Please select + + + Old password + Old password + + + Type in a new password + Type in a new password + + + Type in the old password + Type in the old password + + + Repeat the new password + Repeat the new password + + + Reset password + Reset password + + + You are currently not signed in. + You are currently not signed in. + + + You don''t have the required permission. + You don''t have the required permission. + + + Account confirmation + Account confirmation + + + Unknown error + Unknown error + + + Refresh + Refresh + + +
    +
    \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ru.properties.xlf b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ru.properties.xlf new file mode 100644 index 00000000000..bc8995542d0 --- /dev/null +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_ru.properties.xlf @@ -0,0 +1,400 @@ + + + +
    + + H4sIAAAAAAAAAIVXS28bNxC+81cwJ7dAI6TXAEQgyDYa1K/KVowCvTDLkbTwitySXKtGkf/emSG53JWd5rLL1zw4882DVh9A3eBHNO7Qa/uiVukveh3C0Xmj7vJgXFlDDzqq9JNlVXRutwPz2aorHsjWSh3kEMDLfz98eydCu7O4e48/3OPppk/Toefp7RDT3A1RtPZZd63ZIL0lJT+nOTO0SeGhMzcu3mfKFc2ldVGGzOMjCRaNRzWB+KgVD5mFCBBja3dB3eeB2LZdBE8Hg7rkMZ8Mi8VCHKFDA4F6TP9f0pWif0HKB/cFfLt9YREPvCSjk8+8yCyIwxZis8ctOvXZbp0/6Ng6qy7zerJUW3eIiG5CNl0GNsxoVbpX3XtoYwezAx9F07kAakVf9Iw2KAEdw39iTMIUqcKjwMMgtDGb9VW6u1oaI3Emk1mEe1K3v4tG2wY6teKfKL5QxUsCDrrtFLyn37h9PYT4m36GZbwCHeLNaq+9biLJvetwBSRYsrYenSuPbdxLRBdtR7qubEaiEYg/5ov8kGs5L+MeWe7Rfj/iHM6djdcaPTPCP8gDipMHWhyxt5pga4RfU1GWEbjXdgeFkVrxtAYOHTyHiBZLfpAmTYSBDjL3cx4m5NblPwYIDKLJ9idh3J9uWIPuupdHbeODO5/wcfLFDdLzrjziNkHVVHJS+JMA751nsoxYtbSSF9F8fQ8EtOO+7SCRMuL3WT3doHVsVMjo/TKNRUAvqXv8CA8Hh+M1/whwhDMBpo3qAj9J8qY3mpiuXQdBXbDcIa9JT4ty6/yoL1r5129zyjvwhzYEtM0r+r5uvcWFkEhyKSmqC8YlSZQES4ocPlDZT45VxvUwiWaQFDsmZSh2Oeb7hPQR96MeKbo3/f3QNBDCdkB/qelEphPEotxgITPsmz00T+zoFImB8xGlTwImrvu8IbOzMCHYJ+uO9uKVwpu0kb0fx/QWUuJOwvkS5QKoBniECYYZhsM+p9F0hiOQD+oOpZgXCf+0IYaUkZZp7YKX1PIN3idkohm8R4/U2ErzGlxlMDVdCsBa2WSY2jVFa6U8dxAw1K8B4hr+HlpEMEoIldrgAQ78Ax7B0Kpnsv+JIWGyKJkw0OTlUdeULHLdQx8YZNFqTAql9DV1jSPmgpMthc3oTmM8XmQeC/nYPArmBEn01AxMDCbRznA3pJ0TDrNQWvxlvyS0UTAkNAZIuQbBvZjrRzC78w7DJ7avw5159uP2dzU94fKmypXNXF2Bs52rKLrkaQVRSoeDnzhxDdhAZF0N79Qy42kvp35tERl8uFA+Ip6xOckGKiZe8cFEWjl9hUYPoWbmirU9JlMsbSWoT90xadaQ4VVrn+7R/hhSHQ758ixpzNyjRKqOXwFs9deHb2dn4fuC2DbF23OwPY+rp2Bx29O0S9ujSWZJ7/ukE6WmgEgqrcv9TsKu3nu88+sqMGU3c94cVyfemmEKr3xNes8MikjDNTAP7j51w5c8HfNpaxdyVZK3nwb8YmYiDKuNrUqqSbShff4nMmWSv5DnmE8mnQCBjHDQoTWxy3meRK8z8Elw0VVcj8WkgKpJnc0NPsG7NPmcu6kO7rBj8Lp7nHfR74SFIxeZGzhKLBQoqOcKlq2Ty1kxTaq9pde89RlrtnTqqUo4fwpR3MJmnN1f+xjXcO0ofYyOEQ59zMWtwfYPW0I2SaJ+XVtRHET0+xOdttCwtbQ1VCOl3mlSmLqdCJiWGsAkASu0Nbc+WIXHRUmrWUd8U3WcvXiGzuFpLiPucBhs23BAkZXToVJNprupZiaWXClQGLbxkGpFyai0IlD2tFdadt2sQfqptU030KuBnibABtt6d0hd2M/YCNttuxt8esusprPxhXXJuvfOUgYqry1GJWXI7HBsI5s4OpxnwnVmjLtbbK7HfIywKRt3nW5gjyfp7fXSA79/0DPHenrC5q3T5GM35T5/505J8pOXKGYS/CxFrGdZQSBUlh7yQ5UfyNieS42Oz80Lhl95tfL7bUEk9ACht01uOUx1EpMbZ8/OchUgdXLXYSbOW5ROnL1Snpu5I5fNZDHha97p4Z22eK093ob/4j96Zp4iKhAAAA== + + + + + +
    + + + Name + Имя + + + Company + Компания + + + Password + Пароль + + + Repeat password + Повторите пароль + + + Logged in as user {0}! + Выполнен вход пользователя {0}! + + + Sign in + Войти + + + Sign up + Зарегистрироваться + + + Sign out + Выйти + + + Invalid username + Недопустимое имя пользователя + + + Could not sign out: {0} + Не удалось выйти: {0} + + + Create user + Создать пользователя + + + Settings + Параметры + + + Filter users... + Фильтр пользователей... + + + Welcome, {0}! + Добро пожаловать, {0}! + + + Trying to verify user... + Попытка проверить пользователя... + + + Fetching user information... + Извлечение сведений пользователя... + + + Signed in as {0} + Выполнен вход пользователя {0} + + + Signed in as: + В системе как: + + + Close + Закрыть + + + Loading... + Загрузка... + + + User + Пользователь + + + Users + Пользователи + + + Add URL filter + Добавить фильтр URL-адреса + + + OK + ОК + + + Cancel + Отмена + + + Username + Имя пользователя + + + e-mail + эл. почта + + + Please enter a username with at least {0} characters + Введите имя пользователя длиной не менее {0} символов + + + Please use a password that has at least {0} characters + Используйте пароль длиной не менее {0} символов + + + Passwords must match + Пароли должны совпадать + + + Could not create user: {0} + Не удалось создать пользователя: {0} + + + Change password + Изменить пароль + + + User details + Сведения пользователя + + + Delete user + Удалить пользователя + + + Delete user? + Удалить пользователя? + + + Do you really want to delete user {0}? + Действительно удалить пользователя {0}? + + + An error happened while deleting the user + При удалении пользователя возникла ошибка + + + {0}-Account + {0}-учетная запись + + + Save + Сохранить + + + Remove + Удалить + + + Add + Добавить + + + Edit + Изменить + + + Error updating roles for user {0}: {1} + Ошибка при обновлении ролей для пользователя {0}: {1} + + + Error updating permissions for user {0}: {1} + Ошибка при обновлении разрешений для пользователя {0}: {1} + + + Enter role name... + Введите название роли... + + + Enter permission name... + Введите название разрешения... + + + Error signing up with username {0}: {1} + Ошибка при входе с именем пользователя {0}: {1} + + + Successfully signed up user {0}. Please check you e-mails to validate your e-mail account. + Успешно выполнен вход пользователя {0}. Проверьте почту для подтверждения учетной записи электронной почты. + + + Unknown error trying to sign up user with name {0}. Perhaps another user with that name already exists. + Неизвестная ошибка при попытке входа пользователя с именем {0}. Возможно, уже существует другой пользователь с таким именем. + + + A user with name {0} already exists + Пользователь с именем {0} уже существует + + + Current password + Текущий пароль + + + Password successfully changed + Пароль успешно изменен + + + Password does not meet requirements + Пароль не отвечает требованиям + + + Error changing password: {0} + Ошибка при изменении пароля: {0} + + + Invalid credentials + Недействительные учетные данные + + + Edit e-mail address + Изменить адрес эл. почты + + + Error updating e-mail address: {0} + Ошибка при обновлении адреса эл. почты: {0} + + + Successfully updated e-mail address for user {0}.\nValidation check sent to {1}. + Успешно обновлен адрес эл. почты для пользователя {0}.\nСсылка для подтверждения отправлена по адресу {1}. + + + Error updating user properties: {0} + Ошибка при обновлении свойств пользователя: {0} + + + Successfully updated properties for user {0}. + Успешно обновлены свойства для пользователя {0}. + + + Forgot password + Не помню пароль + + + Error during password reset: {0} + Ошибка при сбросе пароля: {0} + + + Cannot reset password because user {0} does not have a validated e-mail address + Сброс пароля невозможен, так как у пользователя {0} нет подтвержденного адреса эл. почты + + + A link for resetting the password has been sent to {0}''s validated e-mail address + Ссылка для сброса пароля отправлена на подтвержденный адрес эл. почты пользователя {0} + + + Error validating e-mail address of user {0}: {1} + Ошибка при подтверждении адреса эл. почты пользователя {0}: {1} + + + e-mail address of user {0} validated successfully + адрес эл. почты пользователя {0} подтвержден успешно + + + Error resetting password for user {0}: {1} + Ошибка при сброе пароля для пользователя {0}: {1} + + + Successfully reset password for user {0}. e-Mail has been sent. + Успешно сброшен пароль для пользователя {0}. Отправлено сообщение эл. почты. + + + Failed to sign in. Check your credentials. + Не удалось выполнить вход. Проверьте учетные данные. + + + Validation of e-mail address for user {0} failed. Did you really use the latest validation code? + Не удалось подтвердить адрес эл. почты для пользователя {0}. Вы действительно используете последний код подтверждения? + + + Roles + Роли + + + Permissions + Разрешения + + + Sign in with... + Выполнить вход как... + + + Welcome! + Добро пожаловать! + + + New here? + Вы здесь впервые? + + + Please sign in. + Входите, пожалуйста. + + + Enter user name or e-mail address + Введите имя пользователя или адрес эл. почты + + + An error occurred while attempting to contact the server. Please check your network connection and try again. + При попытке обратиться к серверу возникла ошибка. Проверьте сетевое подключение и повторите попытку. + + + Remote Procedure Call + Удалить вызов процедуры + + + Server replies + Ответы сервера + + + Error communicating with server + Ошибка связи с сервером + + + Edit user profile + Изменить профиль пользователя + + + All permissions (including inferred from roles) + Все разрешения (включая предоставляемые ролями) + + + Configuration + Конфигурация + + + Settings for {0} + Параметры для {0} + + + Please select + Выберите + + + Old password + Старый пароль + + + Type in a new password + Введите новый пароль + + + Type in the old password + Введите старый пароль + + + Repeat the new password + Повторите новый пароль + + + Reset password + Сбросить пароль + + + You are currently not signed in. + Вход в систему не выполнен. + + + You don''t have the required permission. + У вас нет необходимого разрешения. + + + Account confirmation + Подтверждение учетной записи + + + Unknown error + Неизвестная ошибка + + + Refresh + Обновить + + +
    +
    \ No newline at end of file diff --git a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_zh_CN.properties.xlf b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_zh_CN.properties.xlf index 65127c575f2..9d7d6c91133 100644 --- a/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_zh_CN.properties.xlf +++ b/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/XLF/StringMessages_zh_CN.properties.xlf @@ -1,12 +1,12 @@ - +
    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 - +
    diff --git a/java/com.sap.sse.security.ui/src/main/resources/shiro.ini b/java/com.sap.sse.security.ui/src/main/resources/shiro.ini index 41d41da7220..bd983fca44e 100755 --- a/java/com.sap.sse.security.ui/src/main/resources/shiro.ini +++ b/java/com.sap.sse.security.ui/src/main/resources/shiro.ini @@ -25,6 +25,8 @@ sessionManager = com.sap.sse.security.SecurityWebSessionManager securityManager.sessionManager = $sessionManager sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO securityManager.sessionManager.sessionDAO = $sessionDAO +# 24h timeout +securityManager.sessionManager.globalSessionTimeout = 86400000 cacheManager = com.sap.sse.security.SessionCacheManager securityManager.cacheManager = $cacheManager diff --git a/java/com.sap.sse.security/resources/shiro.ini b/java/com.sap.sse.security/resources/shiro.ini index 9b536c69992..135cf304a64 100644 --- a/java/com.sap.sse.security/resources/shiro.ini +++ b/java/com.sap.sse.security/resources/shiro.ini @@ -25,6 +25,8 @@ sessionManager = com.sap.sse.security.SecurityWebSessionManager securityManager.sessionManager = $sessionManager sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO securityManager.sessionManager.sessionDAO = $sessionDAO +# 24h timeout +securityManager.sessionManager.globalSessionTimeout = 86400000 cacheManager = com.sap.sse.security.SessionCacheManager securityManager.cacheManager = $cacheManager diff --git a/java/com.sap.sse.threadmanager/resources/shiro.ini b/java/com.sap.sse.threadmanager/resources/shiro.ini index 822a014b4a8..f101dab67e4 100644 --- a/java/com.sap.sse.threadmanager/resources/shiro.ini +++ b/java/com.sap.sse.threadmanager/resources/shiro.ini @@ -25,6 +25,8 @@ sessionManager = com.sap.sse.security.SecurityWebSessionManager securityManager.sessionManager = $sessionManager sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO securityManager.sessionManager.sessionDAO = $sessionDAO +# 24h timeout +securityManager.sessionManager.globalSessionTimeout = 86400000 cacheManager = com.sap.sse.security.SessionCacheManager securityManager.cacheManager = $cacheManager diff --git a/java/com.sap.sse/src/com/sap/sse/util/HttpUrlConnectionHelper.java b/java/com.sap.sse/src/com/sap/sse/util/HttpUrlConnectionHelper.java index 227d73aa035..63917ef0d74 100644 --- a/java/com.sap.sse/src/com/sap/sse/util/HttpUrlConnectionHelper.java +++ b/java/com.sap.sse/src/com/sap/sse/util/HttpUrlConnectionHelper.java @@ -5,6 +5,8 @@ import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; +import com.sap.sse.common.Duration; + public class HttpUrlConnectionHelper { private static final int HTTP_MAX_REDIRECTS = 5; @@ -20,7 +22,7 @@ public class HttpUrlConnectionHelper { connection.setRequestProperty("User-Agent", "Mozilla/5.0..."); connection.setDoOutput(true); // Initial timeout needs to be big enough to allow the first parts of the response to reach this server - connection.setReadTimeout(10000); + connection.setReadTimeout((int) Duration.ONE_MINUTE.times(10).asMillis()); if (connection.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM || connection.getResponseCode() == HttpURLConnection.HTTP_MOVED_TEMP) { String location = connection.getHeaderField("Location"); diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpGetRequest.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpGetRequest.java index 68ba2be2597..517cf77141b 100644 --- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpGetRequest.java +++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpGetRequest.java @@ -11,11 +11,11 @@ import android.content.Context; public class HttpGetRequest extends HttpRequest { public HttpGetRequest(URL requestUrl, Context context) { - super(requestUrl, context); + super(context, requestUrl); } public HttpGetRequest(URL url, HttpRequestProgressListener listener, Context context) { - super(url, listener, context); + super(context, url, listener); } @Override diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpJsonGetRequest.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpJsonGetRequest.java index 78607cd9240..bba9f470bc4 100644 --- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpJsonGetRequest.java +++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpJsonGetRequest.java @@ -10,8 +10,8 @@ import android.content.Context; public class HttpJsonGetRequest extends HttpRequest { public final static String ContentType = "application/json;charset=UTF-8"; - public HttpJsonGetRequest(URL requestUrl, Context context) { - super(requestUrl, context); + public HttpJsonGetRequest(Context context, URL requestUrl) { + super(context, requestUrl); } @Override diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpJsonPostRequest.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpJsonPostRequest.java index 28af17938f8..6e077db1a8b 100644 --- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpJsonPostRequest.java +++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpJsonPostRequest.java @@ -16,16 +16,16 @@ public class HttpJsonPostRequest extends HttpRequest { private String requestBody; private String accessToken; - public HttpJsonPostRequest(URL requestUrl, Context context) { - this(requestUrl, null, context, null); + public HttpJsonPostRequest(Context context, URL requestUrl) { + this(context, requestUrl, null, null); } - public HttpJsonPostRequest(URL requestUrl, String body, Context context) { - this(requestUrl, body, context, null); + public HttpJsonPostRequest(Context context, URL requestUrl, String body) { + this(context, requestUrl, body, null); } - public HttpJsonPostRequest(URL requestUrl, String body, Context context, String accessToken) { - super(requestUrl, context); + public HttpJsonPostRequest(Context context, URL requestUrl, String body, String accessToken) { + super(context, requestUrl); this.requestBody = body; this.accessToken = accessToken; } diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpRequest.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpRequest.java index 50f3ed82c48..7773386c963 100644 --- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpRequest.java +++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/HttpRequest.java @@ -46,11 +46,11 @@ public abstract class HttpRequest { private boolean isCancelled; protected SharedPreferences pref; - public HttpRequest(URL url, Context context) { - this(url, null, context); + public HttpRequest(Context context, URL url) { + this(context, url, null); } - public HttpRequest(URL url, HttpRequestProgressListener listener, Context context) { + public HttpRequest(Context context, URL url, HttpRequestProgressListener listener) { this.url = url; this.listener = listener; this.isCancelled = false; diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/LoginGetRequest.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/LoginGetRequest.java index 51a745426e4..b400587220d 100644 --- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/LoginGetRequest.java +++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/data/http/LoginGetRequest.java @@ -15,7 +15,7 @@ public class LoginGetRequest extends HttpRequest { private final LoginData loginData; public LoginGetRequest(URL url, Context context, LoginData login) { - super(url, context); + super(context, url); loginData = login; } diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/services/sending/MessageSenderTask.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/services/sending/MessageSenderTask.java index 2b86375a0d1..9b36424ac6e 100644 --- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/services/sending/MessageSenderTask.java +++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/services/sending/MessageSenderTask.java @@ -40,7 +40,7 @@ public class MessageSenderTask extends AsyncTask { Boolean authenticated = false; if (url != null) { try { - HttpRequest request = new HttpJsonGetRequest(url, context); + HttpRequest request = new HttpJsonGetRequest(context, url); InputStream responseStream = request.execute(); JSONParser parser = new JSONParser(); diff --git a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/LogoutTask.java b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/LogoutTask.java index 16ee0a7cabe..d0df5475399 100644 --- a/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/LogoutTask.java +++ b/mobile/com.sap.sailing.android.shared/src/com/sap/sailing/android/shared/util/LogoutTask.java @@ -32,7 +32,7 @@ public class LogoutTask extends AsyncTask { @Override protected Void doInBackground(String... params) { if (url != null && params != null && params.length > 0) { - HttpRequest request = new HttpJsonGetRequest(url, context); + HttpRequest request = new HttpJsonGetRequest(context, url); try { request.execute(); } catch (IOException e) { diff --git a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml index 869c3922db0..9c8d7231f91 100644 --- a/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml +++ b/mobile/com.sap.sailing.android.tracking.app/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="8" + android:versionName="1.6"> Das bin nicht ich!
    Möchten Sie den Checkin wirklich löschen? Team Bild wird geladen... + Möchten Sie sich wirklich ausloggen? Sie müssen sich erneut mit dem QR code einloggen, um ihre Regatta zu sehen! diff --git a/mobile/com.sap.sailing.android.tracking.app/res/values/strings_dialog.xml b/mobile/com.sap.sailing.android.tracking.app/res/values/strings_dialog.xml index 9bb8850692f..3f58bc9e9e2 100644 --- a/mobile/com.sap.sailing.android.tracking.app/res/values/strings_dialog.xml +++ b/mobile/com.sap.sailing.android.tracking.app/res/values/strings_dialog.xml @@ -8,4 +8,5 @@ That\'s not me! Do you really want to delete this checkin? Downloading team image... + Do you REALLY want to logout? You will need to re-login with the provided QR code to access your regatta! diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java index bb711c3d562..533eee2d5bf 100755 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/RegattaActivity.java @@ -13,7 +13,9 @@ import java.util.Locale; import org.json.JSONException; import org.json.JSONObject; +import android.app.AlertDialog; import android.app.ProgressDialog; +import android.content.DialogInterface; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -153,7 +155,7 @@ public class RegattaActivity extends AbstractRegattaActivity return true; case R.id.options_menu_checkout: ExLog.i(this, TAG, "Clicked CHECKOUT."); - checkout(); + displayCheckoutConfirmationDialog(); return true; case R.id.options_menu_add_team_image: ExLog.i(this, TAG, "Clicked ADD TEAM IMAGE"); @@ -441,6 +443,20 @@ public class RegattaActivity extends AbstractRegattaActivity return FLAG_IMAGE_FILENAME_PREFIX + countryCode; } + private void displayCheckoutConfirmationDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.warning); + builder.setMessage(R.string.checkout_warning_message); + builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + checkout(); + } + }); + builder.setNegativeButton(R.string.no, null); + builder.show(); + } + /** * Check out from regatta; */ @@ -462,8 +478,7 @@ public class RegattaActivity extends AbstractRegattaActivity } try { - HttpJsonPostRequest request = new HttpJsonPostRequest(new URL(checkoutURLStr), checkoutData.toString(), - this); + HttpJsonPostRequest request = new HttpJsonPostRequest(this, new URL(checkoutURLStr), checkoutData.toString()); NetworkHelper.getInstance(this).executeHttpJsonRequestAsync(request, new NetworkHelperSuccessListener() { diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java index 0cf7914938e..72a8b780e39 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/activities/StartActivity.java @@ -94,7 +94,7 @@ public class StartActivity extends AbstractStartActivity { @Override public void onCheckinDataAvailable(AbstractCheckinData data) { - if(data != null && data instanceof CheckinData) { + if (data != null && data instanceof CheckinData) { CheckinData checkinData = (CheckinData) data; if (!checkinData.isUpdate()) { getHomeFragment().displayUserConfirmationScreen(data); diff --git a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java index 426a5e7b016..15425a241cc 100644 --- a/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java +++ b/mobile/com.sap.sailing.android.tracking.app/src/com/sap/sailing/android/tracking/app/ui/fragments/HomeFragment.java @@ -128,8 +128,8 @@ public class HomeFragment extends AbstractHomeFragment implements LoaderCallback try { JSONObject requestObject = CheckinHelper.getCheckinJson(checkinData.competitorId, checkinData.deviceUid, "TODO push device ID!!", date.getTime()); - HttpJsonPostRequest request = new HttpJsonPostRequest(new URL(checkinData.checkinURL), - requestObject.toString(), getActivity()); + HttpJsonPostRequest request = new HttpJsonPostRequest(getActivity(), new URL(checkinData.checkinURL), + requestObject.toString()); NetworkHelper.getInstance(getActivity()) .executeHttpJsonRequestAsync(request, new CheckinListener(checkinData.checkinDigest), new CheckinErrorListener(checkinData.checkinDigest)); diff --git a/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml b/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml index c1d4017f4e4..128b1c8f86c 100644 --- a/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml +++ b/mobile/com.sap.sailing.buoy.positioning/AndroidManifest.xml @@ -1,8 +1,8 @@ + android:versionCode="8" + android:versionName="1.6"> Abfrage Intervall (Sekunden)
    Checkout + Möchten Sie sich wirklich ausloggen? Sie müssen sich erneut mit dem QR code einloggen, um ihre Bojen zu sehen! \ No newline at end of file diff --git a/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml b/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml index 2778c042243..40a4011fdbb 100644 --- a/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml +++ b/mobile/com.sap.sailing.buoy.positioning/res/values/strings.xml @@ -28,5 +28,6 @@ Polling Interval (seconds) Checkout + Do you REALLY want to logout? You will need to re-login with the provided QR code to access your marks! \ No newline at end of file diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/service/MarkerService.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/service/MarkerService.java index 33121a54994..a0bf73b9723 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/service/MarkerService.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/service/MarkerService.java @@ -27,12 +27,16 @@ public class MarkerService extends IntentService implements CheckinManager.Data @Override public void handleData(AbstractCheckinData data) { - try { - CheckinData checkinData = (CheckinData) data; - DatabaseHelper helper = DatabaseHelper.getInstance(); - helper.updateMarks(this, checkinData.marks, checkinData.getLeaderboard()); - } catch (DatabaseHelper.GeneralDatabaseHelperException e) { - Log.e(TAG, "Error trying to analyze mark checkin data", e); + if (data != null) { + try { + CheckinData checkinData = (CheckinData) data; + DatabaseHelper helper = DatabaseHelper.getInstance(); + helper.updateMarks(this, checkinData.marks, checkinData.getLeaderboard()); + } catch (DatabaseHelper.GeneralDatabaseHelperException e) { + Log.e(TAG, "Error trying to analyze mark checkin data", e); + } + } else { + Log.e(TAG, "checkin data was null"); } } diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/RegattaActivity.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/RegattaActivity.java index 07d58f5f055..a8625ff08c4 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/RegattaActivity.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/ui/activities/RegattaActivity.java @@ -1,7 +1,9 @@ package com.sap.sailing.android.buoy.positioning.app.ui.activities; +import android.app.AlertDialog; import android.content.ComponentName; import android.content.Context; +import android.content.DialogInterface; import android.content.Intent; import android.content.ServiceConnection; import android.os.Bundle; @@ -122,7 +124,7 @@ public class RegattaActivity extends AbstractRegattaActivity { manager.callServerAndGenerateCheckinData(); return true; case R.id.check_out: - checkOut(); + displayCheckoutConfirmationDialog(); return true; case R.id.about: AboutHelper.showInfoActivity(this); @@ -143,19 +145,37 @@ public class RegattaActivity extends AbstractRegattaActivity { @Override public void onCheckinDataAvailable(AbstractCheckinData checkinData) { - CheckinData data = (CheckinData) checkinData; - try { - DatabaseHelper.getInstance().updateMarks(this, data.marks, data.getLeaderboard()); - getRegattaFragment().getAdapter().notifyDataSetChanged(); - } catch (DatabaseHelper.GeneralDatabaseHelperException e) { - ExLog.e(this, TAG, "Batch insert failed: " + e.getMessage()); - displayDatabaseError(); - return; + if (checkinData != null) { + CheckinData data = (CheckinData) checkinData; + try { + DatabaseHelper.getInstance().updateMarks(this, data.marks, data.getLeaderboard()); + getRegattaFragment().getAdapter().notifyDataSetChanged(); + } catch (DatabaseHelper.GeneralDatabaseHelperException e) { + ExLog.e(this, TAG, "Batch insert failed: " + e.getMessage()); + displayDatabaseError(); + return; + } + + if (BuildConfig.DEBUG) { + ExLog.i(this, TAG, "Batch-insert of checkinData completed."); + } + } else { + ExLog.i(this, TAG, "checkinData is null"); } + } - if (BuildConfig.DEBUG) { - ExLog.i(this, TAG, "Batch-insert of checkinData completed."); - } + private void displayCheckoutConfirmationDialog() { + AlertDialog.Builder builder = new AlertDialog.Builder(this); + builder.setTitle(R.string.warning); + builder.setMessage(R.string.checkout_warning_message); + builder.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + checkOut(); + } + }); + builder.setNegativeButton(R.string.no, null); + builder.show(); } private void checkOut(){ diff --git a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java index 384470627c0..5f3657101d8 100644 --- a/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java +++ b/mobile/com.sap.sailing.buoy.positioning/src/com/sap/sailing/android/buoy/positioning/app/util/CheckinManager.java @@ -258,8 +258,7 @@ public class CheckinManager { checkinData = data; if (activity != null) { activity.onCheckinDataAvailable(getCheckinData()); - } - else if (dataChangedListner != null){ + } else if (dataChangedListner != null){ dataChangedListner.handleData(data); } } diff --git a/mobile/com.sap.sailing.racecommittee.app/AndroidManifest.xml b/mobile/com.sap.sailing.racecommittee.app/AndroidManifest.xml index a69a2ec27ec..d7d344dc0a8 100644 --- a/mobile/com.sap.sailing.racecommittee.app/AndroidManifest.xml +++ b/mobile/com.sap.sailing.racecommittee.app/AndroidManifest.xml @@ -1,33 +1,33 @@ - + + android:targetSdkVersion="22" /> + android:protectionLevel="signature" /> - - + + - + - - - - + + + + + android:required="true" /> + android:required="false" /> + android:value="@integer/google_play_services_version" /> + android:value="AIzaSyDH-Dwy5yFlyBa2-VUgiZ3qGGUO8M_0MPY" /> - + - + - + @@ -68,41 +67,43 @@ android:pathPattern="apps/com.sap.sailing.racecommittee.app.apk"/> - - - + + + - + - + - + - + - - + + + android:value="com.sap.sailing.racecommittee.app.services.sending.EventRestorer" /> - + diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_autorenew_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_autorenew_yellow_24dp.png new file mode 100644 index 00000000000..1de10776731 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_autorenew_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_boat_white_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_boat_white_24dp.png new file mode 100644 index 00000000000..e28d64e4fd4 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_boat_white_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_boat_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_boat_yellow_24dp.png new file mode 100644 index 00000000000..45f70887e41 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_boat_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_change_role_white_48dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_change_role_white_48dp.png deleted file mode 100644 index c29cb246f25..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_change_role_white_48dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_directions_boat.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_directions_boat.png deleted file mode 100644 index bbc895c25af..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_directions_boat.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_more_horiz_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_more_horiz_yellow_24dp.png new file mode 100644 index 00000000000..4621f30b4fa Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_more_horiz_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_pin_drop_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_pin_drop_yellow_24dp.png new file mode 100644 index 00000000000..c8698d2dbbe Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-hdpi/ic_pin_drop_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_autorenew_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_autorenew_yellow_24dp.png new file mode 100644 index 00000000000..e5454cb990b Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_autorenew_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_boat_white_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_boat_white_24dp.png new file mode 100644 index 00000000000..004e60e53dd Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_boat_white_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_boat_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_boat_yellow_24dp.png new file mode 100644 index 00000000000..00c2756213c Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_boat_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_change_role_white_48dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_change_role_white_48dp.png deleted file mode 100644 index e966f5104b8..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_change_role_white_48dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_directions_boat.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_directions_boat.png deleted file mode 100644 index 5a79c4157cb..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_directions_boat.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_more_horiz_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_more_horiz_yellow_24dp.png new file mode 100644 index 00000000000..8b9453d5d29 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_more_horiz_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_pin_drop_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_pin_drop_yellow_24dp.png new file mode 100644 index 00000000000..6b7cc5116a8 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-mdpi/ic_pin_drop_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-v21/checked_item_background_dark_ripple.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable-v21/checked_item_background_dark_ripple.xml new file mode 100644 index 00000000000..bde68550fe0 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable-v21/checked_item_background_dark_ripple.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-v21/checked_item_background_light_ripple.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable-v21/checked_item_background_light_ripple.xml new file mode 100644 index 00000000000..41d1fdce7c6 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable-v21/checked_item_background_light_ripple.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-v21/preference_background.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable-v21/preference_background.xml new file mode 100644 index 00000000000..05e92ca30f4 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable-v21/preference_background.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_autorenew_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_autorenew_yellow_24dp.png new file mode 100644 index 00000000000..1a796b17dc5 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_autorenew_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_boat_white_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_boat_white_24dp.png new file mode 100644 index 00000000000..5c4b2f565d3 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_boat_white_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_boat_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_boat_yellow_24dp.png new file mode 100644 index 00000000000..07e39e62e1a Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_boat_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_change_role_white_48dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_change_role_white_48dp.png deleted file mode 100644 index b811a20b301..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_change_role_white_48dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_directions_boat.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_directions_boat.png deleted file mode 100644 index 8eab07db747..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_directions_boat.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_more_horiz_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_more_horiz_yellow_24dp.png new file mode 100644 index 00000000000..983536e6292 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_more_horiz_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_pin_drop_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_pin_drop_yellow_24dp.png new file mode 100644 index 00000000000..fc81339f0c7 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xhdpi/ic_pin_drop_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_autorenew_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_autorenew_yellow_24dp.png new file mode 100644 index 00000000000..3f6b7842d30 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_autorenew_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_boat_white_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_boat_white_24dp.png new file mode 100644 index 00000000000..4f6e50b3ebc Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_boat_white_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_boat_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_boat_yellow_24dp.png new file mode 100644 index 00000000000..ee1762928d9 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_boat_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_change_role_white_48dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_change_role_white_48dp.png deleted file mode 100644 index 02076b894fb..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_change_role_white_48dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_directions_boat.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_directions_boat.png deleted file mode 100644 index dd3d0de631f..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_directions_boat.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_more_horiz_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_more_horiz_yellow_24dp.png new file mode 100644 index 00000000000..4f8e47f62f0 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_more_horiz_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_pin_drop_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_pin_drop_yellow_24dp.png new file mode 100644 index 00000000000..bc7003e65b1 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxhdpi/ic_pin_drop_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_autorenew_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_autorenew_yellow_24dp.png new file mode 100644 index 00000000000..e49ed5eb44b Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_autorenew_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_boat_white_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_boat_white_24dp.png new file mode 100644 index 00000000000..49efaefa35d Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_boat_white_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_boat_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_boat_yellow_24dp.png new file mode 100644 index 00000000000..dd10facd48b Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_boat_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_change_role_white_48dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_change_role_white_48dp.png deleted file mode 100644 index e4cf3914bd9..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_change_role_white_48dp.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_directions_boat.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_directions_boat.png deleted file mode 100644 index bdf2434ad4f..00000000000 Binary files a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_directions_boat.png and /dev/null differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_more_horiz_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_more_horiz_yellow_24dp.png new file mode 100644 index 00000000000..4a5e428d0c2 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_more_horiz_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_pin_drop_yellow_24dp.png b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_pin_drop_yellow_24dp.png new file mode 100644 index 00000000000..8ec1eafbc57 Binary files /dev/null and b/mobile/com.sap.sailing.racecommittee.app/res/drawable-xxxhdpi/ic_pin_drop_yellow_24dp.png differ diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/checked_item_background_dark.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/checked_item_background_dark.xml new file mode 100644 index 00000000000..1070f91df24 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable/checked_item_background_dark.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/checked_item_background_light.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/checked_item_background_light.xml new file mode 100644 index 00000000000..971e4edfe9b --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable/checked_item_background_light.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/factor_background_dark.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/factor_background_dark.xml new file mode 100644 index 00000000000..eba257d7112 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable/factor_background_dark.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/factor_background_light.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/factor_background_light.xml new file mode 100644 index 00000000000..1340e87a546 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable/factor_background_light.xml @@ -0,0 +1,15 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/drawable/preference_background.xml b/mobile/com.sap.sailing.racecommittee.app/res/drawable/preference_background.xml new file mode 100644 index 00000000000..924aba664e5 --- /dev/null +++ b/mobile/com.sap.sailing.racecommittee.app/res/drawable/preference_background.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/checked_list_item.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/checked_list_item.xml index 53e9143348d..e3a9aa545fd 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/checked_list_item.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/checked_list_item.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="?attr/sap_gray_black_30" + android:background="?attr/checkedItemBackground" android:minHeight="@dimen/listView_row_min_height"> + + + + + + \ No newline at end of file diff --git a/mobile/com.sap.sailing.racecommittee.app/res/layout/preference_header.xml b/mobile/com.sap.sailing.racecommittee.app/res/layout/preference_header.xml index fbbbe4c8604..985cceadd06 100644 --- a/mobile/com.sap.sailing.racecommittee.app/res/layout/preference_header.xml +++ b/mobile/com.sap.sailing.racecommittee.app/res/layout/preference_header.xml @@ -1,37 +1,15 @@ - + android:layout_height="match_parent" + android:background="#e1e1e0" + android:orientation="vertical"> -