Merge branch 'master' of ssh://trac@sapsailing.com/home/trac/git into bug3931

This commit is contained in:
Vladislav Chumak committed 2016-10-10 14:10:49 +02:00
commit 9b1f0e4afb
111 files changed
+3172 -662

No files matched your search

@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties" source-language="en">
<file datatype="javapropertyresourcebundle" original="/usr/sap/ljs/app/Converter_7623614428299933729/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties" source-language="en">
<header>
<skl>
<internal-file crc="f6ec166735cc7adb2ddad356f75a3f11" form="base64">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 truncated
<internal-file crc="aa58aa0159559141c900793034ac8e1d" form="base64">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 truncated
</skl>
<phase-group>
<phase company-name="SAP AG" date="2016-07-28T14:32:35Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
<phase company-name="SAP AG" date="2016-09-26T08:30:46Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
</phase-group>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
</header>
@@ -1490,6 +1490,24 @@
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="title" resname="title">
<source>Title</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="subtitle" resname="subtitle">
<source>Subtitle</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="copyright" resname="copyright">
<source>Copyright</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="widthInPx" resname="widthInPx">
<source>Width (pixel)</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="heightInPx" resname="heightInPx">
<source>Height (pixel)</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="tags" resname="tags">
<source>Tags</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="size" resname="size">
<source>Size</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="duration" resname="duration">
<source>Duration (h:mm:ss.ms)</source>
</trans-unit>
@@ -3387,6 +3405,9 @@
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="useStartTimeInference" resname="useStartTimeInference">
<source>Use start time inference from start mark passings</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="controlTrackingFromStartAndFinishTimes" resname="controlTrackingFromStartAndFinishTimes">
<source>Control tracking from start and finish times</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="numberOfQueueMessagesSent" resname="numberOfQueueMessagesSent">
<source>Number of queue messages sent</source>
</trans-unit>
@@ -4512,19 +4533,19 @@
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreCampaign" resname="playstoreCampaign">
<source>utm_source=sapsailing&amp;utm_medium=solutions&amp;utm_content=2016.02&amp;utm_campaign=solutions&amp;pcampaignid=2016.sapsailing.solutions</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreTrackingApp" resname="playstoreTrackingApp">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreInsightApp" resname="playstoreInsightApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreRacecommitteeApp" resname="playstoreRacecommitteeApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playStoreBuoypositioningApp" resname="playStoreBuoypositioningApp">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playStoreBuoyPingerApp" resname="playStoreBuoyPingerApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreBadge" resname="playstoreBadge">
<source>https://play.google.com/intl/en/badges/images/generic/en-play-badge.png</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreSapSailingInsight" resname="appstoreSapSailingInsight">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreSapSailInsight" resname="appstoreSapSailInsight">
<source>http://appstore.com/sapsailinsight</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreStgTrainingstagebuch" resname="appstoreStgTrainingstagebuch">
@@ -4824,6 +4845,294 @@
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="maximumNumberOfDiscards" resname="maximumNumberOfDiscards">
<source>Maximum number of discards</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="notificationRegattaConfigurationUpdatedUsingByMarks" resname="notificationRegattaConfigurationUpdatedUsingByMarks">
<source>Active regatta configuration was set, using the "By Marks" course designer.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="warningOverrideRegattaConfigurationCourseDesignerToByMarks" resname="warningOverrideRegattaConfigurationCourseDesignerToByMarks">
<source>Active regatta configuration already exists, but with the wrong course designer setting.\nWould you like to override course designer setting to "By Marks"?</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="allRacesHaveBeenDenoted" resname="allRacesHaveBeenDenoted">
<source>All races have been denoted for racelog tracking.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chartSelectionHint" resname="chartSelectionHint">
<source>Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. </source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chooseALanguage" resname="chooseALanguage">
<source>Choose a language</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutions" resname="solutions">
<source>Solutions</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="blog" resname="blog">
<source>Blog</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="officalEventWebsite" resname="officalEventWebsite">
<source>Official event website</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="moreInfo" resname="moreInfo">
<source>More info</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="viewAnalysis" resname="viewAnalysis">
<source>View analysis </source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="overallLeaderboard" resname="overallLeaderboard">
<source>Overall leaderboard</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseTryAgain" resname="pleaseTryAgain">
<source>Please try again...</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="reloadPage" resname="reloadPage">
<source>Reload page</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorMessageLoadingData" resname="errorMessageLoadingData">
<source>An error occured while loading the data for this page.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="regattaDetails" resname="regattaDetails">
<source>Regatta details</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chooseChartType" resname="chooseChartType">
<source>Choose chart type</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="whatsNew" resname="whatsNew">
<source>What''s new</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailing" resname="sapSailing">
<source>SAP Sailing</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="search" resname="search">
<source>Search</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownStartingInDays" resname="countdownStartingInDays">
<source>Days</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownDays" resname="countdownDays">
<source>Days</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownHours" resname="countdownHours">
<source>Hrs</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownMinutes" resname="countdownMinutes">
<source>Min</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownSeconds" resname="countdownSeconds">
<source>Sec</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownDay" resname="countdownDay">
<source>Day</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownHour" resname="countdownHour">
<source>Hour</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownMinute" resname="countdownMinute">
<source>Min</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownSecond" resname="countdownSecond">
<source>Sec</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="liveCapitalLetter" resname="liveCapitalLetter">
<source>Live</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="watchNow" resname="watchNow">
<source>Watch now</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="seriesHeaderUpcoming" resname="seriesHeaderUpcoming">
<source>Upcoming</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventRegattaLeaderboardLastScoreUpdate" resname="eventRegattaLeaderboardLastScoreUpdate">
<source>Last Score Update</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventRegattaRaceNotTracked" resname="eventRegattaRaceNotTracked">
<source>Not Tracked</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerJobs" resname="footerJobs">
<source>Jobs</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerCopyright" resname="footerCopyright">
<source>© 2011-2016 SAP Sailing Analytics</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerLanguage" resname="footerLanguage">
<source>SAP Sailing in</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerLegal" resname="footerLegal">
<source>Legal Disclosure</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerPrivacy" resname="footerPrivacy">
<source>Privacy</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerFeedback" resname="footerFeedback">
<source>Feedback</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="headerLogo" resname="headerLogo">
<source>Sailing Analytics</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="headerSearchPlaceholder" resname="headerSearchPlaceholder">
<source>Search </source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainEventShowAll" resname="mainEventShowAll">
<source>Show All Events</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainEventTitle" resname="mainEventTitle">
<source>Latest Events from the Sailing World</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaSubtitle" resname="mainMediaSubtitle">
<source>Get lost in the latest and most beautiful impressions from your favorite sailing event.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaTitle" resname="mainMediaTitle">
<source>Photographers love Sailing</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaVideosSubtitle" resname="mainMediaVideosSubtitle">
<source>Immerse yourself in the world of sailing and check out our latest events for more videos.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaVideosTitle" resname="mainMediaVideosTitle">
<source>Recent Video Entries</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderButton" resname="searchResultHeaderButton">
<source>Search</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderLabel" resname="searchResultHeaderLabel">
<source>Your Search</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderPlaceholder" resname="searchResultHeaderPlaceholder">
<source>Type in your searchkey</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultSortNewest" resname="searchResultSortNewest">
<source>Recent</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSISHeadline" resname="solutionsSISHeadline">
<source>SAP in Sailing</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSAPHeadline" resname="solutionsSAPHeadline">
<source>SAP Sailing Analytics</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsRaceHeadline" resname="solutionsRaceHeadline">
<source>SAP Sailing Race Manager</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsInSightHeadline" resname="solutionsInSightHeadline">
<source>SAP Sail InSight</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsBuoyPingerHeadline" resname="solutionsBuoyPingerHeadline">
<source>SAP Sailing Buoy Pinger</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsPostHeadline" resname="solutionsPostHeadline">
<source>Post-Race Analytics</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsTrainingHeadline" resname="solutionsTrainingHeadline">
<source>Training Diary</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSimulatorHeadline" resname="solutionsSimulatorHeadline">
<source>Strategy Simulator</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapInSailing" resname="sapInSailing">
<source>SAP in Sailing</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing1" resname="contentSapInSailing1">
<source>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:</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing2" resname="contentSapInSailing2">
<source>Help sailors analyze performance and optimize strategy</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing3" resname="contentSapInSailing3">
<source>Bring fans closer to the action</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing4" resname="contentSapInSailing4">
<source>Provide the media with information and insights to deliver a greater informed commentary</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing5" resname="contentSapInSailing5">
<source>SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including:</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing6" resname="contentSapInSailing6">
<source>Official Technology Partner of Travemünder Woche</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing7" resname="contentSapInSailing7">
<source>Technical Partner of the European Sailing Leagues</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing8" resname="contentSapInSailing8">
<source>Title sponsor of the SAP Extreme Sailing Team</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing9" resname="contentSapInSailing9">
<source>Official Technical Partner of the Extreme Sailing Series</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing10" resname="contentSapInSailing10">
<source>Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing11" resname="contentSapInSailing11">
<source>Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week)</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing12" resname="contentSapInSailing12">
<source>Title sponsor of the SAP 5O5 World Championships</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingAnalyticsTitle" resname="sapSailingAnalyticsTitle">
<source>SAP Sailing Analytics</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingAnalytics1" resname="contentSapSailingAnalytics1">
<source>By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingAnalytics2" resname="contentSapSailingAnalytics2">
<source>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.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingAnalyticsReadMore" resname="sapSailingAnalyticsReadMore">
<source>Read More</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingRaceManager" resname="sapSailingRaceManager">
<source>SAP Sailing Race Manager</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingRaceManager" resname="contentSapSailingRaceManager">
<source>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.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingRaceManagerReadMore" resname="sapSailingRaceManagerReadMore">
<source>Learn More</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailInSight" resname="sapSailInSight">
<source>SAP Sail InSight</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailInSight" resname="contentSapSailInSight">
<source>With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailInSightReadMore" resname="sapSailInSightReadMore">
<source>Learn More</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingBuoyPinger" resname="sapSailingBuoyPinger">
<source>SAP Sailing Buoy Pinger</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingBuoyPinger" resname="contentSapSailingBuoyPinger">
<source>With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingBuoyPingerReadMore" resname="sapSailingBuoyPingerReadMore">
<source>Learn More</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="postRaceAnalytics" resname="postRaceAnalytics">
<source>Post-Race Analytics</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentPostRaceAnalytics1" resname="contentPostRaceAnalytics1">
<source>Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentPostRaceAnalytics2" resname="contentPostRaceAnalytics2">
<source>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.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="i18nDeSolutionsTrainingHeadline" resname="i18nDeSolutionsTrainingHeadline">
<source>SAP Sail Better – STG Training Diary</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="i18nDeSolutionsTrainingText" resname="i18nDeSolutionsTrainingText">
<source>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.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="strategySimulator" resname="strategySimulator">
<source>Strategy Simulator</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentStrategySimulator" resname="contentStrategySimulator">
<source>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.</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="strategySimulatorReadMore" resname="strategySimulatorReadMore">
<source>Learn More</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="impressum" resname="impressum">
<source>Imprint</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="lastFix" resname="lastFix">
<source>Last fix</source>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="filterDeviceMappings" resname="filterDeviceMappings">
<source>Filter device mappings</source>
</trans-unit>
</body>
</file>
</xliff>
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T10:45:38Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties" source-language="en" target-language="ja">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:17:16Z" original="/usr/sap/ljs/app/Converter_7623614428299933729/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="f6ec166735cc7adb2ddad356f75a3f11" form="base64">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 truncated
<internal-file crc="aa58aa0159559141c900793034ac8e1d" form="base64">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 truncated
</skl>
<phase-group>
<phase company-name="SAP AG" date="2016-07-28T14:32:35Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
<phase company-name="SAP AG" date="2016-09-26T08:30:46Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
</phase-group>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
</header>
@@ -165,8 +165,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorsSelected" resname="competitorsSelected">
<source><ph id="1">{0}</ph>/<ph id="2">{1}</ph> competitors selected.</source>
<target state="signed-off">
<ph id="1">{0}</ph>/<ph id="2">{1}</ph> の競技者が選択されました。</target>
<target state="signed-off"><ph id="1">{0}</ph>/<ph id="2">{1}</ph> の競技者が選択されました。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="noSuchLeaderboard" resname="noSuchLeaderboard">
<source>No such leaderboard</source>
@@ -938,8 +937,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settingsForComponent" resname="settingsForComponent">
<source>Settings for <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> の設定</target>
<target state="signed-off"><ph id="1">{0}</ph> の設定</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="noEventsFound" resname="noEventsFound">
<source>No events were found</source>
@@ -1003,13 +1001,11 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorPassedMarkAtDate" resname="competitorPassedMarkAtDate">
<source><ph id="1">{0}</ph> passed <ph id="2">{1}</ph> at <ph id="3">{2}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> が <ph id="3">{2}</ph> に <ph id="2">{1}</ph> を通過</target>
<target state="signed-off"><ph id="1">{0}</ph> が <ph id="3">{2}</ph> に <ph id="2">{1}</ph> を通過</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="valueForCompetitorAt" resname="valueForCompetitorAt">
<source><ph id="1">{0}</ph> at <ph id="2">{1}</ph>: <ph id="3">{2}</ph></source>
<target state="signed-off">
<ph id="2">{1}</ph> での <ph id="1">{0}</ph>: <ph id="3">{2}</ph></target>
<target state="signed-off"><ph id="2">{1}</ph> での <ph id="1">{0}</ph>: <ph id="3">{2}</ph></target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="reallyRemoveRace" resname="reallyRemoveRace">
<source>Do you really want to remove the race ''<ph id="1">{0}</ph>''? Note: all race logs for this race will also permanently be removed!</source>
@@ -1105,8 +1101,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="noLeaderboardGroupWithNameFound" resname="noLeaderboardGroupWithNameFound">
<source>No leaderboard group with the name <ph id="1">{0}</ph> found</source>
<target state="signed-off">
<ph id="1">{0}</ph> という名称のリーダーボードグループは見つかりませんでした</target>
<target state="signed-off"><ph id="1">{0}</ph> という名称のリーダーボードグループは見つかりませんでした</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="overview" resname="overview">
<source>Overview</source>
@@ -1988,6 +1983,30 @@
<source>Title</source>
<target state="signed-off">表題</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="subtitle" resname="subtitle">
<source>Subtitle</source>
<target state="signed-off">サブタイトル</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="copyright" resname="copyright">
<source>Copyright</source>
<target state="signed-off">著作権</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="widthInPx" resname="widthInPx">
<source>Width (pixel)</source>
<target state="signed-off">幅 (ピクセル)</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="heightInPx" resname="heightInPx">
<source>Height (pixel)</source>
<target state="signed-off">高さ (ピクセル)</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="tags" resname="tags">
<source>Tags</source>
<target state="signed-off">タグ</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="size" resname="size">
<source>Size</source>
<target state="signed-off">サイズ</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="duration" resname="duration">
<source>Duration (h:mm:ss.ms)</source>
<target state="signed-off">時間 (h:mm:ss.ms)</target>
@@ -2190,8 +2209,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="passedTo" resname="passedTo">
<source>passed to <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> に受け渡し済</target>
<target state="signed-off"><ph id="1">{0}</ph> に受け渡し済</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="gapChangeSinceLegStartInSeconds" resname="gapChangeSinceLegStartInSeconds">
<source>Gap Change</source>
@@ -3511,8 +3529,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="queryResultsChartSubtitle" resname="queryResultsChartSubtitle">
<source>Worked through <ph id="1">{0}</ph> data entries in <ph id="2">{1}</ph> seconds</source>
<target state="signed-off">
<ph id="1">{0}</ph> データエントリを <ph id="2">{1}</ph> 秒で処理済</target>
<target state="signed-off"><ph id="1">{0}</ph> データエントリを <ph id="2">{1}</ph> 秒で処理済</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="noQuerySelected" resname="noQuerySelected">
<source>No query selected</source>
@@ -3544,8 +3561,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="windImport_ResultHeader" resname="windImport_ResultHeader">
<source>Imported wind from: <ph id="1">{0}</ph> to: <ph id="2">{1}</ph>. <ph id="3">{2}</ph> races affected.</source>
<target state="signed-off">
<ph id="1">{0}</ph> から <ph id="2">{1}</ph> に風をインポートしました。<ph id="3">{2}</ph> レースが影響を受けます。</target>
<target state="signed-off"><ph id="1">{0}</ph> から <ph id="2">{1}</ph> に風をインポートしました。<ph id="3">{2}</ph> レースが影響を受けます。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="windImport_ResultEntry" resname="windImport_ResultEntry">
<source>Race: <ph id="1">{0}</ph> (<ph id="2">{1}</ph>) - <ph id="3">{2}</ph> fixes from: <ph id="4">{3}</ph> to: <ph id="5">{4}</ph></source>
@@ -3829,8 +3845,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="classFlagHelpText" resname="classFlagHelpText">
<source>Sets the class flag used for <ph id="1">{0}</ph>. Choose ''Don''t Overwrite'' to activate the procedure''s default flag.</source>
<target state="signed-off">
<ph id="1">{0}</ph> に使用するクラス旗を選定します。手順にある初期値の旗を有効化するには、''上書きしない'' を選択してください。</target>
<target state="signed-off"><ph id="1">{0}</ph> に使用するクラス旗を選定します。手順にある初期値の旗を有効化するには、''上書きしない'' を選択してください。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="individualRecallHelpText" resname="individualRecallHelpText">
<source>When activated the Race Officer is able to call for individual recall.</source>
@@ -4118,23 +4133,19 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="edit_what" resname="edit_what">
<source>Edit <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> を編集</target>
<target state="signed-off"><ph id="1">{0}</ph> を編集</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="add_what" resname="add_what">
<source>Add <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> を追加</target>
<target state="signed-off"><ph id="1">{0}</ph> を追加</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="remove_what" resname="remove_what">
<source>Remove <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> を削除</target>
<target state="signed-off"><ph id="1">{0}</ph> を削除</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseEnterA" resname="pleaseEnterA">
<source>Please enter a <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> を入力してください</target>
<target state="signed-off"><ph id="1">{0}</ph> を入力してください</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pingPosition" resname="pingPosition">
<source>Ping <ph id="1">{0}</ph> position</source>
@@ -4142,8 +4153,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseEnterAValidValueFor" resname="pleaseEnterAValidValueFor">
<source>Please enter a valid value for <ph id="1">{0}</ph> (<ph id="2">{1}</ph>)</source>
<target state="signed-off">
<ph id="1">{0}</ph> の有効な値を入力してください (<ph id="2">{1}</ph>)</target>
<target state="signed-off"><ph id="1">{0}</ph> の有効な値を入力してください (<ph id="2">{1}</ph>)</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="copyCourseAndCompetitors" resname="copyCourseAndCompetitors">
<source>Copy course and competitors to other races</source>
@@ -4351,14 +4361,12 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventSharingShortText" resname="eventSharingShortText">
<source><ph id="1">{0}</ph> in <ph id="2">{1}</ph> on <ph id="3">{2}</ph></source>
<target state="signed-off">
<ph id="2">{1}</ph> の <ph id="1">{0}</ph> を <ph id="3">{2}</ph> で</target>
<target state="signed-off"><ph id="2">{1}</ph> の <ph id="1">{0}</ph> を <ph id="3">{2}</ph> で</target>
<note annotates="source" from="Developer">String eventSharingShortText(String eventName, String venue, String dateString);</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventSharingLongText" resname="eventSharingLongText">
<source>I''d like to share <ph id="1">{0}</ph> in <ph id="2">{1}</ph> on <ph id="3">{2}</ph>. Details on: \n<ph id="4">{3}</ph></source>
<target state="signed-off">
<ph id="2">{1}</ph> の <ph id="1">{0}</ph> を <ph id="3">{2}</ph> でシェアします。詳細: \n<ph id="4">{3}</ph></target>
<target state="signed-off"><ph id="2">{1}</ph> の <ph id="1">{0}</ph> を <ph id="3">{2}</ph> でシェアします。詳細: \n<ph id="4">{3}</ph></target>
<note annotates="source" from="Developer">String eventSharingLongText(String eventName, String venue, String dateString, String url);</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="seriesSharingLongText" resname="seriesSharingLongText">
@@ -4368,9 +4376,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="seriesSharingShortText" resname="seriesSharingShortText">
<source><ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph>
</target>
<target state="signed-off"><ph id="1">{0}</ph></target>
<note annotates="source" from="Developer">String seriesSharingShortText(String seriesName);</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorsAnalytics" resname="competitorsAnalytics">
@@ -4529,6 +4535,10 @@
<source>Use start time inference from start mark passings</source>
<target state="signed-off">スタートマーク通過からの推定スタート時刻を使用</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="controlTrackingFromStartAndFinishTimes" resname="controlTrackingFromStartAndFinishTimes">
<source>Control tracking from start and finish times</source>
<target>スタート時刻およびフィニッシュ時刻からの追跡の制御</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="numberOfQueueMessagesSent" resname="numberOfQueueMessagesSent">
<source>Number of queue messages sent</source>
<target state="signed-off">送信済キューメッセージ数</target>
@@ -4623,8 +4633,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mediaSelectVideoCaption" resname="mediaSelectVideoCaption">
<source><ph id="1">{0}</ph> Videos</source>
<target state="signed-off">
<ph id="1">{0}</ph> 動画</target>
<target state="signed-off"><ph id="1">{0}</ph> 動画</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mediaSelectVideoTooltip" resname="mediaSelectVideoTooltip">
<source>Click to select video</source>
@@ -5296,8 +5305,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="startingIn" resname="startingIn">
<source><ph id="1">{0}</ph> starts in</source>
<target state="signed-off">
<ph id="1">{0}</ph> がスタート:</target>
<target state="signed-off"><ph id="1">{0}</ph> がスタート:</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="raceIsPlanned" resname="raceIsPlanned">
<source>Planned</source>
@@ -5329,8 +5337,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorWonRace" resname="competitorWonRace">
<source><ph id="1">{0}</ph> won race</source>
<target state="signed-off">
<ph id="1">{0}</ph> がレースに勝利</target>
<target state="signed-off"><ph id="1">{0}</ph> がレースに勝利</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="showCompetitorTimeOnTimeFactorColumn" resname="showCompetitorTimeOnTimeFactorColumn">
<source>Time on Time Factor</source>
@@ -5454,8 +5461,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="collapseX" resname="collapseX">
<source>Collapse <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> を圧縮</target>
<target state="signed-off"><ph id="1">{0}</ph> を圧縮</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="numberOfGPSFixes" resname="numberOfGPSFixes">
<source>GPS fixes</source>
@@ -5503,13 +5509,11 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="minutesAgo" resname="minutesAgo">
<source><ph id="1">{0}</ph> min ago</source>
<target state="signed-off">
<ph id="1">{0}</ph> 分前</target>
<target state="signed-off"><ph id="1">{0}</ph> 分前</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="hoursAgo" resname="hoursAgo">
<source><ph id="1">{0}</ph> h ago</source>
<target state="signed-off">
<ph id="1">{0}</ph> 時間前</target>
<target state="signed-off"><ph id="1">{0}</ph> 時間前</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="winner" resname="winner">
<source>Winner</source>
@@ -5597,8 +5601,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="cantDisplayDataOfType" resname="cantDisplayDataOfType">
<source>Can''t display data of type <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> タイプのデータは表示できません。</target>
<target state="signed-off"><ph id="1">{0}</ph> タイプのデータは表示できません。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="shownDecimals" resname="shownDecimals">
<source>Shown Decimals</source>
@@ -5634,8 +5637,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventsHaveTakenPlace" resname="eventsHaveTakenPlace">
<source><ph id="1">{0}</ph> events have taken place</source>
<target state="signed-off">
<ph id="1">{0}</ph> イベントが行われました</target>
<target state="signed-off"><ph id="1">{0}</ph> イベントが行われました</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventsHaveTakenPlace[one]" resname="eventsHaveTakenPlace[one]">
<source>One event has taken place</source>
@@ -5815,8 +5817,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="imageSizeError" resname="imageSizeError">
<source>The size of the <ph id="1">{0}</ph> image does not fit. The width should be between <ph id="2">{1}</ph> and <ph id="3">{2}</ph> px and the height between <ph id="4">{3}</ph> and <ph id="5">{4}</ph> px.</source>
<target state="signed-off">
<ph id="1">{0}</ph> 画像のサイズが適合しません。幅は <ph id="2">{1}</ph> と <ph id="3">{2}</ph> px の間、高さは <ph id="4">{3}</ph> と <ph id="5">{4}</ph> px の間である必要があります。</target>
<target state="signed-off"><ph id="1">{0}</ph> 画像のサイズが適合しません。幅は <ph id="2">{1}</ph> と <ph id="3">{2}</ph> px の間、高さは <ph id="4">{3}</ph> と <ph id="5">{4}</ph> px の間である必要があります。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotRetrieveImageSizeYet" resname="couldNotRetrieveImageSizeYet">
<source>The width and height of the image could not be retrieved yet.</source>
@@ -6038,25 +6039,25 @@
<source>utm_source=sapsailing&amp;utm_medium=solutions&amp;utm_content=2016.02&amp;utm_campaign=solutions&amp;pcampaignid=2016.sapsailing.solutions</source>
<target state="signed-off">utm_source=sapsailing&amp;utm_medium=solutions&amp;utm_content=2016.02&amp;utm_campaign=solutions&amp;pcampaignid=2016.sapsailing.solutions</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreTrackingApp" resname="playstoreTrackingApp">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreInsightApp" resname="playstoreInsightApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</source>
<target state="signed-off">https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</target>
<target>https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreRacecommitteeApp" resname="playstoreRacecommitteeApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app</source>
<target state="signed-off">https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playStoreBuoypositioningApp" resname="playStoreBuoypositioningApp">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playStoreBuoyPingerApp" resname="playStoreBuoyPingerApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</source>
<target state="signed-off">https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</target>
<target>https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreBadge" resname="playstoreBadge">
<source>https://play.google.com/intl/en/badges/images/generic/en-play-badge.png</source>
<target state="signed-off">https://play.google.com/intl/en/badges/images/generic/en-play-badge.png</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreSapSailingInsight" resname="appstoreSapSailingInsight">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreSapSailInsight" resname="appstoreSapSailInsight">
<source>http://appstore.com/sapsailinsight</source>
<target state="signed-off">http://appstore.com/sapsailinsight</target>
<target>http://appstore.com/sapsailinsight</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreStgTrainingstagebuch" resname="appstoreStgTrainingstagebuch">
<source>http://appstore.com/stgtrainingstagebuch</source>
@@ -6454,6 +6455,390 @@
<source>Maximum number of discards</source>
<target state="signed-off">カットレースの最大数</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="notificationRegattaConfigurationUpdatedUsingByMarks" resname="notificationRegattaConfigurationUpdatedUsingByMarks">
<source>Active regatta configuration was set, using the "By Marks" course designer.</source>
<target state="signed-off">"マーク別" コースデザイナーを使用して、有効なレガッタ設定が行われました。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="warningOverrideRegattaConfigurationCourseDesignerToByMarks" resname="warningOverrideRegattaConfigurationCourseDesignerToByMarks">
<source>Active regatta configuration already exists, but with the wrong course designer setting.\nWould you like to override course designer setting to "By Marks"?</source>
<target state="signed-off">有効なレガッタ設定がすでに登録されていますが、コースデザイナーの設定が適切でありません。\n"マーク別" へのコースデザイナー設定を上書きしますか。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="allRacesHaveBeenDenoted" resname="allRacesHaveBeenDenoted">
<source>All races have been denoted for racelog tracking.</source>
<target state="signed-off">すべてのレースがレースログ追跡に表示されています。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chartSelectionHint" resname="chartSelectionHint">
<source>Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. </source>
<target>ヒント: リーダーボード (リーダーボードタブ内) を使用して、チャートに表示する競技者を選択することもできます。 </target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chooseALanguage" resname="chooseALanguage">
<source>Choose a language</source>
<target>言語を選択してください</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutions" resname="solutions">
<source>Solutions</source>
<target>ソリューション</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="blog" resname="blog">
<source>Blog</source>
<target>ブログ</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="officalEventWebsite" resname="officalEventWebsite">
<source>Official event website</source>
<target>公式イベント Web サイト</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="moreInfo" resname="moreInfo">
<source>More info</source>
<target>追加情報</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="viewAnalysis" resname="viewAnalysis">
<source>View analysis </source>
<target>分析の表示 </target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="overallLeaderboard" resname="overallLeaderboard">
<source>Overall leaderboard</source>
<target>全体リーダーボード</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseTryAgain" resname="pleaseTryAgain">
<source>Please try again...</source>
<target>再試行してください...</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="reloadPage" resname="reloadPage">
<source>Reload page</source>
<target>ページのリロード</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorMessageLoadingData" resname="errorMessageLoadingData">
<source>An error occured while loading the data for this page.</source>
<target>このページのデータのロードでエラーが発生しました。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="regattaDetails" resname="regattaDetails">
<source>Regatta details</source>
<target>レガッタ詳細</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chooseChartType" resname="chooseChartType">
<source>Choose chart type</source>
<target>チャートタイプ選択</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="whatsNew" resname="whatsNew">
<source>What''s new</source>
<target>最新情報</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailing" resname="sapSailing">
<source>SAP Sailing</source>
<target>SAP Sailing</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="search" resname="search">
<source>Search</source>
<target>検索</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownStartingInDays" resname="countdownStartingInDays">
<source>Days</source>
<target>日</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownDays" resname="countdownDays">
<source>Days</source>
<target>日</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownHours" resname="countdownHours">
<source>Hrs</source>
<target>時間</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownMinutes" resname="countdownMinutes">
<source>Min</source>
<target>分</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownSeconds" resname="countdownSeconds">
<source>Sec</source>
<target>秒</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownDay" resname="countdownDay">
<source>Day</source>
<target>曜日</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownHour" resname="countdownHour">
<source>Hour</source>
<target>時</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownMinute" resname="countdownMinute">
<source>Min</source>
<target>分</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownSecond" resname="countdownSecond">
<source>Sec</source>
<target>秒</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="liveCapitalLetter" resname="liveCapitalLetter">
<source>Live</source>
<target>ライブ</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="watchNow" resname="watchNow">
<source>Watch now</source>
<target>現在視聴可能</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="seriesHeaderUpcoming" resname="seriesHeaderUpcoming">
<source>Upcoming</source>
<target>予定</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventRegattaLeaderboardLastScoreUpdate" resname="eventRegattaLeaderboardLastScoreUpdate">
<source>Last Score Update</source>
<target>前回スコア更新</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventRegattaRaceNotTracked" resname="eventRegattaRaceNotTracked">
<source>Not Tracked</source>
<target>未追跡</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerJobs" resname="footerJobs">
<source>Jobs</source>
<target>採用</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerCopyright" resname="footerCopyright">
<source>© 2011-2016 SAP Sailing Analytics</source>
<target>© 2011-2016 SAP Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerLanguage" resname="footerLanguage">
<source>SAP Sailing in</source>
<target>SAP Sailing -</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerLegal" resname="footerLegal">
<source>Legal Disclosure</source>
<target>利用規約</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerPrivacy" resname="footerPrivacy">
<source>Privacy</source>
<target>個人情報保護</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerFeedback" resname="footerFeedback">
<source>Feedback</source>
<target>フィードバック</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="headerLogo" resname="headerLogo">
<source>Sailing Analytics</source>
<target>Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="headerSearchPlaceholder" resname="headerSearchPlaceholder">
<source>Search </source>
<target>検索 </target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainEventShowAll" resname="mainEventShowAll">
<source>Show All Events</source>
<target>全イベント表示</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainEventTitle" resname="mainEventTitle">
<source>Latest Events from the Sailing World</source>
<target>Sailing World からの最新イベント</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaSubtitle" resname="mainMediaSubtitle">
<source>Get lost in the latest and most beautiful impressions from your favorite sailing event.</source>
<target>お気に入りのセーリングイベントのすてきな最新画像を楽しんでください。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaTitle" resname="mainMediaTitle">
<source>Photographers love Sailing</source>
<target>最新のセーリング画像</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaVideosSubtitle" resname="mainMediaVideosSubtitle">
<source>Immerse yourself in the world of sailing and check out our latest events for more videos.</source>
<target>最新イベントの動画にアクセスしてセーリングの世界に浸ってください。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaVideosTitle" resname="mainMediaVideosTitle">
<source>Recent Video Entries</source>
<target>最新のセーリング動画</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderButton" resname="searchResultHeaderButton">
<source>Search</source>
<target>検索</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderLabel" resname="searchResultHeaderLabel">
<source>Your Search</source>
<target>検索対象</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderPlaceholder" resname="searchResultHeaderPlaceholder">
<source>Type in your searchkey</source>
<target>検索キーを入力</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultSortNewest" resname="searchResultSortNewest">
<source>Recent</source>
<target>最新</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSISHeadline" resname="solutionsSISHeadline">
<source>SAP in Sailing</source>
<target>SAP in Sailing</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSAPHeadline" resname="solutionsSAPHeadline">
<source>SAP Sailing Analytics</source>
<target>SAP Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsRaceHeadline" resname="solutionsRaceHeadline">
<source>SAP Sailing Race Manager</source>
<target>SAP Sailing Race Manager</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsInSightHeadline" resname="solutionsInSightHeadline">
<source>SAP Sail InSight</source>
<target>SAP Sail InSight</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsBuoyPingerHeadline" resname="solutionsBuoyPingerHeadline">
<source>SAP Sailing Buoy Pinger</source>
<target>SAP Sailing Buoy Pinger</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsPostHeadline" resname="solutionsPostHeadline">
<source>Post-Race Analytics</source>
<target>レース後分析</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsTrainingHeadline" resname="solutionsTrainingHeadline">
<source>Training Diary</source>
<target>トレーニング日記</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSimulatorHeadline" resname="solutionsSimulatorHeadline">
<source>Strategy Simulator</source>
<target>戦略シミュレータ</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapInSailing" resname="sapInSailing">
<source>SAP in Sailing</source>
<target>SAP in Sailing</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing1" resname="contentSapInSailing1">
<source>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:</source>
<target>セーリングは、SAP にとってソリューションを紹介するためのプラットフォームとしてうってつけのものであり、これまでになかったやり方でスポーツの運営を支援しています。SAP によるスポーツへの関与は、以下のことを行うツールを提供することによってセーリングから得られる体験を別次元のものに変えました。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing2" resname="contentSapInSailing2">
<source>Help sailors analyze performance and optimize strategy</source>
<target>パフォーマンスの分析と戦略の最適化でセーラーを支援します</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing3" resname="contentSapInSailing3">
<source>Bring fans closer to the action</source>
<target>アクションをファンにとって身近なものにします</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing4" resname="contentSapInSailing4">
<source>Provide the media with information and insights to deliver a greater informed commentary</source>
<target>情報豊富なすばらしい解説を行うための情報とインサイトを報道関係者に提供します</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing5" resname="contentSapInSailing5">
<source>SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including:</source>
<target>SAP は、長年にわたりセーリングに関与しており、以下のようなチームおよびレガッタと関係を構築してきました。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing6" resname="contentSapInSailing6">
<source>Official Technology Partner of Travemünder Woche</source>
<target>Travemünder Woche の公式テクノロジーパートナー</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing7" resname="contentSapInSailing7">
<source>Technical Partner of the European Sailing Leagues</source>
<target>欧州セーリング連盟 (European Sailing Leagues) のテクノロジーパートナー</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing8" resname="contentSapInSailing8">
<source>Title sponsor of the SAP Extreme Sailing Team</source>
<target>SAP Extreme Sailing Team のタイトルスポンサー</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing9" resname="contentSapInSailing9">
<source>Official Technical Partner of the Extreme Sailing Series</source>
<target>Extreme Sailing Series の公式テクニカルパートナー</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing10" resname="contentSapInSailing10">
<source>Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany</source>
<target>ドイツ代表セーリングチームである Audi Sailing Team Germany のプレミアムパートナー</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing11" resname="contentSapInSailing11">
<source>Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week)</source>
<target>世界最大のレガッタである Kieler Woche (Kiel Week) のプレミアムパートナー</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing12" resname="contentSapInSailing12">
<source>Title sponsor of the SAP 5O5 World Championships</source>
<target>SAP 5O5 World Championships のタイトルスポンサー</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingAnalyticsTitle" resname="sapSailingAnalyticsTitle">
<source>SAP Sailing Analytics</source>
<target>SAP Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingAnalytics1" resname="contentSapSailingAnalytics1">
<source>By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing.</source>
<target>レースランキング、速力、操縦、ベアリングなどに関係するリアルタイム分析を提供することにより、SAP はセーリングという複雑なスポーツを簡略に分かりやすく説明することをお手伝いしています。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingAnalytics2" resname="contentSapSailingAnalytics2">
<source>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.</source>
<target>SAP Sailing Analytics は、クラウドおよびインメモリ技術を活用し、リアルタイムで GPS および風計測データを処理し、どこからでもアクセスできるさまざまなフロントエンドでコンテンツを視覚化することによってセーリングの世界にインサイトと透明性を提供します。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingAnalyticsReadMore" resname="sapSailingAnalyticsReadMore">
<source>Read More</source>
<target>続きを読む</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingRaceManager" resname="sapSailingRaceManager">
<source>SAP Sailing Race Manager</source>
<target>SAP Sailing Race Manager</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingRaceManager" resname="contentSapSailingRaceManager">
<source>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.</source>
<target>SAP Sailing Race Manager は、セーリングレガッタ運営中にレース組織者が手動で行う作業や連絡業務を自動化/簡略化することによって効率と統制を向上させます。Race Committee アプリは、レースイベントの運営/管理業務を簡略化するのに役立ち、レース委員会がより円滑に運営されるよう支援します。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingRaceManagerReadMore" resname="sapSailingRaceManagerReadMore">
<source>Learn More</source>
<target>詳細情報</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailInSight" resname="sapSailInSight">
<source>SAP Sail InSight</source>
<target>SAP Sail InSight</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailInSight" resname="contentSapSailInSight">
<source>With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance.</source>
<target>iPhone、iPad、および Android フォン向け SAP Sail InSight モバイルアプリにより、ヨット競技者はいつでもどこでもレガッタ参加やパフォーマンスを管理することができます。このアプリは SAP Sailing Analytics ソリューションに接続され、競技者が SAP Sail InSight 対応のレガッタへの受付を行い、自分がどこにいるかを艇速や帆走距離などのパフォーマンス指標とともに追跡し、自らのパフォーマンスを分析することを可能にします。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailInSightReadMore" resname="sapSailInSightReadMore">
<source>Learn More</source>
<target>詳細情報</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingBuoyPinger" resname="sapSailingBuoyPinger">
<source>SAP Sailing Buoy Pinger</source>
<target>SAP Sailing Buoy Pinger</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingBuoyPinger" resname="contentSapSailingBuoyPinger">
<source>With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta.</source>
<target>Android フォン向け SAP Sailing Buoy Pinger モバイルアプリにより、ヨットレース運営者はいつでもどこでもレース用のマークの位置決めや、マーク設置担当者とのやり取りを簡略化することができます。このアプリは SAP Sailing Analytics ソリューションに接続され、レガッタ運営者がレース用のマークの地理的位置を追跡することを可能にし、レガッタに参加しているセーラーが SAP Sail InSight モバイルアプリを使用できるようにします。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingBuoyPingerReadMore" resname="sapSailingBuoyPingerReadMore">
<source>Learn More</source>
<target>詳細情報</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="postRaceAnalytics" resname="postRaceAnalytics">
<source>Post-Race Analytics</source>
<target>レース後分析</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentPostRaceAnalytics1" resname="contentPostRaceAnalytics1">
<source>Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.</source>
<target>セーリングイベントで収集されたデータへのアクセスにより、戦略の策定や帆走の向上に役立つ、セーラーがそのパフォーマンスを評価および分析する機会が提供されます。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentPostRaceAnalytics2" resname="contentPostRaceAnalytics2">
<source>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.</source>
<target>SAP Business Analytics ソリューションは、多くのレガッタおよびレースにわたって履歴データを照会および分析するツールをセーラー、コーチ、ファン、そして報道関係者に提供します。SAP HANA は、こうした人たちが自身のパフォーマンスを最適化し、予定されているレガッタで成功を収める戦略を策定するために簡単、迅速、かつ効率的な方法でパフォーマンスのパターン、傾向、およびセーラーのプロファイルを知ることを可能にします。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="i18nDeSolutionsTrainingHeadline" resname="i18nDeSolutionsTrainingHeadline">
<source>SAP Sail Better – STG Training Diary</source>
<target>SAP Sail Better – STG Training Diary</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="i18nDeSolutionsTrainingText" resname="i18nDeSolutionsTrainingText">
<source>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.</source>
<target>STG Training Diary は、選手の体調、ならびに水上トレーニング、身体的トレーニング、操艇、メンタル、理論、さらに教育や移動などのその他の活動の領域におけるトレーニングへの取り組みの日々の記録および分析をサポートします。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="strategySimulator" resname="strategySimulator">
<source>Strategy Simulator</source>
<target>戦略シミュレータ</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentStrategySimulator" resname="contentStrategySimulator">
<source>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.</source>
<target>適切な戦略を選択すれば、レース中に大きな競争上の優位性を得ることが可能です。Strategy Simulator により、さまざまな風況および水流に対して最良のセーリング戦略を決定することが容易になります。風と水流をシミュレーションで直ちに変更することができるため、不確かな気象条件に対しても戦略の確かさを簡単に評価することができます。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="strategySimulatorReadMore" resname="strategySimulatorReadMore">
<source>Learn More</source>
<target>詳細情報</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="impressum" resname="impressum">
<source>Imprint</source>
<target>刻印</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="lastFix" resname="lastFix">
<source>Last fix</source>
<target>最終フィックス</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="filterDeviceMappings" resname="filterDeviceMappings">
<source>Filter device mappings</source>
<target>デバイスマッピングのフィルタリング</target>
</trans-unit>
</body>
</file>
</xliff>
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:17Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:17:08Z" original="/usr/sap/ljs/app/Converter_7623614428299933729/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="f6ec166735cc7adb2ddad356f75a3f11" form="base64">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 truncated
<internal-file crc="aa58aa0159559141c900793034ac8e1d" form="base64">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 truncated
</skl>
<phase-group>
<phase company-name="SAP AG" date="2016-07-28T14:32:35Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
<phase company-name="SAP AG" date="2016-09-26T08:30:46Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
</phase-group>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
</header>
@@ -65,7 +65,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="windPanelLabel" resname="windPanelLabel">
<source>This is the Wind Panel which so far is completely empty.</source>
<target state="translated">Это панель ветров, которая пока что совсем пуста.</target>
<target state="signed-off">Это панель ветров, которая пока что совсем пуста.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="refresh" resname="refresh">
<source>Refresh</source>
@@ -929,7 +929,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="raceIsKnownToStartUpwind" resname="raceIsKnownToStartUpwind">
<source>Race starts with upwind leg</source>
<target state="translated">Гонка начинается против ветра</target>
<target state="signed-off">Гонка начинается против ветра</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="events" resname="events">
<source>Events</source>
@@ -937,8 +937,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settingsForComponent" resname="settingsForComponent">
<source>Settings for <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> — параметры</target>
<target state="signed-off"><ph id="1">{0}</ph> — параметры</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="noEventsFound" resname="noEventsFound">
<source>No events were found</source>
@@ -1002,13 +1001,11 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorPassedMarkAtDate" resname="competitorPassedMarkAtDate">
<source><ph id="1">{0}</ph> passed <ph id="2">{1}</ph> at <ph id="3">{2}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> пройдено <ph id="2">{1}</ph> в <ph id="3">{2}</ph></target>
<target state="signed-off"><ph id="1">{0}</ph> пройдено <ph id="2">{1}</ph> в <ph id="3">{2}</ph></target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="valueForCompetitorAt" resname="valueForCompetitorAt">
<source><ph id="1">{0}</ph> at <ph id="2">{1}</ph>: <ph id="3">{2}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> в <ph id="2">{1}</ph>: <ph id="3">{2}</ph></target>
<target state="signed-off"><ph id="1">{0}</ph> в <ph id="2">{1}</ph>: <ph id="3">{2}</ph></target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="reallyRemoveRace" resname="reallyRemoveRace">
<source>Do you really want to remove the race ''<ph id="1">{0}</ph>''? Note: all race logs for this race will also permanently be removed!</source>
@@ -1776,7 +1773,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="scoringSchemeLowPointForLeagueOverallLeaderboardDescription" resname="scoringSchemeLowPointForLeagueOverallLeaderboardDescription">
<source>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.</source>
<target state="translated">Вместо обычной системы обратного отсчета, используемой для разрешения равенства в схемах низких баллов, участники с равными суммами баллов сравниваются по сумме баллов, полученных за все акты. Если равенство сохраняется, оно разрешается по последнему акту.</target>
<target state="signed-off">Вместо обычной системы обратного отсчета, используемой для разрешения равенства в схемах низких баллов, участники с равными суммами баллов сравниваются по сумме баллов, полученных за все акты. Если равенство сохраняется, оно разрешается по последнему акту.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="scoringSchemeLowPointTieBreakBasedOnLastSeriesOnly" resname="scoringSchemeLowPointTieBreakBasedOnLastSeriesOnly">
<source>Low Point, ties broken based on last series only</source>
@@ -1986,6 +1983,30 @@
<source>Title</source>
<target state="signed-off">Название</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="subtitle" resname="subtitle">
<source>Subtitle</source>
<target state="signed-off">Подзаголовок</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="copyright" resname="copyright">
<source>Copyright</source>
<target state="signed-off">Copyright</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="widthInPx" resname="widthInPx">
<source>Width (pixel)</source>
<target state="signed-off">Ширина (в пикселях)</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="heightInPx" resname="heightInPx">
<source>Height (pixel)</source>
<target state="signed-off">Высота (в пикселях)</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="tags" resname="tags">
<source>Tags</source>
<target state="signed-off">Теги</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="size" resname="size">
<source>Size</source>
<target state="signed-off">Размер</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="duration" resname="duration">
<source>Duration (h:mm:ss.ms)</source>
<target state="signed-off">Длительность (ч:мм:сс.мс)</target>
@@ -2140,8 +2161,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorRegattaDataAfterRaceN" resname="competitorRegattaDataAfterRaceN">
<source><ph id="1">{0}</ph> after race <ph id="2">{1}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> после гонки <ph id="2">{1}</ph></target>
<target state="signed-off"><ph id="1">{0}</ph> после гонки <ph id="2">{1}</ph></target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="rankChart" resname="rankChart">
<source>Ranking</source>
@@ -3729,7 +3749,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="rerunQueryAfterRefresh" resname="rerunQueryAfterRefresh">
<source>Rerun query after refresh</source>
<target state="translated">Повторить запрос после обновления</target>
<target state="signed-off">Повторить запрос после обновления</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="refreshIntervalMustntBeEmpty" resname="refreshIntervalMustntBeEmpty">
<source>Refresh interval mustn''t be empty</source>
@@ -3997,7 +4017,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorImportingIgtimiWind" resname="errorImportingIgtimiWind">
<source>Error importing wind data from Igtimi: <ph id="1">{0}</ph></source>
<target state="translated">Ошибка при импорте данных о ветре из Igtimi: <ph id="1">{0}</ph></target>
<target state="signed-off">Ошибка при импорте данных о ветре из Igtimi: <ph id="1">{0}</ph></target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="resultFromIgtimiWindImport" resname="resultFromIgtimiWindImport">
<source>The following number of fixes were imported for the listed races: <ph id="1">{0}</ph></source>
@@ -4005,13 +4025,11 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="timeToStart" resname="timeToStart">
<source><ph id="1">{0}</ph> to start</source>
<target state="signed-off">
<ph id="1">{0}</ph> до старта</target>
<target state="signed-off"><ph id="1">{0}</ph> до старта</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="timeSinceStart" resname="timeSinceStart">
<source><ph id="1">{0}</ph> since start</source>
<target state="signed-off">
<ph id="1">{0}</ph> от старта</target>
<target state="signed-off"><ph id="1">{0}</ph> от старта</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="distanceToLine" resname="distanceToLine">
<source>Distance to start line</source>
@@ -4343,8 +4361,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventSharingShortText" resname="eventSharingShortText">
<source><ph id="1">{0}</ph> in <ph id="2">{1}</ph> on <ph id="3">{2}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> в <ph id="2">{1}</ph> на <ph id="3">{2}</ph></target>
<target state="signed-off"><ph id="1">{0}</ph> в <ph id="2">{1}</ph> на <ph id="3">{2}</ph></target>
<note annotates="source" from="Developer">String eventSharingShortText(String eventName, String venue, String dateString);</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventSharingLongText" resname="eventSharingLongText">
@@ -4359,9 +4376,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="seriesSharingShortText" resname="seriesSharingShortText">
<source><ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph>
</target>
<target state="signed-off"><ph id="1">{0}</ph></target>
<note annotates="source" from="Developer">String seriesSharingShortText(String seriesName);</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorsAnalytics" resname="competitorsAnalytics">
@@ -4520,6 +4535,10 @@
<source>Use start time inference from start mark passings</source>
<target state="signed-off">Использовать вывод о времени старта из прохождений стартовой отметки</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="controlTrackingFromStartAndFinishTimes" resname="controlTrackingFromStartAndFinishTimes">
<source>Control tracking from start and finish times</source>
<target>Контролировать отслеживание от времени старта и финиша</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="numberOfQueueMessagesSent" resname="numberOfQueueMessagesSent">
<source>Number of queue messages sent</source>
<target state="signed-off">Число отправленных сообщений очереди</target>
@@ -4614,8 +4633,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mediaSelectVideoCaption" resname="mediaSelectVideoCaption">
<source><ph id="1">{0}</ph> Videos</source>
<target state="signed-off">
<ph id="1">{0}</ph> видео</target>
<target state="signed-off"><ph id="1">{0}</ph> видео</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mediaSelectVideoTooltip" resname="mediaSelectVideoTooltip">
<source>Click to select video</source>
@@ -5287,8 +5305,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="startingIn" resname="startingIn">
<source><ph id="1">{0}</ph> starts in</source>
<target state="signed-off">
<ph id="1">{0}</ph> начинается через</target>
<target state="signed-off"><ph id="1">{0}</ph> начинается через</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="raceIsPlanned" resname="raceIsPlanned">
<source>Planned</source>
@@ -5352,7 +5369,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="orcPerformanceCurveRankingMetricDescription" resname="orcPerformanceCurveRankingMetricDescription">
<source>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. </source>
<target state="translated">Кривая эффективности ORC: сложная схема гандикапа, предоставляющая фору с учетом VPP/полярных данных для предварительно определенных углов отрезков к ветру;\nна основе этих допусков рассчитывается "подразумеваемый ветер", используемый как основа для ранжирования.\nПодразумеваемый ветер можно рассчитать в любое время в ходе гонки, поэтому он является основой для ранжирования в гонке.</target>
<target state="signed-off">Кривая эффективности ORC: сложная схема гандикапа, предоставляющая фору с учетом VPP/полярных данных для предварительно определенных углов отрезков к ветру;\nна основе этих допусков рассчитывается "подразумеваемый ветер", используемый как основа для ранжирования.\nПодразумеваемый ветер можно рассчитать в любое время в ходе гонки, поэтому он является основой для ранжирования в гонке.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="timeOnTimeAndDistanceRankingMetricDescription" resname="timeOnTimeAndDistanceRankingMetricDescription">
<source>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.</source>
@@ -5492,13 +5509,11 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="minutesAgo" resname="minutesAgo">
<source><ph id="1">{0}</ph> min ago</source>
<target state="signed-off">
<ph id="1">{0}</ph> мин. назад</target>
<target state="signed-off"><ph id="1">{0}</ph> мин. назад</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="hoursAgo" resname="hoursAgo">
<source><ph id="1">{0}</ph> h ago</source>
<target state="signed-off">
<ph id="1">{0}</ph> ч. назад</target>
<target state="signed-off"><ph id="1">{0}</ph> ч. назад</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="winner" resname="winner">
<source>Winner</source>
@@ -5534,8 +5549,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="degreesToWind" resname="degreesToWind">
<source><ph id="1">{0}</ph>° to wind</source>
<target state="signed-off">
<ph id="1">{0}</ph>° к ветру</target>
<target state="signed-off"><ph id="1">{0}</ph>° к ветру</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="miniLeeaderboardLegendText" resname="miniLeeaderboardLegendText">
<source>Shows the points along with the number of races per competitor</source>
@@ -5647,7 +5661,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="plainResultsPresenter" resname="plainResultsPresenter">
<source>Plain Results Presenter</source>
<target state="translated">Презентатор простых результатов</target>
<target state="signed-off">Презентатор простых результатов</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="resultsChart" resname="resultsChart">
<source>Results Chart</source>
@@ -6025,25 +6039,25 @@
<source>utm_source=sapsailing&amp;utm_medium=solutions&amp;utm_content=2016.02&amp;utm_campaign=solutions&amp;pcampaignid=2016.sapsailing.solutions</source>
<target state="signed-off">utm_source=sapsailing&amp;utm_medium=solutions&amp;utm_content=2016.02&amp;utm_campaign=solutions&amp;pcampaignid=2016.sapsailing.solutions</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreTrackingApp" resname="playstoreTrackingApp">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreInsightApp" resname="playstoreInsightApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</source>
<target state="signed-off">https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</target>
<target>https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreRacecommitteeApp" resname="playstoreRacecommitteeApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app</source>
<target state="signed-off">https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playStoreBuoypositioningApp" resname="playStoreBuoypositioningApp">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playStoreBuoyPingerApp" resname="playStoreBuoyPingerApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</source>
<target state="signed-off">https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</target>
<target>https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreBadge" resname="playstoreBadge">
<source>https://play.google.com/intl/en/badges/images/generic/en-play-badge.png</source>
<target state="signed-off">https://play.google.com/intl/en/badges/images/generic/en-play-badge.png</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreSapSailingInsight" resname="appstoreSapSailingInsight">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreSapSailInsight" resname="appstoreSapSailInsight">
<source>http://appstore.com/sapsailinsight</source>
<target state="signed-off">http://appstore.com/sapsailinsight</target>
<target>http://appstore.com/sapsailinsight</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreStgTrainingstagebuch" resname="appstoreStgTrainingstagebuch">
<source>http://appstore.com/stgtrainingstagebuch</source>
@@ -6441,6 +6455,390 @@
<source>Maximum number of discards</source>
<target state="signed-off">Максимальное число исключений</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="notificationRegattaConfigurationUpdatedUsingByMarks" resname="notificationRegattaConfigurationUpdatedUsingByMarks">
<source>Active regatta configuration was set, using the "By Marks" course designer.</source>
<target state="signed-off">Активная конфигурация регаты была настроена с использованием дизайнера курса "По отметкам".</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="warningOverrideRegattaConfigurationCourseDesignerToByMarks" resname="warningOverrideRegattaConfigurationCourseDesignerToByMarks">
<source>Active regatta configuration already exists, but with the wrong course designer setting.\nWould you like to override course designer setting to "By Marks"?</source>
<target state="signed-off">Активная конфигурация регаты уже существует, но с неверно выбранным дизайнером курса.\nПереопределить выбор дизайнера курса на "По отметкам"?</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="allRacesHaveBeenDenoted" resname="allRacesHaveBeenDenoted">
<source>All races have been denoted for racelog tracking.</source>
<target state="signed-off">Отслеживание журнала всех гонок отменено.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chartSelectionHint" resname="chartSelectionHint">
<source>Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. </source>
<target>Совет: таблицу лидеров (на вкладке ТАБЛИЦА ЛИДЕРОВ) также можно использовать для выбора участников, отображаемых в диаграмме. </target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chooseALanguage" resname="chooseALanguage">
<source>Choose a language</source>
<target>Выбор языка</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutions" resname="solutions">
<source>Solutions</source>
<target>Решения</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="blog" resname="blog">
<source>Blog</source>
<target>Блог</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="officalEventWebsite" resname="officalEventWebsite">
<source>Official event website</source>
<target>Официальный веб-сайт события</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="moreInfo" resname="moreInfo">
<source>More info</source>
<target>Больше сведений</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="viewAnalysis" resname="viewAnalysis">
<source>View analysis </source>
<target>Просмотреть анализ </target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="overallLeaderboard" resname="overallLeaderboard">
<source>Overall leaderboard</source>
<target>Общая таблица лидеров</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseTryAgain" resname="pleaseTryAgain">
<source>Please try again...</source>
<target>Повторите попытку...</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="reloadPage" resname="reloadPage">
<source>Reload page</source>
<target>Перезагрузить страницу</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorMessageLoadingData" resname="errorMessageLoadingData">
<source>An error occured while loading the data for this page.</source>
<target>При загрузке данных для этой страницы возникла ошибка.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="regattaDetails" resname="regattaDetails">
<source>Regatta details</source>
<target>Подробности регаты</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chooseChartType" resname="chooseChartType">
<source>Choose chart type</source>
<target>Выберите тип диаграммы</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="whatsNew" resname="whatsNew">
<source>What''s new</source>
<target>Новые возможности</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailing" resname="sapSailing">
<source>SAP Sailing</source>
<target>SAP Sailing</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="search" resname="search">
<source>Search</source>
<target>Поиск</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownStartingInDays" resname="countdownStartingInDays">
<source>Days</source>
<target>дн.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownDays" resname="countdownDays">
<source>Days</source>
<target>дн.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownHours" resname="countdownHours">
<source>Hrs</source>
<target>ч.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownMinutes" resname="countdownMinutes">
<source>Min</source>
<target>мин.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownSeconds" resname="countdownSeconds">
<source>Sec</source>
<target>сек.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownDay" resname="countdownDay">
<source>Day</source>
<target>дн.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownHour" resname="countdownHour">
<source>Hour</source>
<target>ч.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownMinute" resname="countdownMinute">
<source>Min</source>
<target>мин.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownSecond" resname="countdownSecond">
<source>Sec</source>
<target>сек.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="liveCapitalLetter" resname="liveCapitalLetter">
<source>Live</source>
<target>Активно</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="watchNow" resname="watchNow">
<source>Watch now</source>
<target>Смотреть сейчас</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="seriesHeaderUpcoming" resname="seriesHeaderUpcoming">
<source>Upcoming</source>
<target>Скоро</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventRegattaLeaderboardLastScoreUpdate" resname="eventRegattaLeaderboardLastScoreUpdate">
<source>Last Score Update</source>
<target>Последнее обновление оценок</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventRegattaRaceNotTracked" resname="eventRegattaRaceNotTracked">
<source>Not Tracked</source>
<target>Не отслеживается</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerJobs" resname="footerJobs">
<source>Jobs</source>
<target>Работа</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerCopyright" resname="footerCopyright">
<source>© 2011-2016 SAP Sailing Analytics</source>
<target>© SAP Sailing Analytics, 2011–2016.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerLanguage" resname="footerLanguage">
<source>SAP Sailing in</source>
<target>Язык SAP Sailing</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerLegal" resname="footerLegal">
<source>Legal Disclosure</source>
<target>Раскрытие юридической информации</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerPrivacy" resname="footerPrivacy">
<source>Privacy</source>
<target>Конфиденциальность</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerFeedback" resname="footerFeedback">
<source>Feedback</source>
<target>Обратная связь</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="headerLogo" resname="headerLogo">
<source>Sailing Analytics</source>
<target>Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="headerSearchPlaceholder" resname="headerSearchPlaceholder">
<source>Search </source>
<target>Поиск </target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainEventShowAll" resname="mainEventShowAll">
<source>Show All Events</source>
<target>Показать все события</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainEventTitle" resname="mainEventTitle">
<source>Latest Events from the Sailing World</source>
<target>Последние события в мире парусного спорта</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaSubtitle" resname="mainMediaSubtitle">
<source>Get lost in the latest and most beautiful impressions from your favorite sailing event.</source>
<target>Погрузитесь в новейшие и прекраснейшие впечатления от избранного события в мире парусного спорта.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaTitle" resname="mainMediaTitle">
<source>Photographers love Sailing</source>
<target>Фотографы любят паруса</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaVideosSubtitle" resname="mainMediaVideosSubtitle">
<source>Immerse yourself in the world of sailing and check out our latest events for more videos.</source>
<target>Погрузитесь в мир парусного спорта и просмотрите другие видео наших последних событий.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaVideosTitle" resname="mainMediaVideosTitle">
<source>Recent Video Entries</source>
<target>Последние видеозаписи</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderButton" resname="searchResultHeaderButton">
<source>Search</source>
<target>Поиск</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderLabel" resname="searchResultHeaderLabel">
<source>Your Search</source>
<target>Ваш поиск</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderPlaceholder" resname="searchResultHeaderPlaceholder">
<source>Type in your searchkey</source>
<target>Введите ключ поиска</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultSortNewest" resname="searchResultSortNewest">
<source>Recent</source>
<target>Недавние</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSISHeadline" resname="solutionsSISHeadline">
<source>SAP in Sailing</source>
<target>SAP в парусном спорте</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSAPHeadline" resname="solutionsSAPHeadline">
<source>SAP Sailing Analytics</source>
<target>SAP Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsRaceHeadline" resname="solutionsRaceHeadline">
<source>SAP Sailing Race Manager</source>
<target>SAP Sailing Race Manager</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsInSightHeadline" resname="solutionsInSightHeadline">
<source>SAP Sail InSight</source>
<target>SAP Sail InSight</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsBuoyPingerHeadline" resname="solutionsBuoyPingerHeadline">
<source>SAP Sailing Buoy Pinger</source>
<target>SAP Sailing Buoy Pinger</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsPostHeadline" resname="solutionsPostHeadline">
<source>Post-Race Analytics</source>
<target>Аналитика после гонки</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsTrainingHeadline" resname="solutionsTrainingHeadline">
<source>Training Diary</source>
<target>Дневник тренировок</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSimulatorHeadline" resname="solutionsSimulatorHeadline">
<source>Strategy Simulator</source>
<target>Симулятор стратегии</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapInSailing" resname="sapInSailing">
<source>SAP in Sailing</source>
<target>SAP в парусном спорте</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing1" resname="contentSapInSailing1">
<source>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:</source>
<target>Парусный спорт предоставляет отличную платформу для демонстрации решений SAP и беспрецедентной помощи развитию спорта. Вовлеченность SAP преобразила парусный спорт, предоставив инструменты, которые:</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing2" resname="contentSapInSailing2">
<source>Help sailors analyze performance and optimize strategy</source>
<target>Помогают мореходам анализировать эффективность и оптимизировать стратегию.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing3" resname="contentSapInSailing3">
<source>Bring fans closer to the action</source>
<target>Делают болельщиков ближе к действию.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing4" resname="contentSapInSailing4">
<source>Provide the media with information and insights to deliver a greater informed commentary</source>
<target>Предоставляют информацию и аналитику для более информированного комментирования.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing5" resname="contentSapInSailing5">
<source>SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including:</source>
<target>За немалое время причастности к парусному спорту компанией SAP накоплено солидное портфолио сотрудничества с разными командами регатами, включая:</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing6" resname="contentSapInSailing6">
<source>Official Technology Partner of Travemünder Woche</source>
<target>Официальный технологический партнер Travemünder Woche</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing7" resname="contentSapInSailing7">
<source>Technical Partner of the European Sailing Leagues</source>
<target>Технический партнер Европейской лиги парусного спорта</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing8" resname="contentSapInSailing8">
<source>Title sponsor of the SAP Extreme Sailing Team</source>
<target>Титульный спонсор команды SAP Extreme Sailing Team</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing9" resname="contentSapInSailing9">
<source>Official Technical Partner of the Extreme Sailing Series</source>
<target>Официальный технический партнер серии Extreme Sailing Series</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing10" resname="contentSapInSailing10">
<source>Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany</source>
<target>Премиальный партнер национальной команды Германии по парусному спорту, Audi Sailing Team Germany</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing11" resname="contentSapInSailing11">
<source>Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week)</source>
<target>Премиальный партнер крупнейшей в мире регаты Kieler Woche (Кильская неделя)</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing12" resname="contentSapInSailing12">
<source>Title sponsor of the SAP 5O5 World Championships</source>
<target>Титульный спонсор чемпионатов мира SAP 5O5</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingAnalyticsTitle" resname="sapSailingAnalyticsTitle">
<source>SAP Sailing Analytics</source>
<target>SAP Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingAnalytics1" resname="contentSapSailingAnalytics1">
<source>By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing.</source>
<target>Предоставляя аналитику по данным о рангах в гонке, скоростях, маневрах, ветрах и т. д. в режиме реального времени, SAP помогает упростить и демистифицировать сложный парусный спорт.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingAnalytics2" resname="contentSapSailingAnalytics2">
<source>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.</source>
<target>SAP Sailing Analytics делает мир парусного спорта понятным и прозрачным, используя облако и технологию In-Memory, обработку данных GPS и параметров ветра в реальном времени, а также визуализацию контекста в разных пользовательских интерфейсах, доступных где угодно.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingAnalyticsReadMore" resname="sapSailingAnalyticsReadMore">
<source>Read More</source>
<target>См. также</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingRaceManager" resname="sapSailingRaceManager">
<source>SAP Sailing Race Manager</source>
<target>SAP Sailing Race Manager</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingRaceManager" resname="contentSapSailingRaceManager">
<source>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.</source>
<target>Приложение SAP Sailing Race Manager повышает уровень эффективности и контроля для организаторов гонки за счет автоматизации и упрощения выполняемых вручную задач и общения во время проведения парусных регат. Приложение Race Committee помогает упростить проведение событий и управление ими, освобождая для оргкомитета время на лучшую проработку деталей.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingRaceManagerReadMore" resname="sapSailingRaceManagerReadMore">
<source>Learn More</source>
<target>Узнать больше</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailInSight" resname="sapSailInSight">
<source>SAP Sail InSight</source>
<target>SAP Sail InSight</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailInSight" resname="contentSapSailInSight">
<source>With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance.</source>
<target>С помощью мобильного приложения SAP Sail InSight для смартфонов iPhone, iPad и Android яхтсмены гонок могут управлять своим участием и эффективностью в регате откуда и когда угодно. Это приложение подключается к решению SAP Sailing Analytics и позволяет яхтсменам выполнять вход в регаты, использующие SAP Sail InSight, отслеживать свое местоположение вместе с индикаторами эффективности, такими как скорость или пройденное расстояние, а также анализировать эффективность.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailInSightReadMore" resname="sapSailInSightReadMore">
<source>Learn More</source>
<target>Узнать больше</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingBuoyPinger" resname="sapSailingBuoyPinger">
<source>SAP Sailing Buoy Pinger</source>
<target>SAP Sailing Buoy Pinger</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingBuoyPinger" resname="contentSapSailingBuoyPinger">
<source>With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta.</source>
<target>Мобильное приложение SAP Sailing Buoy Pinger для смартфонов Android позволяет руководителям парусных гонок упростить позиционирование отметок и общение с установщиками отметок откуда и когда угодно. Это приложение подключается к решению SAP Sailing Analytics и позволяет руководителям гонок отслеживать географическое местоположение гоночных отметок, обеспечивая использование мобильного приложения SAP Sail InSight для яхтсменов, участвующих в регате.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingBuoyPingerReadMore" resname="sapSailingBuoyPingerReadMore">
<source>Learn More</source>
<target>Узнать больше</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="postRaceAnalytics" resname="postRaceAnalytics">
<source>Post-Race Analytics</source>
<target>Аналитика после гонки</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentPostRaceAnalytics1" resname="contentPostRaceAnalytics1">
<source>Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.</source>
<target>Доступ к данным, собранным на парусных событиях, дает мореходам возможность оценить и проанализировать свои показатели, помогая разрабатывать стратегии и повышать мастерство.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentPostRaceAnalytics2" resname="contentPostRaceAnalytics2">
<source>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.</source>
<target>Решения SAP Business Analytics предоставляют мореходам, тренерам, болельщикам и СМИ инструменты для просмотра и анализа исторических данных по множеству регат и гонок. SAP HANA позволяет изучать паттерны эффективности, тенденции и профили мореходов простым, быстрым и эффективным образом для оптимизации своих показателей и разработки успешных стратегий на будущие регаты.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="i18nDeSolutionsTrainingHeadline" resname="i18nDeSolutionsTrainingHeadline">
<source>SAP Sail Better – STG Training Diary</source>
<target>SAP Sail Better – Дневник тренировок STG</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="i18nDeSolutionsTrainingText" resname="i18nDeSolutionsTrainingText">
<source>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.</source>
<target>Дневник тренировок STG поддерживает ежедневное документирования и анализ физического состояния атлета и его усилий в тренировках на воде, физической подготовке, работе с лодкой, моральной, теоретической подготовке, а также других видах деятельности, таких как образование и путешествия.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="strategySimulator" resname="strategySimulator">
<source>Strategy Simulator</source>
<target>Симулятор стратегии</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentStrategySimulator" resname="contentStrategySimulator">
<source>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.</source>
<target>Выбор правильной стратегии может обеспечить большое конкурентное преимущество во время гонки. Симулятор стратегии упрощает определение лучшей стратегии хождения под парусом для разных атмосферных условий и водных течений. Возможность мгновенного изменения ветра и течения в симуляции позволяет легко оценить надежность стратегии даже для неопределенных погодных условий.</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="strategySimulatorReadMore" resname="strategySimulatorReadMore">
<source>Learn More</source>
<target>Узнать больше</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="impressum" resname="impressum">
<source>Imprint</source>
<target>Печать</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="lastFix" resname="lastFix">
<source>Last fix</source>
<target>Последний замер</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="filterDeviceMappings" resname="filterDeviceMappings">
<source>Filter device mappings</source>
<target>Фильтровать сопоставления устройств</target>
</trans-unit>
</body>
</file>
</xliff>
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:24Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:17:24Z" original="/usr/sap/ljs/app/Converter_7623614428299933729/java/com.sap.sailing.gwt.ui/src/main/java/com/sap/sailing/gwt/ui/client/StringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="f6ec166735cc7adb2ddad356f75a3f11" form="base64">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 truncated
<internal-file crc="aa58aa0159559141c900793034ac8e1d" form="base64">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 truncated
</skl>
<phase-group>
<phase company-name="SAP AG" date="2016-07-28T14:32:35Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
<phase company-name="SAP AG" date="2016-09-26T08:30:46Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
</phase-group>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
</header>
@@ -937,8 +937,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settingsForComponent" resname="settingsForComponent">
<source>Settings for <ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph>设置</target>
<target state="signed-off"><ph id="1">{0}</ph>设置</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="noEventsFound" resname="noEventsFound">
<source>No events were found</source>
@@ -1002,13 +1001,11 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorPassedMarkAtDate" resname="competitorPassedMarkAtDate">
<source><ph id="1">{0}</ph> passed <ph id="2">{1}</ph> at <ph id="3">{2}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph>于<ph id="3">{2}</ph>越过<ph id="2">{1}</ph></target>
<target state="signed-off"><ph id="1">{0}</ph>于<ph id="3">{2}</ph>越过<ph id="2">{1}</ph></target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="valueForCompetitorAt" resname="valueForCompetitorAt">
<source><ph id="1">{0}</ph> at <ph id="2">{1}</ph>: <ph id="3">{2}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph>(于<ph id="2">{1}</ph>): <ph id="3">{2}</ph></target>
<target state="signed-off"><ph id="1">{0}</ph>(于<ph id="2">{1}</ph>): <ph id="3">{2}</ph></target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="reallyRemoveRace" resname="reallyRemoveRace">
<source>Do you really want to remove the race ''<ph id="1">{0}</ph>''? Note: all race logs for this race will also permanently be removed!</source>
@@ -1124,7 +1121,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="clickAndDragToZoomIn" resname="clickAndDragToZoomIn">
<source>Click and drag in the plot area to zoom in</source>
<target state="translated">单击并拖动绘图区以放大</target>
<target state="signed-off">单击并拖动绘图区以放大</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="windSpeed" resname="windSpeed">
<source>Wind speed (kts)</source>
@@ -1986,6 +1983,30 @@
<source>Title</source>
<target state="signed-off">标题</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="subtitle" resname="subtitle">
<source>Subtitle</source>
<target state="signed-off">副标题</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="copyright" resname="copyright">
<source>Copyright</source>
<target state="signed-off">版权</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="widthInPx" resname="widthInPx">
<source>Width (pixel)</source>
<target state="signed-off">宽度(像素)</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="heightInPx" resname="heightInPx">
<source>Height (pixel)</source>
<target state="signed-off">高度(像素)</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="tags" resname="tags">
<source>Tags</source>
<target state="signed-off">标记</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="size" resname="size">
<source>Size</source>
<target state="signed-off">大小</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="duration" resname="duration">
<source>Duration (h:mm:ss.ms)</source>
<target state="signed-off">持续时间 (h:mm:ss.ms)</target>
@@ -2140,8 +2161,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorRegattaDataAfterRaceN" resname="competitorRegattaDataAfterRaceN">
<source><ph id="1">{0}</ph> after race <ph id="2">{1}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph> 比赛轮次后 <ph id="2">{1}</ph></target>
<target state="signed-off"><ph id="1">{0}</ph> 比赛轮次后 <ph id="2">{1}</ph></target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="rankChart" resname="rankChart">
<source>Ranking</source>
@@ -3501,7 +3521,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="groupBy" resname="groupBy">
<source>Group by</source>
<target state="translated">分组方式</target>
<target state="signed-off">分组方式</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="statisticToCalculate" resname="statisticToCalculate">
<source>Calculate statistic</source>
@@ -3509,8 +3529,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="queryResultsChartSubtitle" resname="queryResultsChartSubtitle">
<source>Worked through <ph id="1">{0}</ph> data entries in <ph id="2">{1}</ph> seconds</source>
<target state="signed-off">
<ph id="2">{1}</ph>秒内处理<ph id="1">{0}</ph>个数据条目</target>
<target state="signed-off"><ph id="2">{1}</ph>秒内处理<ph id="1">{0}</ph>个数据条目</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="noQuerySelected" resname="noQuerySelected">
<source>No query selected</source>
@@ -3778,7 +3797,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="courseDesignerMode" resname="courseDesignerMode">
<source>Course designer</source>
<target state="signed-off">场地设计师</target>
<target state="signed-off">场地设计器</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="racingProcedure" resname="racingProcedure">
<source>Racing procedure</source>
@@ -4006,13 +4025,11 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="timeToStart" resname="timeToStart">
<source><ph id="1">{0}</ph> to start</source>
<target state="signed-off">
<ph id="1">{0}</ph> - 开始</target>
<target state="signed-off"><ph id="1">{0}</ph> - 开始</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="timeSinceStart" resname="timeSinceStart">
<source><ph id="1">{0}</ph> since start</source>
<target state="signed-off">
<ph id="1">{0}</ph> - 开始后</target>
<target state="signed-off"><ph id="1">{0}</ph> - 开始后</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="distanceToLine" resname="distanceToLine">
<source>Distance to start line</source>
@@ -4344,9 +4361,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventSharingShortText" resname="eventSharingShortText">
<source><ph id="1">{0}</ph> in <ph id="2">{1}</ph> on <ph id="3">{2}</ph></source>
<target state="signed-off">
<ph id="3">{2}</ph>
<ph id="2">{1}</ph>中的<ph id="1">{0}</ph></target>
<target state="signed-off"><ph id="3">{2}</ph><ph id="2">{1}</ph>中的<ph id="1">{0}</ph></target>
<note annotates="source" from="Developer">String eventSharingShortText(String eventName, String venue, String dateString);</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventSharingLongText" resname="eventSharingLongText">
@@ -4361,9 +4376,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="seriesSharingShortText" resname="seriesSharingShortText">
<source><ph id="1">{0}</ph></source>
<target state="signed-off">
<ph id="1">{0}</ph>
</target>
<target state="signed-off"><ph id="1">{0}</ph></target>
<note annotates="source" from="Developer">String seriesSharingShortText(String seriesName);</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorsAnalytics" resname="competitorsAnalytics">
@@ -4522,6 +4535,10 @@
<source>Use start time inference from start mark passings</source>
<target state="signed-off">使用从开始绕标推断的开始时间</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="controlTrackingFromStartAndFinishTimes" resname="controlTrackingFromStartAndFinishTimes">
<source>Control tracking from start and finish times</source>
<target>从开始和结束时间控制跟踪</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="numberOfQueueMessagesSent" resname="numberOfQueueMessagesSent">
<source>Number of queue messages sent</source>
<target state="signed-off">发送的队列消息的数量</target>
@@ -4616,8 +4633,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mediaSelectVideoCaption" resname="mediaSelectVideoCaption">
<source><ph id="1">{0}</ph> Videos</source>
<target state="signed-off">
<ph id="1">{0}</ph>个视频</target>
<target state="signed-off"><ph id="1">{0}</ph>个视频</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mediaSelectVideoTooltip" resname="mediaSelectVideoTooltip">
<source>Click to select video</source>
@@ -4785,7 +4801,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="noOverallEventSelected" resname="noOverallEventSelected">
<source>No overall event selected...</source>
<target state="translated">未选择整个活动...</target>
<target state="signed-off">未选择整个活动...</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorTryingToCreateNewEvent" resname="errorTryingToCreateNewEvent">
<source>Error trying to create new event <ph id="1">{0}</ph>: <ph id="2">{1}</ph></source>
@@ -5289,8 +5305,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="startingIn" resname="startingIn">
<source><ph id="1">{0}</ph> starts in</source>
<target state="signed-off">
<ph id="1">{0}</ph>开始于</target>
<target state="signed-off"><ph id="1">{0}</ph>开始于</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="raceIsPlanned" resname="raceIsPlanned">
<source>Planned</source>
@@ -5322,8 +5337,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorWonRace" resname="competitorWonRace">
<source><ph id="1">{0}</ph> won race</source>
<target state="signed-off">
<ph id="1">{0}</ph>赢得比赛轮次</target>
<target state="signed-off"><ph id="1">{0}</ph>赢得比赛轮次</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="showCompetitorTimeOnTimeFactorColumn" resname="showCompetitorTimeOnTimeFactorColumn">
<source>Time on Time Factor</source>
@@ -5467,7 +5481,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="millionValue" resname="millionValue">
<source>{0,number,#0.0} mil</source>
<target state="translated">{0,number,#0.0} 百万</target>
<target state="signed-off">{0,number,#0.0} 百万</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="billionValue" resname="billionValue">
<source>{0,number,#0.0} bil</source>
@@ -5495,13 +5509,11 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="minutesAgo" resname="minutesAgo">
<source><ph id="1">{0}</ph> min ago</source>
<target state="signed-off">
<ph id="1">{0}</ph>分钟前</target>
<target state="signed-off"><ph id="1">{0}</ph>分钟前</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="hoursAgo" resname="hoursAgo">
<source><ph id="1">{0}</ph> h ago</source>
<target state="signed-off">
<ph id="1">{0}</ph>小时前</target>
<target state="signed-off"><ph id="1">{0}</ph>小时前</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="winner" resname="winner">
<source>Winner</source>
@@ -5537,8 +5549,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="degreesToWind" resname="degreesToWind">
<source><ph id="1">{0}</ph>° to wind</source>
<target state="signed-off">
<ph id="1">{0}</ph>°(相对于风)</target>
<target state="signed-off"><ph id="1">{0}</ph>°(相对于风)</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="miniLeeaderboardLegendText" resname="miniLeeaderboardLegendText">
<source>Shows the points along with the number of races per competitor</source>
@@ -5626,8 +5637,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventsHaveTakenPlace" resname="eventsHaveTakenPlace">
<source><ph id="1">{0}</ph> events have taken place</source>
<target state="signed-off">
<ph id="1">{0}</ph>个活动已举行</target>
<target state="signed-off"><ph id="1">{0}</ph>个活动已举行</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventsHaveTakenPlace[one]" resname="eventsHaveTakenPlace[one]">
<source>One event has taken place</source>
@@ -5807,8 +5817,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="imageSizeError" resname="imageSizeError">
<source>The size of the <ph id="1">{0}</ph> image does not fit. The width should be between <ph id="2">{1}</ph> and <ph id="3">{2}</ph> px and the height between <ph id="4">{3}</ph> and <ph id="5">{4}</ph> px.</source>
<target state="signed-off">
<ph id="1">{0}</ph>的图像大小不合适。 宽度应在<ph id="2">{1}</ph>和<ph id="3">{2}</ph> px 之间,高度在<ph id="4">{3}</ph>和<ph id="5">{4}</ph> px 之间。</target>
<target state="signed-off"><ph id="1">{0}</ph>的图像大小不合适。 宽度应在<ph id="2">{1}</ph>和<ph id="3">{2}</ph> px 之间,高度在<ph id="4">{3}</ph>和<ph id="5">{4}</ph> px 之间。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="couldNotRetrieveImageSizeYet" resname="couldNotRetrieveImageSizeYet">
<source>The width and height of the image could not be retrieved yet.</source>
@@ -6030,25 +6039,25 @@
<source>utm_source=sapsailing&amp;utm_medium=solutions&amp;utm_content=2016.02&amp;utm_campaign=solutions&amp;pcampaignid=2016.sapsailing.solutions</source>
<target state="signed-off">utm_source=sapsailing&amp;utm_medium=solutions&amp;utm_content=2016.02&amp;utm_campaign=solutions&amp;pcampaignid=2016.sapsailing.solutions</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreTrackingApp" resname="playstoreTrackingApp">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreInsightApp" resname="playstoreInsightApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</source>
<target state="signed-off">https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</target>
<target>https://play.google.com/store/apps/details?id=com.sap.sailing.android.tracking.app</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreRacecommitteeApp" resname="playstoreRacecommitteeApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app</source>
<target state="signed-off">https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playStoreBuoypositioningApp" resname="playStoreBuoypositioningApp">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playStoreBuoyPingerApp" resname="playStoreBuoyPingerApp">
<source>https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</source>
<target state="signed-off">https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</target>
<target>https://play.google.com/store/apps/details?id=com.sap.sailing.android.buoy.positioning.app</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="playstoreBadge" resname="playstoreBadge">
<source>https://play.google.com/intl/en/badges/images/generic/en-play-badge.png</source>
<target state="signed-off">https://play.google.com/intl/en/badges/images/generic/en-play-badge.png</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreSapSailingInsight" resname="appstoreSapSailingInsight">
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreSapSailInsight" resname="appstoreSapSailInsight">
<source>http://appstore.com/sapsailinsight</source>
<target state="signed-off">http://appstore.com/sapsailinsight</target>
<target>http://appstore.com/sapsailinsight</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="appstoreStgTrainingstagebuch" resname="appstoreStgTrainingstagebuch">
<source>http://appstore.com/stgtrainingstagebuch</source>
@@ -6446,6 +6455,390 @@
<source>Maximum number of discards</source>
<target state="signed-off">最大放弃次数</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="notificationRegattaConfigurationUpdatedUsingByMarks" resname="notificationRegattaConfigurationUpdatedUsingByMarks">
<source>Active regatta configuration was set, using the "By Marks" course designer.</source>
<target state="signed-off">已使用“按标志”场地设计器设置有效的比赛配置。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="warningOverrideRegattaConfigurationCourseDesignerToByMarks" resname="warningOverrideRegattaConfigurationCourseDesignerToByMarks">
<source>Active regatta configuration already exists, but with the wrong course designer setting.\nWould you like to override course designer setting to "By Marks"?</source>
<target state="signed-off">有效的比赛配置已存在,但是场地设计器设置错误。\n是否将场地设计器设置覆盖为“按标志”?</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="allRacesHaveBeenDenoted" resname="allRacesHaveBeenDenoted">
<source>All races have been denoted for racelog tracking.</source>
<target state="signed-off">已为比赛轮次日志跟踪描述所有比赛轮次。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chartSelectionHint" resname="chartSelectionHint">
<source>Hint: You can also use the leaderboard (on the LEADERBOARD tab) to select the competitors displayed in the chart. </source>
<target>提示:您还可以使用积分榜(在 LEADERBOARD 选项卡中)选择在记录中显示的参赛队。 </target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chooseALanguage" resname="chooseALanguage">
<source>Choose a language</source>
<target>选择一种语言</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutions" resname="solutions">
<source>Solutions</source>
<target>解决方案</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="blog" resname="blog">
<source>Blog</source>
<target>博客</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="officalEventWebsite" resname="officalEventWebsite">
<source>Official event website</source>
<target>官方活动网站</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="moreInfo" resname="moreInfo">
<source>More info</source>
<target>更多信息</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="viewAnalysis" resname="viewAnalysis">
<source>View analysis </source>
<target>查看分析 </target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="overallLeaderboard" resname="overallLeaderboard">
<source>Overall leaderboard</source>
<target>总积分榜</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseTryAgain" resname="pleaseTryAgain">
<source>Please try again...</source>
<target>请重试...</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="reloadPage" resname="reloadPage">
<source>Reload page</source>
<target>重新加载页面</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="errorMessageLoadingData" resname="errorMessageLoadingData">
<source>An error occured while loading the data for this page.</source>
<target>加载此页面数据时出错。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="regattaDetails" resname="regattaDetails">
<source>Regatta details</source>
<target>比赛详情</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="chooseChartType" resname="chooseChartType">
<source>Choose chart type</source>
<target>选择记录类型</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="whatsNew" resname="whatsNew">
<source>What''s new</source>
<target>最新消息</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailing" resname="sapSailing">
<source>SAP Sailing</source>
<target>SAP Sailing</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="search" resname="search">
<source>Search</source>
<target>搜索</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownStartingInDays" resname="countdownStartingInDays">
<source>Days</source>
<target>天</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownDays" resname="countdownDays">
<source>Days</source>
<target>天</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownHours" resname="countdownHours">
<source>Hrs</source>
<target>小时</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownMinutes" resname="countdownMinutes">
<source>Min</source>
<target>分钟</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownSeconds" resname="countdownSeconds">
<source>Sec</source>
<target>秒</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownDay" resname="countdownDay">
<source>Day</source>
<target>天</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownHour" resname="countdownHour">
<source>Hour</source>
<target>小时</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownMinute" resname="countdownMinute">
<source>Min</source>
<target>分钟</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="countdownSecond" resname="countdownSecond">
<source>Sec</source>
<target>秒</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="liveCapitalLetter" resname="liveCapitalLetter">
<source>Live</source>
<target>实时</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="watchNow" resname="watchNow">
<source>Watch now</source>
<target>现在观看</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="seriesHeaderUpcoming" resname="seriesHeaderUpcoming">
<source>Upcoming</source>
<target>即将到来</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventRegattaLeaderboardLastScoreUpdate" resname="eventRegattaLeaderboardLastScoreUpdate">
<source>Last Score Update</source>
<target>上次得分更新</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="eventRegattaRaceNotTracked" resname="eventRegattaRaceNotTracked">
<source>Not Tracked</source>
<target>未跟踪</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerJobs" resname="footerJobs">
<source>Jobs</source>
<target>招贤纳士</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerCopyright" resname="footerCopyright">
<source>© 2011-2016 SAP Sailing Analytics</source>
<target>版权所有 © 2011-2016 SAP Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerLanguage" resname="footerLanguage">
<source>SAP Sailing in</source>
<target>SAP Sailing 语言</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerLegal" resname="footerLegal">
<source>Legal Disclosure</source>
<target>法律声明</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerPrivacy" resname="footerPrivacy">
<source>Privacy</source>
<target>隐私</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="footerFeedback" resname="footerFeedback">
<source>Feedback</source>
<target>反馈</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="headerLogo" resname="headerLogo">
<source>Sailing Analytics</source>
<target>Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="headerSearchPlaceholder" resname="headerSearchPlaceholder">
<source>Search </source>
<target>搜索 </target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainEventShowAll" resname="mainEventShowAll">
<source>Show All Events</source>
<target>显示所有活动</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainEventTitle" resname="mainEventTitle">
<source>Latest Events from the Sailing World</source>
<target>来自风帆世界的最新活动</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaSubtitle" resname="mainMediaSubtitle">
<source>Get lost in the latest and most beautiful impressions from your favorite sailing event.</source>
<target>徜徉在让人着迷、震撼人心的最新航行活动中。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaTitle" resname="mainMediaTitle">
<source>Photographers love Sailing</source>
<target>摄影师酷爱航行</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaVideosSubtitle" resname="mainMediaVideosSubtitle">
<source>Immerse yourself in the world of sailing and check out our latest events for more videos.</source>
<target>沉浸在风帆世界中,并通过更多视频了解最新活动。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="mainMediaVideosTitle" resname="mainMediaVideosTitle">
<source>Recent Video Entries</source>
<target>最近视频条目</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderButton" resname="searchResultHeaderButton">
<source>Search</source>
<target>搜索</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderLabel" resname="searchResultHeaderLabel">
<source>Your Search</source>
<target>您的搜索</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultHeaderPlaceholder" resname="searchResultHeaderPlaceholder">
<source>Type in your searchkey</source>
<target>输入搜索关键字</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="searchResultSortNewest" resname="searchResultSortNewest">
<source>Recent</source>
<target>最近</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSISHeadline" resname="solutionsSISHeadline">
<source>SAP in Sailing</source>
<target>SAP in Sailing</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSAPHeadline" resname="solutionsSAPHeadline">
<source>SAP Sailing Analytics</source>
<target>SAP Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsRaceHeadline" resname="solutionsRaceHeadline">
<source>SAP Sailing Race Manager</source>
<target>SAP Sailing Race Manager</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsInSightHeadline" resname="solutionsInSightHeadline">
<source>SAP Sail InSight</source>
<target>SAP Sail InSight</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsBuoyPingerHeadline" resname="solutionsBuoyPingerHeadline">
<source>SAP Sailing Buoy Pinger</source>
<target>SAP Sailing Buoy Pinger</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsPostHeadline" resname="solutionsPostHeadline">
<source>Post-Race Analytics</source>
<target>赛后分析</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsTrainingHeadline" resname="solutionsTrainingHeadline">
<source>Training Diary</source>
<target>训练日记</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="solutionsSimulatorHeadline" resname="solutionsSimulatorHeadline">
<source>Strategy Simulator</source>
<target>策略模拟器</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapInSailing" resname="sapInSailing">
<source>SAP in Sailing</source>
<target>SAP in Sailing</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing1" resname="contentSapInSailing1">
<source>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:</source>
<target>SAP 凭借此航行应用提供完美的平台,向用户展示解决方案,并以前所未有的顺畅速度呈现体育赛事。 SAP 通过提供各种工具转换其在参与此项运动中获得的航行经验,这些工具:</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing2" resname="contentSapInSailing2">
<source>Help sailors analyze performance and optimize strategy</source>
<target>帮助水手分析表现并优化策略</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing3" resname="contentSapInSailing3">
<source>Bring fans closer to the action</source>
<target>让粉丝近距离直击运动</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing4" resname="contentSapInSailing4">
<source>Provide the media with information and insights to deliver a greater informed commentary</source>
<target>为媒体提供信息和见解,从而提供深度评论</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing5" resname="contentSapInSailing5">
<source>SAP has a longstanding involvement with sailing and has established a portfolio spanning across teams and regattas, including:</source>
<target>SAP 长期参与航行运动,并成立了跨越团队和比赛的组合,包括:</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing6" resname="contentSapInSailing6">
<source>Official Technology Partner of Travemünder Woche</source>
<target>特拉沃明德周的官方技术合作伙伴</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing7" resname="contentSapInSailing7">
<source>Technical Partner of the European Sailing Leagues</source>
<target>欧洲帆船联盟的技术合作伙伴</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing8" resname="contentSapInSailing8">
<source>Title sponsor of the SAP Extreme Sailing Team</source>
<target>SAP 极限帆船队的冠名赞助商</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing9" resname="contentSapInSailing9">
<source>Official Technical Partner of the Extreme Sailing Series</source>
<target>极限帆船系列赛的官方技术合作伙伴</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing10" resname="contentSapInSailing10">
<source>Premium Partner of Germany’s national sailing team, Audi Sailing Team Germany</source>
<target>德国国家帆船队 - 德国奥迪帆船队的优选合作伙伴</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing11" resname="contentSapInSailing11">
<source>Premium Partner of the world’s largest regatta, Kieler Woche (Kiel Week)</source>
<target>世界上最大的帆船盛事“基尔周”的优选合作伙伴</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapInSailing12" resname="contentSapInSailing12">
<source>Title sponsor of the SAP 5O5 World Championships</source>
<target>SAP 5O5 世界锦标赛的冠名赞助商</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingAnalyticsTitle" resname="sapSailingAnalyticsTitle">
<source>SAP Sailing Analytics</source>
<target>SAP Sailing Analytics</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingAnalytics1" resname="contentSapSailingAnalytics1">
<source>By delivering real time analytics around race rankings, speeds, maneuvers, bearings etc., SAP is helping to simplify and demystify the complex sport of sailing.</source>
<target>通过实时分析比赛轮次排名、速度、操作和航向角等,SAP 可简化此复杂的航行运动,使其浅显易懂。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingAnalytics2" resname="contentSapSailingAnalytics2">
<source>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.</source>
<target>SAP Sailing Analytics 利用云和内存技术实时处理 GPS 和风力测量数据,并在可从任何地方访问的前端显示,让用户全面、透彻地了解航行运动。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingAnalyticsReadMore" resname="sapSailingAnalyticsReadMore">
<source>Read More</source>
<target>更多信息</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingRaceManager" resname="sapSailingRaceManager">
<source>SAP Sailing Race Manager</source>
<target>SAP Sailing Race Manager</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingRaceManager" resname="contentSapSailingRaceManager">
<source>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.</source>
<target>SAP Sailing Race Manager 通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingRaceManagerReadMore" resname="sapSailingRaceManagerReadMore">
<source>Learn More</source>
<target>了解更多</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailInSight" resname="sapSailInSight">
<source>SAP Sail InSight</source>
<target>SAP Sail InSight</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailInSight" resname="contentSapSailInSight">
<source>With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance.</source>
<target>使用适用于 iPhone、iPad 和 Android 手机的 SAP Sail InSight 移动应用,帆船选手可以随时随地管理其参赛情况和表现。此应用与 SAP Sailing Analytics 解决方案相连,选手可以登录启用 SAP Sail InSight 的比赛,跟踪其所处地点和速度或航行距离等表现指标,并分析其表现。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailInSightReadMore" resname="sapSailInSightReadMore">
<source>Learn More</source>
<target>了解更多</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingBuoyPinger" resname="sapSailingBuoyPinger">
<source>SAP Sailing Buoy Pinger</source>
<target>SAP Sailing Buoy Pinger</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentSapSailingBuoyPinger" resname="contentSapSailingBuoyPinger">
<source>With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta.</source>
<target>使用适用于 Android 手机的 SAP Sailing Buoy Pinger 移动应用,帆船赛赛事经理可以随时随地简化比赛航标的定位和与布标裁判的沟通。此应用与 SAP Sailing Analytics 解决方案相连,比赛经理可以跟踪其比赛航标的地理位置,并允许参赛水手使用 SAP Sail InSight 移动应用。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="sapSailingBuoyPingerReadMore" resname="sapSailingBuoyPingerReadMore">
<source>Learn More</source>
<target>了解更多</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="postRaceAnalytics" resname="postRaceAnalytics">
<source>Post-Race Analytics</source>
<target>赛后分析</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentPostRaceAnalytics1" resname="contentPostRaceAnalytics1">
<source>Access to data collected at sailing events gives sailors the opportunity to assess and analyse their performances to help develop strategies and sail better.</source>
<target>水手通过访问航行活动期间收集的数据评估和分析其表现,帮助他们制定策略和优化航行方案。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentPostRaceAnalytics2" resname="contentPostRaceAnalytics2">
<source>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.</source>
<target>SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="i18nDeSolutionsTrainingHeadline" resname="i18nDeSolutionsTrainingHeadline">
<source>SAP Sail Better – STG Training Diary</source>
<target>SAP Sail Better – STG Training Diary</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="i18nDeSolutionsTrainingText" resname="i18nDeSolutionsTrainingText">
<source>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.</source>
<target>STG Training Diary 可每天记录和分析运动员的身体状况,在水上训练、体能训练、船艇工作、心理、理论以及教育或旅行等其他活动领域的训练力度。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="strategySimulator" resname="strategySimulator">
<source>Strategy Simulator</source>
<target>策略模拟器</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="contentStrategySimulator" resname="contentStrategySimulator">
<source>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.</source>
<target>选择正确的策略可在比赛期间极大地提高竞争优势。策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="strategySimulatorReadMore" resname="strategySimulatorReadMore">
<source>Learn More</source>
<target>了解更多</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="impressum" resname="impressum">
<source>Imprint</source>
<target>版本说明</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="lastFix" resname="lastFix">
<source>Last fix</source>
<target>上次修复</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="filterDeviceMappings" resname="filterDeviceMappings">
<source>Filter device mappings</source>
<target>筛选设备映射</target>
</trans-unit>
</body>
</file>
</xliff>
+2 -1
View File
@@ -54,7 +54,8 @@ SAP is at the center of today’s technology revolution, developing innovations
* [[Administrator|wiki/info/mobile/racecommittee-app-administrator]]
* [[User|wiki/info/mobile/racecommittee-app-user]]
* [[Android and Release Build|wiki/info/mobile/android-and-release-build]]
* [[Data consumption of mobile apps|wiki/info/mobile/data-consumption-of-mobile-apps]]
* [[Energy consumption of mobile apps|wiki/info/mobile/energy-consumption]]
* [[Data consumption of mobile apps|wiki/info/mobile/data-consumption]]
* [[Mobile Sailing Analytics|wiki/info/mobile/mobilesailinganalytics]]
* [[Push Notifications|wiki/info/mobile/push-notifications]]
@@ -1,12 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties" source-language="en">
<file datatype="javapropertyresourcebundle" original="/usr/sap/ljs/app/Converter_6482944262098570487/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties" source-language="en">
<header>
<skl>
<internal-file crc="2476e2fa472ba5cb7a43d465af58c5c7" form="base64">H4sIAAAAAAAAAIVVTW8aMRC9+1fMpVJyiATptypXAiIIFfkQoEY9mt0BLBYb2SaU/vrO2Muuk0b04p1582zPjO23sx1iKWc8ijjO0cywsKb0fVxahykG3Y6HRQTEjfZBmQLnTj1jRbNPAJwQca+2KHkQE1zNjzuU9AU2xEzpanwj+QP3++0CnfiFykkemJ2wyK/D9ypoa1Slw1FmtugVzprjVtZfMcWVCkHJ+isGdu889hwqmUxgW/StCoNKeS/ZgmiKYYUYZBzFVBUoeaAVtjsMOlgnWzMuEOeKOaqt5IESVyW6hVWu5Mq0Wd3YrdJmisFpfEY3WJMnM5qP+5wjc9xzS86vuPJi9Dgb6t/naMS4Igqtd6fc5pFKJua5CUyDmpdSnaLfV+F/CUOipSkPy7Zt/60U7BJaus9bOnJ2v8ubBxHJKXmUe8aNyWt9URAT8tzibaPti/aQRztP/Tr1TTxpU86CQ7MK67Hpo9rTUwiSYTjhoA2cIqK/DB05UNWWra6c6NU6gNKO3evaXTjEP8jIezlCEyrMoA/yzlJBKuTgRzl06NcZ8knS9tasMuizvKXl4UC5sftFjlQVA19P3FUNdDuEWJdy7Mqf2laUBvgGu5a3e+d0oQzS86ro8T3jrCARGJv0SmoMPIPcAMd34KJDWuHDN+jCgY4yXKb+sZC8bp6P6sKdW4ZGWXphFhQxGmEJlpIiBFRIRtKqpzWJFbt8wEmnDgQlCp/zm4qW1n4ta/W6U2U2vTDUlDXfGMk+7xoRYEgkWXpY3lFX9nSHvUwI36AGa1hzVWxyRvSb6A9Njcqi0W+ij0hSF44D7YrqBa0OQB2JWY/oJfkHN7HeEzfmHSGwDhLYKrflHiS10uWb7W4IwAy4eMfbTuI9v2zzs6Xeb4faaL/Os4swJDwrhw48L4LdfzPvYzggmuYEeqasN3irJLjo1scCV9/rHS/F2NOfqNjQr2nsoTabLNpnHwUxS6iNQNLK9qTd5jU57plofwGIogiCRAcAAA==</internal-file>
</skl>
<phase-group>
<phase company-name="SAP AG" date="2016-05-11T12:28:06Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
<phase company-name="SAP AG" date="2016-09-23T09:24:36Z" phase-name="file-creation" process-name="file-creation" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter"/>
</phase-group>
<tool tool-company="SAP AG" tool-id="urn:x-sap:sls-mlt:java:properties-flexible-converter" tool-name="TEW: Javascript .properties Flexible File Converter" tool-version="1.1.0"/>
</header>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T10:45:09Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties" source-language="en" target-language="ja">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:25Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="2476e2fa472ba5cb7a43d465af58c5c7" form="base64">H4sIAAAAAAAAAIVVTW8aMRC9+1fMpVJyiATptypXAiIIFfkQoEY9mt0BLBYb2SaU/vrO2Muuk0b04p1582zPjO23sx1iKWc8ijjO0cywsKb0fVxahykG3Y6HRQTEjfZBmQLnTj1jRbNPAJwQca+2KHkQE1zNjzuU9AU2xEzpanwj+QP3++0CnfiFykkemJ2wyK/D9ypoa1Slw1FmtugVzprjVtZfMcWVCkHJ+isGdu889hwqmUxgW/StCoNKeS/ZgmiKYYUYZBzFVBUoeaAVtjsMOlgnWzMuEOeKOaqt5IESVyW6hVWu5Mq0Wd3YrdJmisFpfEY3WJMnM5qP+5wjc9xzS86vuPJi9Dgb6t/naMS4Igqtd6fc5pFKJua5CUyDmpdSnaLfV+F/CUOipSkPy7Zt/60U7BJaus9bOnJ2v8ubBxHJKXmUe8aNyWt9URAT8tzibaPti/aQRztP/Tr1TTxpU86CQ7MK67Hpo9rTUwiSYTjhoA2cIqK/DB05UNWWra6c6NU6gNKO3evaXTjEP8jIezlCEyrMoA/yzlJBKuTgRzl06NcZ8knS9tasMuizvKXl4UC5sftFjlQVA19P3FUNdDuEWJdy7Mqf2laUBvgGu5a3e+d0oQzS86ro8T3jrCARGJv0SmoMPIPcAMd34KJDWuHDN+jCgY4yXKb+sZC8bp6P6sKdW4ZGWXphFhQxGmEJlpIiBFRIRtKqpzWJFbt8wEmnDgQlCp/zm4qW1n4ta/W6U2U2vTDUlDXfGMk+7xoRYEgkWXpY3lFX9nSHvUwI36AGa1hzVWxyRvSb6A9Njcqi0W+ij0hSF44D7YrqBa0OQB2JWY/oJfkHN7HeEzfmHSGwDhLYKrflHiS10uWb7W4IwAy4eMfbTuI9v2zzs6Xeb4faaL/Os4swJDwrhw48L4LdfzPvYzggmuYEeqasN3irJLjo1scCV9/rHS/F2NOfqNjQr2nsoTabLNpnHwUxS6iNQNLK9qTd5jU57plofwGIogiCRAcAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:06:51Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:25Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="2476e2fa472ba5cb7a43d465af58c5c7" form="base64">H4sIAAAAAAAAAIVVTW8aMRC9+1fMpVJyiATptypXAiIIFfkQoEY9mt0BLBYb2SaU/vrO2Muuk0b04p1582zPjO23sx1iKWc8ijjO0cywsKb0fVxahykG3Y6HRQTEjfZBmQLnTj1jRbNPAJwQca+2KHkQE1zNjzuU9AU2xEzpanwj+QP3++0CnfiFykkemJ2wyK/D9ypoa1Slw1FmtugVzprjVtZfMcWVCkHJ+isGdu889hwqmUxgW/StCoNKeS/ZgmiKYYUYZBzFVBUoeaAVtjsMOlgnWzMuEOeKOaqt5IESVyW6hVWu5Mq0Wd3YrdJmisFpfEY3WJMnM5qP+5wjc9xzS86vuPJi9Dgb6t/naMS4Igqtd6fc5pFKJua5CUyDmpdSnaLfV+F/CUOipSkPy7Zt/60U7BJaus9bOnJ2v8ubBxHJKXmUe8aNyWt9URAT8tzibaPti/aQRztP/Tr1TTxpU86CQ7MK67Hpo9rTUwiSYTjhoA2cIqK/DB05UNWWra6c6NU6gNKO3evaXTjEP8jIezlCEyrMoA/yzlJBKuTgRzl06NcZ8knS9tasMuizvKXl4UC5sftFjlQVA19P3FUNdDuEWJdy7Mqf2laUBvgGu5a3e+d0oQzS86ro8T3jrCARGJv0SmoMPIPcAMd34KJDWuHDN+jCgY4yXKb+sZC8bp6P6sKdW4ZGWXphFhQxGmEJlpIiBFRIRtKqpzWJFbt8wEmnDgQlCp/zm4qW1n4ta/W6U2U2vTDUlDXfGMk+7xoRYEgkWXpY3lFX9nSHvUwI36AGa1hzVWxyRvSb6A9Njcqi0W+ij0hSF44D7YrqBa0OQB2JWY/oJfkHN7HeEzfmHSGwDhLYKrflHiS10uWb7W4IwAy4eMfbTuI9v2zzs6Xeb4faaL/Os4swJDwrhw48L4LdfzPvYzggmuYEeqasN3irJLjo1scCV9/rHS/F2NOfqNjQr2nsoTabLNpnHwUxS6iNQNLK9qTd5jU57plofwGIogiCRAcAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:06:52Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:25Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.datamining/resources/stringmessages/Sailing_StringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="2476e2fa472ba5cb7a43d465af58c5c7" form="base64">H4sIAAAAAAAAAIVVTW8aMRC9+1fMpVJyiATptypXAiIIFfkQoEY9mt0BLBYb2SaU/vrO2Muuk0b04p1582zPjO23sx1iKWc8ijjO0cywsKb0fVxahykG3Y6HRQTEjfZBmQLnTj1jRbNPAJwQca+2KHkQE1zNjzuU9AU2xEzpanwj+QP3++0CnfiFykkemJ2wyK/D9ypoa1Slw1FmtugVzprjVtZfMcWVCkHJ+isGdu889hwqmUxgW/StCoNKeS/ZgmiKYYUYZBzFVBUoeaAVtjsMOlgnWzMuEOeKOaqt5IESVyW6hVWu5Mq0Wd3YrdJmisFpfEY3WJMnM5qP+5wjc9xzS86vuPJi9Dgb6t/naMS4Igqtd6fc5pFKJua5CUyDmpdSnaLfV+F/CUOipSkPy7Zt/60U7BJaus9bOnJ2v8ubBxHJKXmUe8aNyWt9URAT8tzibaPti/aQRztP/Tr1TTxpU86CQ7MK67Hpo9rTUwiSYTjhoA2cIqK/DB05UNWWra6c6NU6gNKO3evaXTjEP8jIezlCEyrMoA/yzlJBKuTgRzl06NcZ8knS9tasMuizvKXl4UC5sftFjlQVA19P3FUNdDuEWJdy7Mqf2laUBvgGu5a3e+d0oQzS86ro8T3jrCARGJv0SmoMPIPcAMd34KJDWuHDN+jCgY4yXKb+sZC8bp6P6sKdW4ZGWXphFhQxGmEJlpIiBFRIRtKqpzWJFbt8wEmnDgQlCp/zm4qW1n4ta/W6U2U2vTDUlDXfGMk+7xoRYEgkWXpY3lFX9nSHvUwI36AGa1hzVWxyRvSb6A9Njcqi0W+ij0hSF44D7YrqBa0OQB2JWY/oJfkHN7HeEzfmHSGwDhLYKrflHiS10uWb7W4IwAy4eMfbTuI9v2zzs6Xeb4faaL/Os4swJDwrhw48L4LdfzPvYzggmuYEeqasN3irJLjo1scCV9/rHS/F2NOfqNjQr2nsoTabLNpnHwUxS6iNQNLK9qTd5jU57plofwGIogiCRAcAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T10:46:08Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages.properties" source-language="en" target-language="ja">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:18:02Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="cdbdcb19e10086d34f715e2a7da26eef" form="base64">H4sIAAAAAAAAAF2RTU/DMAyG7/0VvnGZEGekHgYSUiVgY+3gnLXeajWNo9jbqBD/naQtbOLm+PXH+zgaTN2ROxTuRGqU2D1xyKs5C5c07DlkUhv3tnnkBlfhnYR0G2zFGzyQKIal5C+mQ5BjQBj4CK05IWiL8HX3DUvvgZyosRabW6hadJDmjQV7tpbPaeM0HjhAbanuRtWS6+AoSY5jA0hvgvqWXZzOEOb1YCQ7o625x4rzjymKBRmtyq1gkLzU2AfxmcxkxjWBqbmWllNqkm2c6SL7Ce0wwlYtyXO0khf7Ec9EzICmSb40atAbssATUYMnqhHOpO34TvjGpvLhcoYFCPXeDjPrDuMREpIkN/fZ7shDha7BkKcQdIwz432pHLCYxlT4qclSw+5GLzdPCwfUBXiLRvB36X1qL1jyuftyDu9n/D/p+hzJwDqSxm/2/tX0mJfLNZSROOE/JHuTnEnMFa6kQ6v/S2HOZz95rIJYdwIAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:55Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:18:02Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="cdbdcb19e10086d34f715e2a7da26eef" form="base64">H4sIAAAAAAAAAF2RTU/DMAyG7/0VvnGZEGekHgYSUiVgY+3gnLXeajWNo9jbqBD/naQtbOLm+PXH+zgaTN2ROxTuRGqU2D1xyKs5C5c07DlkUhv3tnnkBlfhnYR0G2zFGzyQKIal5C+mQ5BjQBj4CK05IWiL8HX3DUvvgZyosRabW6hadJDmjQV7tpbPaeM0HjhAbanuRtWS6+AoSY5jA0hvgvqWXZzOEOb1YCQ7o625x4rzjymKBRmtyq1gkLzU2AfxmcxkxjWBqbmWllNqkm2c6SL7Ce0wwlYtyXO0khf7Ec9EzICmSb40atAbssATUYMnqhHOpO34TvjGpvLhcoYFCPXeDjPrDuMREpIkN/fZ7shDha7BkKcQdIwz432pHLCYxlT4qclSw+5GLzdPCwfUBXiLRvB36X1qL1jyuftyDu9n/D/p+hzJwDqSxm/2/tX0mJfLNZSROOE/JHuTnEnMFa6kQ6v/S2HOZz95rIJYdwIAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:55Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:18:02Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.domain.racelogtrackingadapter/resources/stringmessages/TrackingStringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="cdbdcb19e10086d34f715e2a7da26eef" form="base64">H4sIAAAAAAAAAF2RTU/DMAyG7/0VvnGZEGekHgYSUiVgY+3gnLXeajWNo9jbqBD/naQtbOLm+PXH+zgaTN2ROxTuRGqU2D1xyKs5C5c07DlkUhv3tnnkBlfhnYR0G2zFGzyQKIal5C+mQ5BjQBj4CK05IWiL8HX3DUvvgZyosRabW6hadJDmjQV7tpbPaeM0HjhAbanuRtWS6+AoSY5jA0hvgvqWXZzOEOb1YCQ7o625x4rzjymKBRmtyq1gkLzU2AfxmcxkxjWBqbmWllNqkm2c6SL7Ce0wwlYtyXO0khf7Ec9EzICmSb40atAbssATUYMnqhHOpO34TvjGpvLhcoYFCPXeDjPrDuMREpIkN/fZ7shDha7BkKcQdIwz432pHLCYxlT4qclSw+5GLzdPCwfUBXiLRvB36X1qL1jyuftyDu9n/D/p+hzJwDqSxm/2/tX0mJfLNZSROOE/JHuTnEnMFa6kQ6v/S2HOZz95rIJYdwIAAA==</internal-file>
@@ -48,7 +48,6 @@ public class EndOfTrackingController extends AbstractRaceChangeListener {
if (!Util.equalsWithNull(trackedRace.getEndOfTracking(), newEndOfTracking)) {
raceLog.add(new RaceLogEndOfTrackingEventImpl(newEndOfTracking,
raceLogEventAuthor, raceLog.getCurrentPassId()));
trackedRace.updateStartAndEndOfTracking(/* waitForGPSFixesToLoad */ false);
}
}
}
@@ -46,7 +46,6 @@ public class StartOfTrackingController implements StartTimeChangedListener {
if (!Util.equalsWithNull(trackedRace.getStartOfTracking(), newStartOfTracking)) {
raceLog.add(new RaceLogStartOfTrackingEventImpl(newStartOfTracking,
raceLogEventAuthor, raceLog.getCurrentPassId()));
trackedRace.updateStartAndEndOfTracking(/* waitForGPSFixesToLoad */ false);
}
}
}
@@ -197,8 +197,8 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
try {
@SuppressWarnings({ "unchecked" })
DeviceMapping<Competitor> competitorMapping = (DeviceMapping<Competitor>) mapping;
gpsFixStore.loadCompetitorTrack(track, competitorMapping, getStartOfTracking(),
getEndOfTracking());
gpsFixStore.loadCompetitorTrack(track, competitorMapping, timeRangeToLoad.from(),
timeRangeToLoad.to());
} catch (TransformationException | NoCorrespondingServiceRegisteredException e) {
logger.log(Level.WARNING, "Could not load competitor track " + mapping.getMappedTo());
}
@@ -211,12 +211,10 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
try {
@SuppressWarnings("unchecked")
DeviceMapping<Mark> markMapping = (DeviceMapping<Mark>) mapping;
TimePoint from = getStartOfTracking();
TimePoint to = getEndOfTracking();
gpsFixStore.loadMarkTrack(track, markMapping, from, to);
gpsFixStore.loadMarkTrack(track, markMapping, timeRangeToLoad.from(), timeRangeToLoad.to());
if (track.getFirstRawFix() == null) {
logger.fine("Loading mark positions from outside of start/end of tracking interval (" + from
+ ".." + to + ") because no fixes were found in that interval");
logger.fine("Loading mark positions from outside of start/end of tracking interval (" + timeRangeToLoad.from()
+ ".." + timeRangeToLoad.to() + ") because no fixes were found in that interval");
// got an empty track for the mark; try again without constraining the mapping interval
// by start/end of tracking to at least attempt to get fixes at all in case there were any
// within the device mapping interval specified
@@ -298,8 +296,8 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
ThreadPoolUtil.INSTANCE.getDefaultForegroundTaskThreadPoolExecutor().execute(new Runnable() {
@Override
public void run() {
trackedRace.lockForSerializationRead();
try {
trackedRace.lockForSerializationRead();
if (!preemptiveStopRequested.get()) {
setStatusAndProgress(TrackedRaceStatusEnum.LOADING, 0.5);
synchronized (FixLoaderAndTracker.this) {
@@ -308,15 +306,18 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
updateCallback.run();
}
} finally {
synchronized (FixLoaderAndTracker.this) {
int currentActiveLoaders = activeLoaders.decrementAndGet();
FixLoaderAndTracker.this.notifyAll();
if (currentActiveLoaders == 0) {
setStatusAndProgress(stopRequested.get() ? TrackedRaceStatusEnum.FINISHED
: TrackedRaceStatusEnum.TRACKING, 1.0);
try {
synchronized (FixLoaderAndTracker.this) {
int currentActiveLoaders = activeLoaders.decrementAndGet();
FixLoaderAndTracker.this.notifyAll();
if (currentActiveLoaders == 0) {
setStatusAndProgress(stopRequested.get() ? TrackedRaceStatusEnum.FINISHED
: TrackedRaceStatusEnum.TRACKING, 1.0);
}
}
} finally {
trackedRace.unlockAfterSerializationRead();
}
trackedRace.unlockAfterSerializationRead();
}
}
});
@@ -347,7 +348,7 @@ public class FixLoaderAndTracker implements TrackingDataLoader {
@Override
protected void mappingRemoved(DeviceMappingWithRegattaLogEvent<WithID> mapping) {
final DeviceIdentifier device = mapping.getDevice();
if(!hasMappingForDevice(device)) {
if (!hasMappingForDevice(device)) {
sensorFixStore.removeListener(listener, device);
}
// TODO if tracks are always associated to only one device mapping, we could remove tracks here
@@ -262,6 +262,10 @@ public abstract class RegattaLogDeviceMappings<ItemT extends WithID> {
calculateDiff(oldMappings, newMappings);
}
/**
* Calculates <em>and applies</em> the mapping changes by removing listeners no longer needed for the mappings removed,
* and by loading and adding the fixes for extended or added mappings.
*/
private void calculateDiff(Map<ItemT, List<DeviceMappingWithRegattaLogEvent<ItemT>>> previousMappings,
Map<ItemT, List<DeviceMappingWithRegattaLogEvent<ItemT>>> newMappings) {
Set<ItemT> itemsToProcess = new HashSet<ItemT>(previousMappings.keySet());
@@ -65,7 +65,7 @@ public abstract class BaseRegattaLogDeviceMappingFinder<ItemT extends WithID>
if (!endOfFirstHalf.before(from)) {
log.add(createDeviceMappingEvent(item, event.getAuthor(), from, endOfFirstHalf, event.getDevice()));
}
if (!to.before(startOfSecondHalf)) {
if (to == null || !to.before(startOfSecondHalf)) {
log.add(createDeviceMappingEvent(item, event.getAuthor(), startOfSecondHalf, to,
event.getDevice()));
}
@@ -46,7 +46,7 @@ public class WaypointImpl implements Waypoint {
@Override
public String toString() {
return getName();
return (getName()==null?"":getName()) + " ("+getPassingInstructions()+")";
}
@Override
@@ -10,7 +10,6 @@ import java.net.URI;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.logging.Logger;
import org.junit.Before;
@@ -30,6 +29,7 @@ import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tractracadapter.ReceiverType;
import com.sap.sailing.domain.tractracadapter.TracTracConnectionConstants;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.util.ThreadPoolUtil;
import com.tractrac.model.lib.api.event.CreateModelException;
import com.tractrac.subscription.lib.api.SubscriberInitializationException;
@@ -77,7 +77,7 @@ public class ConcurrencyTest extends OnlineTracTracBasedTest {
logger.info("1 thread: "+duration+"ns");
logger.info("number of approximation points: "+approximation1.size());
dp = new DouglasPeucker<Competitor, GPSFixMoving>(teamAquaTrack, Executors.newFixedThreadPool(numberOfCPUs));
dp = new DouglasPeucker<Competitor, GPSFixMoving>(teamAquaTrack, ThreadPoolUtil.INSTANCE.getDefaultBackgroundTaskThreadPoolExecutor());
start = System.nanoTime();
List<GPSFixMoving> approximation2 = dp.approximate(new MeterDistance(3), firstMarkPassing.getTimePoint(), lastMarkPassing.getTimePoint());
duration = System.nanoTime()-start;
@@ -11,6 +11,7 @@ import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Matchers;
import com.sap.sailing.domain.abstractlog.race.analyzing.impl.RaceLogResolver;
import com.sap.sailing.domain.base.Competitor;
@@ -27,6 +28,7 @@ import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl;
import com.sap.sailing.domain.ranking.OneDesignRankingMetric;
import com.sap.sailing.domain.tracking.DynamicGPSFixTrack;
import com.sap.sailing.domain.tracking.LineDetails;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.impl.DynamicGPSFixTrackImpl;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
import com.sap.sailing.domain.tracking.impl.TrackedLegImpl;
@@ -137,7 +139,6 @@ public class StarbordSideOfStartLineRecognitionTest {
Position startStarboardPosition = new DegreePosition(0, 1);
Position windwardPosition = new DegreePosition(10, 0.5);
MockedTrackedRaceImpl trackedRace = createTrackedRaceWithMarkPositions(startPortPosition, startStarboardPosition, windwardPosition);
Position p = trackedRace.getOrCreateTrack(trackedRace.getStartLine(now).getStarboardMarkWhileApproachingLine()).
getEstimatedPosition(now, /* extrapolate */ false);
assertEquals(startStarboardPosition, p);
@@ -184,6 +185,8 @@ public class StarbordSideOfStartLineRecognitionTest {
when(trackedRace.getTrackedLeg(course.getFirstLeg())).thenReturn(trackedLeg);
when(trackedRace.getApproximatePosition(startWaypoint, now)).thenCallRealMethod();
when(trackedRace.getApproximatePosition(windwardWaypoint, now)).thenCallRealMethod();
when(trackedRace.getApproximatePosition(Matchers.eq(startWaypoint), Matchers.eq(now), Matchers.any(MarkPositionAtTimePointCache.class))).thenCallRealMethod();
when(trackedRace.getApproximatePosition(Matchers.eq(windwardWaypoint), Matchers.eq(now), Matchers.any(MarkPositionAtTimePointCache.class))).thenCallRealMethod();
return trackedRace;
}
@@ -37,8 +37,10 @@ import com.sap.sailing.domain.common.impl.KnotSpeedWithBearingImpl;
import com.sap.sailing.domain.common.impl.WindImpl;
import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException;
import com.sap.sailing.domain.polars.PolarDataService;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.TrackedLeg;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
import com.sap.sailing.domain.tracking.impl.MarkPositionAtTimePointCacheImpl;
import com.sap.sailing.domain.tracking.impl.TrackedLegImpl;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
@@ -87,9 +89,8 @@ public class TargetTimeEstimationTest {
TrackedLeg trackedLeg = new TrackedLegImpl(trackedRace, leg, competitors);
//Actual test of functionality
Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint);
Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint, new MarkPositionAtTimePointCacheImpl(trackedRace, timepoint));
assertEquals(75494, duration.asMillis(), 100);
}
@Test
@@ -123,9 +124,10 @@ public class TargetTimeEstimationTest {
when(leg.getFrom()).thenReturn(from);
when(leg.getTo()).thenReturn(to);
when(trackedRace.getApproximatePosition(from, timepoint)).thenReturn(startOfLeg);
when(trackedRace.getApproximatePosition(to, timepoint)).thenReturn(endOfLeg);
when(trackedRace.getApproximatePosition(eq(from), eq(timepoint))).thenReturn(startOfLeg);
when(trackedRace.getApproximatePosition(eq(to), eq(timepoint))).thenReturn(endOfLeg);
when(trackedRace.getApproximatePosition(eq(from), eq(timepoint), any(MarkPositionAtTimePointCache.class))).thenReturn(startOfLeg);
when(trackedRace.getApproximatePosition(eq(to), eq(timepoint), any(MarkPositionAtTimePointCache.class))).thenReturn(endOfLeg);
SpeedWithBearing speedWithBearingPort = new KnotSpeedWithBearingImpl(6, new DegreeBearingImpl(-45));
SpeedWithBearingWithConfidence<Void> boatSpeedWithBearingWithConfidencePort = new SpeedWithBearingWithConfidenceImpl<Void>(speedWithBearingPort, 1, null);
@@ -139,9 +141,8 @@ public class TargetTimeEstimationTest {
TrackedLeg trackedLeg = new TrackedLegImpl(trackedRace, leg, competitors);
//Actual test of functionality
Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint);
Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint, new MarkPositionAtTimePointCacheImpl(trackedRace, timepoint));
assertEquals(213513, duration.asMillis(), 100);
}
@Test
@@ -175,9 +176,10 @@ public class TargetTimeEstimationTest {
when(leg.getFrom()).thenReturn(from);
when(leg.getTo()).thenReturn(to);
when(trackedRace.getApproximatePosition(from, timepoint)).thenReturn(startOfLeg);
when(trackedRace.getApproximatePosition(to, timepoint)).thenReturn(endOfLeg);
when(trackedRace.getApproximatePosition(eq(from), eq(timepoint))).thenReturn(startOfLeg);
when(trackedRace.getApproximatePosition(eq(to), eq(timepoint))).thenReturn(endOfLeg);
when(trackedRace.getApproximatePosition(eq(from), eq(timepoint), any(MarkPositionAtTimePointCache.class))).thenReturn(startOfLeg);
when(trackedRace.getApproximatePosition(eq(to), eq(timepoint), any(MarkPositionAtTimePointCache.class))).thenReturn(endOfLeg);
SpeedWithBearing speedWithBearingPort = new KnotSpeedWithBearingImpl(11, new DegreeBearingImpl(150));
SpeedWithBearingWithConfidence<Void> boatSpeedWithBearingWithConfidencePort = new SpeedWithBearingWithConfidenceImpl<Void>(speedWithBearingPort, 1, null);
@@ -191,7 +193,7 @@ public class TargetTimeEstimationTest {
TrackedLeg trackedLeg = new TrackedLegImpl(trackedRace, leg, competitors);
//Actual test of functionality
Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint);
Duration duration = trackedLeg.getEstimatedTimeToComplete(mockedPolars, timepoint, new MarkPositionAtTimePointCacheImpl(trackedRace, timepoint));
assertEquals(95090, duration.asMillis(), 100);
}
@@ -22,6 +22,7 @@ import com.sap.sailing.domain.common.impl.DegreePosition;
import com.sap.sailing.domain.common.tracking.GPSFix;
import com.sap.sailing.domain.common.tracking.impl.GPSFixImpl;
import com.sap.sailing.domain.tracking.DynamicGPSFixTrack;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.domain.tracking.impl.DynamicGPSFixTrackImpl;
import com.sap.sailing.domain.tracking.impl.DynamicTrackedRaceImpl;
@@ -50,6 +51,7 @@ public class TrackedRaceCenterTest {
trackedRace = mock(DynamicTrackedRaceImpl.class);
when(trackedRace.getCenterOfCourse(Matchers.any(TimePoint.class))).thenCallRealMethod();
when(trackedRace.getApproximatePosition(Matchers.any(Waypoint.class), Matchers.any(TimePoint.class))).thenCallRealMethod();
when(trackedRace.getApproximatePosition(Matchers.any(Waypoint.class), Matchers.any(TimePoint.class), Matchers.any(MarkPositionAtTimePointCache.class))).thenCallRealMethod();
RaceDefinition race = mock(RaceDefinition.class);
when(trackedRace.getRace()).thenReturn(race);
course = mock(Course.class);
@@ -63,6 +63,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.LineDetails;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.RaceAbortedListener;
import com.sap.sailing.domain.tracking.RaceChangeListener;
import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider;
@@ -612,7 +613,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
}
@Override
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) {
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) {
return null;
}
@@ -42,6 +42,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.LineDetails;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.RaceAbortedListener;
import com.sap.sailing.domain.tracking.RaceChangeListener;
import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider;
@@ -218,7 +219,7 @@ public class MockedTrackedRaceWithStartTimeAndRanks implements TrackedRace {
}
@Override
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) {
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) {
return null;
}
@@ -43,6 +43,10 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio
protected abstract Map<Fleet, Iterable<? extends RaceColumn>> getRaceColumnsOfSeries();
/**
* For all tracked races found on any of the {@link #getRaceColumnsOfSeries() race columns} produces a valid and
* potentially empty set.
*/
private Map<TrackedRace, Set<TrackedRace>> reloadAndGetPreviousRacesByRace() {
final Map<TrackedRace, Set<TrackedRace>> previousRacesByRace = new HashMap<>();
for (Entry<Fleet, Iterable<? extends RaceColumn>> raceColumnsInSeries : getRaceColumnsOfSeries().entrySet()) {
@@ -96,11 +100,13 @@ public abstract class AbstractRaceExecutionOrderProvider implements RaceExecutio
@Override
public Set<TrackedRace> getPreviousRacesInExecutionOrder(TrackedRace race) {
Set<TrackedRace> result = Collections.emptySet();
final Set<TrackedRace> result;
final Map<TrackedRace, Set<TrackedRace>> previousRacesByRace = getPreviousRacesByRace();
if (previousRacesByRace != null) {
result = previousRacesByRace.get(race);
}
} else {
result = Collections.emptySet();
}
return result;
}
}
@@ -6,12 +6,9 @@ import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableFuture;
import java.util.concurrent.ScheduledExecutorService;
import com.sap.sailing.domain.common.Bearing;
import com.sap.sailing.domain.common.Distance;
@@ -31,7 +28,7 @@ import com.sap.sse.common.Util;
public class DouglasPeucker<ItemType, FixType extends GPSFix> {
private final GPSFixTrack<ItemType, FixType> track;
private final Executor executor;
private final ScheduledExecutorService executor;
public DouglasPeucker(GPSFixTrack<ItemType, FixType> track) {
this.track = track;
@@ -42,7 +39,7 @@ public class DouglasPeucker<ItemType, FixType extends GPSFix> {
* Allows clients to specify a non-default, optionally multi-threaded executor that will be used to perform the
* high-effort computations.
*/
public DouglasPeucker(GPSFixTrack<ItemType, FixType> track, Executor executor) {
public DouglasPeucker(GPSFixTrack<ItemType, FixType> track, ScheduledExecutorService executor) {
this.track = track;
this.executor = executor;
}
@@ -96,15 +93,8 @@ public class DouglasPeucker<ItemType, FixType extends GPSFix> {
if (fix.getTimePoint().compareTo(to) > 0) {
break;
}
RunnableFuture<Util.Pair<FixType, Distance>> crossTrackErrorFuture = new FutureTask<Util.Pair<FixType, Distance>>(
new Callable<Util.Pair<FixType, Distance>>() {
@Override
public Util.Pair<FixType, Distance> call() throws Exception {
return new Util.Pair<FixType, Distance>(fix, fix.getPosition().absoluteCrossTrackError(
fromPosition, bearing));
}
});
executor.execute(crossTrackErrorFuture);
Future<Util.Pair<FixType, Distance>> crossTrackErrorFuture = executor.submit(
()->new Util.Pair<FixType, Distance>(fix, fix.getPosition().absoluteCrossTrackError(fromPosition, bearing)));
crossTrackErrorFutures.add(crossTrackErrorFuture);
}
for (Future<Util.Pair<FixType, Distance>> crossTrackErrorFuture : crossTrackErrorFutures) {
@@ -23,6 +23,7 @@ import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util;
import com.sap.sse.concurrent.LockUtil;
import com.sap.sse.concurrent.NamedReentrantReadWriteLock;
import com.sap.sse.util.impl.FutureTaskWithTracingGet;
/**
* Caches the expensive to compute {@link LeaderboardDTO} results of a
@@ -140,15 +141,16 @@ public class LeaderboardDTOCache implements LeaderboardCache {
LockUtil.unlockAfterRead(leaderboardCacheLock);
}
if (future == null) {
future = new FutureTask<LeaderboardDTO>(new Callable<LeaderboardDTO>() {
@Override
public LeaderboardDTO call() throws Exception {
LeaderboardDTO result = leaderboard.computeDTO(adjustedTimePoint,
namesOfRaceColumnsForWhichToLoadLegDetails, addOverallDetails,
waitForLatestAnalyses, trackedRegattaRegistry, baseDomainFactory, /* fillTotalPointsUncorrected */ false);
return result;
}
});
future = new FutureTaskWithTracingGet<LeaderboardDTO>(LeaderboardDTOCache.class.getName()+" for leaderboard "+leaderboard.getName(),
new Callable<LeaderboardDTO>() {
@Override
public LeaderboardDTO call() throws Exception {
LeaderboardDTO result = leaderboard.computeDTO(adjustedTimePoint,
namesOfRaceColumnsForWhichToLoadLegDetails, addOverallDetails,
waitForLatestAnalyses, trackedRegattaRegistry, baseDomainFactory, /* fillTotalPointsUncorrected */ false);
return result;
}
});
// The add(Leaderboard) method that the cache manager calls back on this class does nothing, so no synchronization required
this.leaderboardCacheManager.add(leaderboard); // ensure the leaderboard is tracked for changes to invalidate
LockUtil.lockForWrite(leaderboardCacheLock);
@@ -21,7 +21,6 @@ import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.RunnableFuture;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -97,6 +96,7 @@ import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.concurrent.LockUtil;
import com.sap.sse.concurrent.NamedReentrantReadWriteLock;
import com.sap.sse.util.ThreadPoolUtil;
import com.sap.sse.util.impl.FutureTaskWithTracingGet;
/**
* Base implementation for various types of leaderboards. The {@link RaceColumnListener} implementation forwards events
@@ -311,7 +311,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
this.suppressedCompetitors = new HashSet<Competitor>();
this.suppressedCompetitorsLock = new NamedReentrantReadWriteLock("suppressedCompetitorsLock", /* fair */ false);
this.raceColumnListeners = new RaceColumnListeners();
this.raceDetailsAtEndOfTrackingCache = new HashMap<com.sap.sse.common.Util.Pair<TrackedRace, Competitor>, RunnableFuture<RaceDetails>>();
this.raceDetailsAtEndOfTrackingCache = new HashMap<>();
initTransientFields();
}
@@ -330,7 +330,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
}
private void initTransientFields() {
this.raceDetailsAtEndOfTrackingCache = new HashMap<com.sap.sse.common.Util.Pair<TrackedRace,Competitor>, RunnableFuture<RaceDetails>>();
this.raceDetailsAtEndOfTrackingCache = new HashMap<>();
this.cacheInvalidationListeners = new HashSet<CacheInvalidationListener>();
// When many updates are triggered in a short period of time by a single thread, ensure that the single thread
// providing the updates is not outperformed by all the re-calculations happening here. Leave at least one
@@ -1225,7 +1225,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
}
// Now create the race columns and, as a future task, set their competitorsFromBestToWorst, then wait for all these
// futures to finish:
Map<RaceColumn, FutureTask<List<CompetitorDTO>>> competitorsFromBestToWorstTasks = new HashMap<>();
Map<RaceColumn, Future<List<CompetitorDTO>>> competitorsFromBestToWorstTasks = new HashMap<>();
for (final RaceColumn raceColumn : this.getRaceColumns()) {
boolean isMetaLeaderboardColumn = raceColumn instanceof MetaLeaderboardColumn;
RaceColumnDTO raceColumnDTO = result.createEmptyRaceColumn(raceColumn.getName(), raceColumn.isMedalRace(),
@@ -1253,13 +1253,12 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
raceColumn instanceof RaceColumnInSeries ? ((RaceColumnInSeries) raceColumn).getSeries().getName() : null,
fleetDTO, raceColumn.isMedalRace(), raceIdentifier, race, isMetaLeaderboardColumn);
}
FutureTask<List<CompetitorDTO>> task = new FutureTask<List<CompetitorDTO>>(
Future<List<CompetitorDTO>> task = executor.submit(
() -> baseDomainFactory.getCompetitorDTOList(AbstractSimpleLeaderboardImpl.this.getCompetitorsFromBestToWorst(raceColumn, timePoint)));
executor.execute(task);
competitorsFromBestToWorstTasks.put(raceColumn, task);
}
// wait for the competitor orderings to have been computed for all race columns before continuing; subsequent tasks may depend on these data
for (Map.Entry<RaceColumn, FutureTask<List<CompetitorDTO>>> raceColumnAndTaskToJoin : competitorsFromBestToWorstTasks.entrySet()) {
for (Map.Entry<RaceColumn, Future<List<CompetitorDTO>>> raceColumnAndTaskToJoin : competitorsFromBestToWorstTasks.entrySet()) {
try {
result.setCompetitorsFromBestToWorst(raceColumnAndTaskToJoin.getKey().getName(), raceColumnAndTaskToJoin.getValue().get());
} catch (InterruptedException e) {
@@ -1323,7 +1322,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
Map<String, Future<LeaderboardEntryDTO>> futuresForColumnName = new HashMap<String, Future<LeaderboardEntryDTO>>();
final Set<RaceColumn> discardedRaceColumns = getResultDiscardingRule().getDiscardedRaceColumns(competitor, this, getRaceColumns(), timePoint);
for (final RaceColumn raceColumn : this.getRaceColumns()) {
RunnableFuture<LeaderboardEntryDTO> future = new FutureTask<LeaderboardEntryDTO>(() -> {
Future<LeaderboardEntryDTO> future = executor.submit(() -> {
Entry entry = AbstractSimpleLeaderboardImpl.this.getEntry(competitor, raceColumn, timePoint, discardedRaceColumns);
return getLeaderboardEntryDTO(entry, raceColumn, competitor, timePoint,
namesOfRaceColumnsForWhichToLoadLegDetails != null
@@ -1331,7 +1330,6 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
.getName()), waitForLatestAnalyses, legRanksCache, baseDomainFactory,
fillTotalPointsUncorrected, cache);
});
executor.execute(future);
futuresForColumnName.put(raceColumn.getName(), future);
}
for (Map.Entry<String, Future<LeaderboardEntryDTO>> raceColumnNameAndFuture : futuresForColumnName.entrySet()) {
@@ -1611,7 +1609,7 @@ public abstract class AbstractSimpleLeaderboardImpl implements Leaderboard, Race
raceDetails = raceDetailsAtEndOfTrackingCache.get(key);
if (raceDetails == null) {
needToRunRaceDetails = true;
raceDetails = new FutureTask<RaceDetails>(new Callable<RaceDetails>() {
raceDetails = new FutureTaskWithTracingGet<RaceDetails>("RaceDetails for "+trackedRace, new Callable<RaceDetails>() {
@Override
public RaceDetails call() throws Exception {
TimePoint end = trackedRace.getEndOfRace();
@@ -9,7 +9,6 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -173,7 +172,7 @@ public class MarkPassingCalculator {
+ " while waiting for new GPSFixes");
}
listener.getQueue().drainTo(allNewFixInsertions);
logger.finer("MPC for "+raceName+" recieved "+ allNewFixInsertions.size()+" new updates.");
logger.fine("MPC for "+raceName+" received "+ allNewFixInsertions.size()+" new updates.");
for (StorePositionUpdateStrategy fixInsertion : allNewFixInsertions) {
if (listener.isEndMarker(fixInsertion)) {
logger.info("Stopping "+MarkPassingCalculator.this+"'s listener for race "+raceName);
@@ -212,8 +211,7 @@ public class MarkPassingCalculator {
}
executor.invokeAll(tasks);
}
updateManuallySetMarkPassings(fixedMarkPassings, removedFixedMarkPassings, suppressedMarkPassings,
unsuppressedMarkPassings);
updateManuallySetMarkPassings(fixedMarkPassings, removedFixedMarkPassings, suppressedMarkPassings, unsuppressedMarkPassings);
computeMarkPasses(competitorFixes, markFixes);
competitorFixes.clear();
markFixes.clear();
@@ -284,9 +282,24 @@ public class MarkPassingCalculator {
fixes.addAll(fixesAffectedByNewMarkFixes.getValue());
}
}
List<Callable<Object>> tasks = new ArrayList<>();
for (Entry<Competitor, Set<GPSFix>> c : combinedCompetitorFixes.entrySet()) {
tasks.add(Executors.callable(new ComputeMarkPassings(c.getKey(), c.getValue())));
List<Callable<Void>> tasks = new ArrayList<>();
for (final Entry<Competitor, Set<GPSFix>> c : combinedCompetitorFixes.entrySet()) {
final Runnable runnable = new ComputeMarkPassings(c.getKey(), c.getValue());
tasks.add(new Callable<Void>() {
@Override
public Void call() throws Exception {
runnable.run();
return null;
}
/**
* A reasonable toString implementation helps identifying these tasks in log messages for long-running tasks
*/
@Override
public String toString() {
return "Mark passing calculation for competitor "+c.getKey()+" with "+c.getValue().size()+" fixes";
}
});
}
try {
executor.invokeAll(tasks);
@@ -296,8 +309,8 @@ public class MarkPassingCalculator {
}
private class ComputeMarkPassings implements Runnable {
Competitor c;
Iterable<GPSFix> fixes;
final Competitor c;
final Iterable<GPSFix> fixes;
public ComputeMarkPassings(Competitor c, Iterable<GPSFix> fixes) {
this.c = c;
@@ -306,12 +319,22 @@ public class MarkPassingCalculator {
@Override
public void run() {
logger.finer("Calculating MarkPassings for race "+raceName+", competitor " + c + " (" + Util.size(fixes) + " new fixes)");
Util.Pair<Iterable<Candidate>, Iterable<Candidate>> candidateDeltas = finder.getCandidateDeltas(c, fixes);
logger.finer("Received " + Util.size(candidateDeltas.getA()) + " new Candidates for race "+raceName+
" and competitor "+c+" and will remove "
+ Util.size(candidateDeltas.getB()) + " old Candidates for " + c);
chooser.calculateMarkPassDeltas(c, candidateDeltas.getA(), candidateDeltas.getB());
try {
if (logger.isLoggable(Level.FINER)) {
logger.finer("Calculating MarkPassings for race "+raceName+", competitor " + c + " (" + Util.size(fixes) + " new fixes)");
}
Util.Pair<Iterable<Candidate>, Iterable<Candidate>> candidateDeltas = finder.getCandidateDeltas(c, fixes);
if (logger.isLoggable(Level.FINER)) {
logger.finer("Received " + Util.size(candidateDeltas.getA()) + " new Candidates for race "+raceName+
" and competitor "+c+" and will remove "
+ Util.size(candidateDeltas.getB()) + " old Candidates for " + c);
}
chooser.calculateMarkPassDeltas(c, candidateDeltas.getA(), candidateDeltas.getB());
} catch (Exception e) {
// make sure the exception is logged and not only "swallowed" and suppressed by an invokeAll(...) statement
logger.log(Level.SEVERE, "Exception trying to compute mark passings for competitor "+c, e);
throw e;
}
}
}
@@ -39,6 +39,8 @@ import com.sap.sailing.domain.markpassingcalculation.CandidateFinder;
import com.sap.sailing.domain.tracking.DynamicGPSFixTrack;
import com.sap.sailing.domain.tracking.DynamicTrackedRace;
import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.impl.MarkPositionAtTimePointCacheImpl;
import com.sap.sailing.domain.tracking.impl.TimedComparator;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
@@ -47,6 +49,7 @@ import com.sap.sse.common.Timed;
import com.sap.sse.common.Util;
import com.sap.sse.common.Util.Pair;
import com.sap.sse.common.impl.TimeRangeImpl;
import com.sap.sse.concurrent.LockUtil;
import com.sap.sse.util.ThreadPoolUtil;
/**
@@ -383,24 +386,30 @@ public class CandidateFinderImpl implements CandidateFinder {
changedWaypoints.add(w);
}
}
final Set<Callable<Void>> tasks = new HashSet<>();;
final Set<Callable<Void>> tasks = new HashSet<>();
final Thread executingThread = Thread.currentThread(); // most likely the MarkPassingCalculator.Listen thread
for (Competitor c : race.getRace().getCompetitors()) {
tasks.add(()->{
List<Candidate> badCans = new ArrayList<>();
List<Candidate> newCans = new ArrayList<>();
for (Waypoint w : changedWaypoints) {
Map<List<GPSFix>, Candidate> xteCans = getXteCandidates(c, w);
badCans.addAll(xteCans.values());
xteCans.clear();
Map<GPSFix, Candidate> distanceCans = getDistanceCandidates(c, w);
badCans.addAll(distanceCans.values());
distanceCans.clear();
LockUtil.propagateLockSetFrom(executingThread); // "inherit" the course read lock from the "calling" thread into the thread pool executor thread
try {
List<Candidate> badCans = new ArrayList<>();
List<Candidate> newCans = new ArrayList<>();
for (Waypoint w : changedWaypoints) {
Map<List<GPSFix>, Candidate> xteCans = getXteCandidates(c, w);
badCans.addAll(xteCans.values());
xteCans.clear();
Map<GPSFix, Candidate> distanceCans = getDistanceCandidates(c, w);
badCans.addAll(distanceCans.values());
distanceCans.clear();
}
Set<GPSFix> allFixes = getAllFixes(c);
newCans.addAll(checkForDistanceCandidateChanges(c, allFixes, changedWaypoints).getA());
newCans.addAll(checkForXTECandidatesChanges(c, allFixes, changedWaypoints).getA());
result.put(c, new Util.Pair<List<Candidate>, List<Candidate>>(newCans, badCans));
return null;
} finally {
LockUtil.unpropagateLockSetFrom(executingThread); // "return" the course read lock from the thread pool executor thread to the "calling" thread
}
Set<GPSFix> allFixes = getAllFixes(c);
newCans.addAll(checkForDistanceCandidateChanges(c, allFixes, changedWaypoints).getA());
newCans.addAll(checkForXTECandidatesChanges(c, allFixes, changedWaypoints).getA());
result.put(c, new Util.Pair<List<Candidate>, List<Candidate>>(newCans, badCans));
return null;
});
}
executor.invokeAll(tasks);
@@ -513,8 +522,8 @@ public class CandidateFinderImpl implements CandidateFinder {
private Set<GPSFix> getAllFixes(Competitor c) {
Set<GPSFix> fixes = new TreeSet<GPSFix>(comp);
DynamicGPSFixTrack<Competitor, GPSFixMoving> track = race.getTrack(c);
track.lockForRead();
try {
track.lockForRead();
for (GPSFix fix : track.getFixes(
timeRangeForValidCandidates.from(), /* fromInclusive */ true,
timeRangeForValidCandidates.to(), /* toInclusive */ true)) {
@@ -542,8 +551,8 @@ public class CandidateFinderImpl implements CandidateFinder {
affectedFixes.add(fix);
GPSFix fixBefore;
GPSFix fixAfter;
track.lockForRead();
try {
track.lockForRead();
TimePoint timePoint = fix.getTimePoint();
fixBefore = track.getLastFixBefore(timePoint);
fixAfter = track.getFirstFixAfter(timePoint);
@@ -604,15 +613,16 @@ public class CandidateFinderImpl implements CandidateFinder {
if (Math.abs(dis.getMeters()) < Math.abs(disBefore.getMeters())
&& Math.abs(dis.getMeters()) < Math.abs(disAfter.getMeters())) {
t = fix.getTimePoint();
final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(race, t);
p = fix.getPosition();
Double newProbability = getDistanceBasedProbability(w, t, dis);
Double newProbability = getDistanceBasedProbability(w, t, dis, markPositionCache);
if (newProbability != null) {
// FIXME why not generate the candidate here where we have all information at hand?
final double newOnCorrectSideOfWaypointPenalty = getSidePenalty(w, p, t, portMark);
final double newOnCorrectSideOfWaypointPenalty = getSidePenalty(w, p, t, portMark, markPositionCache);
newProbability *= newOnCorrectSideOfWaypointPenalty * PENALTY_FOR_DISTANCE_CANDIDATES;
final Double newStartProbabilityBasedOnOtherCompetitors;
if (isStartWaypoint(w)) {
newStartProbabilityBasedOnOtherCompetitors = getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(c, t);
newStartProbabilityBasedOnOtherCompetitors = getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(c, t, markPositionCache);
if (newStartProbabilityBasedOnOtherCompetitors != null) {
newProbability *= newStartProbabilityBasedOnOtherCompetitors;
}
@@ -663,6 +673,7 @@ public class CandidateFinderImpl implements CandidateFinder {
private Map<Waypoint, List<Distance>> getDistances(Competitor c, GPSFix fix) {
// TODO Possibly for specific waypoints
Map<Waypoint, List<Distance>> result = distanceCache.get(c).get(fix);
final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(race, fix.getTimePoint());
if (result == null) {
// Else calculate distances and put them into the cache
result = new LinkedHashMap<>();
@@ -670,7 +681,7 @@ public class CandidateFinderImpl implements CandidateFinder {
course.lockForRead();
try {
for (Waypoint w : course.getWaypoints()) {
List<Distance> distances = calculateDistance(fix.getPosition(), w, fix.getTimePoint());
List<Distance> distances = calculateDistance(fix.getPosition(), w, fix.getTimePoint(), markPositionCache);
result.put(w, distances);
}
} finally {
@@ -811,13 +822,14 @@ public class CandidateFinderImpl implements CandidateFinder {
result = new HashMap<>();
Position p = fix.getPosition();
TimePoint t = fix.getTimePoint();
final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(race, t);
Course course = race.getRace().getCourse();
course.lockForRead();
try {
for (Waypoint w : course.getWaypoints()) {
List<Distance> distances = new ArrayList<>();
result.put(w, distances);
for (Util.Pair<Position, Bearing> crossingInfo : getCrossingInformation(w, t)) {
for (Util.Pair<Position, Bearing> crossingInfo : getCrossingInformation(w, t, markPositionCache)) {
if (crossingInfo.getA() != null && crossingInfo.getB() != null) {
distances.add(p.crossTrackError(crossingInfo.getA(), crossingInfo.getB()));
}
@@ -831,20 +843,6 @@ public class CandidateFinderImpl implements CandidateFinder {
return result;
}
/**
* Calculates the cross-track error of each fix to the position and crossing bearing of each waypoint. Gates have
* two of these and lines always go from the port mark to the starboard mark.
*
*
* /* private void calculateCrossTrackErrors(Competitor c, Iterable<GPSFix> fixes, Iterable<Waypoint>
* waypointsToCalculate) { for (GPSFix fix : fixes) { Position fixPos = fix.getPosition(); TimePoint t =
* fix.getTimePoint(); Map<Waypoint, List<Double>> waypointXTE = new HashMap<Waypoint, List<Double>>();
* crossTrackErrors.get(c).put(fix, waypointXTE); for (Waypoint w : race.getRace().getCourse().getWaypoints()) {
* List<Double> xte = new ArrayList<>(); waypointXTE.put(w, xte); for (Util.Pair<Position, Bearing> crossingInfo :
* getCrossingInformation(w, t)) { xte.add(fixPos.crossTrackError(crossingInfo.getA(),
* crossingInfo.getB()).getMeters()); } } } }
*/
/**
* {@code xte1} and {@code xte2} are expected to have different signums or both be 0. The method
* interpolates between the time points {@code t1} and {@code t2} according to where the XTE is
@@ -856,10 +854,11 @@ public class CandidateFinderImpl implements CandidateFinder {
final double ratio = (Math.abs(xte1) / (Math.abs(xte1) + Math.abs(xte2)));
final TimePoint t = t1.plus((long) (differenceInMillis * ratio));
final Position p = race.getTrack(c).getEstimatedPosition(t, false);
final List<Distance> distances = calculateDistance(p, w, t);
final List<Distance> distances = calculateDistance(p, w, t, new MarkPositionAtTimePointCacheImpl(race, t));
final Distance d = portMark ? distances.get(0) : distances.get(1);
final double sidePenalty = getSidePenalty(w, p, t, portMark);
double probability = getDistanceBasedProbability(w, t, d) * sidePenalty;
final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(race, t);
final double sidePenalty = getSidePenalty(w, p, t, portMark, markPositionCache);
double probability = getDistanceBasedProbability(w, t, d, markPositionCache) * sidePenalty;
final Double passesInTheRightDirectionProbability = passesInTheRightDirection(w, xte1, xte2, portMark);
// null would mean "unknown"; no penalty for those cases
probability = passesInTheRightDirectionProbability == null ? probability : probability * passesInTheRightDirectionProbability;
@@ -869,7 +868,7 @@ public class CandidateFinderImpl implements CandidateFinder {
// at time point t the other competitors are largely not even close to the start waypoint;
// this will make start candidates much more likely if many other competitors are also very close to the
// start, and it will help ruling out those candidates where someone is practicing a start just for themselves
startProbabilityBasedOnOtherCompetitors = getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(c, t);
startProbabilityBasedOnOtherCompetitors = getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(c, t, markPositionCache);
if (startProbabilityBasedOnOtherCompetitors != null) {
probability *= startProbabilityBasedOnOtherCompetitors;
}
@@ -932,9 +931,9 @@ public class CandidateFinderImpl implements CandidateFinder {
* A low variance with a positive average (meaning on course side) indicates that everyone else may have started around the
* same time, making this a probable late starter's candidate. Therefore, low variance with positive average shall increase
* a probability that was low because of a large weighted average distance.
*
* @param t
* the time point at which to consider the other competitors behavior relative to the start waypoint
*
* @return {@code null} if the {@link #race} has a gate start or the start time is known; a probability between 0..1
* (inclusive) where 0 means that based on all but {@code c}'s relation to the start line it seems
* completely unlikely that a candidate for {@code c} at time {@code t} could have been a start candidate; 1
@@ -942,11 +941,13 @@ public class CandidateFinderImpl implements CandidateFinder {
* a fact that this must have been the start.
*
*/
private Double getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(Competitor c, TimePoint t) {
private Double getProbabilityForStartCandidateBasedOnOtherCompetitorsBehavior(Competitor c, TimePoint t, MarkPositionAtTimePointCache markPositionCache) {
assert t.equals(markPositionCache.getTimePoint());
assert race == markPositionCache.getTrackedRace();
final Double result;
if (race.getStartOfRace(/* inferred */ false) == null && race.isGateStart() != Boolean.TRUE) {
final Waypoint start = race.getRace().getCourse().getFirstWaypoint();
final Iterable<Pair<Position, Bearing>> crossingInformationForStart = getCrossingInformation(start, t);
final Iterable<Pair<Position, Bearing>> crossingInformationForStart = getCrossingInformation(start, t, markPositionCache);
if (start == null) {
result = 1.0;
} else {
@@ -960,7 +961,7 @@ public class CandidateFinderImpl implements CandidateFinder {
final Position estimatedPositionAtT = track.getEstimatedPosition(t, /* extrapolate */ true);
// consider that a position may not be available for that other competitor, although a track exists
if (estimatedPositionAtT != null) {
final Distance otherCompetitorsDistanceToStartAtT = getMinDistanceOrNull(calculateDistance(estimatedPositionAtT, start, t));
final Distance otherCompetitorsDistanceToStartAtT = getMinDistanceOrNull(calculateDistance(estimatedPositionAtT, start, t, markPositionCache));
if (otherCompetitorsDistanceToStartAtT != null) {
final Distance crossTrackError;
if (startIsLine) {
@@ -1095,14 +1096,16 @@ public class CandidateFinderImpl implements CandidateFinder {
* to be negative. If the passing instructions are {@link PassingInstruction#Line}, it checks whether the boat
* passed between the two marks.
*/
private double getSidePenalty(Waypoint w, Position p, TimePoint t, boolean portMark) {
private double getSidePenalty(Waypoint w, Position p, TimePoint t, boolean portMark, MarkPositionAtTimePointCache markPositionCache) {
assert t.equals(markPositionCache.getTimePoint());
assert race == markPositionCache.getTrackedRace();
boolean isOnRightSide = true;
Distance onWrongSide = new MeterDistance(0);
PassingInstruction instruction = getPassingInstructions(w);
if (instruction == PassingInstruction.Line) {
List<Position> pos = new ArrayList<>();
for (Mark m : w.getMarks()) {
Position po = race.getOrCreateTrack(m).getEstimatedPosition(t, false);
Position po = markPositionCache.getEstimatedPosition(m);
if (po == null) {
isOnRightSide = true;
break;
@@ -1130,11 +1133,11 @@ public class CandidateFinderImpl implements CandidateFinder {
|| instruction == PassingInstruction.FixedBearing || instruction == PassingInstruction.Offset) {
m = w.getMarks().iterator().next();
} else if (instruction == PassingInstruction.Gate) {
Util.Pair<Mark, Mark> pair = getPortAndStarboardMarks(t, w);
Util.Pair<Mark, Mark> pair = getPortAndStarboardMarks(t, w, markPositionCache);
m = portMark ? pair.getA() : pair.getB();
}
if (m != null) {
Util.Pair<Position, Bearing> crossingInfo = Util.get(getCrossingInformation(w, t), portMark ? 0 : 1);
Util.Pair<Position, Bearing> crossingInfo = Util.get(getCrossingInformation(w, t, markPositionCache), portMark ? 0 : 1);
isOnRightSide = p.crossTrackError(crossingInfo.getA(), crossingInfo.getB().add(new DegreeBearingImpl(90))).getMeters() < 0;
if (isOnRightSide == false) {
onWrongSide = p.getDistance(crossingInfo.getA());
@@ -1188,9 +1191,11 @@ public class CandidateFinderImpl implements CandidateFinder {
/**
* @return a probability based on the distance to <code>w</code> and the average leg lengths before and after.
*/
private Double getDistanceBasedProbability(Waypoint w, TimePoint t, Distance distance) {
private Double getDistanceBasedProbability(Waypoint w, TimePoint t, Distance distance, MarkPositionAtTimePointCache markPositionCache) {
assert t.equals(markPositionCache.getTimePoint());
assert race == markPositionCache.getTrackedRace();
final Double result;
Distance legLength = getAverageLengthOfAdjacentLegs(t, w);
Distance legLength = getAverageLengthOfAdjacentLegs(t, w, markPositionCache);
if (legLength != null) {
result = 1 / (STRICTNESS_OF_DISTANCE_BASED_PROBABILITY/* Raising this will make it stricter */
// reduce distance by 2x the typical HDOP, accounting for the possibility that some distance from the mark
@@ -1205,26 +1210,38 @@ public class CandidateFinderImpl implements CandidateFinder {
/**
* @return an average of the estimated legs before and after <code>w</code>.
*/
private Distance getAverageLengthOfAdjacentLegs(TimePoint t, Waypoint w) {
Course course = race.getRace().getCourse();
if (w == course.getFirstWaypoint()) {
return race.getTrackedLegStartingAt(w).getGreatCircleDistance(t);
private Distance getAverageLengthOfAdjacentLegs(TimePoint t, Waypoint w, MarkPositionAtTimePointCache markPositionCache) {
assert t.equals(markPositionCache.getTimePoint());
assert race == markPositionCache.getTrackedRace();
final Distance result;
final Course course = race.getRace().getCourse();
if (course.getNumberOfWaypoints() < 2) {
result = null;
} else if (w == course.getFirstWaypoint()) {
result = race.getTrackedLegStartingAt(w).getGreatCircleDistance(t, markPositionCache);
} else if (w == course.getLastWaypoint()) {
return race.getTrackedLegFinishingAt(w).getGreatCircleDistance(t);
result = race.getTrackedLegFinishingAt(w).getGreatCircleDistance(t, markPositionCache);
} else {
Distance before = race.getTrackedLegStartingAt(w).getGreatCircleDistance(t);
Distance after = race.getTrackedLegFinishingAt(w).getGreatCircleDistance(t);
Distance before = race.getTrackedLegStartingAt(w).getGreatCircleDistance(t, markPositionCache);
Distance after = race.getTrackedLegFinishingAt(w).getGreatCircleDistance(t, markPositionCache);
if (after != null && before != null) {
return new MeterDistance(before.add(after).getMeters() / 2);
result = new MeterDistance(before.add(after).getMeters() / 2);
} else {
result = null;
}
return null;
}
return result;
}
/**
* Calculates the distance from p to each mark of w at the timepoint t.
*
* @param markPositionCache
* a mark position cache for time point {@code t} for this finder's {@link #race}
*/
private List<Distance> calculateDistance(Position p, Waypoint w, TimePoint t) {
private List<Distance> calculateDistance(Position p, Waypoint w, TimePoint t, MarkPositionAtTimePointCache markPositionCache) {
assert t.equals(markPositionCache.getTimePoint());
assert race == markPositionCache.getTrackedRace();
final List<Distance> distances = new ArrayList<>();
PassingInstruction instruction = getPassingInstructions(w);
boolean singleMark = false;
@@ -1236,25 +1253,25 @@ public class CandidateFinderImpl implements CandidateFinder {
singleMark = true;
break;
case Gate:
Util.Pair<Mark, Mark> posGate = getPortAndStarboardMarks(t, w);
Util.Pair<Mark, Mark> posGate = getPortAndStarboardMarks(t, w, markPositionCache);
if (posGate.getA() != null) {
Position portGatePosition = race.getOrCreateTrack(posGate.getA()).getEstimatedPosition(t, false);
Position portGatePosition = markPositionCache.getEstimatedPosition(posGate.getA());
distances.add(portGatePosition != null ? p.getDistance(portGatePosition) : null);
} else {
distances.add(null);
}
if (posGate.getB() != null) {
Position starboardGatePosition = race.getOrCreateTrack(posGate.getB()).getEstimatedPosition(t, false);
Position starboardGatePosition = markPositionCache.getEstimatedPosition(posGate.getB());
distances.add(starboardGatePosition != null ? p.getDistance(starboardGatePosition) : null);
} else {
distances.add(null);
}
break;
case Line:
Util.Pair<Mark, Mark> posLine = getPortAndStarboardMarks(t, w);
Util.Pair<Mark, Mark> posLine = getPortAndStarboardMarks(t, w, markPositionCache);
if (posLine.getA() != null && posLine.getB() != null) {
Position portLinePosition = race.getOrCreateTrack(posLine.getA()).getEstimatedPosition(t, false);
Position starboardLinePosition = race.getOrCreateTrack(posLine.getB()).getEstimatedPosition(t, false);
Position portLinePosition = markPositionCache.getEstimatedPosition(posLine.getA());
Position starboardLinePosition = markPositionCache.getEstimatedPosition(posLine.getB());
distances.add((portLinePosition != null && starboardLinePosition != null) ? p.getDistanceToLine(
portLinePosition, starboardLinePosition).abs() : null);
}
@@ -1270,8 +1287,7 @@ public class CandidateFinderImpl implements CandidateFinder {
break;
}
if (singleMark) {
Position markPosition = race.getOrCreateTrack(w.getMarks().iterator().next())
.getEstimatedPosition(t, false);
Position markPosition = markPositionCache.getEstimatedPosition(w.getMarks().iterator().next());
distances.add(markPosition != null ? p.getDistance(markPosition) : null);
}
return distances;
@@ -1292,44 +1308,46 @@ public class CandidateFinderImpl implements CandidateFinder {
* @return all possible ways to pass a waypoint, described as a position and a bearing. The line out of those two
* must be crossed.
*/
private Iterable<Util.Pair<Position, Bearing>> getCrossingInformation(Waypoint w, TimePoint t) {
private Iterable<Util.Pair<Position, Bearing>> getCrossingInformation(Waypoint w, TimePoint t, MarkPositionAtTimePointCache markPositionCache) {
assert t.equals(markPositionCache.getTimePoint());
assert race == markPositionCache.getTrackedRace();
List<Util.Pair<Position, Bearing>> result = new ArrayList<>();
PassingInstruction instruction = getPassingInstructions(w);
if (instruction == PassingInstruction.Line) {
Util.Pair<Mark, Mark> marks = getPortAndStarboardMarks(t, w);
Util.Pair<Mark, Mark> marks = getPortAndStarboardMarks(t, w, markPositionCache);
Position portPosition = null;
Bearing b = null;
Mark portMark = marks.getA();
Mark starBoardMark = marks.getB();
if (portMark != null && starBoardMark != null) {
portPosition = race.getOrCreateTrack(portMark).getEstimatedPosition(t, false);
Position starboardPosition = race.getOrCreateTrack(starBoardMark).getEstimatedPosition(t, false);
portPosition = markPositionCache.getEstimatedPosition(portMark);
Position starboardPosition = markPositionCache.getEstimatedPosition(starBoardMark);
if (portPosition != null && starboardPosition != null) {
b = portPosition.getBearingGreatCircle(starboardPosition);
result.add(new Util.Pair<Position, Bearing>(portPosition, b));
}
}
} else if (instruction == PassingInstruction.Gate) {
Position before = race.getApproximatePosition(race.getTrackedLegFinishingAt(w).getLeg().getFrom(), t);
Position after = race.getApproximatePosition(race.getTrackedLegStartingAt(w).getLeg().getTo(), t);
Util.Pair<Mark, Mark> pos = getPortAndStarboardMarks(t, w);
Position before = markPositionCache.getApproximatePosition(race.getTrackedLegFinishingAt(w).getLeg().getFrom());
Position after = markPositionCache.getApproximatePosition(race.getTrackedLegStartingAt(w).getLeg().getTo());
Util.Pair<Mark, Mark> pos = getPortAndStarboardMarks(t, w, markPositionCache);
Mark portMark = pos.getA();
if (portMark != null) {
Position portPosition = race.getOrCreateTrack(portMark).getEstimatedPosition(t, false);
Position portPosition = markPositionCache.getEstimatedPosition(portMark);
Bearing crossingPort = before.getBearingGreatCircle(portPosition).middle(
after.getBearingGreatCircle(portPosition));
result.add(new Util.Pair<Position, Bearing>(portPosition, crossingPort));
}
Mark starboardMark = pos.getB();
if (starboardMark != null) {
Position starboardPosition = race.getOrCreateTrack(starboardMark).getEstimatedPosition(t, false);
Position starboardPosition = markPositionCache.getEstimatedPosition(starboardMark);
Bearing crossingStarboard = before.getBearingGreatCircle(starboardPosition).middle(
after.getBearingGreatCircle(starboardPosition));
result.add(new Util.Pair<Position, Bearing>(starboardPosition, crossingStarboard));
}
} else { // single mark
Bearing b = null;
Position p = race.getOrCreateTrack(w.getMarks().iterator().next()).getEstimatedPosition(t, false);
Position p = markPositionCache.getEstimatedPosition(w.getMarks().iterator().next());
if (instruction == PassingInstruction.FixedBearing) {
b = w.getFixedBearing();
} else {
@@ -1339,23 +1357,23 @@ public class CandidateFinderImpl implements CandidateFinder {
// orthogonally to the adjacent leg:
if (w == race.getRace().getCourse().getFirstWaypoint()) {
if (instruction == PassingInstruction.None || instruction == PassingInstruction.Single_Unknown) {
b = race.getTrackedLegStartingAt(w).getLegBearing(t).add(new DegreeBearingImpl(90));
b = markPositionCache.getLegBearing(race.getTrackedLegStartingAt(w)).add(new DegreeBearingImpl(90));
result.add(new Pair<>(p, b));
b = race.getTrackedLegStartingAt(w).getLegBearing(t).add(new DegreeBearingImpl(270));
b = markPositionCache.getLegBearing(race.getTrackedLegStartingAt(w)).add(new DegreeBearingImpl(270));
} else {
b = race.getTrackedLegStartingAt(w).getLegBearing(t).add(new DegreeBearingImpl(instruction == PassingInstruction.Port ? 90 : 270));
b = markPositionCache.getLegBearing(race.getTrackedLegStartingAt(w)).add(new DegreeBearingImpl(instruction == PassingInstruction.Port ? 90 : 270));
}
} else if (w == race.getRace().getCourse().getLastWaypoint()) {
if (instruction == PassingInstruction.None || instruction == PassingInstruction.Single_Unknown) {
b = race.getTrackedLegFinishingAt(w).getLegBearing(t).add(new DegreeBearingImpl(90));
b = markPositionCache.getLegBearing(race.getTrackedLegFinishingAt(w)).add(new DegreeBearingImpl(90));
result.add(new Pair<>(p, b));
b = race.getTrackedLegFinishingAt(w).getLegBearing(t).add(new DegreeBearingImpl(270));
b = markPositionCache.getLegBearing(race.getTrackedLegFinishingAt(w)).add(new DegreeBearingImpl(270));
} else {
b = race.getTrackedLegFinishingAt(w).getLegBearing(t).add(new DegreeBearingImpl(instruction == PassingInstruction.Port ? 90 : 270));
b = markPositionCache.getLegBearing(race.getTrackedLegFinishingAt(w)).add(new DegreeBearingImpl(instruction == PassingInstruction.Port ? 90 : 270));
}
} else {
Bearing before = race.getTrackedLegFinishingAt(w).getLegBearing(t);
Bearing after = race.getTrackedLegStartingAt(w).getLegBearing(t);
Bearing before = markPositionCache.getLegBearing(race.getTrackedLegFinishingAt(w));
Bearing after = markPositionCache.getLegBearing(race.getTrackedLegStartingAt(w));
if (before != null && after != null) {
b = before.middle(after.reverse());
}
@@ -1367,14 +1385,17 @@ public class CandidateFinderImpl implements CandidateFinder {
}
/**
* @param markPositionCache
* a mark position cache for this finder's {@link #race} for time point {@code t}
* @return the marks of a waypoint with two marks in the order port, starboard (when approaching the waypoint from
* the direction of the waypoint beforehand.
*/
private Util.Pair<Mark, Mark> getPortAndStarboardMarks(TimePoint t, Waypoint w) {
private Util.Pair<Mark, Mark> getPortAndStarboardMarks(TimePoint t, Waypoint w, MarkPositionAtTimePointCache markPositionCache) {
assert t.equals(markPositionCache.getTimePoint());
assert race == markPositionCache.getTrackedRace();
List<Position> markPositions = new ArrayList<Position>();
for (Mark mark : w.getMarks()) {
final Position estimatedMarkPosition = race.getOrCreateTrack(mark).getEstimatedPosition(t, /* extrapolate */
false);
final Position estimatedMarkPosition = markPositionCache.getEstimatedPosition(mark);
if (estimatedMarkPosition == null) {
return new Util.Pair<Mark, Mark>(null, null);
}
@@ -1389,8 +1410,8 @@ public class CandidateFinderImpl implements CandidateFinder {
return new Util.Pair<Mark, Mark>(null, null);
}
final boolean isStartLine = indexOfWaypoint == 0;
final Bearing legDeterminingDirectionBearing = race.getTrackedLeg(
legs.get(isStartLine ? 0 : indexOfWaypoint - 1)).getLegBearing(t);
final Bearing legDeterminingDirectionBearing = markPositionCache.getLegBearing(race.getTrackedLeg(
legs.get(isStartLine ? 0 : indexOfWaypoint - 1)));
if (legDeterminingDirectionBearing == null) {
return new Util.Pair<Mark, Mark>(null, null);
}
@@ -1414,8 +1435,9 @@ public class CandidateFinderImpl implements CandidateFinder {
final TimePoint newNonInferredStartTime = race.getStartOfRace(/* inferred */ false);
final TimePoint newTimePointWhenToStartConsideringCandidates = getTimePointWhenToStartConsideringCandidates(newNonInferredStartTime);
if (!Util.equalsWithNull(newTimePointWhenToStartConsideringCandidates, timeRangeForValidCandidates.from())) {
final TimePoint oldTimePointWhenToStartConsideringCandidates = timeRangeForValidCandidates.from();
timeRangeForValidCandidates = new TimeRangeImpl(newTimePointWhenToStartConsideringCandidates, timeRangeForValidCandidates.to());
result = updateCandiatesAfterRaceTimeRangeChanged(newTimePointWhenToStartConsideringCandidates, timeRangeForValidCandidates.from());
result = updateCandiatesAfterRaceTimeRangeChanged(newTimePointWhenToStartConsideringCandidates, oldTimePointWhenToStartConsideringCandidates);
} else {
result = Collections.emptyMap();
}
@@ -1427,12 +1449,10 @@ public class CandidateFinderImpl implements CandidateFinder {
TimePoint oldFinishedTime, TimePoint newFinishedTime) {
final Map<Competitor, Pair<Iterable<Candidate>, Iterable<Candidate>>> result;
final TimePoint newTimePointWhenToFinishConsideringCandidates = getTimePointWhenToFinishConsideringCandidates(newFinishedTime);
final TimePoint oldTimePointWhenToFinishConsideringCandidates = timeRangeForValidCandidates.to();
if (!Util.equalsWithNull(timeRangeForValidCandidates.to(), newTimePointWhenToFinishConsideringCandidates)) {
final TimePoint oldTimePointWhenToFinishConsideringCandidates = timeRangeForValidCandidates.to();
timeRangeForValidCandidates = new TimeRangeImpl(timeRangeForValidCandidates.from(), newTimePointWhenToFinishConsideringCandidates);
result = updateCandiatesAfterRaceTimeRangeChanged(
oldTimePointWhenToFinishConsideringCandidates,
newTimePointWhenToFinishConsideringCandidates);
result = updateCandiatesAfterRaceTimeRangeChanged(oldTimePointWhenToFinishConsideringCandidates, newTimePointWhenToFinishConsideringCandidates);
} else {
result = Collections.emptyMap();
}
@@ -0,0 +1,58 @@
package com.sap.sailing.domain.tracking;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.Bearing;
import com.sap.sailing.domain.common.Position;
import com.sap.sse.common.TimePoint;
/**
* Some calculations that span several method calls require access to the same {@link Mark} positions for the same
* {@link TimePoint} within the scope of the same {@link TrackedRace} repeatedly. Usually, for such a compound
* calculation it doesn't matter whether a new fix has arrived in between, making it valid to cache the mark
* positions---once calculated---for the remainder of the compound operation. Based on these positions, approximate
* waypoint positions and leg bearings can also be calculated and cached.
* <p>
*
* Implementations of this interface may cache the results of computing a mark's position for the duration of this
* object.
*
* @author Axel Uhl (D043530)
*
*/
public interface MarkPositionAtTimePointCache {
/**
* Gets the non-extrapolated mark position in this cache's tracked race at the time point
* specified.
*
* @see TrackedRace#getOrCreateTrack(Mark)
* @see GPSFixTrack#getEstimatedPosition(TimePoint, boolean)
*/
Position getEstimatedPosition(Mark mark);
/**
* Gets the approximate position of a waypoint in the scope of this cache's tracked race at
* the time point specified.
*
* @see TrackedRace#getApproximatePosition(Waypoint, TimePoint)
*/
Position getApproximatePosition(Waypoint waypoint);
/**
* Gets the bearing of the tracked leg at the time point specified, optionally based on mark position
* information already stored in this cache.
*
* @see TrackedLeg#getLegBearing(TimePoint)
*/
Bearing getLegBearing(TrackedLeg trackedLeg);
/**
* @return the time point for which this cache holds values
*/
TimePoint getTimePoint();
/**
* @return the tracked race for which this cache holds values
*/
TrackedRace getTrackedRace();
}
@@ -56,6 +56,16 @@ public interface TrackedLeg extends Serializable {
Bearing getLegBearing(TimePoint at);
/**
* Same as {@link #getLegBearing(TimePoint)}, but giving the caller the possibility to provide a cache for
* mark positions and related position and bearing data
*
* @param markPositionCache
* a cache for this tracked leg's {@link MarkPositionAtTimePointCache#getTrackedRace() race} and the
* {@link MarkPositionAtTimePointCache#getTimePoint() timePoint} passed
*/
Bearing getLegBearing(TimePoint at, MarkPositionAtTimePointCache markPositionCache);
/**
* Returns the positive (absolute) distance of <code>p</code> to this leg's course middle line at <code>timePoint</code>,
* based on the position of the waypoints delimiting this leg at that time.
@@ -80,6 +90,16 @@ public interface TrackedLeg extends Serializable {
*/
Distance getGreatCircleDistance(TimePoint timePoint);
/**
* Same as {@link #getGreatCircleDistance(TimePoint)}, but giving the caller the possibility to provide a cache for
* mark positions and related position and bearing data
*
* @param markPositionCache
* a cache for this tracked leg's {@link MarkPositionAtTimePointCache#getTrackedRace() race} and the
* {@link MarkPositionAtTimePointCache#getTimePoint() timePoint} passed
*/
Distance getGreatCircleDistance(TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache);
/**
* If the current {@link #getLeg() leg} is +/- {@link TrackedLegImpl#UPWIND_DOWNWIND_TOLERANCE_IN_DEG} degrees
* collinear with the wind's bearing, <code>pos1</code> is projected onto the line crossing <code>pos2</code> in the
@@ -144,7 +164,8 @@ public interface TrackedLeg extends Serializable {
* is not available
* @throws NoWindException no wind available. unable to determine legtypes for given timepoint
*/
Duration getEstimatedTimeToComplete(PolarDataService polarDataService, TimePoint timepoint) throws NotEnoughDataHasBeenAddedException, NoWindException;
Duration getEstimatedTimeToComplete(PolarDataService polarDataService, TimePoint timepoint, MarkPositionAtTimePointCache markPositionCache)
throws NotEnoughDataHasBeenAddedException, NoWindException;
/**
* Computes the windward distance (for upwind/downwind legs) or the along-course distance (for reaching legs) at a reference time point
@@ -49,6 +49,7 @@ import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException;
import com.sap.sailing.domain.polars.PolarDataService;
import com.sap.sailing.domain.ranking.RankingMetric;
import com.sap.sailing.domain.ranking.RankingMetric.RankingInfo;
import com.sap.sailing.domain.tracking.impl.NonCachingMarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.impl.TrackedRaceImpl;
import com.sap.sse.common.Duration;
import com.sap.sse.common.IsManagedByCache;
@@ -316,8 +317,22 @@ public interface TrackedRace extends Serializable, IsManagedByCache<SharedDomain
* If the <code>waypoint</code> only has one {@link #getMarks() mark}, its position at time <code>timePoint</code>
* is returned. Otherwise, the center of gravity between the mark positions is computed and returned.
*/
Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint);
default Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) {
return getApproximatePosition(waypoint, timePoint, new NonCachingMarkPositionAtTimePointCache(this, timePoint));
}
/**
* Same as {@link #getApproximatePosition(Waypoint, TimePoint)}, but giving the caller the possibility to pass a
* cache of mark positions and related information that can help speed up compound operations requiring frequent
* access to the same marks in the same race for the same time point.
*
* @param markPositionCache
* a cache for this {@link MarkPositionAtTimePointCache#getTrackedRace() race} and the
* {@link MarkPositionAtTimePointCache#getTimePoint() timePoint} passed
*/
Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint,
MarkPositionAtTimePointCache markPositionCache);
/**
* Checks whether the {@link Wind#getTimePoint()} is in range of start and end {@link TimePoint}s plus extra time
* for wind recording. If, based on a {@link RaceExecutionOrderProvider}, there is no previous race that takes the
@@ -946,4 +961,5 @@ public interface TrackedRace extends Serializable, IsManagedByCache<SharedDomain
* @return all currently attached {@link RaceLog}s or an empty Iterable if there aren't any
*/
Iterable<RaceLog> getAttachedRaceLogs();
}
@@ -1075,8 +1075,10 @@ public class GPSFixTrackImpl<ItemType, FixType extends GPSFix> extends MappedTra
unlockAfterRead();
}
}
for (GPSTrackListener<ItemType, FixType> listener : getListeners()) {
listener.gpsFixReceived(fix, getTrackedItem(), firstFixInTrack);
if (result) {
for (GPSTrackListener<ItemType, FixType> listener : getListeners()) {
listener.gpsFixReceived(fix, getTrackedItem(), firstFixInTrack);
}
}
return result;
}
@@ -0,0 +1,62 @@
package com.sap.sailing.domain.tracking.impl;
import java.util.HashMap;
import java.util.Map;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.Bearing;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.tracking.TrackedLeg;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.TimePoint;
public class MarkPositionAtTimePointCacheImpl extends NonCachingMarkPositionAtTimePointCache {
private final Map<Mark, Position> estimatedMarkPositions;
private final Map<Waypoint, Position> approximateWaypointPositions;
private final Map<TrackedLeg, Bearing> legBearings;
public MarkPositionAtTimePointCacheImpl(TrackedRace trackedRace, TimePoint timePoint) {
super(trackedRace, timePoint);
estimatedMarkPositions = new HashMap<>();
approximateWaypointPositions = new HashMap<>();
legBearings = new HashMap<>();
}
@Override
public Position getEstimatedPosition(Mark mark) {
final Position result;
if (estimatedMarkPositions.containsKey(mark)) {
result = estimatedMarkPositions.get(mark);
} else {
result = super.getEstimatedPosition(mark);
estimatedMarkPositions.put(mark, result);
}
return result;
}
@Override
public Position getApproximatePosition(Waypoint waypoint) {
final Position result;
if (approximateWaypointPositions.containsKey(waypoint)) {
result = approximateWaypointPositions.get(waypoint);
} else {
result = super.getApproximatePosition(waypoint);
approximateWaypointPositions.put(waypoint, result);
}
return result;
}
@Override
public Bearing getLegBearing(TrackedLeg trackedLeg) {
final Bearing result;
if (legBearings.containsKey(trackedLeg)) {
result = legBearings.get(trackedLeg);
} else {
result = super.getLegBearing(trackedLeg);
legBearings.put(trackedLeg, result);
}
return result;
}
}
@@ -0,0 +1,46 @@
package com.sap.sailing.domain.tracking.impl;
import com.sap.sailing.domain.base.Mark;
import com.sap.sailing.domain.base.Waypoint;
import com.sap.sailing.domain.common.Bearing;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.TrackedLeg;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sse.common.TimePoint;
public class NonCachingMarkPositionAtTimePointCache implements MarkPositionAtTimePointCache {
private final TrackedRace trackedRace;
private final TimePoint timePoint;
public NonCachingMarkPositionAtTimePointCache(TrackedRace trackedRace, TimePoint timePoint) {
super();
this.trackedRace = trackedRace;
this.timePoint = timePoint;
}
@Override
public Position getEstimatedPosition(Mark mark) {
return trackedRace.getOrCreateTrack(mark).getEstimatedPosition(timePoint, /* extrapolate */ false);
}
@Override
public Position getApproximatePosition(Waypoint waypoint) {
return trackedRace.getApproximatePosition(waypoint, timePoint, this);
}
@Override
public Bearing getLegBearing(TrackedLeg trackedLeg) {
return trackedLeg.getLegBearing(timePoint, this);
}
@Override
public TrackedRace getTrackedRace() {
return trackedRace;
}
@Override
public TimePoint getTimePoint() {
return timePoint;
}
}
@@ -39,6 +39,7 @@ import com.sap.sailing.domain.leaderboard.caching.LeaderboardDTOCalculationReuse
import com.sap.sailing.domain.polars.NotEnoughDataHasBeenAddedException;
import com.sap.sailing.domain.polars.PolarDataService;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.TrackedLeg;
import com.sap.sailing.domain.tracking.TrackedLegOfCompetitor;
import com.sap.sailing.domain.tracking.TrackedRace;
@@ -204,8 +205,15 @@ public class TrackedLegImpl implements TrackedLeg {
@Override
public Bearing getLegBearing(TimePoint at) {
Position startMarkPos = getTrackedRace().getApproximatePosition(getLeg().getFrom(), at);
Position endMarkPos = getTrackedRace().getApproximatePosition(getLeg().getTo(), at);
return getLegBearing(at, new MarkPositionAtTimePointCacheImpl(getTrackedRace(), at));
}
@Override
public Bearing getLegBearing(TimePoint at, MarkPositionAtTimePointCache markPositionCache) {
assert markPositionCache.getTimePoint().equals(at);
assert markPositionCache.getTrackedRace() == getTrackedRace();
Position startMarkPos = markPositionCache.getApproximatePosition(getLeg().getFrom());
Position endMarkPos = markPositionCache.getApproximatePosition(getLeg().getTo());
Bearing legBearing = (startMarkPos != null && endMarkPos != null) ? startMarkPos.getBearingGreatCircle(endMarkPos) : null;
return legBearing;
}
@@ -337,10 +345,12 @@ public class TrackedLegImpl implements TrackedLeg {
}
@Override
public Distance getGreatCircleDistance(TimePoint timePoint) {
public Distance getGreatCircleDistance(TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) {
assert markPositionCache.getTimePoint().equals(timePoint);
assert markPositionCache.getTrackedRace() == getTrackedRace();
final Distance result;
final Position approximatePositionOfFrom = getTrackedRace().getApproximatePosition(getLeg().getFrom(), timePoint);
final Position approximatePositionOfTo = getTrackedRace().getApproximatePosition(getLeg().getTo(), timePoint);
final Position approximatePositionOfFrom = markPositionCache.getApproximatePosition(getLeg().getFrom());
final Position approximatePositionOfTo = markPositionCache.getApproximatePosition(getLeg().getTo());
if (approximatePositionOfFrom != null && approximatePositionOfTo != null) {
result = approximatePositionOfFrom.getDistance(approximatePositionOfTo);
} else {
@@ -349,6 +359,11 @@ public class TrackedLegImpl implements TrackedLeg {
return result;
}
@Override
public Distance getGreatCircleDistance(TimePoint timePoint) {
return getGreatCircleDistance(timePoint, new NonCachingMarkPositionAtTimePointCache(getTrackedRace(), timePoint));
}
@Override
public Distance getAbsoluteWindwardDistance(Position pos1, Position pos2, TimePoint at, WindPositionMode windPositionMode) {
return getAbsoluteWindwardDistance(pos1, pos2, at, windPositionMode, new LeaderboardDTOCalculationReuseCache(at));
@@ -498,8 +513,10 @@ public class TrackedLegImpl implements TrackedLeg {
}
@Override
public Duration getEstimatedTimeToComplete(PolarDataService polarDataService, TimePoint timepoint)
public Duration getEstimatedTimeToComplete(PolarDataService polarDataService, TimePoint timepoint, MarkPositionAtTimePointCache markPositionCache)
throws NotEnoughDataHasBeenAddedException, NoWindException {
assert timepoint.equals(markPositionCache.getTimePoint());
assert getTrackedRace() == markPositionCache.getTrackedRace();
Position centralPosition = trackedRace.getCenterOfCourse(timepoint);
Wind wind = trackedRace.getWind(centralPosition, timepoint, getTrackedRace().getWindSources(WindSourceType.TRACK_BASED_ESTIMATION));
Position from = trackedRace.getApproximatePosition(leg.getFrom(), timepoint);
@@ -127,6 +127,7 @@ import com.sap.sailing.domain.tracking.GPSTrackListener;
import com.sap.sailing.domain.tracking.LineDetails;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.RaceChangeListener;
import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider;
import com.sap.sailing.domain.tracking.RaceListener;
@@ -158,6 +159,7 @@ import com.sap.sse.util.SmartFutureCache;
import com.sap.sse.util.SmartFutureCache.AbstractCacheUpdater;
import com.sap.sse.util.SmartFutureCache.EmptyUpdateInterval;
import com.sap.sse.util.impl.ArrayListNavigableSet;
import com.sap.sse.util.impl.FutureTaskWithTracingGet;
import difflib.DiffUtils;
import difflib.Patch;
@@ -750,7 +752,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
/**
* Monitor object to synchronize access to the {@link #updateStartAndEndOfTracking(boolean)} method. See bug 3922.
*/
private final Serializable updateStartAndEndOfTrackingMonitor = "";
private final Serializable updateStartAndEndOfTrackingMonitor = "updateStartAndEndOfTrackingMonitor";
/**
* Updates the start and end of tracking in the following precedence order:
@@ -1670,10 +1672,12 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
}
@Override
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) {
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) {
assert timePoint.equals(markPositionCache.getTimePoint());
assert this == markPositionCache.getTrackedRace();
Position result = null;
for (Mark mark : waypoint.getMarks()) {
Position nextPos = getOrCreateTrack(mark).getEstimatedPosition(timePoint, /* extrapolate */false);
Position nextPos = markPositionCache.getEstimatedPosition(mark);
if (result == null) {
result = nextPos;
} else if (nextPos != null) {
@@ -1875,7 +1879,7 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
synchronized (directionFromStartToNextMarkCache) {
future = directionFromStartToNextMarkCache.get(at);
if (future == null) {
newFuture = new FutureTask<Wind>(new Callable<Wind>() {
newFuture = new FutureTaskWithTracingGet<Wind>("getDirectionFromStartToNextMark for "+this, new Callable<Wind>() {
@Override
public Wind call() {
Wind result;
@@ -3892,8 +3896,9 @@ public abstract class TrackedRaceImpl extends TrackedRaceWithWindEssentials impl
throw new NotEnoughDataHasBeenAddedException("Target time estimation failed. No polar service available.");
}
Duration durationOfAllLegs = Duration.NULL;
final MarkPositionAtTimePointCache markPositionCache = new MarkPositionAtTimePointCacheImpl(this, timepoint);
for (TrackedLeg leg : trackedLegs.values()) {
Duration durationOfLeg = leg.getEstimatedTimeToComplete(polarDataService, timepoint);
Duration durationOfLeg = leg.getEstimatedTimeToComplete(polarDataService, timepoint, markPositionCache);
durationOfAllLegs = durationOfAllLegs.plus(durationOfLeg);
}
return durationOfAllLegs;
@@ -50,6 +50,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.LineDetails;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.RaceAbortedListener;
import com.sap.sailing.domain.tracking.RaceChangeListener;
import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider;
@@ -352,7 +353,7 @@ public class MockedTrackedRace implements DynamicTrackedRace {
}
@Override
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) {
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) {
return null;
}
@@ -0,0 +1,60 @@
package com.sap.sailing.gwt.ui.adminconsole;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.sap.sailing.gwt.ui.client.StringMessages;
/**
* Can be used in {@link AbstractEventManagementPanel}s to enable some sort of time-delayed race simulation.
* Provides a checkbox (see {@link #isSimulate()}) that enables simulation and an offset in minutes (see
* {@link #getOffsetToStartTimeInMinutes()}).
*
* @author Axel Uhl (d043530)
*
*/
public class SimulationPanel extends VerticalPanel {
private static final String ZERO_AS_STRING = "0";
final CheckBox simulateWithStartTimeNowCheckBox;
final TextBox offsetToStartTimeOfSimulatedRaceTextBox;
public SimulationPanel(StringMessages stringMessages) {
offsetToStartTimeOfSimulatedRaceTextBox = new TextBox();
offsetToStartTimeOfSimulatedRaceTextBox.setWidth("40px");
offsetToStartTimeOfSimulatedRaceTextBox.setEnabled(false);
offsetToStartTimeOfSimulatedRaceTextBox.setValue(ZERO_AS_STRING);
simulateWithStartTimeNowCheckBox = new CheckBox(stringMessages.simulateAsLiveRace());
simulateWithStartTimeNowCheckBox.ensureDebugId("SimulateWithStartTimeNowCheckBox");
simulateWithStartTimeNowCheckBox.setWordWrap(false);
simulateWithStartTimeNowCheckBox.setValue(Boolean.FALSE);
simulateWithStartTimeNowCheckBox.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
offsetToStartTimeOfSimulatedRaceTextBox.setEnabled(simulateWithStartTimeNowCheckBox.getValue());
offsetToStartTimeOfSimulatedRaceTextBox.setFocus(simulateWithStartTimeNowCheckBox.getValue());
}
});
final FlowPanel simulateAsLiveRacePanel = new FlowPanel();
simulateAsLiveRacePanel.add(simulateWithStartTimeNowCheckBox);
final Label offsetToStartLabel = new Label(stringMessages.simulateWithOffset());
final HorizontalPanel simulateWithOffsetPanel = new HorizontalPanel();
simulateWithOffsetPanel.add(offsetToStartLabel);
simulateWithOffsetPanel.add(offsetToStartTimeOfSimulatedRaceTextBox);
add(simulateAsLiveRacePanel);
add(simulateWithOffsetPanel);
}
public boolean isSimulate() {
return simulateWithStartTimeNowCheckBox.getValue();
}
public String getOffsetToStartTimeInMinutes() {
return offsetToStartTimeOfSimulatedRaceTextBox.getValue();
}
}
@@ -23,7 +23,6 @@ import com.google.gwt.user.client.ui.CaptionPanel;
import com.google.gwt.user.client.ui.CheckBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;
import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HTMLTable.ColumnFormatter;
import com.google.gwt.user.client.ui.HorizontalPanel;
@@ -85,7 +84,6 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel {
private LabeledAbstractFilterablePanel<TracTracRaceRecordDTO> racesFilterablePanel;
private FlushableCellTable<TracTracRaceRecordDTO> racesTable;
private static final String ZERO_AS_STRING = "0";
public TracTracEventManagementPanel(final SailingServiceAsync sailingService, ErrorReporter errorReporter,
RegattaRefresher regattaRefresher, StringMessages stringMessages) {
@@ -275,32 +273,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel {
correctWindCheckBox.setWordWrap(false);
correctWindCheckBox.setValue(Boolean.TRUE);
final TextBox offsetToStartTimeOfSimulatedRaceTextBox = new TextBox();
offsetToStartTimeOfSimulatedRaceTextBox.setWidth("40px");
offsetToStartTimeOfSimulatedRaceTextBox.setEnabled(false);
offsetToStartTimeOfSimulatedRaceTextBox.setValue(ZERO_AS_STRING);
final CheckBox simulateWithStartTimeNowCheckBox = new CheckBox(stringMessages.simulateAsLiveRace());
simulateWithStartTimeNowCheckBox.ensureDebugId("SimulateWithStartTimeNowCheckBox");
simulateWithStartTimeNowCheckBox.setWordWrap(false);
simulateWithStartTimeNowCheckBox.setValue(Boolean.FALSE);
simulateWithStartTimeNowCheckBox.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
offsetToStartTimeOfSimulatedRaceTextBox.setEnabled(simulateWithStartTimeNowCheckBox.getValue());
offsetToStartTimeOfSimulatedRaceTextBox.setFocus(simulateWithStartTimeNowCheckBox.getValue());
}
});
final FlowPanel simulateAsLiveRacePanel = new FlowPanel();
simulateAsLiveRacePanel.add(simulateWithStartTimeNowCheckBox);
final Label offsetToStartLabel = new Label(stringMessages.simulateWithOffset());
final HorizontalPanel simulateWithOffsetPanel = new HorizontalPanel();
simulateWithOffsetPanel.add(offsetToStartLabel);
simulateWithOffsetPanel.add(offsetToStartTimeOfSimulatedRaceTextBox);
final SimulationPanel simulationPanel = new SimulationPanel(stringMessages);
final CheckBox ignoreTracTracMarkPassingsCheckbox = new CheckBox(stringMessages.useInternalAlgorithm());
ignoreTracTracMarkPassingsCheckbox.setWordWrap(false);
ignoreTracTracMarkPassingsCheckbox.setValue(Boolean.FALSE);
@@ -308,8 +281,7 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel {
layoutTable.setWidget(++row, 0, trackSettingsLabel);
layoutTable.setWidget(row, 1, trackWindCheckBox);
layoutTable.setWidget(++row, 1, correctWindCheckBox);
layoutTable.setWidget(++row, 1, simulateAsLiveRacePanel);
layoutTable.setWidget(++row, 1, simulateWithOffsetPanel);
layoutTable.setWidget(++row, 1, simulationPanel);
layoutTable.setWidget(++row, 1, ignoreTracTracMarkPassingsCheckbox);
// Filter
@@ -413,8 +385,8 @@ public class TracTracEventManagementPanel extends AbstractEventManagementPanel {
@Override
public void onClick(ClickEvent event) {
Duration offsetToStartTimeOfSimulatedRace = null;
if(simulateWithStartTimeNowCheckBox.getValue().booleanValue()) {
offsetToStartTimeOfSimulatedRace = getMillisecondsDurationFromMinutesAsString(offsetToStartTimeOfSimulatedRaceTextBox.getValue());
if (simulationPanel.isSimulate()) {
offsetToStartTimeOfSimulatedRace = getMillisecondsDurationFromMinutesAsString(simulationPanel.getOffsetToStartTimeInMinutes());
}
trackSelectedRaces(trackWindCheckBox.getValue(), correctWindCheckBox.getValue(),
offsetToStartTimeOfSimulatedRace, ignoreTracTracMarkPassingsCheckbox.getValue());
@@ -491,12 +491,12 @@ mediaPanel=音声と動画
url=URL
mimeType=MIME タイプ
title=表題
subtitle=Subtitle
copyright=Copyright
widthInPx=Width (pixel)
heightInPx=Height (pixel)
tags=Tags
size=Size
subtitle=サブタイトル
copyright=著作権
widthInPx=幅 (ピクセル)
heightInPx=高さ (ピクセル)
tags=タグ
size=サイズ
duration=時間 (h:mm:ss.ms)
addMediaTrack=音声/動画追加
addYoutubeTrack=YouTube 追加
@@ -1132,6 +1132,7 @@ lastScoreCorrectionsTime=最終得点修正時刻
lastScoreCorrectionsComment=最終得点修正コメント
setTimeToNow=時刻を ''現在'' に設定
useStartTimeInference=スタートマーク通過からの推定スタート時刻を使用
controlTrackingFromStartAndFinishTimes=スタート時刻およびフィニッシュ時刻からの追跡の制御
numberOfQueueMessagesSent=送信済キューメッセージ数
totalSize=合計サイズ
averageMessageSize=メッセージごとの平均サイズ (バイト)
@@ -1363,6 +1364,7 @@ gotoDesktop=デスクトップバージョンにジャンプ
goBack=戻る
showAllX=全 {0} を表示
collapseX={0} を圧縮
numberOfGPSFixes=GPS フィックス
fastestSailor=最速
numberWindFixes=風フィックス
@@ -1611,8 +1613,11 @@ raceAnalysis=レース分析
startAnalysis=スタート分析
winningLanes=勝利レーン
maximumNumberOfDiscards=カットレースの最大数
notificationRegattaConfigurationUpdatedUsingByMarks="マーク別" コースデザイナーを使用して、有効なレガッタ設定が行われました。
warningOverrideRegattaConfigurationCourseDesignerToByMarks=有効なレガッタ設定がすでに登録されていますが、コースデザイナーの設定が適切でありません。\n"マーク別" へのコースデザイナー設定を上書きしますか。
allRacesHaveBeenDenoted=すべてのレースがレースログ追跡に表示されています。
chartSelectionHint=ヒント: リーダーボード (リーダーボードタブ内) を使用して、チャートに表示する競技者を選択することもできます。
chartSelectionHint=ヒント: リーダーボード (リーダーボードタブ内) を使用して、チャートに表示する競技者を選択することもできます。
chooseALanguage=言語を選択してください
solutions=ソリューション
blog=ブログ
@@ -1644,7 +1649,7 @@ eventRegattaLeaderboardLastScoreUpdate=前回スコア更新
eventRegattaRaceNotTracked=未追跡
footerJobs=採用
footerCopyright=© 2011-2016 SAP Sailing Analytics
footerLanguage=SAP Sailing -
footerLanguage=SAP Sailing -
footerLegal=利用規約
footerPrivacy=個人情報保護
footerFeedback=フィードバック
@@ -1683,17 +1688,17 @@ contentSapInSailing11=世界最大のレガッタである Kieler Woche (Kiel We
contentSapInSailing12=SAP 5O5 World Championships のタイトルスポンサー
sapSailingAnalyticsTitle=SAP Sailing Analytics
contentSapSailingAnalytics1=レースランキング、速力、操縦、ベアリングなどに関係するリアルタイム分析を提供することにより、SAP はセーリングという複雑なスポーツを簡略に分かりやすく説明することをお手伝いしています。
contentSapSailingAnalytics2=SAP Sailing Analytics は、クラウドおよびインメモリ技術を活用し、リアルタイムで GPS および風計測データを処理し、どこからでもアクセスできる多様なフロントエンドでコンテンツを視覚化して、セーリングの世界に洞察力と透明性を提供します。
contentSapSailingAnalytics2=SAP Sailing Analytics は、クラウドおよびインメモリ技術を活用し、リアルタイムで GPS および風計測データを処理し、どこからでもアクセスできるさまざまなフロントエンドでコンテンツを視覚化することによってセーリングの世界にインサイトと透明性を提供します。
sapSailingAnalyticsReadMore=続きを読む
sapSailingRaceManager=SAP Sailing Race Manager
contentSapSailingRaceManager=SAP Sailing Race Manager は、セーリングレガッタ運営中にレース組織者が手動で行う作業や連絡業務を自動化/簡略化することによって効率と統制を向上させます。Race Committee アプリは、レースイベントの運営/管理業務を簡略化するのに役立ち、レース委員会がより円滑に運営されるよう支援します。
sapSailingRaceManagerReadMore=詳細情報
sapSailInSight=SAP Sail InSight
contentSapSailInSight=With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance.
sapSailInSightReadMore=Learn More
contentSapSailInSight=iPhone、iPad、および Android フォン向け SAP Sail InSight モバイルアプリにより、ヨット競技者はいつでもどこでもレガッタ参加やパフォーマンスを管理することができます。このアプリは SAP Sailing Analytics ソリューションに接続され、競技者が SAP Sail InSight 対応のレガッタへの受付を行い、自分がどこにいるかを艇速や帆走距離などのパフォーマンス指標とともに追跡し、自らのパフォーマンスを分析することを可能にします。
sapSailInSightReadMore=詳細情報
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta.
sapSailingBuoyPingerReadMore=Learn More
contentSapSailingBuoyPinger=Android フォン向け SAP Sailing Buoy Pinger モバイルアプリにより、ヨットレース運営者はいつでもどこでもレース用のマークの位置決めや、マーク設置担当者とのやり取りを簡略化することができます。このアプリは SAP Sailing Analytics ソリューションに接続され、レガッタ運営者がレース用のマークの地理的位置を追跡することを可能にし、レガッタに参加しているセーラーが SAP Sail InSight モバイルアプリを使用できるようにします。
sapSailingBuoyPingerReadMore=詳細情報
postRaceAnalytics=レース後分析
contentPostRaceAnalytics1=セーリングイベントで収集されたデータへのアクセスにより、戦略の策定や帆走の向上に役立つ、セーラーがそのパフォーマンスを評価および分析する機会が提供されます。
contentPostRaceAnalytics2=SAP Business Analytics ソリューションは、多くのレガッタおよびレースにわたって履歴データを照会および分析するツールをセーラー、コーチ、ファン、そして報道関係者に提供します。SAP HANA は、こうした人たちが自身のパフォーマンスを最適化し、予定されているレガッタで成功を収める戦略を策定するために簡単、迅速、かつ効率的な方法でパフォーマンスのパターン、傾向、およびセーラーのプロファイルを知ることを可能にします。
@@ -1702,4 +1707,6 @@ i18nDeSolutionsTrainingText=STG Training Diary は、選手の体調、ならび
strategySimulator=戦略シミュレータ
contentStrategySimulator=適切な戦略を選択すれば、レース中に大きな競争上の優位性を得ることが可能です。Strategy Simulator により、さまざまな風況および水流に対して最良のセーリング戦略を決定することが容易になります。風と水流をシミュレーションで直ちに変更することができるため、不確かな気象条件に対しても戦略の確かさを簡単に評価することができます。
strategySimulatorReadMore=詳細情報
impressum=刻印
impressum=刻印
lastFix=最終フィックス
filterDeviceMappings=デバイスマッピングのフィルタリング
@@ -491,12 +491,12 @@ mediaPanel=Аудио и видео
url=URL-адрес
mimeType=Тип MIME
title=Название
subtitle=Subtitle
subtitle=Подзаголовок
copyright=Copyright
widthInPx=Width (pixel)
heightInPx=Height (pixel)
tags=Tags
size=Size
widthInPx=Ширина (в пикселях)
heightInPx=Высота (в пикселях)
tags=Теги
size=Размер
duration=Длительность (ч:мм:сс.мс)
addMediaTrack=Добавить аудио/видео
addYoutubeTrack=Добавить Youtube
@@ -1132,6 +1132,7 @@ lastScoreCorrectionsTime=Время последнего исправления
lastScoreCorrectionsComment=Комментарий последнего исправления оценки
setTimeToNow=Установить время "сейчас"
useStartTimeInference=Использовать вывод о времени старта из прохождений стартовой отметки
controlTrackingFromStartAndFinishTimes=Контролировать отслеживание от времени старта и финиша
numberOfQueueMessagesSent=Число отправленных сообщений очереди
totalSize=Общий размер
averageMessageSize=Средний размер сообщения в байтах
@@ -1612,8 +1613,11 @@ raceAnalysis=Анализ гонки
startAnalysis=Начать анализ
winningLanes=Выигрышные маршруты
maximumNumberOfDiscards=Максимальное число исключений
notificationRegattaConfigurationUpdatedUsingByMarks=Активная конфигурация регаты была настроена с использованием дизайнера курса "По отметкам".
warningOverrideRegattaConfigurationCourseDesignerToByMarks=Активная конфигурация регаты уже существует, но с неверно выбранным дизайнером курса.\nПереопределить выбор дизайнера курса на "По отметкам"?
allRacesHaveBeenDenoted=Отслеживание журнала всех гонок отменено.
chartSelectionHint=Совет: таблицу лидеров (на вкладке ТАБЛИЦА ЛИДЕРОВ) также можно использовать для выбора участников, отображаемых в диаграмме.
chartSelectionHint=Совет: таблицу лидеров (на вкладке ТАБЛИЦА ЛИДЕРОВ) также можно использовать для выбора участников, отображаемых в диаграмме.
chooseALanguage=Выбор языка
solutions=Решения
blog=Блог
@@ -1640,7 +1644,7 @@ countdownMinute=мин.
countdownSecond=сек.
liveCapitalLetter=Активно
watchNow=Смотреть сейчас
seriesHeaderUpcoming=Предстоит
seriesHeaderUpcoming=Скоро
eventRegattaLeaderboardLastScoreUpdate=Последнее обновление оценок
eventRegattaRaceNotTracked=Не отслеживается
footerJobs=Работа
@@ -1690,11 +1694,11 @@ sapSailingRaceManager=SAP Sailing Race Manager
contentSapSailingRaceManager=Приложение SAP Sailing Race Manager повышает уровень эффективности и контроля для организаторов гонки за счет автоматизации и упрощения выполняемых вручную задач и общения во время проведения парусных регат. Приложение Race Committee помогает упростить проведение событий и управление ими, освобождая для оргкомитета время на лучшую проработку деталей.
sapSailingRaceManagerReadMore=Узнать больше
sapSailInSight=SAP Sail InSight
contentSapSailInSight=With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance.
sapSailInSightReadMore=Learn More
contentSapSailInSight=С помощью мобильного приложения SAP Sail InSight для смартфонов iPhone, iPad и Android яхтсмены гонок могут управлять своим участием и эффективностью в регате откуда и когда угодно. Это приложение подключается к решению SAP Sailing Analytics и позволяет яхтсменам выполнять вход в регаты, использующие SAP Sail InSight, отслеживать свое местоположение вместе с индикаторами эффективности, такими как скорость или пройденное расстояние, а также анализировать эффективность.
sapSailInSightReadMore=Узнать больше
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta.
sapSailingBuoyPingerReadMore=Learn More
contentSapSailingBuoyPinger=Мобильное приложение SAP Sailing Buoy Pinger для смартфонов Android позволяет руководителям парусных гонок упростить позиционирование отметок и общение с установщиками отметок откуда и когда угодно. Это приложение подключается к решению SAP Sailing Analytics и позволяет руководителям гонок отслеживать географическое местоположение гоночных отметок, обеспечивая использование мобильного приложения SAP Sail InSight для яхтсменов, участвующих в регате.
sapSailingBuoyPingerReadMore=Узнать больше
postRaceAnalytics=Аналитика после гонки
contentPostRaceAnalytics1=Доступ к данным, собранным на парусных событиях, дает мореходам возможность оценить и проанализировать свои показатели, помогая разрабатывать стратегии и повышать мастерство.
contentPostRaceAnalytics2=Решения SAP Business Analytics предоставляют мореходам, тренерам, болельщикам и СМИ инструменты для просмотра и анализа исторических данных по множеству регат и гонок. SAP HANA позволяет изучать паттерны эффективности, тенденции и профили мореходов простым, быстрым и эффективным образом для оптимизации своих показателей и разработки успешных стратегий на будущие регаты.
@@ -1704,4 +1708,5 @@ strategySimulator=Симулятор стратегии
contentStrategySimulator=Выбор правильной стратегии может обеспечить большое конкурентное преимущество во время гонки. Симулятор стратегии упрощает определение лучшей стратегии хождения под парусом для разных атмосферных условий и водных течений. Возможность мгновенного изменения ветра и течения в симуляции позволяет легко оценить надежность стратегии даже для неопределенных погодных условий.
strategySimulatorReadMore=Узнать больше
impressum=Печать
lastFix=Последний замер
filterDeviceMappings=Фильтровать сопоставления устройств
@@ -491,12 +491,12 @@ mediaPanel=音频和视频
url=URL
mimeType=MIME 类型
title=标题
subtitle=Subtitle
copyright=Copyright
widthInPx=Width (pixel)
heightInPx=Height (pixel)
tags=Tags
size=Size
subtitle=副标题
copyright=版权
widthInPx=宽度(像素)
heightInPx=高度(像素)
tags=标记
size=大小
duration=持续时间 (h:mm:ss.ms)
addMediaTrack=添加音频/视频
addYoutubeTrack=添加 Youtube
@@ -944,7 +944,7 @@ maximumRoundsForCourse=场地的最大轮次
resultsMailRecipient=结果邮件收件人
deviceConfiguration=设备配置
none=无
courseDesignerMode=场地设计师
courseDesignerMode=场地设计器
racingProcedure=比赛程序
courseNames=场地名称
generate=生成
@@ -1132,6 +1132,7 @@ lastScoreCorrectionsTime=上次得分更正时间
lastScoreCorrectionsComment=上次得分更正评论
setTimeToNow=将时间设为“现在”
useStartTimeInference=使用从开始绕标推断的开始时间
controlTrackingFromStartAndFinishTimes=从开始和结束时间控制跟踪
numberOfQueueMessagesSent=发送的队列消息的数量
totalSize=总大小
averageMessageSize=各消息的平均大小(字节)
@@ -1363,6 +1364,7 @@ gotoDesktop=进入桌面版
goBack=返回
showAllX=显示所有{0}
collapseX=折叠{0}
numberOfGPSFixes=GPS 修复
fastestSailor=最快
numberWindFixes=风力修复
@@ -1511,7 +1513,7 @@ playstoreInsightApp=https://play.google.com/store/apps/details?id=com.sap.sailin
playstoreRacecommitteeApp=https://play.google.com/store/apps/details?id=com.sap.sailing.racecommittee.app
playStoreBuoyPingerApp=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
appstoreSapSailnsight=http://appstore.com/sapsailinsight
appstoreSapSailInsight=http://appstore.com/sapsailinsight
appstoreStgTrainingstagebuch=http://appstore.com/stgtrainingstagebuch
appstoreBadgeSuffix=_en
distanceFromAveragePosition=与平均位置的距离
@@ -1611,14 +1613,17 @@ raceAnalysis=比赛轮次分析
startAnalysis=起航分析
winningLanes=获胜的船道
maximumNumberOfDiscards=最大放弃次数
notificationRegattaConfigurationUpdatedUsingByMarks=已使用“按标志”场地设计器设置有效的比赛配置。
warningOverrideRegattaConfigurationCourseDesignerToByMarks=有效的比赛配置已存在,但是场地设计器设置错误。\n是否将场地设计器设置覆盖为“按标志”?
allRacesHaveBeenDenoted=已为比赛轮次日志跟踪描述所有比赛轮次。
chartSelectionHint=提示:您还可以使用积分榜(在 LEADERBOARD 选项卡中)选择在记录中显示的参赛队。
chartSelectionHint=提示:您还可以使用积分榜(在 LEADERBOARD 选项卡中)选择在记录中显示的参赛队。
chooseALanguage=选择一种语言
solutions=解决方案
blog=博客
officalEventWebsite=官方活动网站
moreInfo=更多信息
viewAnalysis=查看分析
viewAnalysis=查看分析
overallLeaderboard=总积分榜
pleaseTryAgain=请重试...
reloadPage=重新加载页面
@@ -1649,7 +1654,7 @@ footerLegal=法律声明
footerPrivacy=隐私
footerFeedback=反馈
headerLogo=Sailing Analytics
headerSearchPlaceholder=搜索
headerSearchPlaceholder=搜索
mainEventShowAll=显示所有活动
mainEventTitle=来自风帆世界的最新活动
mainMediaSubtitle=徜徉在让人着迷、震撼人心的最新航行活动中。
@@ -1686,20 +1691,22 @@ contentSapSailingAnalytics1=通过实时分析比赛轮次排名、速度、操
contentSapSailingAnalytics2=SAP Sailing Analytics 利用云和内存技术实时处理 GPS 和风力测量数据,并在可从任何地方访问的前端显示,让用户全面、透彻地了解航行运动。
sapSailingAnalyticsReadMore=更多信息
sapSailingRaceManager=SAP Sailing Race Manager
contentSapSailingRaceManager=SAP Sailing Race Manager 通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。 Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。
contentSapSailingRaceManager=SAP Sailing Race Manager 通过自动化及简化赛事主办机构在航行比赛期间的人工作业和沟通,实现更高的效率和控制能力。Race Committee 应用简化举办和管理比赛活动的操作,使竞赛委员会的操作更加智能。
sapSailingRaceManagerReadMore=了解更多
sapSailInSight=SAP Sail InSight
contentSapSailInSight=With the SAP Sail InSight mobile app for iPhone, iPad and Android phones, sailboat racers can manage their regatta participation and performance anywhere and anytime. This app connects to the SAP Sailing Analytics solution and enables racers to sign in to an SAP Sail InSight-enabled regatta, track their location together with performance indicators like speed or distance sailed, and analyze their performance.
sapSailInSightReadMore=Learn More
contentSapSailInSight=使用适用于 iPhone、iPad 和 Android 手机的 SAP Sail InSight 移动应用,帆船选手可以随时随地管理其参赛情况和表现。此应用与 SAP Sailing Analytics 解决方案相连,选手可以登录启用 SAP Sail InSight 的比赛,跟踪其所处地点和速度或航行距离等表现指标,并分析其表现。
sapSailInSightReadMore=了解更多
sapSailingBuoyPinger=SAP Sailing Buoy Pinger
contentSapSailingBuoyPinger=With the SAP Sailing Buoy Pinger mobile app for Android phones, sailboat race managers can simplify the positioning of race marks and communication with the mark layers anywhere and anytime. This app connects to the SAP Sailing Analytics solution and allows regatta managers to track the geographical position of their race marks, enabling the use of the SAP Sail InSight mobile app by sailors participating in the regatta.
sapSailingBuoyPingerReadMore=Learn More
contentSapSailingBuoyPinger=使用适用于 Android 手机的 SAP Sailing Buoy Pinger 移动应用,帆船赛赛事经理可以随时随地简化比赛航标的定位和与布标裁判的沟通。此应用与 SAP Sailing Analytics 解决方案相连,比赛经理可以跟踪其比赛航标的地理位置,并允许参赛水手使用 SAP Sail InSight 移动应用。
sapSailingBuoyPingerReadMore=了解更多
postRaceAnalytics=赛后分析
contentPostRaceAnalytics1=水手通过访问航行活动期间收集的数据评估和分析其表现,帮助他们制定策略和优化航行方案。
contentPostRaceAnalytics2=SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。 SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。
contentPostRaceAnalytics2=SAP Business Analytics 解决方案为水手、教练、粉丝和媒体提供跨比赛和轮次浏览和分析历史数据的工具。SAP HANA 通过简单、快速和高效的方式使其了解表现模式、趋势和水手资料,从而提高自己的表现并为今后的比赛制定成功的策略。
i18nDeSolutionsTrainingHeadline=SAP Sail Better – STG Training Diary
i18nDeSolutionsTrainingText=STG Training Diary 可每天记录和分析运动员的身体状况,在水上训练、体能训练、船艇工作、心理、理论以及教育或旅行等其他活动领域的训练力度。
strategySimulator=策略模拟器
contentStrategySimulator=选择正确的策略可在比赛期间极大地提高竞争优势。 策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。 由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。
contentStrategySimulator=选择正确的策略可在比赛期间极大地提高竞争优势。策略模拟器为不同的风力条件和水流简化确定最佳的航行策略。由于可以在模拟中即时更改风和水流,即便在不确定的天气条件下,也可以轻松地评估策略的稳健性。
strategySimulatorReadMore=了解更多
impressum=版本说明
impressum=版本说明
lastFix=上次修复
filterDeviceMappings=筛选设备映射
@@ -27,6 +27,8 @@ import com.sap.sse.common.settings.Settings;
import com.sap.sse.gwt.client.ErrorReporter;
import com.sap.sse.gwt.client.async.AsyncActionsExecutor;
import com.sap.sse.gwt.client.controls.busyindicator.SimpleBusyIndicator;
import com.sap.sse.gwt.client.controls.slider.TimeTicksCalculator;
import com.sap.sse.gwt.client.controls.slider.TimeTicksCalculator.NormalizedInterval;
import com.sap.sse.gwt.client.player.TimeListener;
import com.sap.sse.gwt.client.player.TimeRangeChangeListener;
import com.sap.sse.gwt.client.player.TimeRangeWithZoomProvider;
@@ -66,6 +68,8 @@ public abstract class AbstractRaceChart<SettingsType extends Settings> extends A
/** the tick count must be the same as TimeSlider.TICKCOUNT, otherwise the time ticks will be not synchronized */
private final int TICKCOUNT = 10;
public static final long MINUTE_IN_MILLIS = 60 * 1000;
private boolean ignoreNextClickEvent;
@@ -158,7 +162,12 @@ public abstract class AbstractRaceChart<SettingsType extends Settings> extends A
if (!isZoomed) {
isZoomed = true;
}
timeRangeWithZoomProvider.setTimeZoom(new Date(xAxisMin), new Date(xAxisMax), this);
//Set a minute as max time zoom just as for chart
if (xAxisMax - xAxisMin > MINUTE_IN_MILLIS) {
timeRangeWithZoomProvider.setTimeZoom(new Date(xAxisMin), new Date(xAxisMax), this);
} else {
return false;
}
} catch (Exception e) {
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
@@ -193,7 +202,9 @@ public abstract class AbstractRaceChart<SettingsType extends Settings> extends A
if (minTimepoint != null && maxTimepoint != null) {
xAxis.setExtremes(minTimepoint.getTime(), maxTimepoint.getTime(), /* redraw */ false, false);
long tickInterval = (maxTimepoint.getTime() - minTimepoint.getTime()) / TICKCOUNT;
xAxis.setTickInterval(tickInterval);
TimeTicksCalculator calculator = new TimeTicksCalculator();
NormalizedInterval normalizedInterval = calculator.normalizeTimeTickInterval(tickInterval);
xAxis.setTickInterval(normalizedInterval.count * normalizedInterval.unitRange);
}
if (minTimepoint != null) {
xAxis.setMin(minTimepoint.getTime());
@@ -2173,7 +2173,7 @@ public class SailingServiceImpl extends ProxiedRemoteServiceServlet implements S
} else {
actualTimePoint = timePoint;
}
RaceDefinition race = trackedRace.getRace();
final RaceDefinition race = trackedRace.getRace();
int rank = 1;
final List<Competitor> competitorsFromBestToWorst = trackedRace.getCompetitorsFromBestToWorst(actualTimePoint);
for (Competitor competitor : competitorsFromBestToWorst) {
@@ -10,10 +10,7 @@ import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.Set;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.ScheduledExecutorService;
import java.util.logging.Logger;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
@@ -86,7 +83,7 @@ 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.util.impl.ThreadFactoryWithPriority;
import com.sap.sse.util.ThreadPoolUtil;
public class SimulatorServiceImpl extends RemoteServiceServlet implements SimulatorService {
@@ -107,12 +104,7 @@ public class SimulatorServiceImpl extends RemoteServiceServlet implements Simula
private SpeedWithBearing averageWind = null;
public SimulatorServiceImpl() {
final int THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors()/2, 3);
Executor simulatorExecutor = new ThreadPoolExecutor(/* corePoolSize */THREAD_POOL_SIZE,
/* maximumPoolSize */THREAD_POOL_SIZE,
/* keepAliveTime */60, TimeUnit.SECONDS,
/* workQueue */new LinkedBlockingQueue<Runnable>(),
new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true));
final ScheduledExecutorService simulatorExecutor = ThreadPoolUtil.INSTANCE.getDefaultForegroundTaskThreadPoolExecutor();
// TODO: initialize smart-future-cache for simulation-results and add to simulation-service
simulationService = SimulationServiceFactory.INSTANCE.getService(simulatorExecutor, null);
}
@@ -4,7 +4,16 @@
<div id="mainContent">
<h4 class="articleHeadline">What's New - SAP Sailing Buoy Pinger</h4>
<div class="innerContent">
<h5 class="articleSubheadline">October 2016</h5>
<ul class="bulletList">
<li>Improved pinging accuracy by using a more controllable API:
The app will now only use true GPS signals instead of accepting
positions acquired through network triangulation.</li>
<li>In some rare situations the app crashed, if you want to scan a QR-Code.</li>
</ul>
<h5 class="articleSubheadline">June 2016</h5>
<ul class="bulletList">
<li>First PlayStore release</li>
</ul>
@@ -4,7 +4,19 @@
<div id="mainContent">
<h4 class="articleHeadline">What's New - SAP Sail InSight</h4>
<div class="innerContent">
<h5 class="articleSubheadline">October 2016</h5>
<ul class="bulletList">
<li>Improved tracking reliability and accuracy,
especially when the app is in background by using a more reliable and controllable API:
The app will now only use true GPS signals instead of accepting
positions acquired through network triangulation.</li>
<li>There now is a more detailed energy saving option,
and the automatic setting overriding user preferences has been removed.</li>
<li>In some rare situations the app crashed, if you want to scan a QR-Code.</li>
</ul>
<h5 class="articleSubheadline">August 2016</h5>
<ul class="bulletList">
<li>The GPS fix sending was optimize to send all data in a bulk. Instead of sending
every fix separately. This will reduce the battery consumption and minimize the
@@ -15,6 +27,7 @@
</ul>
<h5 class="articleSubheadline">July 2016</h5>
<ul class="bulletList">
<li>It is possible to track buoys for multiple regattas. Scan all buoy QR-codes and
start tracking for one buoy. It will track all buoys.</li>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T10:44:58Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.polars.datamining/resources/stringmessages/Polars_StringMessages.properties" source-language="en" target-language="ja">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:10Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.polars.datamining/resources/stringmessages/Polars_StringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="99b784fd6920a22f02e85034e5d2ef70" form="base64">H4sIAAAAAAAAAF2PTQrCQAyF93OKXEH32TiiFBSGunAdOrEObTPQaaHHd/6s4Cbv4yW8JMaPNOs3OTmgSRyU2a0jnqgbWCzUVksdaz+uk+AP1Y37RixvGAEylYwzLVRCIWExw3fN1TwubsMoEFU9ndiWpGdMBBmz2QTt5eUsy4I7QR66M4V15ika8TQZMBVVb67b/j74ALSew+fwAAAA</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:06:35Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.polars.datamining/resources/stringmessages/Polars_StringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:10Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.polars.datamining/resources/stringmessages/Polars_StringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="99b784fd6920a22f02e85034e5d2ef70" form="base64">H4sIAAAAAAAAAF2PTQrCQAyF93OKXEH32TiiFBSGunAdOrEObTPQaaHHd/6s4Cbv4yW8JMaPNOs3OTmgSRyU2a0jnqgbWCzUVksdaz+uk+AP1Y37RixvGAEylYwzLVRCIWExw3fN1TwubsMoEFU9ndiWpGdMBBmz2QTt5eUsy4I7QR66M4V15ika8TQZMBVVb67b/j74ALSew+fwAAAA</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:06:35Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.polars.datamining/resources/stringmessages/Polars_StringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:10Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sailing.polars.datamining/resources/stringmessages/Polars_StringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="99b784fd6920a22f02e85034e5d2ef70" form="base64">H4sIAAAAAAAAAF2PTQrCQAyF93OKXEH32TiiFBSGunAdOrEObTPQaaHHd/6s4Cbv4yW8JMaPNOs3OTmgSRyU2a0jnqgbWCzUVksdaz+uk+AP1Y37RixvGAEylYwzLVRCIWExw3fN1TwubsMoEFU9ndiWpGdMBBmz2QTt5eUsy4I7QR66M4V15ika8TQZMBVVb67b/j74ALSew+fwAAAA</internal-file>
@@ -17,8 +17,12 @@ public class FlatGPSFixJsonSerializer implements JsonSerializer<GPSFix> {
result.put(FIELD_LON_DEG, object.getPosition().getLngDeg());
result.put(FIELD_LAT_DEG, object.getPosition().getLatDeg());
result.put(FIELD_TIME_MILLIS, object.getTimePoint().asMillis());
// TODO the default accuracy is 1.0; when fixes ever have an accuracy, report it here
result.put(FIELD_ACCURACY, 1.0);
// TODO Insert Accuracy if someday available from the server
// Buoy Pinger app will interpret no accuracy in JSON message as MarkPingInfo.NOT_SET_BY_USER (-1) and store that in DB
// For the user these values are displayed as R.string.unknown ("n/a");
// (CheckinManager in Buoy Pinger can accept messages with and without accuracy)
// result.put(FIELD_ACCURACY, XXXXXXXXX);
return result;
}
}
@@ -31,13 +31,12 @@ import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Pair;
/**
* Import servlet for sensor data files. Importers are located through the OSGi service registry and mathed against the
* name provided by the upload formular.
* Import servlet for sensor data files. Importers are located through the OSGi service registry and matched against the
* name provided by the upload form.
*/
public class SensorDataImportServlet extends AbstractFileUploadServlet {
private static final long serialVersionUID = 1120226743039934620L;
private static final Logger logger = Logger.getLogger(SensorDataImportServlet.class.getName());
private static final int READ_BUFFER_SIZE = 1024 * 1024 * 1024;
public void storeFixes(Iterable<DoubleVectorFix> fixes, DeviceIdentifier deviceIdentifier) {
try {
@@ -6,7 +6,6 @@ import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -18,7 +17,7 @@ import com.sap.sailing.domain.common.trackfiles.TrackFilesFormat;
import com.sap.sailing.domain.trackimport.FormatNotSupportedException;
import com.sap.sailing.domain.tracking.TrackedRace;
import com.sap.sailing.server.trackfiles.TrackFileExporter;
import com.sap.sse.util.impl.ThreadFactoryWithPriority;
import com.sap.sse.util.ThreadPoolUtil;
/**
* Export data to well-known formats such as GPX, KML etc. Internally, the RouteConverter Library is used.
@@ -56,7 +55,7 @@ public class TrackFileExporterImpl implements TrackFileExporter {
};
List<WriteRaceDataCallable> callables = new ArrayList<>();
ExecutorService executor = Executors.newCachedThreadPool(new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true));
ExecutorService executor = ThreadPoolUtil.INSTANCE.getDefaultForegroundTaskThreadPoolExecutor();
List<String> errors = new ArrayList<>();
for (TrackedRace race : races) {
for (TrackFilesDataSource d : data) {
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T10:45:20Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.server/resources/stringmessages/StringMessages.properties" source-language="en" target-language="ja">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:47Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.server/resources/stringmessages/StringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="c8a799f35957b659646c59bd67421d2f" form="base64">H4sIAAAAAAAAAKVUTW/bMAy9+1cQ2CEbkAVpdwvgQ5YuWIChDZr2sKPs0A1XWTIk2VkQ5L+PkvNhtzZarBfbEh/f4yNlGZHiQt3jk3BO3GU/KlQuNrwJ+/EBSIGpQzDYXx0GoDNAD+Hl9WEQmZA9l4iun+Tz/tvhy5tUEsUaTaKFWZ8YGlsMGrdzmCJqJq02enuPtpTO/iL1/EBOYuw3WTbshmLtXYWmIty+xPgY6GMwQC+svOiAX0AeMFVC7iy90vZNEMdYFDHczaSw1qfMSZHd4HpVJn8wdbHfg0wb8ChIPSz0byMsZEcsfAWFZ0sgKkFSJBKjTzCewJn+VuQ4hKtJ0L9BmxoqHGnVXcB3vd7Ftw3ajiJ4fNxyEAYvoqOGoVWqDc60MeyEhU6emqyt3A6NPg+NIXdaeSH9ATepzgt05LRZMhJt3aCTl9k5GjgKD1kfJwOSFHpaUZ+NYOVC1zuPbsVg4V1y7KJV93+NIW0p9dbeM4de8c5BtLXePFaPBSeQevLH9WRmWv9VHWPdkpRgnTAOrObS3vdTDOF6Ao5y7JYNNuavxXzdDUFRFEb/pVw4lDtgJN9q7MSWyVloobhmBvBn/FuXwTX3CqliKVDaUUZpCHOvjM5hNV3Cirviw+GCcZTaETxocKVRfBtm7awhFDwki1CRJQc7XRooLRrg0jLiaXNZboP+9DxDglJvR5GPL+tw/Oixx0VEeWGIb+FF/Y74WYl0Fy/rd2SFLF1t5qeQUvumDKN/18D20lAGAAA=</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:03Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.server/resources/stringmessages/StringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:47Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.server/resources/stringmessages/StringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="c8a799f35957b659646c59bd67421d2f" form="base64">H4sIAAAAAAAAAKVUTW/bMAy9+1cQ2CEbkAVpdwvgQ5YuWIChDZr2sKPs0A1XWTIk2VkQ5L+PkvNhtzZarBfbEh/f4yNlGZHiQt3jk3BO3GU/KlQuNrwJ+/EBSIGpQzDYXx0GoDNAD+Hl9WEQmZA9l4iun+Tz/tvhy5tUEsUaTaKFWZ8YGlsMGrdzmCJqJq02enuPtpTO/iL1/EBOYuw3WTbshmLtXYWmIty+xPgY6GMwQC+svOiAX0AeMFVC7iy90vZNEMdYFDHczaSw1qfMSZHd4HpVJn8wdbHfg0wb8ChIPSz0byMsZEcsfAWFZ0sgKkFSJBKjTzCewJn+VuQ4hKtJ0L9BmxoqHGnVXcB3vd7Ftw3ajiJ4fNxyEAYvoqOGoVWqDc60MeyEhU6emqyt3A6NPg+NIXdaeSH9ATepzgt05LRZMhJt3aCTl9k5GjgKD1kfJwOSFHpaUZ+NYOVC1zuPbsVg4V1y7KJV93+NIW0p9dbeM4de8c5BtLXePFaPBSeQevLH9WRmWv9VHWPdkpRgnTAOrObS3vdTDOF6Ao5y7JYNNuavxXzdDUFRFEb/pVw4lDtgJN9q7MSWyVloobhmBvBn/FuXwTX3CqliKVDaUUZpCHOvjM5hNV3Cirviw+GCcZTaETxocKVRfBtm7awhFDwki1CRJQc7XRooLRrg0jLiaXNZboP+9DxDglJvR5GPL+tw/Oixx0VEeWGIb+FF/Y74WYl0Fy/rd2SFLF1t5qeQUvumDKN/18D20lAGAAA=</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:03Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.server/resources/stringmessages/StringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:47Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sailing.server/resources/stringmessages/StringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="c8a799f35957b659646c59bd67421d2f" form="base64">H4sIAAAAAAAAAKVUTW/bMAy9+1cQ2CEbkAVpdwvgQ5YuWIChDZr2sKPs0A1XWTIk2VkQ5L+PkvNhtzZarBfbEh/f4yNlGZHiQt3jk3BO3GU/KlQuNrwJ+/EBSIGpQzDYXx0GoDNAD+Hl9WEQmZA9l4iun+Tz/tvhy5tUEsUaTaKFWZ8YGlsMGrdzmCJqJq02enuPtpTO/iL1/EBOYuw3WTbshmLtXYWmIty+xPgY6GMwQC+svOiAX0AeMFVC7iy90vZNEMdYFDHczaSw1qfMSZHd4HpVJn8wdbHfg0wb8ChIPSz0byMsZEcsfAWFZ0sgKkFSJBKjTzCewJn+VuQ4hKtJ0L9BmxoqHGnVXcB3vd7Ftw3ajiJ4fNxyEAYvoqOGoVWqDc60MeyEhU6emqyt3A6NPg+NIXdaeSH9ATepzgt05LRZMhJt3aCTl9k5GjgKD1kfJwOSFHpaUZ+NYOVC1zuPbsVg4V1y7KJV93+NIW0p9dbeM4de8c5BtLXePFaPBSeQevLH9WRmWv9VHWPdkpRgnTAOrObS3vdTDOF6Ao5y7JYNNuavxXzdDUFRFEb/pVw4lDtgJN9q7MSWyVloobhmBvBn/FuXwTX3CqliKVDaUUZpCHOvjM5hNV3Cirviw+GCcZTaETxocKVRfBtm7awhFDwki1CRJQc7XRooLRrg0jLiaXNZboP+9DxDglJvR5GPL+tw/Oixx0VEeWGIb+FF/Y74WYl0Fy/rd2SFLF1t5qeQUvumDKN/18D20lAGAAA=</internal-file>
@@ -45,7 +45,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="boatClassRaceFinishedBody" resname="boatClassRaceFinishedBody">
<source>New results for boat class <ph id="1">{0}</ph> in <ph id="2">{1}</ph> are available.</source>
<target state="translated"><ph id="2">{1}</ph>中船只级别<ph id="1">{0}</ph>的新结果可用。</target>
<target state="signed-off"><ph id="2">{1}</ph>中船只级别<ph id="1">{0}</ph>的新结果可用。</target>
<note annotates="source" from="Developer">0: boatClassName, 1: raceDescription</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="boatClassScoreCorrectionSubject" resname="boatClassScoreCorrectionSubject">
@@ -54,7 +54,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="boatClassScoreCorrectionBody" resname="boatClassScoreCorrectionBody">
<source>New results for boat class <ph id="1">{0}</ph> in <ph id="2">{1}</ph> are available.</source>
<target state="translated"><ph id="2">{1}</ph>中船只级别<ph id="1">{0}</ph>的新结果可用。</target>
<target state="signed-off"><ph id="2">{1}</ph>中船只级别<ph id="1">{0}</ph>的新结果可用。</target>
<note annotates="source" from="Developer">0: boatClassName, 1: leaderboardDescription</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorPassesFinishSubject" resname="competitorPassesFinishSubject">
@@ -72,7 +72,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="competitorScoreCorrectionBody" resname="competitorScoreCorrectionBody">
<source>New results for competitor <ph id="1">{0}</ph> in <ph id="2">{1}</ph> are available.</source>
<target state="translated"><ph id="2">{1}</ph>中参赛队<ph id="1">{0}</ph>的新结果可用。</target>
<target state="signed-off"><ph id="2">{1}</ph>中参赛队<ph id="1">{0}</ph>的新结果可用。</target>
<note annotates="source" from="Developer">0: competitorName, 1: leaderboardDescription</note>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="boatClassUpcomingRaceSubject" resname="boatClassUpcomingRaceSubject">
@@ -102,7 +102,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="salutation" resname="salutation">
<source>Hallo <ph id="1">{0}</ph>,</source>
<target state="translated"><ph id="1">{0}</ph>您好!</target>
<target state="signed-off"><ph id="1">{0}</ph>您好!</target>
</trans-unit>
</body>
</file>
@@ -28,7 +28,6 @@ import java.util.Map.Entry;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;
@@ -605,7 +604,7 @@ public class RacingEventServiceImpl implements RacingEventService, ClearStateTes
operationExecutionListeners = new ConcurrentHashMap<>();
courseListeners = new ConcurrentHashMap<>();
persistentRegattasForRaceIDs = new ConcurrentHashMap<>();
Executor simulatorExecutor = ThreadPoolUtil.INSTANCE.getDefaultBackgroundTaskThreadPoolExecutor();
final ScheduledExecutorService simulatorExecutor = ThreadPoolUtil.INSTANCE.getDefaultBackgroundTaskThreadPoolExecutor();
// TODO: initialize smart-future-cache for simulation-results and add to simulation-service
simulationService = SimulationServiceFactory.INSTANCE.getService(simulatorExecutor, this);
this.raceLogReplicator = new RaceLogReplicatorAndNotifier(this);
@@ -41,6 +41,7 @@ import com.sap.sailing.domain.tracking.GPSFixTrack;
import com.sap.sailing.domain.tracking.LineDetails;
import com.sap.sailing.domain.tracking.Maneuver;
import com.sap.sailing.domain.tracking.MarkPassing;
import com.sap.sailing.domain.tracking.MarkPositionAtTimePointCache;
import com.sap.sailing.domain.tracking.RaceAbortedListener;
import com.sap.sailing.domain.tracking.RaceChangeListener;
import com.sap.sailing.domain.tracking.RaceExecutionOrderProvider;
@@ -213,7 +214,7 @@ public class DummyTrackedRace extends TrackedRaceWithWindEssentials {
}
@Override
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint) {
public Position getApproximatePosition(Waypoint waypoint, TimePoint timePoint, MarkPositionAtTimePointCache markPositionCache) {
return null;
}
@@ -1,6 +1,6 @@
package com.sap.sailing.server.simulation;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import com.sap.sailing.server.RacingEventService;
@@ -8,6 +8,6 @@ public interface SimulationServiceFactory {
static SimulationServiceFactory INSTANCE = new SimulationServiceFactoryImpl();
SimulationService getService(Executor executor, RacingEventService racingEventService);
SimulationService getService(ScheduledExecutorService executor, RacingEventService racingEventService);
}
@@ -1,12 +1,12 @@
package com.sap.sailing.server.simulation;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
import com.sap.sailing.server.RacingEventService;
public class SimulationServiceFactoryImpl implements SimulationServiceFactory {
public SimulationService getService(Executor executor, RacingEventService racingEventService) {
public SimulationService getService(ScheduledExecutorService executor, RacingEventService racingEventService) {
return new SimulationServiceImpl(executor, racingEventService);
}
@@ -8,9 +8,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
import java.util.concurrent.Future;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.logging.Logger;
@@ -59,13 +57,12 @@ import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsDurationImpl;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.util.SmartFutureCache;
import com.sap.sse.util.impl.ThreadFactoryWithPriority;
public class SimulationServiceImpl implements SimulationService {
private static final Logger logger = Logger.getLogger(SimulationService.class.getName());
final private Executor executor;
final private ScheduledExecutorService executor;
final private SmartFutureCache<LegIdentifier, SimulationResults, SmartFutureCache.EmptyUpdateInterval> cache;
final private RacingEventService racingEventService;
final private ScheduledExecutorService scheduler;
@@ -73,9 +70,9 @@ public class SimulationServiceImpl implements SimulationService {
final private HashMap<RaceIdentifier, LegChangeListener> legListeners;
final private long WAIT_MILLIS = 20000; // milliseconds to wait until earliest cache-update for simulation
public SimulationServiceImpl(Executor executor, RacingEventService racingEventService) {
public SimulationServiceImpl(ScheduledExecutorService executor, RacingEventService racingEventService) {
this.executor = executor;
this.scheduler = Executors.newScheduledThreadPool(1, new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true));
this.scheduler = executor;
this.racingEventService = racingEventService;
if (racingEventService != null) {
this.raceListeners = new HashMap<String, SimulationRaceListener>();
@@ -437,31 +434,26 @@ public class SimulationServiceImpl implements SimulationService {
Simulator simulator = new SimulatorImpl(simulationParameters);
Map<PathType, Path> result = new HashMap<PathType, Path>();
FutureTask<Path> taskOmniscient = null;
Future<Path> taskOmniscient = null;
if (simulationParameters.showOmniscient()) {
// schedule omniscient task
taskOmniscient = new FutureTask<Path>(() -> simulator.getPath(PathType.OMNISCIENT));
executor.execute(taskOmniscient);
taskOmniscient = executor.submit(() -> simulator.getPath(PathType.OMNISCIENT));
}
FutureTask<Path> task1TurnerLeft = null;
FutureTask<Path> task1TurnerRight = null;
Future<Path> task1TurnerLeft = null;
Future<Path> task1TurnerRight = null;
if (simulationParameters.getLegType() != LegType.REACHING) {
// schedule 1-turner tasks
task1TurnerLeft = new FutureTask<Path>(() -> simulator.getPath(PathType.ONE_TURNER_LEFT));
task1TurnerRight = new FutureTask<Path>(() -> simulator.getPath(PathType.ONE_TURNER_RIGHT));
executor.execute(task1TurnerLeft);
executor.execute(task1TurnerRight);
task1TurnerLeft = executor.submit(() -> simulator.getPath(PathType.ONE_TURNER_LEFT));
task1TurnerRight = executor.submit(() -> simulator.getPath(PathType.ONE_TURNER_RIGHT));
}
FutureTask<Path> taskOpportunistLeft = null;
FutureTask<Path> taskOpportunistRight = null;
Future<Path> taskOpportunistLeft = null;
Future<Path> taskOpportunistRight = null;
if (simulationParameters.showOpportunist()) {
// schedule opportunist tasks (which depend on 1-turner results)
taskOpportunistLeft = new FutureTask<Path>(() -> simulator.getPath(PathType.OPPORTUNIST_LEFT));
taskOpportunistRight = new FutureTask<Path>(() -> simulator.getPath(PathType.OPPORTUNIST_RIGHT));
executor.execute(taskOpportunistLeft);
executor.execute(taskOpportunistRight);
taskOpportunistLeft = executor.submit(() -> simulator.getPath(PathType.OPPORTUNIST_LEFT));
taskOpportunistRight = executor.submit(() -> simulator.getPath(PathType.OPPORTUNIST_RIGHT));
}
Path path1TurnerLeft = null;
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T10:45:09Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.datamining/resources/stringmessages/StringMessages.properties" source-language="en" target-language="ja">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:26Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.datamining/resources/stringmessages/StringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="299055c6be272a85a07b907e3c6ce40a" form="base64">H4sIAAAAAAAAAD2MQQoCMQxF9znFLHWnB8hicCXSjYMHKBpLsE2hTQdhmLsbpuoieT958MeZig+EYyc4erAX7ICpJbQB59+cLH8JjqXfnXDKTRS3bQ1KpWKCi2St+BKzMdJdWQL+Yha4Um1RJw7CT6aCy2Eddstx3cP/d5absG6GZTAHH6Y6WeOvAAAA</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:06:52Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.datamining/resources/stringmessages/StringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:26Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.datamining/resources/stringmessages/StringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="299055c6be272a85a07b907e3c6ce40a" form="base64">H4sIAAAAAAAAAD2MQQoCMQxF9znFLHWnB8hicCXSjYMHKBpLsE2hTQdhmLsbpuoieT958MeZig+EYyc4erAX7ICpJbQB59+cLH8JjqXfnXDKTRS3bQ1KpWKCi2St+BKzMdJdWQL+Yha4Um1RJw7CT6aCy2Eddstx3cP/d5absG6GZTAHH6Y6WeOvAAAA</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:06:52Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.datamining/resources/stringmessages/StringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:16:26Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.datamining/resources/stringmessages/StringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="299055c6be272a85a07b907e3c6ce40a" form="base64">H4sIAAAAAAAAAD2MQQoCMQxF9znFLHWnB8hicCXSjYMHKBpLsE2hTQdhmLsbpuoieT958MeZig+EYyc4erAX7ICpJbQB59+cLH8JjqXfnXDKTRS3bQ1KpWKCi2St+BKzMdJdWQL+Yha4Um1RJw7CT6aCy2Eddstx3cP/d5absG6GZTAHH6Y6WeOvAAAA</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T10:45:49Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.filestorage/resources/stringmessages/FileStorageStringMessages.properties" source-language="en" target-language="ja">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:17:40Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.filestorage/resources/stringmessages/FileStorageStringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="37afe0b1eb405886cd475fe305c64722" form="base64">H4sIAAAAAAAAAJ1SwW7bMAy95yt4bNHBPeTcQ4tiQLGiGNrmAxiZTojSkiHKSb3Dvn2klGTddSdL1OPj4/PT9SNpuHsrKRMMLKSQItyP+Ms+b+sO3vcEmXSWwnFXERBxJGAFhIyxTyNsNk+PMMmsUAydMu84ojQwxd4au5Wu70Mg1ae+DmwXsL4rITwQbAXjB5QEsxL8vu3wqLchU0+xMIoCRy2E/fWF6ActTToZrMCJ0Kr/wfgwhw8qL7ZXpfQDpAFa+UxxtUf1M0q2tgXok7V8A7PAnzNEol5B52HgwDYEJsojq3KKer2SFFBOgvOBg7mdMqj5fvbVFVUDK7S5p4tpHDv4Xt93JsY7qHdohf3Esr9xaNXsWgJG2Nqx+mFILLBFpU2Wv7iXVMhG2ZPPCykW1yuLSzHmEx7GWSsi0+DxuLDyVjwUo7HI4hGxMPhY34g+cZyEKnbPdDAF2wXGNMcaIDz1fV3vax8M2QKlBQuHTnFSZPH8BKumZk+mSTi0f3HxoGsGPzTl1Wc/w+b1GW7gsvhdLRx9JZgnSdibvirlyCL/btgYn88TKme9gV/PqXDtbRf7Mbij1R9TuhdHUgMAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:36Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.filestorage/resources/stringmessages/FileStorageStringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:17:40Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.filestorage/resources/stringmessages/FileStorageStringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="37afe0b1eb405886cd475fe305c64722" form="base64">H4sIAAAAAAAAAJ1SwW7bMAy95yt4bNHBPeTcQ4tiQLGiGNrmAxiZTojSkiHKSb3Dvn2klGTddSdL1OPj4/PT9SNpuHsrKRMMLKSQItyP+Ms+b+sO3vcEmXSWwnFXERBxJGAFhIyxTyNsNk+PMMmsUAydMu84ojQwxd4au5Wu70Mg1ae+DmwXsL4rITwQbAXjB5QEsxL8vu3wqLchU0+xMIoCRy2E/fWF6ActTToZrMCJ0Kr/wfgwhw8qL7ZXpfQDpAFa+UxxtUf1M0q2tgXok7V8A7PAnzNEol5B52HgwDYEJsojq3KKer2SFFBOgvOBg7mdMqj5fvbVFVUDK7S5p4tpHDv4Xt93JsY7qHdohf3Esr9xaNXsWgJG2Nqx+mFILLBFpU2Wv7iXVMhG2ZPPCykW1yuLSzHmEx7GWSsi0+DxuLDyVjwUo7HI4hGxMPhY34g+cZyEKnbPdDAF2wXGNMcaIDz1fV3vax8M2QKlBQuHTnFSZPH8BKumZk+mSTi0f3HxoGsGPzTl1Wc/w+b1GW7gsvhdLRx9JZgnSdibvirlyCL/btgYn88TKme9gV/PqXDtbRf7Mbij1R9TuhdHUgMAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:36Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.filestorage/resources/stringmessages/FileStorageStringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:17:40Z" original="/usr/sap/ljs/app/Converter_5483050776164983/java/com.sap.sse.filestorage/resources/stringmessages/FileStorageStringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="37afe0b1eb405886cd475fe305c64722" form="base64">H4sIAAAAAAAAAJ1SwW7bMAy95yt4bNHBPeTcQ4tiQLGiGNrmAxiZTojSkiHKSb3Dvn2klGTddSdL1OPj4/PT9SNpuHsrKRMMLKSQItyP+Ms+b+sO3vcEmXSWwnFXERBxJGAFhIyxTyNsNk+PMMmsUAydMu84ojQwxd4au5Wu70Mg1ae+DmwXsL4rITwQbAXjB5QEsxL8vu3wqLchU0+xMIoCRy2E/fWF6ActTToZrMCJ0Kr/wfgwhw8qL7ZXpfQDpAFa+UxxtUf1M0q2tgXok7V8A7PAnzNEol5B52HgwDYEJsojq3KKer2SFFBOgvOBg7mdMqj5fvbVFVUDK7S5p4tpHDv4Xt93JsY7qHdohf3Esr9xaNXsWgJG2Nqx+mFILLBFpU2Wv7iXVMhG2ZPPCykW1yuLSzHmEx7GWSsi0+DxuLDyVjwUo7HI4hGxMPhY34g+cZyEKnbPdDAF2wXGNMcaIDz1fV3vax8M2QKlBQuHTnFSZPH8BKumZk+mSTi0f3HxoGsGPzTl1Wc/w+b1GW7gsvhdLRx9JZgnSdibvirlyCL/btgYn88TKme9gV/PqXDtbRf7Mbij1R9TuhdHUgMAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T10:46:17Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ja">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:18:20Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:08:06Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:18:20Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:08:06Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:18:20Z" original="/usr/sap/ljs/app/Converter_2475291648609719345/java/com.sap.sse.gwt/src/com/sap/sse/gwt/client/controls/filestorage/StringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="85e48bcf9e250e66161b1b03d11cf699" form="base64">H4sIAAAAAAAAAH1SzU4jMQy+5yn8BIgXyKEa2MuuAFEEZ5O4naiZZOR4WiG0746TtLNod+Hi/2/8eb4UPJLdqjFMU9b4sTmTD/b+p3GYHEU7NGfQe7vx3pAPYm/VmEJ8JL5lzmw3CagGkJ1bmMnDaQyRAEVomiWkPUgGl5OgE5CRoKOv4CESFgI3kjvAW14YEskp86FOJ3IScgJMHoTfAPcY0pVxMReyQ7WNudADZ0d+YRowxnaGEKxFqNUz30eaY6Bity0D7qlp7Ic8TUsKDivhlyBjH7LtRuXzqQsnbZ+PMHpT0L+3aU73yKb0WLcIYIE+YFxeor/L8kRFlNxMLJXKUMuQsv4YbcC8dlaAfua/87rqi/G+v/IPjv5CdDaNvDZX1K+M/itY1N63uCOGiK/xAi3/YC8DF3hR5XZMZVS1mjcJJ7J3aswR40L2uVrjqTgOc30G9uZP3AXryiiTtAv7hbFNDZ+zqkbVqwreg7Xyowk+50RJ1i7sVOn3699mbu9yS1GfoD0/0tIy8wFPN7vhNwMAAA==</internal-file>
@@ -158,10 +158,24 @@ public class TimeTicksCalculator {
// get tick positions
i = 1;
/*
* There are the Competitor and the Wind highcharts which
* set time ticks depending on a locale. So we have to
* move the ticks in this time slider on the time zone offset
* to match the time ticks in time slider with ticks in highcharts
*/
minDate = new Date(minDate.getTime() - minDate.getTimezoneOffset() * TimeUnits.MINUTE.unitInMs);
minYear = minDate.getYear() + 1900;
int minMonth = minDate.getMonth() + 1;
int minDateDate = minDate.getDate();
long time = minDate.getTime();
/*
* After the moving time on time zone offset,
* we should make some steps back to find the race start time
*/
while (time > min) {
time -= interval * count;
}
// iterate and add tick positions at appropriate values
while (time < max) {
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T10:45:59Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties" source-language="en" target-language="ja">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:17:51Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties" source-language="en" target-language="ja">
<header>
<skl>
<internal-file crc="d38efe4badae12b0c22cb2104d135a30" form="base64">H4sIAAAAAAAAAIVX3W8bNwx/11+hPmUDVqN7LSAUhpNgxfI1J24wYC/qibYPOUs3SRcvGPq/j6Sk052Tri93EiVSFPnjh6w+gLrBj2jcodf2Ra3SX/Q6hKPzRt3lwUhZQw86qvSThSo6t9uB+WzVFQ9ka6UOcgjg5b8fvr0Tod1ZXL3HH67xdNOn6dDz9HaIae6GKFr7rLvWbJDfkpKf05wF2qTw0JkbF+8z54rm0rooQ5bxkQ4WjUc1geSoFQ9ZhAgQY2t3Qd3ngdi2XQRPG4O65DHvDIvFQhyhQwOBekz/X9KVon9Bzgf3BXy7feEjHpgko5PPTGQRJGELsdnjEu36bLfOH3RsnVWXmZ4s1dYVYqKbkE2XgQ0zWpXuVdce2tjBbMNH0XQugFrRFz2jDZ6AjuE/CabDFKnCo8DDILQxm/VVurtaGiNxJpNZhHtSt7+LRtsGOrXinyi+UMVLAg667RS8p9+4fD2E+Jt+hmW8Ah3izWqvvW4inXvXIQUkWLK2Hp0rj23cS0QXLUe6rmxGphGIP5aL8lBq2S/jHkXu0X4/khzOnY3XGj0zwj/IAx4nD0QcsbeaYGuEX1NRlhG413YHRZBa8bQGDm08h4gWS36QJk2EgQ6y9HMeJuRW8h8DBAbRZPmTMO5PN6xBd93Lo7bxwZ1P5Dj54gbpeVUecZmgaio7KfxJgPfOM1tGrFpayUQ0X98DAe24bztIrIz4fVZPN2gdGxUKer9MYxHQS+oeP8LDweF4zT8CHOFMgGmjusBPOnnTG01C166DoC743CHTpCei3Do/6otW/vXbnPMO/KENAW3zir+vS29JISTSuZQU1QXjkk6UBEuKHN5QxU+2VcF1Mx3NICl2TMpQ7HLM9wnpI+5HPVJ0b/r7oWkghO2A/lLTiUw7SES5wUJm2Dd7aJ7I0V6mUAyckCh/EjInCzJ7CzOCfbLuaC9eabxJC9n9ccxvIWXudDrfotwA9QCPOME4w3jY5zya9nAI8kbd4SnmRcI/bYghpaRlol0wSS3fkH3CJprBe3RJDa40r9FVBlPbpQispU2GqWFTuFbOcwcBY/0aIK7h76FFCOMJoXIb3MCRf8AtGFt1TwYACSRQFiUTCJpMHnVN2SIXPvSBQRGtxqxQal9TaRwyF5xtKW5Gdxrj8SLzYMjb5mEwZ0hHT83AzGAS7wx4Q1o5kTCLpcVf9ktCG0VDgmOAlGwQ3Yu5fgSzO+8wfmL7Ot5ZZj8uf1fTEylvqlzFzNUVONu5iqJLnlYQpXw4+IkT14AdRNbV8EqtM57Wcu7XFpHBmwvnI+IZu5NsoGLiFW9MrFXSV2j0EGpqrljbYzbF2laC+tQdk24NBV619uke7Y8h1eGQL88njal7PJHK41cAW/314dvZWfj+QWyb4u052J5H6ilY3PY079LyaJJZ1vs+60SpKSCSSutyv5Owq/ce7/y6DEzFzZw3x9WJt2aYwitfk94zgyLSkAbmwd2ndviSp2M+be1Crmr2ngT8YmYiDKuNrUqqSbShff4nMmU6fyHPMZ9MWgECGeGgQ2tim/M8iV5n4JPgqqu4IItJBVWTQps7fIJ36fI5d1Mh3GHL4HX3OG+j3wkLRy4yN3CUWCjwoJ5LWLZOrmfFNKn4lmbz1mes2dKqpyrh/ClEcQm7cXZ/bWRcw7WjNDI6Rjj0MRe3Bvs/7AnZJIn7reJqIaLfn2i3hYatpa2hGin1TpPC1O5EwLTUACYJWKGtuffBKjwSJVGzjvio6jh78Qydw9NcRtzhMNi24YAiK6dNpZpMV1PNTCK5UuBh2MdDqhUloxJF4NnTZmnZdbMO6afWNt1AzwZ6mwAbbOvdIbVhP2MnbLftbvDpMbOazsYn1iXr3jtLGag8txiVlCGzw7GPbOLocJ4J15kx7m6xux7zMcKmLNx1uoE97qTH10sP/ABCzxzr7omYt3aTj91U+vyhO2XJb17imJ3gZyliPcsKAqGy9JBfqvxCxv5canR8bl4w/MqzlR9wC2KhFwg9bnLLYaqTmN04e3aWqwCpk7sOM3HeorTi7JXy3swtuWwmxISveaeHd9ritfZ4G/6LHgns/ytsWwa9A3VXKJg1Ekn8B7YNScxQEAAA</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:46Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties" source-language="en" target-language="ru">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:17:50Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties" source-language="en" target-language="ru">
<header>
<skl>
<internal-file crc="d38efe4badae12b0c22cb2104d135a30" form="base64">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</internal-file>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file datatype="javapropertyresourcebundle" date="2016-08-12T11:07:46Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties" source-language="en" target-language="zh-CN">
<file datatype="javapropertyresourcebundle" date="2016-09-29T12:17:52Z" original="/usr/sap/ljs/app/Converter_4178050061048672287/java/com.sap.sse.security.ui/src/main/java/com/sap/sse/security/ui/client/i18n/StringMessages.properties" source-language="en" target-language="zh-CN">
<header>
<skl>
<internal-file crc="d38efe4badae12b0c22cb2104d135a30" form="base64">H4sIAAAAAAAAAIVX3W8bNwx/11+hPmUDVqN7LSAUhpNgxfI1J24wYC/qibYPOUs3SRcvGPq/j6Sk052Tri93EiVSFPnjh6w+gLrBj2jcodf2Ra3SX/Q6hKPzRt3lwUhZQw86qvSThSo6t9uB+WzVFQ9ka6UOcgjg5b8fvr0Tod1ZXL3HH67xdNOn6dDz9HaIae6GKFr7rLvWbJDfkpKf05wF2qTw0JkbF+8z54rm0rooQ5bxkQ4WjUc1geSoFQ9ZhAgQY2t3Qd3ngdi2XQRPG4O65DHvDIvFQhyhQwOBekz/X9KVon9Bzgf3BXy7feEjHpgko5PPTGQRJGELsdnjEu36bLfOH3RsnVWXmZ4s1dYVYqKbkE2XgQ0zWpXuVdce2tjBbMNH0XQugFrRFz2jDZ6AjuE/CabDFKnCo8DDILQxm/VVurtaGiNxJpNZhHtSt7+LRtsGOrXinyi+UMVLAg667RS8p9+4fD2E+Jt+hmW8Ah3izWqvvW4inXvXIQUkWLK2Hp0rj23cS0QXLUe6rmxGphGIP5aL8lBq2S/jHkXu0X4/khzOnY3XGj0zwj/IAx4nD0QcsbeaYGuEX1NRlhG413YHRZBa8bQGDm08h4gWS36QJk2EgQ6y9HMeJuRW8h8DBAbRZPmTMO5PN6xBd93Lo7bxwZ1P5Dj54gbpeVUecZmgaio7KfxJgPfOM1tGrFpayUQ0X98DAe24bztIrIz4fVZPN2gdGxUKer9MYxHQS+oeP8LDweF4zT8CHOFMgGmjusBPOnnTG01C166DoC743CHTpCei3Do/6otW/vXbnPMO/KENAW3zir+vS29JISTSuZQU1QXjkk6UBEuKHN5QxU+2VcF1Mx3NICl2TMpQ7HLM9wnpI+5HPVJ0b/r7oWkghO2A/lLTiUw7SES5wUJm2Dd7aJ7I0V6mUAyckCh/EjInCzJ7CzOCfbLuaC9eabxJC9n9ccxvIWXudDrfotwA9QCPOME4w3jY5zya9nAI8kbd4SnmRcI/bYghpaRlol0wSS3fkH3CJprBe3RJDa40r9FVBlPbpQispU2GqWFTuFbOcwcBY/0aIK7h76FFCOMJoXIb3MCRf8AtGFt1TwYACSRQFiUTCJpMHnVN2SIXPvSBQRGtxqxQal9TaRwyF5xtKW5Gdxrj8SLzYMjb5mEwZ0hHT83AzGAS7wx4Q1o5kTCLpcVf9ktCG0VDgmOAlGwQ3Yu5fgSzO+8wfmL7Ot5ZZj8uf1fTEylvqlzFzNUVONu5iqJLnlYQpXw4+IkT14AdRNbV8EqtM57Wcu7XFpHBmwvnI+IZu5NsoGLiFW9MrFXSV2j0EGpqrljbYzbF2laC+tQdk24NBV619uke7Y8h1eGQL88njal7PJHK41cAW/314dvZWfj+QWyb4u052J5H6ilY3PY079LyaJJZ1vs+60SpKSCSSutyv5Owq/ce7/y6DEzFzZw3x9WJt2aYwitfk94zgyLSkAbmwd2ndviSp2M+be1Crmr2ngT8YmYiDKuNrUqqSbShff4nMmU6fyHPMZ9MWgECGeGgQ2tim/M8iV5n4JPgqqu4IItJBVWTQps7fIJ36fI5d1Mh3GHL4HX3OG+j3wkLRy4yN3CUWCjwoJ5LWLZOrmfFNKn4lmbz1mes2dKqpyrh/ClEcQm7cXZ/bWRcw7WjNDI6Rjj0MRe3Bvs/7AnZJIn7reJqIaLfn2i3hYatpa2hGin1TpPC1O5EwLTUACYJWKGtuffBKjwSJVGzjvio6jh78Qydw9NcRtzhMNi24YAiK6dNpZpMV1PNTCK5UuBh2MdDqhUloxJF4NnTZmnZdbMO6afWNt1AzwZ6mwAbbOvdIbVhP2MnbLftbvDpMbOazsYn1iXr3jtLGag8txiVlCGzw7GPbOLocJ4J15kx7m6xux7zMcKmLNx1uoE97qTH10sP/ABCzxzr7omYt3aTj91U+vyhO2XJb17imJ3gZyliPcsKAqGy9JBfqvxCxv5canR8bl4w/MqzlR9wC2KhFwg9bnLLYaqTmN04e3aWqwCpk7sOM3HeorTi7JXy3swtuWwmxISveaeHd9ritfZ4G/6LHgns/ytsWwa9A3VXKJg1Ekn8B7YNScxQEAAA</internal-file>
@@ -65,7 +65,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="welcome" resname="welcome">
<source>Welcome, <ph id="1">{0}</ph>!</source>
<target state="translated"><ph id="1">{0}</ph>欢迎使用!</target>
<target state="signed-off"><ph id="1">{0}</ph>欢迎使用!</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="tryingToVerifyUser" resname="tryingToVerifyUser">
<source>Trying to verify user...</source>
@@ -161,7 +161,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="account" resname="account">
<source><ph id="1">{0}</ph>-Account</source>
<target state="translated"><ph id="1">{0}</ph> 账户</target>
<target state="signed-off"><ph id="1">{0}</ph> 账户</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="save" resname="save">
<source>Save</source>
@@ -349,7 +349,7 @@
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="settingsForComponent" resname="settingsForComponent">
<source>Settings for <ph id="1">{0}</ph></source>
<target state="translated"><ph id="1">{0}</ph>设置</target>
<target state="signed-off"><ph id="1">{0}</ph>设置</target>
</trans-unit>
<trans-unit datatype="x-urn:x-sap:sls-mlt:java:flexible-converter:messageformat" id="pleaseSelect" resname="pleaseSelect">
<source>Please select</source>
@@ -13,6 +13,7 @@ import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Future;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -23,6 +24,11 @@ import com.sap.sse.common.Util.Pair;
import com.sap.sse.concurrent.LockUtil;
import com.sap.sse.concurrent.NamedReentrantReadWriteLock;
import com.sap.sse.util.SmartFutureCache.UpdateInterval;
import com.sap.sse.util.impl.HasTracingGet;
import com.sap.sse.util.impl.HasTracingGetImpl;
import com.sap.sse.util.impl.KnowsExecutor;
import com.sap.sse.util.impl.KnowsExecutorAndTracingGet;
import com.sap.sse.util.impl.KnowsExecutorAndTracingGetImpl;
/**
* A cache for which a background update can be triggered. Readers can decide whether they want to wait for any ongoing
@@ -188,6 +194,10 @@ public class SmartFutureCache<K, V, U extends UpdateInterval<U>> {
return callable.call();
}
@Override
public String toString() {
return callable==null?"null":callable.toString();
}
}
/**
@@ -201,7 +211,9 @@ public class SmartFutureCache<K, V, U extends UpdateInterval<U>> {
* @author Axel Uhl (D043530)
*
*/
private class FutureTaskWithCancelBlocking extends FutureTask<V> implements Callable<V> {
private class FutureTaskWithCancelBlocking extends FutureTask<V> implements KnowsExecutor, Callable<V> {
private final KnowsExecutorAndTracingGet<V> tracingGetHelper;
private boolean runningAndReadUpdateInterval;
private final K key;
@@ -228,6 +240,7 @@ public class SmartFutureCache<K, V, U extends UpdateInterval<U>> {
public FutureTaskWithCancelBlocking(SettableCallable<V> callable, final K key, final U updateInterval,
final boolean callerWaitsSynchronouslyForResult, final Thread callerThread) {
super(callable);
tracingGetHelper = new KnowsExecutorAndTracingGetImpl<>();
callable.setCallable(this);
this.gettingThreads = new HashSet<>();
this.key = key;
@@ -274,7 +287,7 @@ public class SmartFutureCache<K, V, U extends UpdateInterval<U>> {
}
}
}
return super.get();
return tracingGetHelper.callGetAndTraceAfterEachTimeout(this);
}
@Override
@@ -363,6 +376,16 @@ public class SmartFutureCache<K, V, U extends UpdateInterval<U>> {
public U getUpdateInterval() {
return updateInterval;
}
@Override
public void setExecutorThisTaskIsScheduledFor(ThreadPoolExecutor executorThisTaskIsScheduledFor) {
tracingGetHelper.setExecutorThisTaskIsScheduledFor(executorThisTaskIsScheduledFor);
}
@Override
public String toString() {
return getClass().getName()+" [key="+key+", updateInterval="+updateInterval+", cacheUpdateComputer="+cacheUpdateComputer+"]";
}
}
public SmartFutureCache(CacheUpdater<K, V, U> cacheUpdateComputer, String nameForLocks) {
@@ -507,14 +530,33 @@ public class SmartFutureCache<K, V, U extends UpdateInterval<U>> {
notifyAll();
}
}
public String toString() {
final String result;
synchronized (this) {
if (isSet) {
result = value==null?"null":value.toString();
} else {
result = "unset";
}
}
return result;
}
}
private static class TransitiveFuture<T> implements Future<T> {
private final SettableFuture<Future<T>> future;
private final HasTracingGet<T> tracingGetHelper;
protected TransitiveFuture(SettableFuture<Future<T>> future) {
super();
this.future = future;
this.tracingGetHelper = new HasTracingGetImpl<T>() {
@Override
protected String getAdditionalTraceInfo() {
return "transitive future "+TransitiveFuture.this.future.toString();
}
};
}
@Override
@@ -546,7 +588,7 @@ public class SmartFutureCache<K, V, U extends UpdateInterval<U>> {
@Override
public T get() throws InterruptedException, ExecutionException {
return future.get().get();
return tracingGetHelper.callGetAndTraceAfterEachTimeout(this);
}
@Override
@@ -52,7 +52,7 @@ public interface ThreadPoolUtil {
*
* The same configuration as for {@link #getDefaultBackgroundTaskThreadPoolExecutor()} is used.
*/
ScheduledExecutorService createBackgroundTaskThreadPoolExecutor();
ScheduledExecutorService createBackgroundTaskThreadPoolExecutor(String name);
/**
* In case an application module really requires its own thread pool instead of
@@ -74,5 +74,7 @@ public interface ThreadPoolUtil {
*
* The same configuration as for {@link #getDefaultForegroundTaskThreadPoolExecutor()} is used.
*/
ScheduledExecutorService createForegroundTaskThreadPoolExecutor();
ScheduledExecutorService createForegroundTaskThreadPoolExecutor(String name);
ScheduledExecutorService createForegroundTaskThreadPoolExecutor(int size, String name);
}
@@ -0,0 +1,37 @@
package com.sap.sse.util.impl;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class FutureTaskWithTracingGet<V> extends FutureTask<V> {
private final HasTracingGet<V> hasTracingGet;
private final String traceInfo;
public FutureTaskWithTracingGet(String traceInfo, Callable<V> callable) {
super(callable);
this.traceInfo = traceInfo;
hasTracingGet = createHasTracingGet();
}
public FutureTaskWithTracingGet(String traceInfo, Runnable runnable, V result) {
super(runnable, result);
this.traceInfo = traceInfo;
hasTracingGet = createHasTracingGet();
}
@Override
public V get() throws InterruptedException, ExecutionException {
return hasTracingGet.callGetAndTraceAfterEachTimeout(this);
}
private HasTracingGet<V> createHasTracingGet() {
return new HasTracingGetImpl<V>() {
@Override
protected String getAdditionalTraceInfo() {
return traceInfo;
}
};
}
}
@@ -0,0 +1,16 @@
package com.sap.sse.util.impl;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeoutException;
public interface HasTracingGet<V> {
/**
* Keeps calling {@link Future#get(long, java.util.concurrent.TimeUnit)} with a timeout until a result is available
* or an exception other than a {@link TimeoutException} is thrown. When a timeout occurs, some trace output is
* written to the log. The method is guaranteed not to call {@link Future#get()} and therefore can be used in an
* implementation of a {@link Future#get()} method without causing an endless recursion as long as
* {@link Future#get(long, java.util.concurrent.TimeUnit)} is not calling this method.
*/
V callGetAndTraceAfterEachTimeout(Future<V> future) throws InterruptedException, ExecutionException;
}
@@ -0,0 +1,37 @@
package com.sap.sse.util.impl;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sse.common.Duration;
/**
* Can be used with a {@link Future} task and outputs trace messages to the log after {@link #MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET} milliseconds
* of a {@link #get()} call not returning. The {@link #getAdditionalTraceInfo()} method must be implemented by subclasses to provide some meaningful
* hint as to which object is currently timing out.
*
* @author Axel Uhl (d043530)
*
* @param <V>
*/
public abstract class HasTracingGetImpl<V> implements HasTracingGet<V> {
private static final Logger logger = Logger.getLogger(HasTracingGetImpl.class.getName());
private final long MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET = Duration.ONE_SECOND.times(5).asMillis();
public V callGetAndTraceAfterEachTimeout(Future<V> future) throws InterruptedException, ExecutionException {
while (true) {
try {
return future.get(MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET, TimeUnit.MILLISECONDS);
} catch (TimeoutException e) {
logger.log(Level.INFO, ""+Thread.currentThread()+": Timeout waiting for future task "+future+
" (retrying); "+ getAdditionalTraceInfo(), e);
}
}
}
protected abstract String getAdditionalTraceInfo();
}
@@ -0,0 +1,14 @@
package com.sap.sse.util.impl;
import java.util.concurrent.ThreadPoolExecutor;
/**
* A {@link ThreadPoolExecutor} can be set on this object. This is used, in particular, by the
* {@link NamedTracingScheduledThreadPoolExecutor} whenever a task of this type is enqueued.
*
* @author Axel Uhl (d043530)
*
*/
public interface KnowsExecutor {
void setExecutorThisTaskIsScheduledFor(ThreadPoolExecutor executorThisTaskIsScheduledFor);
}
@@ -0,0 +1,17 @@
package com.sap.sse.util.impl;
import java.util.concurrent.Future;
import com.sap.sse.util.ThreadPoolUtil;
/**
* Can be used with a {@link Future} task and outputs trace messages to the log after {@link #MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET} milliseconds
* of a {@link #get()} call not returning. When used in conjunction with a {@link NamedTracingScheduledThreadPoolExecutor} such as
* the ones returned by {@link ThreadPoolUtil}, the task will be
*
* @author Axel Uhl (d043530)
*
* @param <V>
*/
public interface KnowsExecutorAndTracingGet<V> extends KnowsExecutor, HasTracingGet<V> {
}
@@ -0,0 +1,31 @@
package com.sap.sse.util.impl;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import com.sap.sse.util.ThreadPoolUtil;
/**
* Can be used with a {@link Future} task and outputs trace messages to the log after
* {@link #MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET} milliseconds of a {@link #get()} call not returning. When used
* in conjunction with a {@link NamedTracingScheduledThreadPoolExecutor} such as the ones returned by
* {@link ThreadPoolUtil}, the task will be
*
* @author Axel Uhl (d043530)
*
* @param <V>
*/
public class KnowsExecutorAndTracingGetImpl<V> extends HasTracingGetImpl<V> implements KnowsExecutorAndTracingGet<V> {
private ThreadPoolExecutor executorThisTaskIsScheduledFor;
@Override
public void setExecutorThisTaskIsScheduledFor(ThreadPoolExecutor executorThisTaskIsScheduledFor) {
this.executorThisTaskIsScheduledFor = executorThisTaskIsScheduledFor;
}
@Override
protected String getAdditionalTraceInfo() {
return executorThisTaskIsScheduledFor == null ? "not scheduled"
: ("scheduled with executor " + executorThisTaskIsScheduledFor);
}
}
@@ -0,0 +1,164 @@
package com.sap.sse.util.impl;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Future;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.RunnableFuture;
import java.util.concurrent.RunnableScheduledFuture;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sse.common.Duration;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.impl.MillisecondsTimePoint;
import com.sap.sse.concurrent.ConcurrentWeakHashMap;
/**
* A scheduled thread pool executor with a name that produces {@link Future} tasks that write a trace message
* to the log after their {@link Future#get()} method hasn't produced a result for some time, then keep trying.
* The tasks are linked to this executor, also when a {@link KnowsExecutor} task is submitted to the {@link #execute(Runnable)}
* method, so that when they need to trace they
*
* @author Axel Uhl (d043530)
*
*/
public class NamedTracingScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor {
private static final Logger logger = Logger.getLogger(NamedTracingScheduledThreadPoolExecutor.class.getName());
private final String name;
/**
* If logging level is at least {@link Level#FINE}, each runnable's start time point is recorded in the
* {@link #beforeExecute(Thread, Runnable)} method. If at this logging level, the
* {@link #afterExecute(Runnable, Throwable)} method calculates the runnable's duration, and if above the
* {@link #DURATION_LOGGING_THRESHOLD}, writes a log entry.
*/
private final ConcurrentHashMap<Runnable, TimePoint> startTimePoints = new ConcurrentHashMap<>();
/**
* When logging {@link Level#FINE}, the {@link #schedule(Runnable, long, TimeUnit)} variants produce wrappers
* around the runnables whose content is nulled when {@link #afterExecute(Runnable, Throwable)} is called. In order
* to be able to log long-running runnables correctly, this map stores the connection between the wrapping
* future and the runnable wrapped by it.
*/
private final ConcurrentWeakHashMap<ScheduledFuture<?>, Runnable> wrappedRunnables = new ConcurrentWeakHashMap<>();
private final Duration DURATION_LOGGING_THRESHOLD = Duration.ONE_SECOND.times(5);
public NamedTracingScheduledThreadPoolExecutor(String name, int corePoolSize, RejectedExecutionHandler handler) {
super(corePoolSize, handler);
this.name = name;
}
public NamedTracingScheduledThreadPoolExecutor(String name, int corePoolSize, ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
super(corePoolSize, threadFactory, handler);
this.name = name;
}
public NamedTracingScheduledThreadPoolExecutor(String name, int corePoolSize, ThreadFactory threadFactory) {
super(corePoolSize, threadFactory);
this.name = name;
}
public NamedTracingScheduledThreadPoolExecutor(String name, int corePoolSize) {
super(corePoolSize);
this.name = name;
}
@Override
protected <V> RunnableScheduledFuture<V> decorateTask(Runnable runnable, RunnableScheduledFuture<V> task) {
return new ThreadPoolAwareRunnableScheduledFutureDelegate<>(this, task);
}
@Override
protected <V> RunnableScheduledFuture<V> decorateTask(Callable<V> callable, RunnableScheduledFuture<V> task) {
return new ThreadPoolAwareRunnableScheduledFutureDelegate<>(this, task);
}
@Override
protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value) {
return new ThreadPoolAwareFutureTask<T>(this, runnable, value);
}
@Override
protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable) {
return new ThreadPoolAwareFutureTask<T>(this, callable);
}
@Override
public void execute(Runnable command) {
if (command instanceof KnowsExecutor) {
((KnowsExecutor) command).setExecutorThisTaskIsScheduledFor(this);
}
super.execute(command);
}
@Override
protected void beforeExecute(Thread t, Runnable r) {
super.beforeExecute(t, r);
if (logger.isLoggable(Level.FINE)) {
startTimePoints.put(r, MillisecondsTimePoint.now());
}
}
@Override
protected void afterExecute(Runnable r, Throwable t) {
if (logger.isLoggable(Level.FINE)) {
final TimePoint end = MillisecondsTimePoint.now();
final TimePoint startTime = startTimePoints.remove(r);
Runnable theRunnableToLog = wrappedRunnables.get(r);
if (theRunnableToLog == null) {
theRunnableToLog = r;
}
if (startTime != null) {
final Duration duration = startTime.until(end);
if (duration.compareTo(DURATION_LOGGING_THRESHOLD) > 0) {
logger.fine("Runnable "+theRunnableToLog+" took "+duration+" to complete in executor "+this+(t==null?"":("It failed with exception "+t)));
}
} else {
logger.fine("Strange internal problem: had expected to find start time for "+r);
}
}
super.afterExecute(r, t);
}
@Override
public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit) {
final ScheduledFuture<?> result = super.schedule(command, delay, unit);
if (logger.isLoggable(Level.FINE)) {
// remember which runnable was wrapped by the future because it will have been nulled out when afterExecute is called
wrappedRunnables.put(result, command);
}
return result;
}
@Override
public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) {
final ScheduledFuture<?> result = super.scheduleAtFixedRate(command, initialDelay, period, unit);
if (logger.isLoggable(Level.FINE)) {
// remember which runnable was wrapped by the future because it will have been nulled out when afterExecute is called
wrappedRunnables.put(result, command);
}
return result;
}
@Override
public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) {
final ScheduledFuture<?> result = super.scheduleWithFixedDelay(command, initialDelay, delay, unit);
if (logger.isLoggable(Level.FINE)) {
// remember which runnable was wrapped by the future because it will have been nulled out when afterExecute is called
wrappedRunnables.put(result, command);
}
return result;
}
@Override
public String toString() {
return super.toString() + "[name=" + name + "]";
}
}
@@ -0,0 +1,62 @@
package com.sap.sse.util.impl;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.logging.Level;
import java.util.logging.Logger;
import com.sap.sse.util.ThreadPoolUtil;
/**
* A future task that outputs trace messages to the log after {@link #MILLIS_AFTER_WHICH_TO_TRACE_NON_RETURNING_GET} milliseconds
* of a {@link #get()} call not returning. When used in conjunction with a {@link NamedTracingScheduledThreadPoolExecutor} such as
* the ones returned by {@link ThreadPoolUtil}, the task will be updated by the executor when added to the queue. When the {@link #get()}
* method doesn't respond after the timeout period, the executor that scheduled this tasks, its name as well as its queue size
* are traced into the log.
*
* @author Axel Uhl (d043530)
*
* @param <V>
*/
public class ThreadPoolAwareFutureTask<V> extends FutureTask<V> implements KnowsExecutor {
private static final Logger logger = Logger.getLogger(ThreadPoolAwareFutureTask.class.getName());
private final KnowsExecutorAndTracingGet<V> getHelper = new KnowsExecutorAndTracingGetImpl<V>();
private final Object callableOrRunnableIfLoggingFine;
public ThreadPoolAwareFutureTask(ThreadPoolExecutor executor, Callable<V> callable) {
super(callable);
if (logger.isLoggable(Level.FINE)) {
callableOrRunnableIfLoggingFine = callable;
} else {
callableOrRunnableIfLoggingFine = null;
}
getHelper.setExecutorThisTaskIsScheduledFor(executor);
}
public ThreadPoolAwareFutureTask(ThreadPoolExecutor executor, Runnable runnable, V result) {
super(runnable, result);
if (logger.isLoggable(Level.FINE)) {
callableOrRunnableIfLoggingFine = runnable;
} else {
callableOrRunnableIfLoggingFine = null;
}
getHelper.setExecutorThisTaskIsScheduledFor(executor);
}
@Override
public void setExecutorThisTaskIsScheduledFor(ThreadPoolExecutor executorThisTaskIsScheduledFor) {
this.getHelper.setExecutorThisTaskIsScheduledFor(executorThisTaskIsScheduledFor);
}
@Override
public V get() throws InterruptedException, ExecutionException {
return getHelper.callGetAndTraceAfterEachTimeout(this);
}
@Override
public String toString() {
return super.toString()+(callableOrRunnableIfLoggingFine==null?"":(" "+callableOrRunnableIfLoggingFine.toString()));
}
}
@@ -0,0 +1,53 @@
package com.sap.sse.util.impl;
import java.util.concurrent.Delayed;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.RunnableScheduledFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class ThreadPoolAwareRunnableScheduledFutureDelegate<V> extends KnowsExecutorAndTracingGetImpl<V> implements KnowsExecutorAndTracingGet<V>, RunnableScheduledFuture<V> {
private final RunnableScheduledFuture<V> future;
public ThreadPoolAwareRunnableScheduledFutureDelegate(ThreadPoolExecutor executor, RunnableScheduledFuture<V> future) {
this.future = future;
setExecutorThisTaskIsScheduledFor(executor);
}
public long getDelay(TimeUnit unit) {
return future.getDelay(unit);
}
public void run() {
future.run();
}
public boolean isPeriodic() {
return future.isPeriodic();
}
public boolean cancel(boolean mayInterruptIfRunning) {
return future.cancel(mayInterruptIfRunning);
}
public int compareTo(Delayed o) {
return future.compareTo(o);
}
public boolean isCancelled() {
return future.isCancelled();
}
public boolean isDone() {
return future.isDone();
}
public V get() throws InterruptedException, ExecutionException {
return callGetAndTraceAfterEachTimeout(future);
}
public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException {
return future.get(timeout, unit);
}
}
@@ -1,21 +1,18 @@
package com.sap.sse.util.impl;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import com.sap.sse.util.ThreadPoolUtil;
public class ThreadPoolUtilImpl implements ThreadPoolUtil {
private static final int REASONABLE_THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors()/2, 3);
private static final int REASONABLE_THREAD_POOL_SIZE = Math.max(Runtime.getRuntime().availableProcessors()-1, 3);
private final ScheduledExecutorService defaultBackgroundTaskThreadPoolExecutor;
private final ScheduledExecutorService defaultForegroundTaskThreadPoolExecutor;
public ThreadPoolUtilImpl() {
defaultBackgroundTaskThreadPoolExecutor = Executors.newScheduledThreadPool(/* corePoolSize */ REASONABLE_THREAD_POOL_SIZE,
new ThreadFactoryWithPriority(Thread.NORM_PRIORITY-1, /* daemon */ true));
defaultForegroundTaskThreadPoolExecutor = Executors.newScheduledThreadPool(/* corePoolSize */ Math.max(Runtime.getRuntime().availableProcessors()-1, 6),
new ThreadFactoryWithPriority(Thread.NORM_PRIORITY, /* daemon */ true));
defaultBackgroundTaskThreadPoolExecutor = createBackgroundTaskThreadPoolExecutor("Default background executor");
defaultForegroundTaskThreadPoolExecutor = createForegroundTaskThreadPoolExecutor(2*REASONABLE_THREAD_POOL_SIZE, "Default foreground executor");
}
@Override
@@ -29,18 +26,26 @@ public class ThreadPoolUtilImpl implements ThreadPoolUtil {
}
@Override
public ScheduledExecutorService createBackgroundTaskThreadPoolExecutor() {
return createThreadPoolExecutor(Thread.NORM_PRIORITY-1);
public ScheduledExecutorService createBackgroundTaskThreadPoolExecutor(String name) {
return createThreadPoolExecutor(name, Thread.NORM_PRIORITY-1);
}
@Override
public ScheduledExecutorService createForegroundTaskThreadPoolExecutor() {
return createThreadPoolExecutor(Thread.NORM_PRIORITY);
public ScheduledExecutorService createForegroundTaskThreadPoolExecutor(String name) {
return createThreadPoolExecutor(name, Thread.NORM_PRIORITY);
}
private ScheduledExecutorService createThreadPoolExecutor(final int priority) {
return Executors.newScheduledThreadPool(/* corePoolSize */ REASONABLE_THREAD_POOL_SIZE,
new ThreadFactoryWithPriority(priority, /* daemon */ true));
@Override
public ScheduledExecutorService createForegroundTaskThreadPoolExecutor(int size, String name) {
return createThreadPoolExecutor(name, Thread.NORM_PRIORITY, size);
}
private ScheduledExecutorService createThreadPoolExecutor(String name, final int priority) {
return createThreadPoolExecutor(name, priority, /* corePoolSize */ REASONABLE_THREAD_POOL_SIZE);
}
private ScheduledExecutorService createThreadPoolExecutor(String name, final int priority, final int size) {
return new NamedTracingScheduledThreadPoolExecutor(name, /* corePoolSize */ size, new ThreadFactoryWithPriority(priority, /* daemon */ true));
}
@Override
@@ -2,6 +2,13 @@ package com.sap.sailing.android.ui.fragments;
import java.util.List;
import com.sap.sailing.android.shared.R;
import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.ui.adapters.AbstractRegattaAdapter;
import com.sap.sailing.android.shared.util.BaseAppPreferences;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.DialogInterface;
@@ -18,13 +25,6 @@ import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;
import com.sap.sailing.android.shared.R;
import com.sap.sailing.android.shared.data.BaseCheckinData;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.ui.activities.AbstractStartActivity;
import com.sap.sailing.android.shared.ui.adapters.AbstractRegattaAdapter;
import com.sap.sailing.android.shared.util.BaseAppPreferences;
public abstract class AbstractHomeFragment extends BaseFragment {
private final static String TAG = AbstractHomeFragment.class.getName();
protected AbstractRegattaAdapter adapter;
@@ -58,26 +58,30 @@ public abstract class AbstractHomeFragment extends BaseFragment {
}
private boolean requestQRCodeScan() {
boolean result;
PackageManager manager = getActivity().getPackageManager();
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
PackageManager manager = getActivity().getPackageManager();
List<ResolveInfo> infos = manager.queryIntentActivities(intent, 0);
if (infos.size() != 0) {
startActivityForResult(intent, requestCodeQRCode);
return true;
} else {
Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android");
Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
infos = manager.queryIntentActivities(marketIntent, 0);
if (infos.size() != 0) {
startActivity(marketIntent);
} else {
Toast.makeText(getActivity(), getString(R.string.error_play_store_and_scanning_not_available),
Toast.LENGTH_LONG).show();
try {
startActivityForResult(intent, requestCodeQRCode);
result = true;
} catch (Exception ex) {
requestQRCodeScannerInstallation();
result = false;
}
return false;
} else {
requestQRCodeScannerInstallation();
result = false;
}
return result;
}
private void requestQRCodeScannerInstallation() {
Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android");
Intent marketIntent = new Intent(Intent.ACTION_VIEW, marketUri);
startActivity(marketIntent);
}
@Override
@@ -1,11 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="settings_category_energy_saving">Batterie Sparen</string>
<string name="energy_saving_enabled">Batteriesparmodus</string>
<string name="preference_energy_saving_is_enabled">Ein</string>
<string name="preference_energy_saving_is_disabled">Aus</string>
<string name="preference_energy_saving_summary_is_enabled">GPS Updates werden alle 30 Sekunden verschickt.</string>
<string name="preference_energy_saving_summary_is_disabled">GPS Updates werden jede Sekunde verschickt.</string>
<string name="preference_energy_saving_sending_interval">Sendeintervall für GPS-Updates auswählen</string>
<string name="preference_energy_saving_sending_interval_summary">Wählen Sie den größtmöglichen Wert, der dennoch eine dem Anwendungsfall entsprechend hohe Aktualisierungsrate ermöglicht.</string>
<string name="preference_energy_saving_sending_interval_message">GPS Updates werden%1$s %2$s an den Server gesendet.</string>
<string name="preference_energy_saving_sending_interval_message_every">alle</string>
<string-array name="preference_energy_saving_sending_interval_entries">
<item>sofort</item>
<item>5 Sekunden</item>
<item>10 Sekunden</item>
<item>20 Sekunden</item>
<item>60 Sekunden</item>
</string-array>
<string name="preference_heading_with_declination_subtracted_is_enabled">Ein</string>
<string name="preference_heading_with_declination_subtracted_is_disabled">Aus</string>
<string name="preference_heading_with_declination_subtracted_summary_is_enabled">Anzeige: Missweisend</string>
@@ -78,5 +78,6 @@
<string name="upload_in_progress">Wird hochgeladen&#8230;</string>
<string name="upload_io_error">Fehler beim Hochladen: </string>
<string name="upload_retry">Fehler beim Hochladen.\nZum Wiederholen hier tippen.</string>
<string name="tracking_status_gps_found">GPS Signal gefunden!</string>
</resources>
@@ -6,15 +6,32 @@
<!-- override default values of android.shared -->
<string name="app_folder" translatable="false">tracking</string>
<string name="preference_energy_saving_enabled_key" translatable="false">preferenceEnergySavingEnabled</string>
<string name="preference_heading_with_declination_subtracted_key" translatable="false">preferenceHeadingWithDeclinationSubtracted</string>
<string name="settings_category_energy_saving">Battery Saving</string>
<string name="energy_saving_enabled">Save Energy</string>
<string name="preference_energy_saving_is_enabled">On</string>
<string name="preference_energy_saving_is_disabled">Off</string>
<string name="preference_energy_saving_summary_is_enabled">GPS updates are being sent to server every 30 seconds.</string>
<string name="preference_energy_saving_summary_is_disabled">GPS updates are being sent to server every second.</string>
<string name="preference_energy_saving_sending_interval_key" translatable="false">msgSndInt</string>
<string name="preference_energy_saving_sending_interval_default" translatable="false">0</string>
<string name="preference_energy_saving_sending_interval">choose GPS update sending interval</string>
<string name="preference_energy_saving_sending_interval_summary">Choose a value as high as possible to preserve battery life while still maintaining a reasonable live experience, depending on your use case.</string>
<string name="preference_energy_saving_sending_interval_message">GPS updates will be sent to the server%1$s %2$s.</string>
<string name="preference_energy_saving_sending_interval_message_key">msgSndIntMessage</string>
<string name="preference_energy_saving_sending_interval_message_every">every</string>
<string-array name="preference_energy_saving_sending_interval_entries">
<item>immediately</item>
<item>5 seconds</item>
<item>10 seconds</item>
<item>20 seconds</item>
<item>60 seconds</item>
</string-array>
<string-array name="preference_energy_saving_sending_interval_values" translatable="false">
<item>0</item>
<item>5</item>
<item>10</item>
<item>20</item>
<item>60</item>
</string-array>
<string name="preference_gps_fix_interval_ms_key" translatable="false">gpsFixInterval</string>
<string name="preference_gps_fix_interval_ms_default" translatable="false">500</string>
@@ -19,4 +19,5 @@
<string name="tracking_status_no_gps_signal">No GPS Signal!</string>
<string name="desc_regatta_user_image">Regatta User Image</string>
<string name="desc_add_photo_button">Add Photo Button</string>
<string name="tracking_status_gps_found">GPS signal found!</string>
</resources>
@@ -3,14 +3,17 @@
<!-- Energy Saving -->
<PreferenceCategory android:title="@string/settings_category_energy_saving">
<SwitchPreference
android:defaultValue="false"
android:key="@string/preference_energy_saving_enabled_key"
android:switchTextOn="@string/preference_energy_saving_is_enabled"
android:switchTextOff="@string/preference_energy_saving_is_disabled"
android:summaryOn="@string/preference_energy_saving_summary_is_enabled"
android:summaryOff="@string/preference_energy_saving_summary_is_disabled"
android:title="@string/energy_saving_enabled"/>
<ListPreference
android:defaultValue="@string/preference_energy_saving_sending_interval_default"
android:key="@string/preference_energy_saving_sending_interval_key"
android:entryValues="@array/preference_energy_saving_sending_interval_values"
android:entries="@array/preference_energy_saving_sending_interval_entries"
android:title="@string/preference_energy_saving_sending_interval"
android:summary="@string/preference_energy_saving_sending_interval_summary"/>
<EditTextPreference
android:key="@string/preference_energy_saving_sending_interval_message_key"
android:selectable="false"/>
</PreferenceCategory>
<!-- Connection -->
@@ -37,11 +37,9 @@ import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.BitmapFactory;
import android.hardware.GeomagneticField;
import android.location.Location;
import android.os.BatteryManager;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
@@ -68,8 +66,6 @@ public class TrackingService extends Service implements GoogleApiClient.Connecti
private int NOTIFICATION_ID = R.string.tracker_started;
public final static int UPDATE_INTERVAL_IN_MILLIS_DEFAULT = 1000;
private final static int UPDATE_INTERVAL_IN_MILLIS_POWERSAVE_MODE = 30000;
private final static float BATTERY_POWER_SAVE_THRESHOLD = 0.2f;
private boolean initialLocation;
private String checkinDigest;
@@ -235,7 +231,6 @@ public class TrackingService extends Service implements GoogleApiClient.Connecti
if (initialLocation) {
storeInitialTrackingTimestamp();
}
updateResendIntervalSetting();
reportGPSQualityBearingAndSpeed(location.getAccuracy(), location.getBearing(), location.getSpeed(),
location.getLatitude(), location.getLongitude(), location.getAltitude());
final String postUrlStr = event.server + prefs.getServerGpsFixesPostPath();
@@ -347,47 +342,6 @@ public class TrackingService extends Service implements GoogleApiClient.Connecti
initialLocation = false;
}
/**
* Update whether message sending service should retry every 3 seconds or every 30.
*/
private void updateResendIntervalSetting() {
float batteryPct = getBatteryPercentage();
boolean batteryIsCharging = prefs.getBatteryIsCharging();
int updateInterval = UPDATE_INTERVAL_IN_MILLIS_DEFAULT;
if (prefs.getEnergySavingEnabledByUser() || (batteryPct < BATTERY_POWER_SAVE_THRESHOLD && !batteryIsCharging)) {
if (BuildConfig.DEBUG) {
ExLog.i(this, "POWER-LEVELS", "in power saving mode");
}
updateInterval = UPDATE_INTERVAL_IN_MILLIS_POWERSAVE_MODE;
} else {
if (BuildConfig.DEBUG) {
ExLog.i(this, "POWER-LEVELS", "in default power mode");
}
}
prefs.setMessageResendIntervalInMillis(updateInterval);
}
/**
* Get battery charging level
*
* @return battery charging level in interval [0,1]
*/
private float getBatteryPercentage() {
IntentFilter ifilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
Intent batteryStatus = this.registerReceiver(null, ifilter);
int level = batteryStatus.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);
int scale = batteryStatus.getIntExtra(BatteryManager.EXTRA_SCALE, -1);
float batteryPct = level / (float) scale;
if (BuildConfig.DEBUG) {
ExLog.i(this, TAG, "Battery: " + (batteryPct * 100) + "%");
}
return batteryPct;
}
@Override
public IBinder onBind(Intent intent) {
return trackingBinder;
@@ -7,11 +7,11 @@ import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.provider.Settings.SettingNotFoundException;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.sap.sailing.android.shared.logging.ExLog;
import com.sap.sailing.android.shared.services.sending.MessageSendingService.APIConnectivity;
@@ -30,8 +30,9 @@ public class TrackingFragment extends BaseFragment {
static final String SIS_GPS_ACCURACY = "instanceStateGpsAccuracy";
static final String SIS_GPS_UNSENT_FIXES = "instanceStateGpsUnsentFixes";
private AppPreferences prefs;
private long lastGPSQualityUpdate;
private Toast gpsToast;
private boolean gpsFound = true;
private String TAG = TrackingFragment.class.getName();
@@ -69,6 +70,9 @@ public class TrackingFragment extends BaseFragment {
qualityIndicator.setSignalQuality(savedInstanceState.getInt(SIS_GPS_QUALITY));
accuracyText.setText(savedInstanceState.getString(SIS_GPS_ACCURACY));
unsentFixesText.setText(savedInstanceState.getString(SIS_GPS_UNSENT_FIXES));
} else {
//initially set quality to "No GPS" on start tracking
updateTrackingStatus(GPSQuality.noSignal);
}
}
@@ -111,13 +115,27 @@ public class TrackingFragment extends BaseFragment {
public void updateTrackingStatus(GPSQuality quality) {
if (isAdded()) {
TextView textView = (TextView) getActivity().findViewById(R.id.tracking_status);
if (quality == GPSQuality.noSignal) {
textView.setText(getString(R.string.tracking_status_no_gps_signal));
textView.setTextColor(getResources().getColor(R.color.sap_red));
//either GPS has been found before or tracking just started (but is not available now) --> show noGPS Toast
if (gpsFound || gpsToast == null) {
gpsToast = Toast.makeText(getActivity(),getString(R.string.tracking_status_no_gps_signal), Toast.LENGTH_LONG);
gpsToast.show();
gpsFound = false;
}
} else {
textView.setText(getString(R.string.tracking_status_tracking));
textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
if (gpsToast == null) {
gpsToast.cancel();
}
//GPS was lost before but is available again now --> show gpsFound toast
if (!gpsFound) {
gpsToast = Toast.makeText(getActivity(),getString(R.string.tracking_status_gps_found), Toast.LENGTH_SHORT);
gpsToast.show();
gpsFound = true;
}
}
}
}
@@ -134,14 +152,8 @@ public class TrackingFragment extends BaseFragment {
public void run() {
TextView textView = (TextView) getActivity().findViewById(R.id.mode);
if (apiConnectivity == APIConnectivity.transmissionSuccess) {
if (prefs.getEnergySavingEnabledByUser()) {
textView.setText(getString(R.string.tracking_mode_battery_saving));
textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
} else {
textView.setText(getString(R.string.tracking_mode_live));
textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
}
textView.setText(getString(R.string.tracking_mode_live));
textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
} else if (apiConnectivity == APIConnectivity.noAttempt) {
textView.setText(getString(R.string.tracking_mode_offline));
textView.setTextColor(getResources().getColor(R.color.fiori_text_color));
@@ -183,7 +195,7 @@ public class TrackingFragment extends BaseFragment {
} else {
locationProviders = Settings.Secure.getString(context.getContentResolver(),
Settings.Secure.LOCATION_PROVIDERS_ALLOWED);
return !TextUtils.isEmpty(locationProviders);
return locationProviders.contains("gps");
}
} else {
return false;
@@ -1,7 +1,9 @@
package com.sap.sailing.android.tracking.app.ui.fragments.preference;
import android.os.Bundle;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
import android.preference.SwitchPreference;
import com.sap.sailing.android.shared.ui.fragments.preference.BasePreferenceFragment;
@@ -9,8 +11,7 @@ import com.sap.sailing.android.shared.util.UniqueDeviceUuid;
import com.sap.sailing.android.tracking.app.R;
import com.sap.sailing.android.tracking.app.utils.AppPreferences;
public class GeneralPreferenceFragment extends BasePreferenceFragment {
public class GeneralPreferenceFragment extends BasePreferenceFragment implements OnPreferenceChangeListener {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
@@ -24,23 +25,76 @@ public class GeneralPreferenceFragment extends BasePreferenceFragment {
if (currentDeviceId != null && currentDeviceId.length() > 0) {
deviceIdPreference.setSummary(currentDeviceId);
} else {
// this would, in most caes, be set elsewhere, but since we don't want to show an empty summary,
// this would, in most cases, be set elsewhere, but since we don't want to show an empty summary,
// we can just set it here. (UniqueDeviceUuid.getUniqueId sets it in prefs.)
String newDeviceId = UniqueDeviceUuid.getUniqueId(getActivity());
deviceIdPreference.setSummary(newDeviceId);
}
ListPreference prefSendingInterval = findPreference(R.string.preference_energy_saving_sending_interval_key);
prefSendingInterval.setDefaultValue(R.string.preference_energy_saving_sending_interval_default);
prefSendingInterval.setOnPreferenceChangeListener(this);
updateEnergySavingMessage(null);
}
@Override
public void onPause() {
super.onPause();
SwitchPreference prefEnergy = findPreference(R.string.preference_energy_saving_enabled_key);
//SwitchPreference prefEnergy = findPreference(R.string.preference_energy_saving_enabled_key);
SwitchPreference prefDeclination = findPreference(R.string.preference_heading_with_declination_subtracted_key);
AppPreferences prefs = new AppPreferences(getActivity());
prefs.setEnergySavingEnabledByUser(prefEnergy.isChecked());
//prefs.setEnergySavingEnabledByUser(prefEnergy.isChecked());
prefs.setDisplayHeadingWithSubtractedDeclination(prefDeclination.isChecked());
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
AppPreferences prefs = new AppPreferences(getActivity());
//GPS message sending interval settings
if(preference.getKey().equals(getString(R.string.preference_energy_saving_sending_interval_key))) {
int msgSndInt = Integer.parseInt((String)newValue);
switch (msgSndInt){
case 0:
//send every second
prefs.setMessageResendIntervalInMillis(1000);
break;
default:
prefs.setMessageResendIntervalInMillis(msgSndInt * 1000);
break;
}
updateEnergySavingMessage(newValue.toString());
}
return true;
}
private void updateEnergySavingMessage(String value){
Preference msgSndIntMessage = findPreference(getString(R.string.preference_energy_saving_sending_interval_message_key));
ListPreference msgSndIntPreference = (ListPreference) findPreference(getString(R.string.preference_energy_saving_sending_interval_key));
//when value == null, (meaning the settings screen just launched) - current entry will be selected
//otherwise, we need to get the index of the newly selected entry as the one resulting from getEntry() will be the previous one
String entry;
if (value == null){
entry = msgSndIntPreference.getEntry().toString();
} else {
int indexOfEntry = msgSndIntPreference.findIndexOfValue(value);
entry = msgSndIntPreference.getEntries()[indexOfEntry].toString();
}
//possibly fill in the word "every"
String fillEvery = (entry.equals(msgSndIntPreference.getEntries()[0])) ? "" : " " + getString(R.string.preference_energy_saving_sending_interval_message_every);
//set Text
msgSndIntMessage.setSummary(String.format(
getString(R.string.preference_energy_saving_sending_interval_message),
fillEvery,
entry)
);
}
}
@@ -112,15 +112,6 @@ public class AppPreferences extends BaseAppPreferences {
preferences.edit().putString(context.getString(R.string.preference_competitor_key), id).commit();
}
public void setEnergySavingEnabledByUser(boolean newValue) {
preferences.edit().putBoolean(context.getString(R.string.preference_energy_saving_enabled_key), newValue)
.commit();
}
public boolean getEnergySavingEnabledByUser() {
return preferences.getBoolean(context.getString(R.string.preference_energy_saving_enabled_key), false);
}
public void setDisplayHeadingWithSubtractedDeclination(boolean newValue) {
preferences.edit()
.putBoolean(context.getString(R.string.preference_heading_with_declination_subtracted_key), newValue)
@@ -186,4 +177,5 @@ public class AppPreferences extends BaseAppPreferences {
public void removeFailedUpload(String key) {
pref.edit().remove(key).commit();
}
}
@@ -9,6 +9,7 @@
<string name="reset_position">Position zurücksetzen</string>
<string name="getting_marks">Empfangen der Markierungen&#8230;</string>
<string name="set">Gesetzt</string>
<string name="unknown">Unbekannt</string>
<string name="not_set">Nicht gesetzt</string>
<string name="mark_list_accuracy">(Genauigkeit ca. %1$sm)</string>
<string name="accuracy">GPS Genauigkeit</string>
Loaded 100 of 111 files, more files were not shown because too many files have changed in this diff. Show more