diff --git a/code/TabBase.h b/code/TabBase.h index 8dce07c..2eea14b 100644 --- a/code/TabBase.h +++ b/code/TabBase.h @@ -22,7 +22,6 @@ ************************************************************************/ #include "Localizer.h" -#include #include "gdioutput.h" diff --git a/code/TabClass.cpp b/code/TabClass.cpp index cd9e992..841afd1 100644 --- a/code/TabClass.cpp +++ b/code/TabClass.cpp @@ -2138,10 +2138,7 @@ int TabClass::classCB(gdioutput &gdi, int type, void *data) } else if (bi.id == "Module") { size_t ix = gdi.getSelectedItem("Module").first; - if (ix < currentResultModuleTags.size()) { - const string &mtag = currentResultModuleTags[ix]; - gdi.hideWidget("EditModule", mtag.empty()); - } + hideEditResultModule(gdi, ix); } else if (bi.id=="Courses") EditChanged=true; @@ -2188,6 +2185,16 @@ int TabClass::classCB(gdioutput &gdi, int type, void *data) return 0; } +void TabClass::hideEditResultModule(gdioutput &gdi, int ix) const { + if (size_t(ix) < currentResultModuleTags.size()) { + const string &mtag = currentResultModuleTags[ix]; + + wstring srcFile; + gdi.hideWidget("EditModule", mtag.empty() || + dynamic_cast(oe->getGeneralResult(mtag, srcFile).get()) == nullptr); + } +} + void TabClass::readClassSettings(gdioutput &gdi) { for (size_t k=0;kgetDCI().fillInput("Status", out, selected); gdi.addItem("Status", out); gdi.selectItemByData("Status", selected); - - fillResultModules(gdi, pc); } + if (gdi.hasWidget("Module")) { + fillResultModules(gdi, pc); + } gdi.check("AllowQuickEntry", pc->getAllowQuickEntry()); if (gdi.hasWidget("NoTiming")) gdi.check("NoTiming", pc->getNoTiming()); @@ -3244,7 +3252,7 @@ bool TabClass::loadPage(gdioutput &gdi) gdi.addSelection("StartBlock", 80, 300, 0, L"Startblock:"); - for (int k=1;k<=100;k++) { + for (int k = 1; k <= 100; k++) { gdi.addItem("StartBlock", itow(k), k); } @@ -3258,8 +3266,19 @@ bool TabClass::loadPage(gdioutput &gdi) st.emplace_back(lang.tl(sc.second), st.size()); gdi.addItem("Status", st); gdi.autoGrow("Status"); - gdi.popX(); + } + + bool hasResultModuleClasses = false; + vector cls; + oe->getClasses(cls, false); + for (pClass c : cls) { + if (c->getResultModuleTag().size() > 0) { + hasResultModuleClasses = true; + break; + } + } + if (showAdvanced || hasResultModuleClasses) { gdi.dropLine(3); gdi.addSelection("Module", 100, 400, ClassesCB, L"Resultatuträkning:"); fillResultModules(gdi, nullptr); @@ -4882,5 +4901,5 @@ void TabClass::fillResultModules(gdioutput &gdi, pClass pc) { gdi.addItem("Module", st); gdi.autoGrow("Module"); gdi.selectItemByData("Module", current); - gdi.hideWidget("EditModule", current == 0); + hideEditResultModule(gdi, current); } diff --git a/code/TabClass.h b/code/TabClass.h index 8da2c2d..0f1da64 100644 --- a/code/TabClass.h +++ b/code/TabClass.h @@ -87,7 +87,7 @@ class TabClass : bool warnDrawStartTime(gdioutput &gdi, const wstring &firstStart); void static clearPage(gdioutput &gdi, bool autoRefresh); - + void hideEditResultModule(gdioutput &gdi, int ix) const; bool hasWarnedStartTime; bool hasWarnedDirect; bool tableMode; diff --git a/code/TabClub.cpp b/code/TabClub.cpp index c63d578..89c0067 100644 --- a/code/TabClub.cpp +++ b/code/TabClub.cpp @@ -144,12 +144,12 @@ int TabClub::clubCB(gdioutput &gdi, int type, void *data) oClub::definedPayModes(*oe, dpm); pc->generateInvoice(gdi, pay, paid, dpm, ppm); } - gdi.addButton(gdi.getWidth()+20, gdi.scaleLength(15), gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, gdi.scaleLength(15), gdi.scaleLength(baseButtonWidth), "Cancel", "Återgå", ClubsCB, "", true, false); - gdi.addButton(gdi.getWidth()+20, gdi.scaleLength(45), gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, gdi.scaleLength(45), gdi.scaleLength(baseButtonWidth), "Print", "Skriv ut...", ClubsCB, "Skriv ut fakturan", true, false); - gdi.addButton(gdi.getWidth()+20, gdi.scaleLength(75), gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, gdi.scaleLength(75), gdi.scaleLength(baseButtonWidth), "PDF", "PDF...", ClubsCB, "Spara som PDF.", true, false); gdi.refresh(); @@ -190,14 +190,14 @@ int TabClub::clubCB(gdioutput &gdi, int type, void *data) oe->printInvoices(gdi, oEvent::InvoicePrintType(lbi.data), path, false); - gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(baseButtonWidth), "Cancel", "Återgå", ClubsCB, "", true, false); if (lbi.data>10) { // To file - gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(baseButtonWidth), "Print", "Skriv ut...", ClubsCB, "", true, false); - gdi.addButton(gdi.getWidth()+20, 75, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, 75, gdi.scaleLength(baseButtonWidth), "PDF", "PDF...", ClubsCB, "Spara som PDF.", true, false); gdi.refresh(); @@ -249,9 +249,9 @@ int TabClub::clubCB(gdioutput &gdi, int type, void *data) gdi.clearPage(false); wstring nn; oe->printInvoices(gdi, oEvent::IPTAllPrint, nn, true); - gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(120), "Cancel", + gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(baseButtonWidth), "Cancel", "Återgå", ClubsCB, "", true, false); - gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(120), "Print", + gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(baseButtonWidth), "Print", "Skriv ut...", ClubsCB, "Skriv ut fakturan", true, false); gdi.refresh(); diff --git a/code/TabCompetition.cpp b/code/TabCompetition.cpp index a4aa80c..0a1441e 100644 --- a/code/TabCompetition.cpp +++ b/code/TabCompetition.cpp @@ -568,9 +568,9 @@ int TabCompetition::competitionCB(gdioutput &gdi, int type, void *data) gdi.clearPage(true); oe->generateCompetitionReport(gdi); - gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(120), "Cancel", + gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(baseButtonWidth), "Cancel", "Återgå", CompetitionCB, "", true, false); - gdi.addButton(gdi.getWidth()+20, 18+gdi.getButtonHeight(), gdi.scaleLength(120), "Print", + gdi.addButton(gdi.getWidth()+20, 18+gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "Print", "Skriv ut...", CompetitionCB, "Skriv ut rapporten", true, false); gdi.refresh(); @@ -1615,7 +1615,9 @@ int TabCompetition::competitionCB(gdioutput &gdi, int type, void *data) loadPage(gdi); } else if (bi.id == "WelcomeOK") { - gdi.scaleSize(1.0/gdi.getScale()); + gdi.setFont(oe->getPropertyInt("TextSize", 0), + oe->getPropertyString("TextFont", L"Arial")); + oe->setProperty("FirstTime", 0); loadPage(gdi); } @@ -2403,6 +2405,7 @@ void TabCompetition::loadAboutPage(gdioutput &gdi) const "\n\nOriginal French Translation by Jerome Monclard" "\n\nAdaption to French conditions and extended translation by Pierre Gaufillet" "\n\nCzech Translation by Marek Kustka" + "\n\nSpanish Translation by Manuel Pedre" "\n\nHelp with English documentation: Torbjörn Wikström"); gdi.dropLine(); @@ -2626,7 +2629,7 @@ bool TabCompetition::loadPage(gdioutput &gdi) rc.top = gdi.getCY() - gdi.scaleLength(30); rc.left = gdi.getCX() - gdi.scaleLength(30); - int bw = gdi.scaleLength(150); + int bw = gdi.scaleLength(baseButtonWidth+40); gdi.addString("", 1, "Importera tävlingsdata"); gdi.addButton(gdi.getCX(), gdi.getCY(), bw, "Entries", "Anmälningar", CompetitionCB, "", false, false); @@ -3229,7 +3232,7 @@ void TabCompetition::loadRunnerDB(gdioutput &gdi, int tableToShow, bool updateTa void TabCompetition::welcomeToMeOS(gdioutput &gdi) { gdi.clearPage(false, false); - gdi.scaleSize(1.8/gdi.getScale()); + gdi.scaleSize(1.4*gdi.getScale()); gdi.dropLine(5); gdi.setCX(gdi.getCX() + 5*gdi.getLineHeight()); diff --git a/code/TabCourse.cpp b/code/TabCourse.cpp index 7ebd275..fb3e15f 100644 --- a/code/TabCourse.cpp +++ b/code/TabCourse.cpp @@ -1009,10 +1009,10 @@ void TabCourse::runCourseImport(gdioutput& gdi, const wstring &filename, gdi.dropLine(); } - gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, 45, gdi.scaleLength(baseButtonWidth), "Print", "Skriv ut...", CourseCB, "Skriv ut listan.", true, false); - gdi.addButton(gdi.getWidth()+20, 75, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, 75, gdi.scaleLength(baseButtonWidth), "PDF", "PDF...", CourseCB, "Spara som PDF.", true, false); diff --git a/code/TabList.cpp b/code/TabList.cpp index 56f3d9b..6a2f6b4 100644 --- a/code/TabList.cpp +++ b/code/TabList.cpp @@ -154,25 +154,25 @@ int ListsCB(gdioutput *gdi, int type, void *data) } int TabList::baseButtons(gdioutput &gdi, int extraButtons) { - gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, 15, gdi.scaleLength(baseButtonWidth), "Cancel", ownWindow ? "Stäng" : "Återgå", ListsCB, "", true, false); - gdi.addButton(gdi.getWidth()+20, 18+gdi.getButtonHeight(), gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, 18+gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "Print", "Skriv ut...", ListsCB, "Skriv ut listan.", true, false); if (!ownWindow) { - gdi.addButton(gdi.getWidth() + 20, 21 + 2 * gdi.getButtonHeight(), gdi.scaleLength(120), + gdi.addButton(gdi.getWidth() + 20, 21 + 2 * gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "HTMLDesign", "Webb...", ListsCB, "Spara för webben.", true, false); } - gdi.addButton(gdi.getWidth()+20, 24+3*gdi.getButtonHeight(), gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, 24+3*gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "PDF", "PDF...", ListsCB, "Spara som PDF.", true, false); - gdi.addButton(gdi.getWidth()+20, 27+4*gdi.getButtonHeight(), gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, 27+4*gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "Copy", "Kopiera", ListsCB, "Kopiera till urklipp.", true, false); int ypos = 30+5*gdi.getButtonHeight(); if (extraButtons == 1) { int w, h; - gdi.addButton(gdi.getWidth()+20, ypos, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, ypos, gdi.scaleLength(baseButtonWidth), "EditInForest", "edit_in_forest", ListsCB, "", true, false).getDimension(gdi, w, h); ypos += h + 3; } @@ -187,11 +187,11 @@ void TabList::generateList(gdioutput &gdi, bool forceUpdate) int baseY = 15; if (!gdi.isFullScreen()) { - gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(baseButtonWidth), "Cancel", ownWindow ? "Stäng" : "Återgå", ListsCB, "", true, false); baseY += 3 + gdi.getButtonHeight(); - gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(baseButtonWidth), "FullScreenLive", "Fullskärm", ListsCB, "Visa listan i fullskärm", true, false); } SelectedList = "GeneralList"; @@ -257,10 +257,10 @@ void TabList::generateList(gdioutput &gdi, bool forceUpdate) int baseY = baseButtons(gdi, extra); if (!ownWindow) { - gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(baseButtonWidth), "Window", "Eget fönster", ListsCB, "Öppna i ett nytt fönster.", true, false); - gdi.addButton(gdi.getWidth()+20, baseY + 3 + 1*gdi.getButtonHeight(), gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, baseY + 3 + 1*gdi.getButtonHeight(), gdi.scaleLength(baseButtonWidth), "Automatic", "Automatisera", ListsCB, "Skriv ut eller exportera listan automatiskt.", true, false); baseY += 2*(3+gdi.getButtonHeight()); @@ -268,16 +268,16 @@ void TabList::generateList(gdioutput &gdi, bool forceUpdate) if (currentList.supportUpdateClasses()) { baseY += 3 + gdi.getButtonHeight(); - gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(baseButtonWidth), "ClassSelection", "Klassval...", ListsCB, "Välj klasser", true, false); } baseY += 3 + gdi.getButtonHeight(); - gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth() + 20, baseY, gdi.scaleLength(baseButtonWidth), "ListDesign", "Utseende...", ListsCB, "Justera visningsinställningar", true, false); if (!currentList.getParam().saved && !oe->isReadOnly()) { baseY += 3 + gdi.getButtonHeight(); - gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(120), + gdi.addButton(gdi.getWidth()+20, baseY, gdi.scaleLength(baseButtonWidth), "Remember", "Kom ihåg listan...", ListsCB, "Spara den här listan som en favoritlista", true, false); } } @@ -1266,7 +1266,7 @@ int TabList::listCB(gdioutput &gdi, int type, void *data) } pair TabList::makeOwnWindow(gdioutput &gdi) { - gdioutput *gdi_new = createExtraWindow(uniqueTag("list"), makeDash(L"MeOS - ") + currentList.getName(), gdi.getWidth() + 64 + gdi.scaleLength(120)); + gdioutput *gdi_new = createExtraWindow(uniqueTag("list"), makeDash(L"MeOS - ") + currentList.getName(), gdi.getWidth() + 64 + gdi.scaleLength(baseButtonWidth)); TabList *tl_new = 0; if (gdi_new) { TabList &tl = dynamic_cast(*gdi_new->getTabs().get(TListTab)); @@ -2125,9 +2125,9 @@ void TabList::loadClassSettings(gdioutput &gdi, string targetTag) { gdi.fillDown(); gdi.addSelection("AgeFilter", 200, 150, nullptr, L"Åldersfiltrering:"); vector> ages; - ages.emplace_back(L"Alla", size_t(oListParam::AgeFilter::All)); - ages.emplace_back(L"Ungdom", size_t(oListParam::AgeFilter::OnlyYouth)); - ages.emplace_back(L"Vuxna", size_t(oListParam::AgeFilter::ExludeYouth)); + ages.emplace_back(lang.tl("Alla"), size_t(oListParam::AgeFilter::All)); + ages.emplace_back(lang.tl("Ungdom"), size_t(oListParam::AgeFilter::OnlyYouth)); + ages.emplace_back(lang.tl("Vuxna"), size_t(oListParam::AgeFilter::ExludeYouth)); gdi.addItem("AgeFilter", ages); gdi.selectItemByData("AgeFilter", int(currentList.getParam().ageFilter)); diff --git a/code/TabSpeaker.cpp b/code/TabSpeaker.cpp index 40d3638..9b70e6a 100644 --- a/code/TabSpeaker.cpp +++ b/code/TabSpeaker.cpp @@ -268,7 +268,7 @@ int TabSpeaker::processButton(gdioutput &gdi, const ButtonInfo &bu) loadPage(gdi); } else if (bu.id == "LiveResult") { - gdioutput *gdi_new = createExtraWindow(uniqueTag("list"), makeDash(L"MeOS - Live"), gdi.getWidth() + 64 + gdi.scaleLength(120)); + gdioutput *gdi_new = createExtraWindow(uniqueTag("list"), makeDash(L"MeOS - Live"), gdi.getWidth() + 64 + gdi.scaleLength(baseButtonWidth)); gdi_new->clearPage(false); gdi_new->addString("", boldLarge, "Liveresultat"); @@ -316,7 +316,7 @@ int TabSpeaker::processButton(gdioutput &gdi, const ButtonInfo &bu) else if (bu.id == "Window") { oe->setupTimeLineEvents(0); - gdioutput *gdi_new = createExtraWindow(uniqueTag("speaker"), makeDash(L"MeOS - Speakerstöd"), gdi.getWidth() + 64 + gdi.scaleLength(120)); + gdioutput *gdi_new = createExtraWindow(uniqueTag("speaker"), makeDash(L"MeOS - Speakerstöd"), gdi.getWidth() + 64 + gdi.scaleLength(baseButtonWidth)); if (gdi_new) { TabSpeaker &tl = dynamic_cast(*gdi_new->getTabs().get(TSpeakerTab)); tl.ownWindow = true; @@ -355,7 +355,7 @@ int TabSpeaker::processButton(gdioutput &gdi, const ButtonInfo &bu) if (speakerSettings.empty()) throw meosException("Inställningarna är ogiltiga"); for (size_t k = 1; k < speakerSettings.size(); k++) { - gdioutput *gdi_new = createExtraWindow(uniqueTag("speaker"), makeDash(L"MeOS - Speakerstöd"), gdi.getWidth() + 64 + gdi.scaleLength(120)); + gdioutput *gdi_new = createExtraWindow(uniqueTag("speaker"), makeDash(L"MeOS - Speakerstöd"), gdi.getWidth() + 64 + gdi.scaleLength(baseButtonWidth)); if (gdi_new) { TabSpeaker &tl = dynamic_cast(*gdi_new->getTabs().get(TSpeakerTab)); tl.ownWindow = true; diff --git a/code/TabTeam.cpp b/code/TabTeam.cpp index 35cbf23..1499c74 100644 --- a/code/TabTeam.cpp +++ b/code/TabTeam.cpp @@ -257,6 +257,7 @@ void TabTeam::updateTeamStatus(gdioutput &gdi, pTeam t) gdi.selectItemByData("Status", 0); gdi.setText("TimeAdjust", makeDash(L"-")); gdi.setText("PointAdjust", makeDash(L"-")); + gdi.setText("TeamInfo", L"", true); return; } @@ -278,6 +279,19 @@ void TabTeam::updateTeamStatus(gdioutput &gdi, pTeam t) gdi.setText("TimeAdjust", getTimeMS(t->getTimeAdjustment())); gdi.setText("PointAdjust", -t->getPointAdjustment()); gdi.selectItemByData("Status", t->getStatus()); + + auto ri = t->getRaceInfo(); + BaseInfo *bi = gdi.setText("TeamInfo", ri.first, true); + TextInfo *ti = dynamic_cast(bi); + assert(ti); + if (ti) { + if (ri.second > 0) + ti->setColor(GDICOLOR::colorGreen); + else if (ri.second < 0) + ti->setColor(GDICOLOR::colorRed); + else + ti->setColor(GDICOLOR::colorDefault); + } } bool TabTeam::save(gdioutput &gdi, bool dontReloadTeams) { @@ -1442,7 +1456,10 @@ bool TabTeam::loadPage(gdioutput &gdi) gdi.popX(); gdi.selectItemByData("Status", 0); - + + gdi.addString("TeamInfo", 0, "").setColor(colorRed); + gdi.dropLine(0.4); + if (oe->hasAnyRestartTime()) { gdi.addCheckbox("NoRestart", "Förhindra omstart", 0, false, "Förhindra att laget deltar i någon omstart"); } diff --git a/code/czech.lng b/code/czech.lng index 30fc86a..f75ac30 100644 --- a/code/czech.lng +++ b/code/czech.lng @@ -2315,3 +2315,164 @@ Ingen nummerlapp = Bez startovního čísla Rogaining results for a team, where each team member collects points individually = Rogainingové výsledky pro tým, kde každý člen sbírá body samostatně prefsCodePage = Kódová tabulka pro 8-bitový text při importu/exportu. Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = Žádná kategorie nemá povolený rychlý vstup.\n\nTuto vlastnost můžeš změnit na stránce Kategorie. +%s m = %s m +Age (on last day of current year) = Věk (v poslední den tohoto roku) +Age above or equal implies senior/pensioner = Věk vyšší nebo roven značí seniory +Age below or equal implies youth = Věk nižší nebo roven značí mládež +AllPunches = Všechna ražení +Anmäl andra = Nová přihláška +Anmälan mottagen = Přijatá přihláška +Anmälan måste hanteras manuellt = Tvá přihláška vyžaduje manuální zpracování +Anmälningsdatum = Datum přihlášky +Anyone = Kdokoliv +Automatisk omladdning = Automatický update +Begränsa antal rader per sida = Limit řádek na stránce +Bricknummer = Číslo čipu +ClassAvailableMaps = Dostupné mapy pro kategorii +ClassKnockoutTotalResult = Kategorie, celkový knock-out výsledek +ClassLiveResult = Živé výsledky (rádiové časy), po kategoriích +ClassNumEntries = Počet přihlášek v kategorii +ClassTotalMaps = Celkový počet map pro kategorii +Classes together = Kategorie spolu +CoursePunches = Ražení (na trati) +Database is used and cannot be deleted = Databáze je používána a nemůže být smazána +Direkt tidtagning = Časomíra živě +EFilterAPIEntry = Přihlášky skrze API +EFilterWrongFee = Neočekávaný vklad +Ej omstart = Bez restartu +Endast grundläggande (enklast möjligt) = Jen základní funkčnost +Endast tidtagning = Jen časomíra +Endast tidtagning (utan banor) = Jen časomíra (bez tratí) +Endast tidtagning (utan banor), stafett = Jen časomíra (bez tratí), štafety +Externa adresser = Externí adresy +Felaktigt datum 'X' (Använd YYYY-MM-DD) = Neplatné datum 'X' (Použij YYYY-MM-DD) +Felaktigt rankingformat i X. Förväntat: Y = Neplatný formát rankingu v X.\nOčekáváno: Y +FilterAnyResult = radio-časy/výsledky +FilterNamedControl = Pojmenované kontroly +FilterNotFinish = Bez cíle +Finish order = Pořadí v cíli +First to finish = První v cíli +Flera lopp i valfri ordning = Vícero závodů v libovolném pořadí +Flytta ner = Přesuň dolů +Flytta upp = Přesuň vzhůru +Från första = Od prvního +Från löpardatabasen = Z databáze závodníků +Från löpardatabasen i befintliga klubbar = Z databáze závodníků ve stávajících klubech +Färre slingor = Méně okruhů +Förhindra att laget deltar i någon omstart = Zabraň týmu v účasti na restartu +Förhindra omstart = Zabraň restartu +Förväntad = Očekávaný +HTML Export = HTML Export +HTML Export för 'X' = HTML Export 'X' +HTML formaterad genom listinställningar = HTML formátovaný sestavou +Heat = Kolo +Hittar inte klass X = Kategorie X nenalezena +Importerar RAID patrull csv-fil = Importuj csv data RAID družstev +Importerar ranking = Importuj ranking +Individual result by finish time = Výsledky jednotlivců dle cílového času +Individuellt = Jednotlivec +Inkludera bana = Včetně trati +Kartor = Mapy +Klart. X värden tilldelade = Hotovo. Přířazeno X hodnot. +Klassen X är listad flera gånger = Kategorie X je uvedena vícekrát +Klassen är full = Kategorie je plná +Klassval för 'X' = Výběr kategorie pro 'X' +Knockout sammanställning = Přehled knockoutů +Knockout total = Knockout celkově +Kolumner = Sloupce +Kunde inte ladda upp löpardatabasen (X) = Nemohu odeslat databázi závodníků (X) +Kunde inte öppna databasen (X) = Nemohu se připojit k databázi (X) +Kvalschema = Kvalifikační schéma +Lag och stafett = Tým a štafeta +Lagra inställningar = Ulož nastavení +Lagändringblankett = Formulář změny týmu +LineBreak = Zalomení řádku +Liveresultat, radiotider = Živé výsledky s radio-časy +Lås funktion = Zamkni +Lås upp = Odemkni +Låst gaffling = Uzamčená větvení +Mappa rootadressen (http:///localhost:port/) till funktion = Mapuj bázovou adresu (http:///localhost:port/) na funkci +MeOS utvecklinsstöd = Podpora vývoje MeOSu +Med direktanmälan = S přímým přihlášením +Målstämpling tillåts inte (X) = Cílové ražení zamítnuto (X) +Ogiltig starttid X = Neplatný čas startu X +Ogiltigt startintervall X = Chybný startovní interval +Pages with columns = Stránka se sloupci +Pages with columns, no header = Stránka se sloupci, bez hlavičky +Plac. E[stageno] = Umís. E +Poäng E[stageno] = Body E +Poängreduktion = Srážka +PunchAbsTime = Ražení, skutečný čas +PunchName = Ražení, jméno kontroly +PunchNamedSplit = Čas od poslední pojmenované kontroly +PunchSplitTime = Čas od poslední kontroly (mezičas) +PunchTimeSinceLast = Čas od posledního ražení +PunchTotalTime = Celkový čas na kontrolu +PunchTotalTimeAfter = Ztráta na kontrole +Rad X är ogiltig = Řádek X je neplatný +Rader = Řádky +Radio = Rádio +Radio tillåts inte (X) = Radio-kontroly zamítnuty (X) +Referens = Reference +Registrera hyrbrickor = Registruj půjčené čipy +Result module = Výsledkový modul +Rogaining points before automatic reduction = Rogainingové body před automatickou srážkou +Runner check time = Čas checku +Runner/team earlier stage places = Závodník/tým: umístění v předchozích etapách +Runner/team earlier stage points = Závodník/tým: body v předchozích etapách +Runner/team earlier stage running times = Závodník/tým: časy v předchozích etapách +Runner/team earlier stage statuses = Závodník/tým: statusy v předchozích etapách +RunnerCheck = Čas pro ražení checku +RunnerExpectedFee = Očekávaný vklad závodníka +RunnerGrossTime = Závodníkův čas před úpravou +RunnerId = Závodníkovo externí ID +Senast sedd: X vid Y = Naposled viděn: X at Y +Slå ihop med befintlig lista = Spoj se stávajícím protokolem +StartTimeClass = Čas startu, kategorie +Startstämpling tillåts inte (X) = Ražení startu zamítnuto (X) +Status E[stageno] = Status E +Status code for cancelled entry = Status kód pro zrušenou přihlášku +Status code for no timing = Status kód pro režim bez časomíry +Status code for running out-of-competition = Status kód pro účast mimo soutěž (OOC) +Stigning = Stoupání +Support intermediate legs = Podpora volby úseku +TeamGrossTime = Čas týmu před úpravou +There is no result module with X as identifier = Není výsledkový modul s identifikátorem X +Tid E[stageno] = Čas E +Till sista = Poslední jako cíl +Till vilka klasser = Do kterých kategorií +Tillåt = Povol +Tillåt anmälan = Povol vstup +Timekeeping = Časomíra +Unexpected Fee = Neočekávané vklady +Utom tävlan = m.s. +Varning: Följande deltagare har ett osäkert resultat = Varování: Přiřazení následujících závodníků je nejisté +Varning: Kartorna är slut = Varování: Žádné mapy +Varvräkning = Počet kol +Varvräkning med mellantid = Počet kol s časem navíc +Vem får anmäla sig = Kdo se smí přihlásit +Vill du sätta hyrbricka på befintliga löpare med dessa brickor? = Chceš uplatnit zapůjčení čipu na tyto závodníky? +Vill du ta bort brickan från hyrbrickslistan? = Chceš odstranit čip ze seznamu zapůjčených? +Vill du ta bort schemat? = Chceš odstranit schéma? +Vill du tömma listan med hyrbrickor? = Chceš smazat seznam zapůjčených čipů? +Visa detaljerad rapport för viss deltagare = Zobraz podrobný výpis pro zvoleného závodníka +Visa rubrik = Zobraz název +Visa rubrik mellan listorna = Zobraz nadpis mezi seznamy +Without courses = Bez tratí +X anmälda = X přihlášek +X går vidare, klass enligt ranking = X kvalifikováno, kategorie dle rankingu +ask:outofmaps = Nejsou mapy. Chceš přesto závodníka přihlásit? +ask:removescheme = Pokud odstraníš schéma, výsledky zmizí. Chceš pokračovat? +ask:usecourseinclass = Trať není používána žádným závodníkem této kategorie.\n\nChceš ji přesto použít? +help:custom_text_lines = Můžeš vložit vybraná vlastní data napsáním [Jména symbolu]. Dostupné symboly jsou vidět v seznamu napravo.\n\n Příklad: Výborně [RunnerName]! +help:registerhiredcards = Předregistruj čipy pro zapůjčení předem a dostanou pak status zapůjčení automaticky, jakmile budou přířazeny závodníkovi. +htmlhelp = HTML can be exported as a structured table or as a freely formatted document (more similar to the MeOS lists). You can also use export templates for custom formatting: columns, JavaScript base page flips, automatic scrolling, etc. It is possible to add custom templates by adding '.template' files in MeOS data folder. If you use a template there is a number of parameters to set below. The exact interpretation depends on the template.\n\nIf you select the list and its settings is stored permanently in the competition. You can then access the list by using MeOS as a web server (The service 'Information Server') or export the list automatically at regular intervals. +htmlhelp = HTML může být exportováno jako strukturovaná tabulka nebo jako volně formátovaný dokument (spíše podobný protokolům MeOSu). Můžeš také použít exportní šablony pro vlastní formátování: sloupce, JavaScriptové převracení stránek, automatické rolování, atd. Je možné přidat vlastní šablony přidáním '.template' souborů do datové složky MeOSu. Pokud použiješ šablonu, pak je třeba níže nastavit řadu parametrů. Přesná interpretace závisí na šabloně.\n\nPokud zvolíš , protokol a jeho nastavení jsou trvale uloženy v závodě. Pak jej můžeš použít s MeOSem coby webovým servrem (Služba 'Informační Server') nebo exportovat protokol automaticky v pravidelných intervalech. +info:advanceinfo = Start služby pro okamžitý přenos výsledků selhal. Výsledky budou přijaty s několika-vteřinovým zpožděním. Toto je očekávané chování když je na počítači spuštěno vícero MeOS procesů. +info:pageswithcolumns = Zobraz protokol po stránkách, s udaným počtem sloupců. Automaticky obnov data po každém kole. +prefsLastExportTarget = Poslední cíl exportu +prefsServiceRootMap = Výchozí funkce kořene webového serveru +prefsshowheader = Zobrazuj hlavičky stránek +warn:printmodeonly = Věz, že vytvoříš pouze výtisk obsahu čipu.\n\nK uložení výsledku do závodu potřebuješ zvolit funkci vyčtení/rádio. +Åldersfiltrering = Věkový filtr +Övrigt = Různé diff --git a/code/english.lng b/code/english.lng index b86c8c7..557cdc2 100644 --- a/code/english.lng +++ b/code/english.lng @@ -2493,3 +2493,4 @@ Först = First Lottat = Drawn Sist = Last Fakturadatum = Fakturadatum +Youth Cup X = Youth Cup X diff --git a/code/french.lng b/code/french.lng index 9657218..864d756 100644 --- a/code/french.lng +++ b/code/french.lng @@ -9,13 +9,15 @@ (sekunder) = (secondes) (sträckseger) = (meilleur partiel) ALLA( = Tous( -API-nyckel = clef API +API-nyckel = clé API Accepterade elektroniska fakturor = Factures électroniques acceptées Adress = Adresse Adress och kontakt = Adresse et contact Aktivera = Activer la lecture Alla = Tous -Alla banfiler = Tous les fichiers de circuit -oli +Vuxna = Adultes +Ungdom = Jeunes +Alla banfiler = Tous les fichiers de circuit Alla deltagare måste ha ett namn = Tous les concurrents doivent avoir un nom Alla fakturor = Toutes les factures Alla händelser = Tous les évènements @@ -41,6 +43,7 @@ Anmälningar = Inscriptions Anmälningar (IOF (xml) eller OE-CSV) = Inscriptions (IOF (xml) ou OE-CSV) Anmälningsavgift = Droits d'inscription Anmälningsläge = Mode saisie rapide +Anmälningstid = Heure d'inscription Anslut = Connecter Anslut till en server = Connexion au serveur Ansluten till = Connecté à @@ -60,12 +63,12 @@ Antal misslyckade: X = Nombre d'inscriptions Antal startande per block = Nombre de départ par bloc Antal startande per intervall (inklusive redan lottade) = Nombre de départs par intervalle (y compris ceux déjà affectés) Antal sträckor = Nombre de branches -Antal vakanser = Nombre de vacants +Antal vakanser = Nombre de vacants Antal: %d = Nombre: %d Antal: X = Nombre: X Antalet rader i urklipp får inte plats i selektionen = Le nombre de ligne dans le presse-papier ne correspond pas à la sélection Använd Eventor = Utiliser Eventor -Använd banpool = Utiliser un jeu de circuits +Använd banpool = Utiliser un jeu de circuits Använd funktioner för fleretappsklass = Utiliser les fonctions de courses à étape Använd första kontrollen som start = Utiliser le premier boîtier comme boîtier départ Använd löpardatabasen = Utiliser la base des coureurs @@ -74,13 +77,13 @@ Använd speakerstöd = Utiliser le module speaker Använd stor font = Utiliser une grande police Använd symbolen X där MeOS ska fylla i typens data = Utilisez le symbole X à l'emplacement où MeOS doit insérer les données Användarnamn = Nom de l'utilisateur -Applicera för specifik sträcka = Utiliser pour un partiel spécifique +Applicera för specifik sträcka = Utiliser pour une branche spécifique Arrangör = Organisateur Att betala = A payer Att betala: X = A payer: X Automater = Services Automatisera = Automatiser -Automatisk lottning = Tirage au sort Automatique +Automatisk lottning = Tirage au sort automatique Automatisk skroll = Défilement automatique Automatisk utskrift = Impression automatique Automatisk utskrift / export = Impression / export automatique @@ -107,12 +110,12 @@ Banan måste ha ett namn = Le circuit doit avoir un nom Banmall = Circuit Banor = Circuits Banor (antal kontroller) = Circuit (nombre de postes) -Banor för %s, sträcka %d = Circuit pour %s, partiel %d +Banor för %s, sträcka %d = Circuit pour %s, branche %d Banor, IOF (xml) = Circuits, IOF (xml) Banor, OCAD semikolonseparerat = Circuits, format OCAD -Banpool = [pool de circuits] -Banpool, gemensam start = [pool de circuits], départ en masse -Banpool, lottad startlista = [pool de circuits], liste de départ établie +Banpool = Liste des circuits possibles +Banpool, gemensam start = Liste de circuits, masse +Banpool, lottad startlista = Liste de circuits, avec horaires Bantilldelning = Affectation de circuit Bantilldelning, individuell = Affectation de circuit, course individuelle Bantilldelning, stafett = Affectation de circuit, relais @@ -124,8 +127,8 @@ Begränsning, antal visade per klass = Nombre maximum de coureurs par catégorie Behandlar löpardatabasen = Traitement de la base de données des coureurs Behandlar tävlingsdata = Traitement des compétitions Behandlar: X = Traitement: X -Bekräfta att %s byter klass till %s = Confirmer SVP que %s passe dans la catégorie %s -Bekräfta att deltagaren har lämnat återbud = Confirmez SVP l'annulation de ce coureur +Bekräfta att %s byter klass till %s = Confirmez que %s passe dans la catégorie %s +Bekräfta att deltagaren har lämnat återbud = Confirmez l'annulation de ce coureur Betalat = Payé Betalningsinformation = Détails du paiement Bevakar händelser i X = Moniteur d'évènement X @@ -146,7 +149,7 @@ Bomtid: X = Temps perdu: X Bricka = Puce Bricka %d används redan av %s och kan inte tilldelas = La puce %d est utilisé par %s et ne peut être réaffectée Brickan redan inläst = Puce déjà lue -Brickhyra = Location de puce +Brickhyra = Loc. puce Bricknummret är upptaget (X) = Puce utilisée (X) Brickor = Puces Bygg databaser = Création des bases de données @@ -168,22 +171,22 @@ ClubName = Nom du club ClubRunner = Club / Coureur CmpDate = Date de la compétition CmpName = Nom de la compétition -CourseClimb = Dénivelée circuit +CourseClimb = Dénivelé circuit CourseLength = Longueur circuit CourseName = Nom du circuit CourseResult = Résultat du circuit CurrentTime = Heure actuelle Databasanslutning = Connexion base de données -Databasvarning: X = Base de donnée, warning : X -Datorröst som läser upp förvarningar = Annonce vocales des coureurs +Databasvarning: X = Base de donnée, attention : X +Datorröst som läser upp förvarningar = Annonce vocale des coureurs Datum = Date Decimalseparator = Séparateur décimal DefaultFont = Formatage standard -Dela = Scinder -Dela efter ranking = Scinder par classement -Dela klass: X = Scinder la catégorie: X -Dela klassen = Scinder la catégorie -Dela klubbvis = Scinder par club +Dela = Diviser +Dela efter ranking = Diviser par classement +Dela klass: X = Diviser la catégorie: X +Dela klassen = Diviser la catégorie +Dela klubbvis = Diviser par club Deltagare = Coureurs Deltagare %d = Coureur %d Deltagaren 'X' deltar i patrullklassen 'Y' men saknar patrull. Klassens start- och resultatlistor kan därmed bli felaktiga = Le coureur 'X' est dans la catégorie d'équipe 'Y', mais n'a pas d'équipe. Les résultats dans cette catégorie pourraient être faussés. @@ -192,7 +195,7 @@ Deltagaren 'X' saknar klass = Le coureur 'X' n'a pas de catégorie Deltar ej = Ne participe pas Denna etapps nummer = Numéro d'étape Destinationskatalog = répertoire de destination -Det går endast att sätta in vakanser på sträcka 1 = Vous pouvez ajouter des places vacantes seulement sur le premier partiel +Det går endast att sätta in vakanser på sträcka 1 = Vous pouvez ajouter des places vacantes seulement sur la première branche Det här programmet levereras utan någon som helst garanti. Programmet är = Ce programme est fourni tel quel, sans aucune garantie. Ce programme est Direktanmälan = Inscription rapide Disk. = Disq. @@ -201,32 +204,32 @@ Don't know how to align with 'X' = Impossible d'aligner avec 'X' Du kan importera banor och klasser från OCADs exportformat = Vous pouvez importer des circuits et des catégories à partir d'un fichier exporté par OCAD Du måste välja en klass = Vous devez choisir une catégorie Duplicera = Dupliquer -E-post = Courriel +E-post = E-mail Efter = Après Efteranm. avg. = Frais inscription tardives Efteranmälda (efter ordinarie) = Inscriptions tardives (Après) Efteranmälda (före ordinarie) = Inscriptions tardives (Avant) Efteranmälda före ordinarie = Inscriptions tardives en premier Efteranmälningar = Inscriptions tardives -Egen listrubrik = En-tête personnalisée +Egen listrubrik = En-tête personnalisé Egen text = Texte personnalisé Egenskaper = Propriétés Eget fönster = Nouvelle fenêtre Egna listor = Listes personnalisées -Ej accepterade elektroniska fakturor = factures électronique refusées +Ej accepterade elektroniska fakturor = Factures électronique refusées Ej elektronisk = Pas électronique Ej lottade = Pas tiré au sort Ej lottade, efter = Tirés au sort restant après Ej lottade, före = Tirés au sort restant avant Ej start = Non partant -Ej tidtagning = non chronométré +Ej tidtagning = Non chronométré Ekonomisk sammanställning = Synthèse financière Elektronisk = Electronique Elektronisk godkänd = Accepté électroniquement Elit = Élite -Elitavgift = Frais d'inscription pour les Elites -Elitklasser = Catégorie Elite -En gafflad sträcka = Un embranchement +Elitavgift = Frais élites +Elitklasser = Catégorie élite +En gafflad sträcka = Circuit avec variations En klass kan inte slås ihop med sig själv = Vous ne pouvez pas fusionner une catégorie avec elle-même En klubb kan inte slås ihop med sig själv = Un club ne peut pas fusionner avec lui-même Endast en bana = Circuit individuel @@ -252,11 +255,11 @@ Exportera tävlingsdata = Export des données Externt Id = Identifiant externe Extra = Extra Extra stämplingar = Poinçons supplémentaires -Extralöparstafett = [Co-runner relay] +Extralöparstafett = Relais avec Open FAKTURA = FACTURE FEL, inget svar = Erreur, pas de réponse -FEL: Porten kunde inte öppnas = Error: le port ne peut pas être ouvert -Failed to generate card = Impossible de générer la puce[Failed to generate card] +FEL: Porten kunde inte öppnas = Erreur: le port ne peut pas être ouvert +Failed to generate card = Impossible de lire la puce Failed to open 'X' for reading = Echec de l'ouverture de 'X' en lecture Faktiskt startdjup: X minuter = Durée des départs: X minutes Faktura = Facture @@ -266,7 +269,7 @@ Fakturor = Factures Fel: X = Erreur: X Fel: hittar inte filen X = Erreur. Fichier 'X' non trouvé Felaktig kontroll = Mauvais poinçon -Felaktig nyckel = Clef incorrecte +Felaktig nyckel = Clé incorrecte Felaktig sträcka = Numéro de relayeur incorrect Felaktigt filformat = Format de fichier incorrect Felst. = PM @@ -288,7 +291,7 @@ FilterStarted = A démarré Filtrering = Filtrage FinishTime = Heure d'arrivée, nom Flera banor = Multi circuits -Flera banor / stafett / patrull / banpool = Multi circuits/ Relais / Patrouille / [Pool circuits] +Flera banor / stafett / patrull / banpool = Multi circuits/ Relais / Patrouille / Liste de circuits Flera banor/stafett = Multi circuits / Relais Flytta höger = Vers la droite Flytta vänster = Vers la gauche @@ -316,7 +319,7 @@ För muspekaren över en markering för att få mer information = Survoler avec För många kontroller = Trop de contrôles Förbered lottning = Préparation du tirage au sort Fördefinierade tävlingsformer = Compétitions prédéfinies -Fördela starttider = attribution des heures de départ +Fördela starttider = Attribution des heures de départ Föregående = Précédent Föregående etapp = Etape précédente Förhandsgranskning, import = Prévisualisation de l'import @@ -329,7 +332,7 @@ Första omstartstid = [First time for restart] Första ordinarie starttid = Première heure de départ normale Första start = Premier départ Första starttid = Premier horaire de départ -Första sträckan kan inte vara parallell = Le premier partiel ne peut pas être dédoublé +Första sträckan kan inte vara parallell = La première branche ne peut pas être dédoublée Försöket misslyckades = L'opération a échoué Förvarning på (SI-kod): alla stämplingar = Pré-warning (code SI): tous les poinçons Förvarningsröst = Pré-warning Voix @@ -341,7 +344,7 @@ Generera testtävling = Générer une compétition de test Genererad = Généré à Geografisk fördelning = Répartition géographique Global sorteringsordning = Ordre de tri global -Godkänd API-nyckel = Clef API acceptée +Godkänd API-nyckel = Clé API acceptée Granska inmatning = Prévisualisation Grund avg. = Tarifs de base Grundavgift = Tarif de base @@ -356,9 +359,9 @@ Hemsida = Site web Hjälp = Aide Hoppar över stafettklass: X = Sauter la catégorie de relais: X Huvudlista = Liste principale -Hyravgift = Tarif de Location +Hyravgift = Tarif de location Hyrbricka = Puces louées -Hyrbricksrapport = Rapport avec puces louées +Hyrbricksrapport = Rapport des puces louées Hyrbricksrapport - %s = Puces louées - %s Hyrd = Louée Hämta (efter)anmälningar från Eventor = Rechercher les enregistrements récents dans Eventor @@ -375,7 +378,7 @@ Hämtar klubbar = Recherche de clubs Hämtar löpardatabasen = Recherche dans la base des coureurs Hämtar tävling = Recherche d'une compétition Händelser = Evènement -Händelser - tidslinje = Evènement - Chronologie +Händelser - tidslinje = Evènement - chronologie Hög avgift = Frais d'inscription tardive IOF (xml) = IOF (xml) IOF Resultat (xml) = Résultats IOF (xml) @@ -388,7 +391,7 @@ IOF Löpardatabas, version 3.0 (xml) = Base de données des coureurs IOF, versio IOF Klubbdatabas, version 3.0 (xml) = Base de données des clubs IOF, version 3.0 (xml) IP-adress eller namn på en MySQL-server = Adresse IP ou nom d'un serveur MySQL Id = Id -Identifierar X unika inledningar på banorna = Identification X ouvertures unique des circuits +Identifierar X unika inledningar på banorna = X débuts de circuits différents identifiés Importera = Importer Importera IOF (xml) = Import IOF (xml) Importera anmälningar = Importation des inscriptions @@ -416,10 +419,10 @@ Importerar tävlingsdata (IOF, xml) = Importation des données de compétition(I Importerbara = Importable Index = Index Individuell = par catégorie -Individuell resultatlista, alla lopp = liste de résultat par nom, toute les courses -Individuell resultatlista, sammanställning av flera lopp = liste de résultat par nom, résumé -Individuell resultatlista, visst lopp = liste de résultat par nom, spécifique -Individuell resultatlista, visst lopp (STOR) = liste de résultat par nom, spécifique (GRAND) +Individuell resultatlista, alla lopp = Liste de résultat par nom, toute les courses +Individuell resultatlista, sammanställning av flera lopp = Liste de résultat par nom, résumé +Individuell resultatlista, visst lopp = Liste de résultat par nom, spécifique +Individuell resultatlista, visst lopp (STOR) = Liste de résultat par nom, spécifique (GRAND) Individuell startlista, visst lopp = Liste de départ par nom, spécifique Individuella deltagare = Coureurs individuels Individuella slutresultat = Résultats finaux individuels @@ -436,7 +439,7 @@ Ingen klass vald = Pas de catégorie sélectionnée Ingen löpare saknar bricka = tous les coureurs ont une puce Ingen matchar 'X' = Aucune correspondance pour 'X' Ingen rogaining = Pas de course au score -Inkommande = Nouveautés +Inkommande = Arrivants Inläst bricka ställd i kö = La puce a été mise en file d'attente Inlästa brickor = Lecture de puces Inmatning av mellantider = Entrez les temps intermédiaires @@ -467,7 +470,7 @@ Klass saknad = Catégorie absente Klass / klasstyp = Catégorie / Type Klass att slå ihop = Catégories à fusionner Klassbyte = Modifier la catégorie -Klassen 'X' har jaktstart/växling på första sträckan = La catégorie 'X' a une chasse/variation sur le premier partiel +Klassen 'X' har jaktstart/växling på första sträckan = La catégorie 'X' a une chasse/variation sur la première branche Klassen används och kan inte tas bort = La catégorie est utilisée et ne peut être supprimée Klassen lottas inte, startstämpling = Poinçon de départ uniquement Klassen måste ha ett namn = La catégorie doit avoir un nom @@ -491,7 +494,7 @@ Klubbar (IOF, xml) = Clubs (IOF, xml) Klubbar som inte svarat = Clubs qui n'ont pas répondu Klubbdatabasen = Base de données des clubs Klubblös = Pas de club -Klubbresultat = par club +Klubbresultat = par club Klubbresultatlista = Résultats par club Klubbresultatlista - %s = Résultats par club - %s Klubbstartlista = par club @@ -629,7 +632,7 @@ Med stafettklasser = Avec relais Med sträcktidsanalys = Avec analyse des temps intermédiaires MediumFont = Texte moyen MediumPlus = Texte un peu plus grand -Medlöpare = Co-compétiteur +Medlöpare = Open Mellantider visas för namngivna kontroller = Les temps intermédiaires sont affichés pour les contrôles nommés Metod = Méthode Min. vakanser (per klass) = Nombre min. de vacant (par catégorie) @@ -660,7 +663,7 @@ Normal = Normal NormalFont = Texte normal Normalavgift = Frais normaux Not implemented = Non implémenté -Nr = Nombre +Nr = Dossard Nummerlapp = Dossard Nummerlappar = Dossards Nummerlappar i X = Dossards pour X @@ -672,7 +675,7 @@ Ny klubb = Nouveau club Ny kontroll = Nouveau poste Ny lista = Nouvelle liste Ny tävling = Nouvelle compétition -Nyckel för Eventor = Clef Eventor +Nyckel för Eventor = Clé Eventor Nytt fönster = Nouvelle fenêtre Nytt lag = Nouvelle équipe Nästa = Suivant @@ -684,7 +687,7 @@ Ogiltig banfil. Kontroll förväntad på position X, men hittade 'Y' = Fichier d Ogiltig föregående/efterföljande etapp = Etape précédente/suivante invalide Ogiltig första starttid. Måste vara efter nolltid = Heure du premier départ invalide. Doit être postérieure à l'heure zéro Ogiltig omstartstid = Heure de nouveau départ invalide -Ogiltig repdragningstid = Temps de corde invalide [Invalid rope time] +Ogiltig repdragningstid = Temps d'arrêt des attardés invalide Ogiltig starttid i 'X' på sträcka Y = Heure de départ dans 'X' invalide pour le relayeur Y Ogiltig starttid: X = Heure de départ invalide: X Ogiltig tid = Heure invalide @@ -695,8 +698,8 @@ Okänd funktion = Mode inconnu Okänd klass = Catégorie inconnue Okänd klubb med id X = Club avec identifiant X inconnu Om MeOS = A propos de MeOS -Om MeOS – ett Mycket Enkelt OrienteringsSystem = A propos de MeOS – un logiciel de CO nettement plus simple -Omstart = Redémarrage +Om MeOS – ett Mycket Enkelt OrienteringsSystem = A propos de MeOS – un logiciel de CO nettement plus simple +Omstart = Départ des attardés Omstart i stafettklasser = Redémarrage du relais Omstartstid = Heure de redémarrage Omvänd jaktstart = Chasse inversée @@ -709,7 +712,7 @@ Ordinarie avgift = Frais d'inscription normaux Organisation = Organisation Oväntad kontroll 'X' i bana Y = Poste 'X' non prévu dans le circuit Y Packar upp löpardatabas = Extension de la base des coureurs -Par- eller singelklass = Catégorie pour patrouille ou individuel +Par- eller singelklass = Binôme ou individuel Para ihop = Appairage Para ihop bricka X med en deltagare = Association de la puce X avec un coureur Parallell = Parallèle @@ -733,7 +736,7 @@ Poängavdrag per påbörjad minut = Point de pénalité pour toute minute entam Poänggräns = Limite en points Prel. bomtid = Temps perdu (prélim.) Prel. placering = Place (prélim.) -Prioritering = Prioritisation +Prioritering = Priorisation Prisutdelningslista = Résultats pour la remise des prix Programinställningar = Configuration du programme Prolog + jaktstart = Prologue + chasse @@ -743,7 +746,7 @@ Publicera startlista = Publication des horaires de départ Publicera startlistan på Eventor = Publication des horaires de départ sur Eventor Publicerar resultat = Publication des résultats Publicerar startlistan = Publication des horaires de départ -PunchNamedTime = temps intermédiaires nommés +PunchNamedTime = Temps intermédiaires nommés PunchTime = Heure de poinçonnage Punches = Poinçons Radera = Supprimer @@ -766,21 +769,21 @@ Reducerad avg = Frais d'inscription réduits Reduktionsmetod = Méthode de réduction Region = Région Relativ skalfaktor för typsnittets storlek i procent = Facteur d'échelle pour la police (pourcentage) -Rep = Corde +Rep = Arrêt attardés Reparera vald tävling = Réparer la compétition sélectionnée Reparerar tävlingsdatabasen = Réparation de la base de données de la compétition -Repdragningstid = Heure de corde [Rope time] -Repdragningstiden måste ligga före omstartstiden = L'heure de corde doit précéder l'heure des re-départs +Repdragningstid = Heure d'arrêt des attardés +Repdragningstiden måste ligga före omstartstiden = L'heure d'arrêt doit précéder l'heure des re-départs Reserverade = Réservé Resultat = Résultat -Resultat && sträcktider = Résultat && temps intermédiaires +Resultat && sträcktider = Résultats / Temps interm. Resultat (STOR) = Résultats (GRAND) Resultat - %s = Résultats - %s Resultat - X = Résultats - X -Resultat banvis per klass = Résultat circuit-wise par catégorie +Resultat banvis per klass = Résultat des circuits par catégorie Resultat efter klass och bana - X = Résultats par catégorie et circuit - X Resultat efter sträcka %d = Résultats après le relayeur %d -Resultat efter sträcka X = Résultats après le partiel X +Resultat efter sträcka X = Résultats après le X ème relayeur Resultat efter sträckan = Résultats après le relayeur Resultat för ett visst lopp = Résultats pour une course donnée Resultat lopp X - Y = Résultats pour la course X - Y @@ -822,13 +825,13 @@ RunnerRogainingPoint = Points de la course au score RunnerStart = Heure de départ du coureur RunnerStartNo = Numéro de départ du coureur RunnerTempTimeAfter = Temps du coureur après le poste sélectionné -RunnerTempTimeStatus = Temps/statut du coureur au poste sélectionné +RunnerTempTimeStatus = Temps / statut du coureur au poste sélectionné RunnerTime = Temps du coureur RunnerTimeAfter = Retard du coureur RunnerTimeAfterDiff = Différence de retard du coureur RunnerTimeLost = Temps perdu par le coureur RunnerTimePlaceFixed = Instant à partir duquel la place du coureur n'a plus évolué -RunnerTimeStatus = Temps/statut du coureur +RunnerTimeStatus = Temps / statut du coureur RunnerTotalPlace = Place consolidée du coureur RunnerTotalTime = Temps consolidé du coureur RunnerTotalTimeAfter = Retard consolidé du coureur @@ -858,7 +861,7 @@ Server: [X] Y = Serveur: [X] Y Sidbrytning mellan klasser = Saut de page Sidbrytning mellan klasser / klubbar = Saut de page entre catégories / clubs Simulera inläsning av stämplar = Simuler la lecture de puce -Sista betalningsdatum = Paiements dus +Sista betalningsdatum = Paiements dûs au (AAAA-MM-JJ) Sista ordinarie anmälningsdatum = Date limite d'inscription au tarif normal Sista start (nu tilldelad) = Dernier départ (affecter maintenant) Sista start (nu tilldelad): X = Dernier départ (affecté): X @@ -972,7 +975,7 @@ Starttiden är upptagen = L'heure de départ n'est pas disponible Starttyp = Type de départ Status = Statut Status OK = Statut OK -Status in = saisie du statut +Status in = Saisie du statut Stoppa automaten = Arrêt du service Stor = Grand Str. = Relais @@ -1016,10 +1019,10 @@ SubCounter = Compteur secondaire SubSubCounter = Compteur tertiaire Summera = Somme Synkronisera med Eventor = Synchroniser avec Eventor -Säkerhetskopiera = Sauvegarder/Enregistrer sous -Sätt okända löpare utan registrering till = Définir le statut pour les coureurs non enregistrés +Säkerhetskopiera = Enregistrer sous +Sätt okända löpare utan registrering till = Définir le statut pour les coureurs non enregistrés Sätt som oparad = Non appairé -Sätter reptid (X) och omstartstid (Y) för = Temps de corde (X) et heure de redémarrage (Y) appliqués pour +Sätter reptid (X) och omstartstid (Y) för = Heure d'arrêt des attardés (X) et heure de redémarrage (Y) appliqués pour Sök = Rechercher Sök (X) = Rechercher (X) Sök deltagare = Rechercher un coureur @@ -1073,7 +1076,7 @@ Tidsintervall (MM:SS) = Intervalle de temps (MM:SS) Tidsjustering = Ajustement de l'heure Tidslinje – X = Chronologie – X Tidsskalning = Echelle de temps -Till huvudsidan = Vers la page principale +Till huvudsidan = Retour Till kontroll = Au poste Tilldela = Affecter Tilldela avgifter = Affecter les frais d'inscription @@ -1084,7 +1087,7 @@ Tilldelning av hyrbrickor = Affecter les puces louées Tillgängliga automater = Services disponibles Tillsatte vakans = Vacants utilisés Tillsätt vakans = Remplir les vacants -Tillämpa parstart = Démarrer l'appairage +Tillämpa parstart = Appairage des départs Tillåt decimaler = Autoriser les décimales Tillåt direktanmälan = Autoriser la saisie rapide Tillåt valutauttryck med decimaler = Autoriser les expressions monétaires avec décimales @@ -1100,7 +1103,7 @@ Totalt kontant = Total des espèces Totaltid = Temps total Trasig = Défectueux Träning = Entrainement -Tvåmannastafett = Relais en binôme +Tvåmannastafett = Relais Finlandais Typ = Type Typ av delning = Type de temps intermédiaire Typ av export = Type d'export @@ -1121,7 +1124,7 @@ Tävlingsstatistik = Statistiques de la compétition Underlag för tävlingsavgift = Données pour les frais d'inscription de la compétition Underlista = Sous liste Underrubrik = Sous-titre -Undre datumgräns = Date limite basse [Lower date limit] +Undre datumgräns = Première date limite Undre gräns (år) = Limite basse (années) Undre ålder = Age minimal Ungdom = Jeune @@ -1132,7 +1135,7 @@ Uppdatera alla klubbar = Mise à jour de tous les clubs Uppdatera alla värden i tabellen = Mise à jour de la table Uppdatera alla värden i tabellen (X) = Rafraîchir les valeurs de la table (X) Uppdatera från Eventor = Mise à jour depuis Eventor -Uppdatera fördelning = Mise à jour de la diffusion +Uppdatera fördelning = Mise à jour de la distribution Uppdatera fördelningen av starttider med hänsyn till manuella ändringar ovan = Mise à jour de la diffusion des horaires de départ en prenant en compte les changements manuels Uppdatera klubbar && löpare = Mise à jour des clubs et coureurs Uppdatera klubbarnas och löparnas uppgifter med data från löpardatabasen/distriktsregistret = Mise à jour des clubs et coureurs en utilisant la base de données des coureurs @@ -1211,8 +1214,8 @@ Visualisera startfältet = Visualisation des champs de départ Vuxen = Adulte Vuxenklasser = Catégories adultes Vuxna = Adultes -Välj Spara för att lagra brickorna. Interaktiv inläsning är INTE aktiverad = Cliquer sur pour enregistrer la puce. La lecture interactive n'est pas activée -Välj Spara för att lagra brickorna. Interaktiv inläsning är aktiverad = clinker sur pour enregistrer les puces. La lecture interactive est activée +Välj Spara för att lagra brickorna. Interaktiv inläsning är INTE aktiverad = Cliquer sur pour enregistrer les puces. La lecture interactive n'est pas activée +Välj Spara för att lagra brickorna. Interaktiv inläsning är aktiverad = Cliquer sur pour enregistrer les puces. La lecture interactive est activée Välj alla = Sélectionner tout Välj alla klasser = Sélectionner toutes les catégories Välj allt = Sélectionner tout @@ -1229,7 +1232,7 @@ Välj klasser där alla löpare saknar starttid = Sélectionner les catégories Välj klasser där någon löpare saknar starttid = Sélectionner les catégories où des coureurs n'ont pas d'heure de départ Välj kolumner = Choisir les colonnes Välj kolumner att visa = Choisir les colonnes à afficher -Välj kolumner för tabellen X = Choisir les colonnes pour la table X +Välj kolumner för tabellen X = Choisir les colonnes pour le tableau X Välj lista = Sélectionner la liste Välj lopp = Sélectionner la course Välj löpare = Choisir un coureur @@ -1242,7 +1245,7 @@ Välj vilka klasser och kontroller som bevakas = Sélectionner les catégories e Välj vilka kolumner du vill visa = Choisir les colonnes à afficher Välj vy = Choisir la vue Välkommen till MeOS = Bienvenue dans MeOS -Vänligen betala senast = Merci de régler au plus tard le +Vänligen betala senast = Merci de régler avant le Vänligen återlämna hyrbrickan = Merci de rendre votre puce de location Växling = Changement Webb = Document Web @@ -1263,11 +1266,11 @@ Zooma in (Ctrl + '+') = Zoomer (Ctrl + '+') Zooma ut (Ctrl + '-') = Dézoomer (Ctrl + '-') [Bevaka] = [Observer] [Flytta ner] = [Descendre] -[Bort] = [Supprimer] +[Bort] = [Descendre] [Klassens bana] = [De la catégorie] [Uppdaterad anmälan] = [Mise à jour de l'inscription] [VARNING] ingen/okänd = [ATTENTION] aucun/inconnu -[Återställ] = [Remise à zéro] +[Återställ] = [Restaurer] andra = seconde ask:addpunches = Aucune puce n'a été lue pour ce coureur. Voulez-vous ajouter des poinçons manuellement ? ask:changedclassfee = Le tarif a été modifié pour certaines catégories. Voulez-vous appliquer les nouveaux tarifs aux coureurs déjà présents dans ces catégories ?\n\nAttention: les frais d'inscription affectés manuellement seront écrasés. @@ -1279,7 +1282,7 @@ ask:overwrite_server = La compétition est déjà sur le serveur. Voulez-vous é ask:overwriteconfirm = Vous avez choisi d'écraser la compétition. Vérifiez que personne d'autre n'est connecté.\n\nSouhaitez vous continuer ? ask:repair = Effectuez une réparation de la base de données uniquement si vous rencontrez des problèmes.\n\nImportant:\n- Assurez-vous que personne d'autre n'est connecté à la base.\n- Si le serveur plante ou s'arrête pendant la réparation, vous devez le redémarrer et réessayer la réparation avant d'effectuer quoi que ce soit d'autre. Si vous faites d'autres opération avec la base de données toutes les données seront perdues.\n\nSouhaitez-vous essayer une réparation maintenant ? backup = sauvegarde -c/o = Aux bon soins de +c/o = Représenté par check (X) = Vérification de (X) ej aktiv = inactif elfte = onzième @@ -1294,15 +1297,15 @@ fritt att använda och du är välkommen att distribuera det under vissa villkor fyra = quatrième går i mål på X plats med tiden Y = termine X en Y går i mål på X plats, efter Y, på tiden Z = termine X, derrière Y, en Z -går i mål på delad X plats med tiden Y = finit ex-aequo en Xème place, en Y +går i mål på delad X plats med tiden Y = finit ex-aequo en Xè place, en Y går upp i delad ledning med tiden X = partage la tête de la course en X handskakning = authentification har startat = a démarré help:10000 = Un service dans MeOS est un petit programme qui, de temps à autre ou lorsque les données de la compétition changent, fait des choses automatiquement. help:12138 = Choisir une catégorie à fusionner avec la catégorie choisie. Si le tirage des catégories a été effectué, vous devez refaire un tirage, car les coureurs conservent leur horaire de départ. help:12290 = La compétition a été créée avec une autre version de MeOS et ne peut pas être ouverte depuis le serveur. Vous pouvez toutefois importer la compétition depuis un fichier. -help:12352 = Cette opération supprime le club que vous avez choisi (%s, id -help:12662 = Ajoutez des postes en ajoutant une séquence de numéros de postes. Vous ne devez pas préciser l'arrivée. Exemple: 31, 50, 36, 50, 37, 100. +help:12352 = Cette opération supprime le club que vous avez choisi (%s, id=d%) et déplace tous ses coureurs vers le club que vous choisirez ci-dessous. L'opération ne pourra pas être annulée. +help:12662 = Ajoutez des postes en ajoutant une séquence de numéros de postes. Vous ne devez pas préciser l'arrivée. Exemple: 31, 50, 36, 50, 37, 100 help:14070 = Le port TCP est utilisé pour recevoir les poinçons par TCP depuis d'autres machines. Précisez le port utilisé. L'instant initial du protocole est 00:00:00. help:14343 = Une liste avec la puce lue est affichée. Pour affecter un coureur à une autre puce, double cliquez sur la puce ou le coureur que vous souhaitez déplacer. help:146122 = Vous pouvez étendre les connaissances de MeOS sur les coureurs, clubs et catégories en cherchant les bases de données au format MeOS ou IOF (xml).\n\nSouhaitez vous effectuer cette opération ? @@ -1310,45 +1313,45 @@ help:14692 = Saisir le numéro de poste, le coureur (numéro de départ ou de pu help:15491 = Vous pouvez exporter les configurations ainsi que les bases de données des clubs et coureurs dans le répertoire de votre choix. Ces configurations et bases de données peuvent être importées sur un autre PC. help:21576 = En cas d'erreur, cliquer sur le nom des coureurs pour modifier la saisie. Utiliser la page des coureurs pour supprimer les enregistrements. Pour voir une catégorie dans la liste ci-dessous, elle doit être marquée pour saisie rapide sur la page des catégories. help:25041 = Ici vous déclarez vos circuits. Un circuit est alors lié à une ou plusieurs catégories (ou coureurs). Il est également possible d'importer des circuits depuis OCAD, Condes, ou tout autre logiciel d'élaboration de circuits. Si vous spécifiez le nombre de cartes, MeOS contrôlera le nombre de cartes disponibles dans le formulaire de saisie rapide. -help:26963 = Un ensemble de circuits est utilisé pour définir un ensemble de partiels pour une branche. Le circuit est affecté au compétiteur à l'arrivée sur la base des postes poinçonnés. Définissez les partiels dans le groupe en les ajoutant dans Circuits Multiples/Relais. Un [S] après la catégorie signifie que tous les compétiteurs ont un horaire de départ. +help:26963 = Un ensemble de circuits est utilisé pour définir un ensemble de partiels pour une branche. Le circuit est affecté au coureur à l'arrivée sur la base des postes poinçonnés. Définissez les branches dans le groupe en les ajoutant dans Circuits Multiples/Relais. Un [S] après la catégorie signifie que tous les coureurs ont un horaire de départ. help:29191 = Vous pouvez installer les configurations, clubs et base de données des coureurs à partir d'un répertoire source spécifié. Vos configurations locales sont écrasées. MeOS devrait être redémarré après l'installation.\n\nLe bouton vous conduit à une page où vous pouvez exporter votre configuration courante. help:29758 = Ici vous gérez les clubs et l'impression des factures. Vous pouvez définir un tarif prenant en compte le type de catégorie et la date d'inscription. Les clubs en double (mal orthographiés) peuvent être regroupés dans le club correct. Vous pouvez également mettre à jour les adresses de clubs à partir du tableau de comptes. help:30750 = Vous pouvez créer un grand nombre de listes et rapports différents. Ceux-ci peuvent être visualisés à l'écran, imprimés, ou sauvés dans un format web. La liste est automatiquement mise à jour lorsque des données liées à la compétition changent. L'impression automatique des résultats s'obtient à partir de la page Services. Pour exporter les données de la compétition, par exemple les temps intermédiaires, aller à la page Compétition. -help:31661 = Un nouveau départ (en masse) est défini par une barrière horaire et une heure de reprise. A la barrière horaire les passages de relais sont terminés et aucun compétiteur n'est autorisé à partir en forêt. Les concurrents restants partent à l'heure de la barrière horaire. Il est possible de spécifier différents horaires pour des partiels précis, mais en utilisant cette fonction vous pouvez rapidement prendre en charge des catégories entières.\n\nSi des équipes refusent le départ en masse des attardés (possible aux CFC par exemple), il suffit de cocher dans la page Équipes la case 'Empêcher le redémarrage' des équipes concernées. -help:33940 = Importer les inscriptions en format texte libre. Spécifier le nom, le club, la catégorie et le numéro de puce (éventuellement l'heure de départ), de préférence séparés par des virgules, une personne (équipe) par ligne. Il est également possible de spécifier plusieurs compétiteurs dans le même club / catégorie en laissant partiellement vides ces champs. Il est également possible d'importer des données formatées par d'autres moyens. -help:41072 = Sélectionner un poinçon dans la liste pour le modifier ou le supprimer. Vous pouvez ajouter des poinçons manquants à partir du modèle de course. Si l'heure d'arrivée est manquante, le coureur obtient le statut . Si un poinçon est manquant, le statut est . Il est impossible d'assigner un statut incompatible avec les poinçons. S'il y a un poinçon d'arrivée, vous devez le modifier pour pouvoir définir manuellement l'heure d'arrivée. Le même principe s'applique au poinçon de départ. -help:41641 = Entrez un premier horaire de départ et un intervalle. Tirage Aléatoire affecte un ordre de départ totalement aléatoire. La Méthode de Tirage Suédoise utilise des règles spéciales pour répartir les coureurs d'un même club. Départ groupé signifie que la catégorie complète part par petits groupes pendant la durée spécifiée (Départ en masse étendu). Dans le champ Partiel vous pouvez spécifier quel partiel doit être tiré au hasard si la catégorie en a plusieurs. -help:425188 = Vous pouvez gérer automatiquement les compétiteurs qui ne sont pas partis en lisant les boîtiers SI (clear/check/start/control) dans SI Config. Sauvegarder les données lues en tant que fichier texte dont les colonnes sont séparées par des points-virgules, et importez ce fichier dans MeOS. Les compétiteurs figurant dans cet import reçoivent un enregistrement. Vous pouvez alors donner le statut Non partant à tous les compétiteurs n'ayant pas d'enregistrement. Si ultérieurement vous importez d'autres coureurs, vous pouvez réinitialiser le statut (de Non partant à Inconnu) sur les compétiteurs alors importés. -help:471101 = Activez le boîtier SI en sélectionnant son port COM ou en recherchant les boîtiers SI installés. Appuyez sur Information pour obtenir le statut du port sélectionné.\n\nLecture Interactive vous permet de gérer directement les problèmes tels qu'un numéro de puce erroné. N'utilisez pas cette possibilité quand les compétiteurs ayant des problèmes sont pris en charge séparément.\n\nLa base de données des compétiteurs est utilisée si vous voulez ajouter automatiquement de nouveaux compétiteurs. Les poinçons sont utilisés pour trouver (détecter) la bonne catégorie. +help:31661 = Un nouveau départ (en masse) est défini par une barrière horaire et une heure de reprise. A la barrière horaire les passages de relais sont terminés et aucun coureur n'est autorisé à partir en forêt. Les concurrents restants partent à l'heure de la barrière horaire. Il est possible de spécifier différents horaires pour des branches précises, mais en utilisant cette fonction vous pouvez rapidement prendre en charge des catégories entières.\n\nSi des équipes refusent le départ en masse des attardés (possible aux CFC par exemple), il suffit de cocher dans l'onglet Équipes la case 'Empêcher le redémarrage' des équipes concernées. +help:33940 = Importer les inscriptions en format texte libre. Spécifier le nom, le club, la catégorie et le numéro de puce (éventuellement l'heure de départ), de préférence séparés par des virgules, une personne (équipe) par ligne. Il est également possible de spécifier plusieurs coureurs dans le même club / catégorie en laissant partiellement vides ces champs. Il est également possible d'importer des données formatées par d'autres moyens. +help:41072 = Sélectionner un poinçon dans la liste pour le modifier ou le supprimer. Vous pouvez ajouter des poinçons manquants à partir du modèle de course. Si l'heure d'arrivée est manquante, le coureur obtient le statut . Si un poinçon est manquant, le statut est . Il est impossible d'affecter un statut incompatible avec les poinçons. S'il y a un poinçon d'arrivée, vous devez le modifier pour pouvoir définir manuellement l'heure d'arrivée. Le même principe s'applique au poinçon de départ. +help:41641 = Entrez un premier horaire de départ et un intervalle. Tirage Aléatoire affecte un ordre de départ totalement aléatoire. La Méthode de Tirage Suédoise utilise des règles spéciales pour répartir les coureurs d'un même club. Départ groupé signifie que la catégorie complète part par petits groupes pendant la durée spécifiée (Départ en masse étendu). Dans le champ Branches vous pouvez spécifier quelle branche doit être tirée au hasard si la catégorie en a plusieurs. +help:425188 = Vous pouvez gérer automatiquement les coureurs qui ne sont pas partis en lisant les boîtiers SI (clear/check/start/control) dans SI Config. Sauvegarder les données lues en tant que fichier texte dont les colonnes sont séparées par des points-virgules, et importez ce fichier dans MeOS. Les coureurs figurant dans cet import reçoivent un enregistrement. Vous pouvez alors donner le statut Non partant à tous les coureurs n'ayant pas d'enregistrement. Si ultérieurement vous importez d'autres coureurs, vous pouvez réinitialiser le statut (de Non partant à Inconnu) sur les coureurs alors importés. +help:471101 = Activez le boîtier SI en sélectionnant son port COM ou en recherchant les boîtiers SI installés. Appuyez sur Information pour obtenir le statut du port sélectionné.\n\nLecture Interactive vous permet de gérer directement les problèmes tels qu'un numéro de puce erroné. N'utilisez pas cette possibilité quand les coureurs ayant des problèmes sont pris en charge séparément.\n\nLa base de données des coureurs est utilisée si vous voulez ajouter automatiquement de nouveaux coureurs. Les poinçons sont utilisés pour trouver (détecter) la bonne catégorie. help:50431 = Vous êtes désormais connecté à un serveur. Pour ouvrir une compétition sur le serveur, sélectionnez le dans la liste et cliquer Ouvrir. Ajoutez une compétition au serveur, ouvrez la compétition en local et sélectionnez Télécharger. Quand vous aurez ouvert une compétition sur le serveur, vous pourrez voir tous les autres clients MeOS connectés. help:52726 = Connectez vous à un serveur ci-dessous.\n\nInstallation\nTélécharger et installer MySQL 5 (Community Edition) depuis www.mysql.com. Vous pouvez utiliser la configuration par défaut. Il est uniquement nécessaire d'installer MySQL sur l'ordinateur servant de serveur. Quand MySQL est installé, démarrer MySQL Command Line Client et créez un compte utilisateur pour MeOS. Ecrire quelque chose du genre :\n\n> CREATE USER MeOS;\nGRANT ALL ON *.* TO MeOS;\n\nVous avez maintenant un utilisateur MeOS sans mot de passe. Entrez le nom du serveur ci-dessous (vous pouvez avoir à configurer les pare-feu pour laisser passer le traffic).\n\nComme alternative vous pouvez utiliser le compte root d'origine de MySQL. Le nom d'utilisateur est 'root' et le mot de passe est celui donné lors de l'installation de MySQL. help:5422 = Pas de boîtier SI trouvé. Sont-ils connectés et démarrés ? -help:59395 = Dans ce formulaire, vous pouvez rapidement effectuer des réglages de base en une seule opération pour plusieurs catégories.\n\nDépart est le nom du départ tel qu'il apparaît sur les liste d'horaire de départ.\n\nUn Bloc est un nombre entre 0 et 100 qui peut fournir une distribution des compétiteurs encore plus fine. Les catégories dans le même bloc seront imprimées dans la même minute sur les horaires de départ. \n\nIndex est une clé de tri. Les catégories sont triées à l'aide de cette clé dans toutes les listes.\n\nLe circuit peut être défini pour les catégories ayant exactement un circuit; s'il y a plusieurs circuits possibles vous devez utiliser le formulaire standard de catégorie.\n\nSaisie rapide détermine si la catégorie accepte les inscriptions rapides. +help:59395 = Dans ce formulaire, vous pouvez rapidement effectuer des réglages de base en une seule opération pour plusieurs catégories.\n\nDépart est le nom du départ tel qu'il apparaît sur les liste d'horaire de départ.\n\nUn Bloc est un nombre entre 0 et 100 qui peut fournir une distribution des coureurs encore plus fine. Les catégories dans le même bloc seront imprimées dans la même minute sur les horaires de départ. \n\nIndex est une clé de tri. Les catégories sont triées à l'aide de cette clé dans toutes les listes.\n\nLe circuit peut être défini pour les catégories ayant exactement un circuit; s'il y a plusieurs circuits possibles vous devez utiliser le formulaire standard de catégorie.\n\nSaisie rapide détermine si la catégorie accepte les inscriptions rapides. help:59395_more = Les tarifs par catégories sont appliqués aux nouvelles inscriptions, si vous avez activé Gestion et frais d'inscriptions. Si vous modifiez un tarif, MeOS vous demandera si vous voulez appliquer ce nouveau tarifs aux coureurs déjà inscrits. \n\nPour les dossards, vous avez le chois entre Aucun, Consécutif et Manuel. Vous pouvez aussi spécifier le premier dossard de la catégorie, par exemple A100, ou 50. Consécutif signifie que le dernier dossard d'une catégorie est utilisé pour définir le premier de la suivante. Des dossards réservés permettent de garder un écart de numérotation entre les catégories, dont vous choisissez la valeur. \n\nMeOS met à jour les dossards si vous modifiez l'architecture ou les horaires des listes de départ. Manuel signifie que MeOS ne mettra jamais à jour automatiquement les dossards.\n\nPour les catégories comportant des équipes, le paramètre équipe contrôle le rapport entre la place dans l'équipe et le dossard. Il peut être Identique (même dossard pour toute l'équipe), Croissant (100, 101, 102), par Relayeur (100-1, 100-2, etc.) ou complètement indépendant. -help:7618 = Le nombre de compétiteurs dans l'équipe est défini dans la page Catégories. +help:7618 = Le nombre de coureurs dans l'équipe est défini dans la page Catégories. help:7620 = Intervalle (secondes). Laisser le champ vide pour qu'il soit mis à jour quand la compétition évolue. -help:89064 = Pour chaque poste, vous devez spécifier un ou plusieurs numéro de code (codes SI). Dans un circuit, vous faites référence à un poste par son identifiant (ID). Habituellement vous n'avez pas besoin d'ajouter des postes manuellement puisque MeOS ajoute automatiquement tous les postes nécessaires.\n\nL'utilisation de plus d'un code SI est utile lorsque l'on veut remplacer un boîtier défectueux ou pour créer des fourches simples. Pour un poste ordinaire, il est exigé que le compétiteur poinçonne un des postes spécifiés. Si le statut du poste est , tous les postes spécifiés doivent être poinçonnés (dans un ordre quelconque). Si le statut est , le boîtier est ignoré.\n\nSi vous spécifiez un nom de poste, il est possible d'imprimer les résultats avec les temps intermédiaires aux postes nommés.\n\nUn réajustement de l'heure du poste peut être effectué s'il apparaît que le boîtier n'était pas à l'heure. Le format de l'heure est +/-MM:SS ou +/-HH:MM:SS.\n\nLe temps de partiel le plus court définit le temps le plus court possible sur ce partiel. Aucun concurrent n'aura un temps plus court pour aller à ce poste, aussi rapide soit-il. Cela peut être utilisé, par exemple, si une route dangereuse doit être traversée.\n\nLe statut signifie que le temps pour aller au poste est ignoré; le temps total sera le même quel que soit le temps réellement mis pour se rendre au poste. +help:89064 = Pour chaque poste, vous devez spécifier un ou plusieurs numéro de code (codes SI). Dans un circuit, vous faites référence à un poste par son identifiant (ID). Habituellement vous n'avez pas besoin d'ajouter des postes manuellement puisque MeOS ajoute automatiquement tous les postes nécessaires.\n\nL'utilisation de plus d'un code SI est utile lorsque l'on veut remplacer un boîtier défectueux ou pour créer des fourches simples. Pour un poste ordinaire, il est exigé que le coureur poinçonne un des postes spécifiés. Si le statut du poste est , tous les postes spécifiés doivent être poinçonnés (dans un ordre quelconque). Si le statut est , le boîtier est ignoré.\n\nSi vous spécifiez un nom de poste, il est possible d'imprimer les résultats avec les temps intermédiaires aux postes nommés.\n\nUn réajustement de l'heure du poste peut être effectué s'il apparaît que le boîtier n'était pas à l'heure. Le format de l'heure est +/-MM:SS ou +/-HH:MM:SS.\n\nLe temps de branche le plus court définit le temps le plus court possible sur cette branche. Aucun concurrent n'aura un temps plus court pour aller à ce poste, aussi rapide soit-il. Cela peut être utilisé, par exemple, si une route dangereuse doit être traversée.\n\nLe statut signifie que le temps pour aller au poste est ignoré; le temps total sera le même quel que soit le temps réellement mis pour se rendre au poste. help:9373 = Donnez un ou plusieurs numéro de postes (codes SI) utilisés pour ce poste.\nExemple: 31, 32, 33. help:9615 = Aucune réponse reçue. Voulez-vous ouvrir le port en mode passif ? MeOS doit-il être à l'écoute de poinçons à venir ? -help:assignfee = MeOS va prendre en charge automatiquement pour vous les droits d'inscription dans la plupart des cas. Le tarif est basé sur l'âge et la date d'inscription des compétiteurs (vous pouvez définir les limites dans Configuration de la compétition). Chaque catégorie définit un tarif. Vous fournissez une valeur par défaut pour différentes catégories dans Configuration de la Compétition, mais vous pouvez également reconfigurer la catégorie en utilisant Configuration Rapide pour cette catégorie.\n\nCette page vous permet d'utiliser différentes limites en âges et date limites d'inscription pour différents tarifs. Sur la page des Compétiteurs, vous pouvez ajuster manuellement le tarif pour chaque compétiteur en cas de besoin. +help:assignfee = MeOS va prendre en charge automatiquement pour vous les droits d'inscription dans la plupart des cas. Le tarif est basé sur l'âge et la date d'inscription des coureurs (vous pouvez définir les limites dans Configuration de la compétition). Chaque catégorie définit un tarif. Vous fournissez une valeur par défaut pour différentes catégories dans Configuration de la Compétition, mais vous pouvez également reconfigurer la catégorie en utilisant Configuration Rapide pour cette catégorie.\n\nCette page vous permet d'utiliser différentes limites en âges et date limites d'inscription pour différents tarifs. Sur la page des Coureurs, vous pouvez ajuster manuellement le tarif pour chaque coureur en cas de besoin. help:baudrate = Vitesse de transmission (baudrate) : utilisez 4800 ou 38400. -help:computer_voice = Un poinçon arrivant est mis en correspondance avec un numéro de départ et joue le fichier où N est le numéro de départ. Les fichiers sont situés dans le répertoire ci-dessous. Si le compétiteur/équipe a une nationalité NAT d'affectée, MeOS essaie en priorité de jouer le fichier , qui se doit de contenir le nombre dans la version de langue appropriée. -help:dbage = La base de donnée des compétiteurs date de plus de deux mois. Souhaitez vous télécharger une nouvelle base à partir d'Eventor ? +help:computer_voice = Un poinçon arrivant est mis en correspondance avec un numéro de départ et joue le fichier où N est le numéro de départ. Les fichiers sont situés dans le répertoire ci-dessous. Si le coureur/équipe a une nationalité NAT d'affectée, MeOS essaie en priorité de jouer le fichier , qui se doit de contenir le nombre dans la version de langue appropriée. +help:dbage = La base de donnée des coureurs date de plus de deux mois. Souhaitez vous télécharger une nouvelle base à partir d'Eventor ? help:duplicate = Faire une copie locale de cette compétition. -help:eventorkey = Entrez la clef Eventor de votre club (spécial Suède). Vous pouvez obtenir la clef auprès de l'administrateur Eventor de votre club. +help:eventorkey = Entrez la clé Eventor de votre club (spécial Suède). Vous pouvez obtenir la clé auprès de l'administrateur Eventor de votre club. help:fullscreen = Vous pouvez ajuster la vitesse de défilement en utilisant Ctrl+M (augmente) et Ctrl+N (diminue). Pour sortir du mode plein écran, appuyez sur Esc. -help:import_entry_data = Vous pouvez importer des compétiteurs, des catégories, des clubs et des inscriptions à partir de divers formats texte et XML. Il n'est pas nécessaire de fournir tous les fichiers ci-dessous. Par exemple, un fichier CSV de OE avec les inscriptions contient les clubs et les catégories, aussi dans ce cas ces champs devraient-ils être laissés vides.\n\nSi le même compétiteur est importé plusieurs fois vous n'obtiendrez pas plusieurs copies de ce compétiteur, mais son inscription sera modifiée. Cela signifie qu'il est sans danger de ré-importer ou d'importer un fichier d'inscription qui a été étendu. +help:import_entry_data = Vous pouvez importer des coureurs, des catégories, des clubs et des inscriptions à partir de divers formats texte et XML. Il n'est pas nécessaire de fournir tous les fichiers ci-dessous. Par exemple, un fichier CSV de OE avec les inscriptions contient les clubs et les catégories, aussi dans ce cas ces champs devraient-ils être laissés vides.\n\nSi le même coureur est importé plusieurs fois vous n'obtiendrez pas plusieurs copies de ce coureur, mais son inscription sera modifiée. Cela signifie qu'il est sans danger de ré-importer ou d'importer un fichier d'inscription qui a été étendu. help:importcourse = Vous pouvez importer des circuits et des catégories à partir (par exemple) d'exports OCAD ou Condes. help:ocad13091 = Si vous avez accès aux circuits (par exemple à partir d'OCAD ou Condes) vous pouvez fournir les fichiers contenant les circuits ici. Autrement, vous pourrez ajouter les circuits ultérieurement. -help:relaysetup = Utilisez le guide ci-dessous pour choisir parmi les formulaires de compétitions prédéfinis. Après avoir appliqué la configuration, il est possible d'adapter manuellement la configuration pour chaque partiel et configurer les circuits.\n\nQuelques explications :\n- Relais est utilisé pour différent type de relais.\n- Relais par paire signifie que deux compétiteurs forme une équipe et courent à tour de rôle.\n- Un relais en Co-compétition est parfois utilisé dans les catégories jeunes et permet d'avoir plus d'un compétiteur sur certains partiels. (le premier compétiteur change d'une fois à l'autre).\n- Une patrouille peut s'effectuer avec une ou deux puces.\n- Prologue et poursuite est une compétition individuelle mais constitué de deux courses.\n- Un pool de circuit signifie qu'il y a plusieurs variantes, mais qu'il n'est pas décidé à l'avance qui court sur quelle variante; la décision est prise automatiquement lorsque le coureur a terminé. +help:relaysetup = Utilisez le guide ci-dessous pour choisir parmi les formulaires de compétitions prédéfinis. Après avoir appliqué la configuration, il est possible d'adapter manuellement la configuration pour chaque branche et configurer les circuits.\n\nQuelques explications :\n- Relais est utilisé pour différent type de relais.\n- Relais par paire signifie que deux coureurs forme une équipe et courent à tour de rôle.\n- Un relais en avec un coureur Open est parfois utilisé dans les catégories jeunes et permet d'avoir plus d'un coureur sur certains partiels. (le premier coureur change d'une fois à l'autre).\n- Une patrouille peut s'effectuer avec une ou deux puces.\n- Prologue et poursuite est une compétition individuelle mais constitué de deux courses.\n- Un jeu de circuit signifie qu'il y a plusieurs variantes, mais qu'il n'est pas décidé à l'avance qui court sur quelle variante; la décision est prise automatiquement lorsque le coureur a terminé. help:restore_backup = Choisissez une sauvegarde à restaurer en cliquant la date à laquelle la sauvegarde a été faite. help:runnerdatabase = En important une base de donnée de clubs et de coureurs, MeOS reconnaitra automatiquement les coureurs inconnus (par leur numéro de puce), et vous aurez les adresses et numéros de téléphone du club. help:save = MeOS sauve automatiquement toutes les configurations lorsque c'est nécessaire. help:speaker_setup = Choisissez les catégories et circuits que vous voulez surveiller. help:speakerprio = Cochez les coureurs/équipes que vous souhaitez surveiller dès le départ et tant que tout va bien. Mettre deux coches pour surveiller même si le résultat n'est plus très bon. Aucune coche signifie que la surveillance n'est activée que si le coureur/l'équipe a de bons résultats (donc pas forcément depuis le départ). help:splitexport = Décidez si vous voulez exporter les résultats individuellement ou globalement pour chaque course. Si vous choisissez d'exporter toutes les courses, des fichiers numérotés seront créés. -help:startmethod = MeOS utilisera automatiquement la méthode de départ choisie. Quoi que vous choisissiez ici, vous pourrez dans tous les cas changer la méthode de départ ou refaire le tirage plus tard. -help:winsplits_auto = Ce service sauvegarde les temps intermédiaires dans un fichier IOF (xml) à intervalles réguliers. Si vous ouvrez ce fichier dans Winslet, les temps intermédiaires seront mis à jour en temps réel. +help:startmethod = MeOS utilisera automatiquement la méthode de départ choisie. Quoi que vous choisissiez ici, vous pourrez dans tous les cas changer la méthode de départ ou refaire le tirage plus tard. +help:winsplits_auto = Ce service sauvegarde les temps intermédiaires dans un fichier IOF (xml) à intervalles réguliers. Si vous ouvrez ce fichier dans WinSplit, les temps intermédiaires seront mis à jour en temps réel. help:zero_time = Définissez l'heure zéro à une heure avant le premier départ prévu. help:long_times = La date de compétition est la date à laquelle toutes les catégories commencent. L'heure zéro est à minuit. help_autodraw = Fournit une première heure de départ (ordinaire), un intervalle minimal (pour une catégorie) et le pourcentage de vacants. Vous pouvez également choisir la méthode utilisée pour le tirage au sort et si les personnes inscrites tardivement doivent partir avant ou après les autres coureurs. Le premier horaire de départ doit être supérieur à l'heure zéro de la compétition.\n\nSi vous cliquez sur , MeOS vérifie toutes les catégories. Si la catégorie n'a pas eu de tirage celui-ci est effectué. S'il y a des personnes inscrites tardivement sans horaires de départ dans une catégorie, leur horaire de départ sera tiré au sort.\n\nMeOS garantit que les coureurs ayant des circuits similaires ne partent pas simultanément, et de la place est réservée pour permettre l'accueil de coureurs inscrits tardivement dans les même conditions.\n\nSi au contraire vous cliquez sur vous pouvez contrôler exactement quelle catégories sont tirées au sort et avec quels paramètres. @@ -1390,17 +1393,17 @@ tolfte = douzième tolva = douzième tooltip:analyze = Analyse les donnée et prévisualise les données importées. tooltip:builddata = Etendre les connaissances de MeOS des coureurs, clubs et catégories en analysant les données de la compétition. -tooltip:import = Importer depuis un fichier. -tooltip:inforest = Liste des coureurs en forêt et des coureurs n'ayant pas pris le départ. -tooltip:paste = Coller depuis le presse papier. +tooltip:import = Importer depuis un fichier +tooltip:inforest = Liste des coureurs en forêt et des coureurs n'ayant pas pris le départ +tooltip:paste = Coller depuis le presse papier tooltip:resultprint = Imprimer les résultats à l'écran -tooltip:voice = Synthèse vocale des pré-annonces. +tooltip:voice = Synthèse vocale des pré-annonces trea = troisième tredje = troisième tvåa = second väntas till X om någon minut = est attendu sous peu au poste X väntas till X om någon minut, och kan i så fall ta en Y plats = est attendu au poste X dans la minute, et peut prendre la Y place. -väntas till X om någon minut, och kan i så fall ta ledningen = est attendu au poste X dans la minute, et peut prendre la tête de la course. +väntas till X om någon minut, och kan i så fall ta ledningen = est attendu au poste X dans la minute, et peut prendre la tête de la course. växeln = passage de relais växlar på X plats med tiden Y = passage de relais au poste X avec un temps de Y växlar på X plats, efter Y, på tiden Z = passage de relais à la X place, après Y, avec un temps de Z @@ -1409,7 +1412,7 @@ warn:changedtimezero = Changer l'heure zéro d'une compétition ayant des résul warn:olddbversion = La base de donnée est utilisée par une version postérieure de MeOS. Une mise à jour est recommandée. warning:dbproblem = ATTENTION. Problèmes rencontrés avec la connexion à la base: 'X'. La connexion sera automatiquement restaurée. Vous pouvez continuer à travailler normalement. warning:drawresult = La catégorie a déjà des résultats, les heures de départ seront écrasées. Voulez-vous continuer ? -warning:has_entries = La catégorie a déjà des coureurs . Changer la répartition des variations à ce stade peut entraîner une perte de données.\n\nVoulez-vous continuer ? +warning:has_entries = La catégorie a déjà des coureurs. Changer la répartition des variations à ce stade peut entraîner une perte de données.\n\nVoulez-vous continuer ? warning:has_results = La catégorie a déjà des résultats. Changer la répartition des variations à ce stade est inhabituel.\n\nVoulez-vous continuer ? xml-data = données xml Äldre protokoll = Protocole périmé @@ -1440,12 +1443,12 @@ xml-data = données xml Öppna = Ouvrir Öppna fil = Ouvrir le fichier Öppna från aktuell tävling = Ouvrir depuis cette compétition -Öppna föregående = Ouvrir le précédent +Öppna föregående = Ouvrir l'étape précédente Öppna föregående etapp = Ouvrir l'étape précédente Öppna i ett nytt fönster = Ouvrir dans une nouvelle fenêtre Öppna klasser, ungdom = Ouvrir les catégories jeunes Öppna klasser, vuxna = Ouvrir les catégories adultes -Öppna nästa = Ouvrir le suivant +Öppna nästa = Ouvrir l'étape suivante Öppna nästa etapp = Ouvrir l'étape suivante Öppna tävling = Ouvrir la compétition Öppna vald tävling = Ouvrir la compétition sélectionnée @@ -1467,7 +1470,7 @@ xml-data = données xml åtta = huit åttonde = huitième Kopia (X) = Copier (X) -Tillåt samma bana inom basintervall = Autoriser le même circuit dans l'intervalle de base ($1467) +Tillåt samma bana inom basintervall = Autoriser le même circuit dans l'intervalle de base (entrelacer les catégories) Välj X = Sélectionner X Ett startblock spänner över flera starter: X/Y = Un bloc de départ couvre plus d'un départ: X/Y Bricka X = Puce X @@ -1496,7 +1499,7 @@ Eventors tider i UTC (koordinerad universell tid) = Heure UTC d'Eventor Exportera tider i UTC = Heure UTC d'export Tidszon = Fuseau horaire RunnerAge = Age du coureur -RunnerBirthYear = Année de naissance du compétiteur +RunnerBirthYear = Année de naissance du coureur RunnerFee = Prix payé par le coureur RunnerNationality = Nationalité du coureur RunnerPhone = Numéro de téléphone du coureur @@ -1514,7 +1517,7 @@ TeamTotalTimeStatus = Temps total ou statut de l'équipe (toutes les étapes) Vill du dumpa aktuellt tävling och skapa en testtävling? = Voulez-vous faire un dump de la compétition courante et créer une compétition de test ? Radera alla klubbar = Effacer tous les clubs Radera alla klubbar och ta bort klubbtillhörighet = Effacer tous les clubs et les membres des clubs -Vill du ta bort alla klubbar från tävlingen? Alla deltagare blir klubblösa = Souhaitez-vous effacer tous les clubs de la compétition ? Aucune compétition n'aura de club. +Vill du ta bort alla klubbar från tävlingen? Alla deltagare blir klubblösa = Souhaitez-vous effacer tous les clubs de la compétition ? Aucun coureur n'aura de club. Besökare = Visiteurs Föregående kontroll = Poste précédent Ja = Oui @@ -1522,7 +1525,7 @@ Nej = Non På banan = Sur le circuit Stämpelkod = Code du poste Tidpunkt = Temps -Antal deltagare = Compétiteurs +Antal deltagare = Coureurs Förekomst = Occurrence Exporterar om = Export dans Exportformat = Format d'export @@ -1555,12 +1558,12 @@ ClassTeamLeg = Catégorie, équipe, relayeur Okänd = Inconnu Antal hämtade uppdateringar X (Y kb) = Nombre de mise à jour reçues X (Y kb) Använd ROC-protokoll = Utiliser le protocole ROC -Definierade mappningar = [Defined mappings] +Definierade mappningar = Mappings définis Funktion = Fonction Hämta stämplingar m.m. från nätet = Retrouver des poinçons etc... depuis Internet. Inmatning online = Saisie à distance Kod = Code -Kontrollmappning = [Control Mapping] +Kontrollmappning = Mapping des postes Ogiltig funktion = Fonction invalide Ogiltig kontrollkod = Code de poste invalide Onlineinput = Saisie distante @@ -1593,7 +1596,7 @@ Knyt automatiskt efter inläsning = Affectation automatique à la lecture de la Knyt bricka / deltagare = Affecter une puce à un coureur Nummerlapp, lopp-id eller namn = Dossard, identifiant de la course ou nom Lopp-id = Identifiant de la course -Markera 'X' för att hantera deltagarna en och en = Cocher 'X' pour gérer les compétiteurs un par un +Markera 'X' för att hantera deltagarna en och en = Cocher 'X' pour gérer les coureurs un par un Installerbara listor = Listes pouvant être installées Listor i tävlingen = Listes dans la compétition Radera permanent = Suppression définitive @@ -1607,7 +1610,7 @@ Bana med slingor = Circuits avec boucles En bana med slingor tillåter deltagaren att ta slingorna i valfri ordning = Un circuit avec des boucles autorise le coureur à effectuer les boucles dans n'importe quel ordre. Varvningskontroll = Poste commun warn:notextended = INFO: Programmez les boîtiers en protocole étendu avec SI. Config pour accélérer la lecture de puce. -help:DirectResult = - S'il n'y a pas de circuit, le statut est mis à OK sur le poinçon d'arrivé.\n\n- S'il y a des circuits, les poinçons radio sont utilisés comme postes. Aucune lecture de puce n'est nécessaire. +help:DirectResult = - S'il n'y a pas de circuit, le statut est mis à OK sur le poinçon d'arrivé.\n- S'il y a des circuits, les poinçons radio sont utilisés comme postes. Aucune lecture de puce n'est nécessaire. Resultat vid målstämpling = Résultat sur le poinçon d'arrivée Stämpling = Poinçon Skicka och ta emot snabb förhandsinformation om stämplingar och resultat = Envoyez et recevoir des pré-informations rapides sur les poinçons et résultats @@ -1616,12 +1619,12 @@ Färg = Couleur Höger = Droite PunchControlCode = Numéro de poste PunchControlNumber = Numéro de poinçon -PunchControlPlace = Place sur le partiel vers le poste +PunchControlPlace = Place sur la branche vers le poste PunchControlPlaceAcc = Place après le poste PunchLostTime = Temps perdu au poste Slå ihop text med föregående = Fusionner avec le précédent Textjustering = Ajustement du texte -Vänster = gauche +Vänster = Gauche X (press Ctrl+Space to confirm) = X (Appuyez sur + pour confirmer) Press Enter to continue = Appuyez sur pour continuer ask:overwriteresult = X a déjà des résultats. Voulez-vous les écraser ? @@ -1629,24 +1632,24 @@ Brickan används av X = La puce est utilisée par X DATABASE ERROR = ERREUR DE BASE DE DONNEE Lyssnar på X = Ecoute de X vid kontroll X = au poste X -info:runnerdbonline = Comme vous êtes connecté à un serveur, il n'est pas possible d'éditer les bases de données club et compétiteurs manuellement. Effectuez les changements avant d'uploader la compétition sur un serveur. Il est également possible de remplacer la base de données existante sur le serveur en important une nouvelle base (à partir de IOF XML). -ask:cleardb = Voulez-vous effacer les données club et compétiteurs ? +info:runnerdbonline = Comme vous êtes connecté à un serveur, il n'est pas possible d'éditer les bases de données club et coureurs manuellement. Effectuez les changements avant d'uploader la compétition sur un serveur. Il est également possible de remplacer la base de données existante sur le serveur en important une nouvelle base (à partir de IOF XML). +ask:cleardb = Voulez-vous effacer les données club et coureurs ? Banan saknar rogainingkontroller = La compétition n'a pas de poste de type course au score Banans kontroller ger för få poäng för att täcka poängkravet = Les postes de type course au score n'attribuent pas assez de points CustomSort = Ordre personnalisé Brickhantering = Gestion des poinçons HTML med AutoRefresh = HTML avec rafraîchissement automatique -Importera laguppställningar = Alignement des équipes importées [Import Team Line-Ups] +Importera laguppställningar = Importer des équipes depuis un fichier structuré MeOS Funktioner = Fonctionnalités MeOS Målfil = Fichier de destination -Spara tid = Heure enregistrée [Save time] -Stämplingstid = Instant de poinçonnage +Spara tid = Enregistrer +Stämplingstid = Heure de poinçonnage Data from result module (X) = Données fournies par le module de résultat (X) Forkings = Variations Forkings for X = Variations pour X Gruppera = Groupe Resultatuträkning = Calcul des résultats -RunnerRogainingPointTotal = Total des points du compétiteur +RunnerRogainingPointTotal = Total des points du coureur Show forking = Montrer les variations Standard = Standard TeamRogainingPointTotal = Total des points de l'équipe @@ -1655,12 +1658,12 @@ Underfilter = Sous filtre Ogiltigt lag på rad X = Équipe invalide ligne X Okänd klass på rad X = Catégorie inconnue ligne X Klassen X är individuell = La catégorie X est individuelle -Använd befintliga deltagare = Utiliser les compétiteurs déjà inscrits -Knyt redan anmälda deltagare till laget (identifiera genom namn och/eller bricka) = Regrouper les compétiteurs existants à l'équipe (identifiés par le nom et/ou le numéro de puce) -Laguppställning = Constitution de l'équipe [Team Line-up] +Använd befintliga deltagare = Utiliser les coureurs déjà inscrits +Knyt redan anmälda deltagare till laget (identifiera genom namn och/eller bricka) = Regrouper les coureurs existants à l'équipe (identifiés par le nom et/ou le numéro de puce) +Laguppställning = Fichier structuré d'équipes Bakåt = Retour Bibs = Dossards -Club and runner database = Base de donnée des clubs et compétiteurs +Club and runner database = Base de donnée des clubs et coureurs Clubs = Clubs Economy and fees = Gestion et frais d'inscription Forked individual courses = Circuit individuel avec variations @@ -1673,15 +1676,15 @@ Patrols = Équipe Prepare start lists = Préparation des listes de départ Relays = Relais Several MeOS Clients in a network = Plusieurs clients MeOS en réseau -Several races for a runner = Plusieurs compétitions pour un concurrent -Spara laguppställningar = Enregistrer la constitution de l'équipe [Save Team Line-UPS] +Several races for a runner = Plusieurs circuits pour un coureur +Spara laguppställningar = Enregistrer les équipes Teams and forking = Équipes et variations Track runners in forest = Suivi des coureurs en forêt Vacancies and entry cancellations = Places disponibles et annulation des inscriptions Banan saknas = Circuit manquant Klassen saknas = Catégorie absente Alla lopp som individuella = Toutes les courses sont individuelles -Exportera individuella lopp istället för lag = Exporter comme courses individuelles au lieu de par équipe +Exportera individuella lopp istället för lag = Exporter comme courses individuelles au lieu de courses par équipe Exportera startlista = Exporter les horaires de départ Exporttyp = Type d'export Exportval, IOF-XML = Configuration de l'export, IOF-XML @@ -1690,15 +1693,15 @@ Klassval = Sélection de catégorie The forking is not fair = Les variations ne sont pas équitables Unfair control legs = Branche non équitable Växel = Passage -help:teamlineup = Ici vous pouvez importer un alignement d'équipe à partir d'un fichier texte structuré qu'il est facile de produire manuellement à partir d'un tableur. Le fichier doit avoir le format suivant :\n\nCatégorie;Nom de l'équipe;[Club]\nCompétiteur 1;[No de puce];[Club];[Circuit];[Catégorie du compétiteur]\nCompétiteur 2;[No de puce];[Club];[Circuit];[Catégorie du compétiteur]\n...\nCatégorie;Nom de l'équipe;[Club]\n...\n\nLes champs marqués entre crochets [] sont optionnels. Notez que les catégories et circuits utilisées doivent exister, et que le nombre de branches dans la catégorie doit correspondre au nombre de ligne définissant les compétiteurs après la catégorie. Des lignes vides peuvent être utilisées s'il n'y a pas de compétiteur. L'option signifie que seulement les compétiteurs déjà inscrits à la compétition sont ajoutés à l'équipe; les autres compétiteurs spécifiés sont ignorés. -Poängjustering = Point d'ajustement +help:teamlineup = Ici vous pouvez importer des équipes à partir d'un fichier texte structuré qu'il est facile de produire manuellement à partir d'un tableur. Le fichier doit avoir le format suivant :\n\nCatégorie;Nom de l'équipe;[Club]\nCompétiteur 1;[No de puce];[Club];[Circuit];[Catégorie du coureur]\nCompétiteur 2;[No de puce];[Club];[Circuit];[Catégorie du coureur]\n...\nCatégorie;Nom de l'équipe;[Club]\n...\n\nLes champs marqués entre crochets [] sont optionnels. Notez que les catégories et circuits utilisées doivent exister, et que le nombre de branches dans la catégorie doit correspondre au nombre de ligne définissant les coureurs après la catégorie. Des lignes vides peuvent être utilisées s'il n'y a pas de coureur. L'option signifie que seulement les coureurs déjà inscrits à la compétition sont ajoutés à l'équipe; les autres coureurs spécifiés sont ignorés. +Poängjustering = Ajustement des points Use initials in names = Utiliser les initiales comme noms Exportera klubbar (IOF-XML) = Export des clubs (IOF-XML) Exportera personer (IOF-XML) = Export des personnes (IOF-XML) Töm databasen = Effacement des données Several stages = Plusieurs étapes -Assign courses and apply forking to X = Assigner un circuit et appliquer la variation à X -Assign selected courses to selected legs = Assigner les circuits sélectionnés aux branches sélectionnées +Assign courses and apply forking to X = affecter un circuit et appliquer la variation à X +Assign selected courses to selected legs = Affecter les circuits sélectionnés aux branches sélectionnées Calculate and apply forking = Calculer et utiliser les variations Clear selections = Effacer les sélections Define forking = Définir les variations @@ -1717,7 +1720,7 @@ help:analyzecard = Cette fonction vous permet d'imprimer les données de la puce Använd endast en bana i klassen = Utiliser uniquement un circuit pour la catégorie Gafflade banor = Circuits avec variations Unroll split times for loop courses = Dérouler les temps intermédiaires pour les circuits en boucle. -Löpare per klass = Compétiteurs par catégorie +Löpare per klass = Coureurs par catégorie Alla funktioner = Toutes les fonctionnalités Anmäl inga deltagare nu = Aucune inscription Datum (för första start) = Date (du premier départ) @@ -1729,28 +1732,28 @@ Individuell tävling = Compétition individuelle Namn och tidpunkt = Nom et heure Skapar tävling = Création de la compétition Tävling med lag = Compétition en équipe -Tävlingen måste avgöras mellan X och Y = La compétition doit se dérouler entre X et Y +Tävlingen måste avgöras mellan X och Y = La compétition doit se dérouler entre le X et le Y Tävlingens namn = Nom de la compétition Välj från lista = Sélection détaillée Välj vilka funktioner du vill använda = Sélectionnez les fonctionnalités de MeOS dont vous avez besoin pour cette compétition Individuellt, gafflat = Individuel, avec variations Skapa tävlingen = Créer la compétition -newcmp:featuredesc = Sélectionnez les fonctionnalités de MeOS dont vous avez besoin pour cette compétition. Vous pouvez ajouter ou supprimer des fonctionnalités à tout moment en sélectionnant sur la page Compétition. +newcmp:featuredesc = Sélectionnez les fonctionnalités de MeOS dont vous avez besoin pour cette compétition. Vous pouvez ajouter ou supprimer des fonctionnalités à tout moment en sélectionnant sur la page Compétition. Exportera till fil = Exporter dans un fichier FilterPrelResult = Résultats prél. FinishTimeReverse = Temps inversés (le dernier en premier) Open a Copy = Ouvrir une copie -Point calculation for runner = Calcul du nombre de points pour un compétiteur +Point calculation for runner = Calcul du nombre de points pour un coureur Point calculation for team = Calcul du nombre de points pour l'équipe -Result score calculation for runner = Détermination du score pour un compétiteur +Result score calculation for runner = Détermination du score pour un coureur Result score calculation for team = Détermination du score pour une équipe ResultDescription = Nom du type de résultat Skapa = Créer -Status calculation for runner = Détermination du statut pour un compétiteur +Status calculation for runner = Détermination du statut pour un coureur Status calculation for team = Détermination du statut pour une équipe -Support time from control = Temps depuis le poste [Support time from control] -Support time to control = Temps vers le poste [Support time to control] -Time calculation for runner = Calcul du temps pour un compétiteur +Support time from control = Temps depuis le poste +Support time to control = Temps jusqu'au poste +Time calculation for runner = Calcul du temps pour un coureur Time calculation for team = Calcul du temps pour une équipe TimingFrom = Nom du point de départ TimingTo = Nom du point d'arrivée @@ -1766,12 +1769,12 @@ New Result Module = Nouveau module de résultat New Set of Result Rules = Nouvel ensemble de règles de résultat Result Calculation = Calcul du résultat Result Module – X = Module résultat – X -Result module identifier = Identificateur de module de résultat +Result module identifier = Identifiant du module de résultat Result Modules = Modules de résultats Save = Enregistrer Save changes = Enregistrer les changements Source code = Code source -Test Result Module = Module de test de résultat +Test Result Module = Test du module Result score calculation for team = Calcul du score pour l'équipe Time: X = Temps : X Start: X = Départ : X @@ -1781,41 +1784,41 @@ ResultModuleNumber = Module de résultat : Nombre ResultModuleTime = Module de résultat : Temps ResultModuleNumberTeam = Module de résultat : Nombre (pour l'équipe) ResultModuleTimeTeam = Module de résultat : Temps (pour l'équipe) -RunnerRogainingOvertime = Dépassement de temps pour le compétiteur (course au score) -RunnerRogainingReduction = Réduction du nombre de points du compétiteur +RunnerRogainingOvertime = Dépassement de temps pour le coureur (course au score) +RunnerRogainingReduction = Réduction du nombre de points du coureur TeamRogainingOvertime = Dépassement de temps pour l'équipe (course au score) TeamRogainingReduction = Réduction du nombre de points pour l'équipe Automatic rogaining point reduction = Réduction automatique du nombre de points pour la course au score Choose result module = Choisir un module de résultat -Deviation +/- from expected time on course leg = Ecart +/- par rapport au temps estimé sur le partiel -Leg number in team, zero indexed = Partiel en équipe, indexé à partir de zéro +Deviation +/- from expected time on course leg = Ecart +/- par rapport au temps estimé sur la branche +Leg number in team, zero indexed = Branche de équipe, indexé à partir de zéro Length of course = Longueur du circuit Maximum allowed running time = Temps de course maximal autorisé -Place on course leg = Classement sur le partiel du circuit +Place on course leg = Classement sur la branche Result Modules = Modules de résultat -Runner's card, matched control ids (-1 for unmatched punches) = La puce du compétiteur correspond aux n° de poste (-1 par poinçon différents) -Runner's card, punch codes = Puce du compétiteur, n° de poinçon -Runner's card, punch times = Puce du compétiteur, heure du poinçon -Runner's course = Circuit du compétiteur -Runner's split times = Temps intermédiaires du compétiteurs -Runner's total running time to control = Temps total du compétiteur jusqu'au poste -Runner/team fee = Droit d'inscription compétiteur/équipe -Runner/team finish time = Heure d'arrivée compétiteur/équipe -Runner/team input place = Place initiale compétiteur/équipe -Runner/team input points = Points initiaux compétiteur/équipe -Runner/team input running time = Temps de course initial compétiteur/équipe -Runner/team input status = Statut initial compétiteur/équipe -Runner/team place = Place compétiteur/équipe -Runner/team rogaining overtime = Dépassement du temps pour compétiteur/équipe (course au score) -Runner/team rogaining points = Point compétiteur/équipe (course au score) -Runner/team rogaining points adjustment = Ajustement des points compétiteur/équipe (course au score) -Runner/team running time = Temps de course compétiteur/équipe -Runner/team start time = Heure de départ compétiteur/équipe -Runner/team status = Statut compétiteur/équipe -Runner/team time adjustment = Ajustement du temps compétiteur/équipe -Runner/team total place = Place finale compétiteur/équipe -Runner/team total running time = Temps total de course compétiteur/équipe -Runner/team total status = Statut final compétiteur/équipe +Runner's card, matched control ids (-1 for unmatched punches) = La puce du coureur correspond aux n° de poste (-1 par poinçon différents) +Runner's card, punch codes = Puce du coureur, n° de poinçon +Runner's card, punch times = Puce du coureur, heure du poinçon +Runner's course = Circuit du coureur +Runner's split times = Temps intermédiaires du coureurs +Runner's total running time to control = Temps total du coureur jusqu'au poste +Runner/team fee = Droit d'inscription coureur/équipe +Runner/team finish time = Heure d'arrivée coureur/équipe +Runner/team input place = Place initiale coureur/équipe +Runner/team input points = Points initiaux coureur/équipe +Runner/team input running time = Temps de course initial coureur/équipe +Runner/team input status = Statut initial coureur/équipe +Runner/team place = Place coureur/équipe +Runner/team rogaining overtime = Dépassement du temps pour coureur/équipe (course au score) +Runner/team rogaining points = Point coureur/équipe (course au score) +Runner/team rogaining points adjustment = Ajustement des points coureur/équipe (course au score) +Runner/team running time = Temps de course coureur/équipe +Runner/team start time = Heure de départ coureur/équipe +Runner/team status = Statut coureur/équipe +Runner/team time adjustment = Ajustement du temps coureur/équipe +Runner/team total place = Place finale coureur/équipe +Runner/team total running time = Temps total de course coureur/équipe +Runner/team total status = Statut final coureur/équipe Shortest time in class = Meilleur temps de la catégorie Status as computed by your status method = Statut tel que calculé par votre méthode Status code for a missing punch = Code de statut pour un poinçon manquant @@ -1828,15 +1831,15 @@ Status code for not finishing = Code de statut en cas d'abandon Status code for not starting = Code de statut en cas de non prise de départ Points as computed by your point method = Points tels que calculés par votre méthode Time as computed by your time method = Temps tel que calculé par votre méthode -Time after leg winner = Temps après le vainqueur du partiel +Time after leg winner = Temps après le vainqueur de la branche Finish time for each team member = Heure d'arrivée pour chaque équipier Matched control ids (-1 for unmatched) for each team member = Postes corrects pour chaque équipier (-1 en cas de différence) Punch codes for each team member = No de poinçon pour chaque équipier Punch times for each team member = Heure de poinçonnage pour chaque équipier -Result Modules = Modules résultat +Result Modules = Modules de résultat Rogaining points for each team member = Points pour chaque équipier (course au score) -Runner's method output numbers = Méthode de génération de nombre pour les compétiteurs [Runner's method output numbers] -Runner's method output times = Méthode de génération des temps pour les compétiteurs [Runner's method output times] +Runner's method output numbers = Module de résultat en nombre pour chaque équipier +Runner's method output times = Module de résultat en temps pour chaque équipier Running time for each team member = Temps de course pour chaque équipier Start time for each team member = Heure de départ pour chaque équipier Status for each team member = Statut de chaque équipier @@ -1847,8 +1850,8 @@ Debug X for Y = Debug X pour Y Do you want to clear the card memory? = Voulez-vous effacer la puce ? Portable Document Format (PDF) = Portable Document Format (PDF) Poängavdrag = Réduction de point -RunnerPointAdjustment = Ajustement des points du compétiteur -RunnerTimeAdjustment = Ajustement du temps du compétiteur +RunnerPointAdjustment = Ajustement des points du coureur +RunnerTimeAdjustment = Ajustement du temps du coureur Save changes in rule code? = Enregistrer les changements dans le code de la règle ? Symboler = Symboles TeamPointAdjustment = Ajustement des points de l'équipe @@ -1860,31 +1863,31 @@ Result Modules = Modules de résultat Error in result module X, method Y (Z) = Erreur dans le module de résultat 'X', méthode 'Y'\n\nZ Invalid operator X = Opérateur invalide X Unknown symbol X = Symbole inconnu X -RunnerGlobal = Compétiteur (catégories regroupées) +RunnerGlobal = Coureur (catégories regroupées) TeamGlobal = Équipe (catégories regroupées) List Error: X = Erreur de liste : X Rader markerade med (*) kommer från en lista i tävlingen = Les lignes avec une (*) proviennent d'une liste de la compétition Resultatmodulen används i X = Le module de résultat est utilisé dans X Valfri = Optionnel Vill du sätta resultatet från tidigare etapper till ? = Voulez-vous modifier le résultat des étapes précédentes en ? -Hantera deltagare som bytt klass = Traitement des compétiteurs qui ont changé de catégorie +Hantera deltagare som bytt klass = Traitement des coureurs qui ont changé de catégorie Välj klasser med nya anmälningar = Spécifiez les catégories pour lesquelles de nouvelles inscriptions sont autorisées Byt till rätt klass (behåll eventuell starttid) = Basculer vers la bonne catégorie (conserver l'heure de départ) Byt till vakansplats i rätt klass (om möjligt) = Déplacer vers un horaire vacant dans la bonne catégorie (si possible) Tillåt ny klass, behåll resultat från annan klass = Autoriser de nouvelles catégories et conserver les résultats des autres catégories Tillåt ny klass, inget totalresultat = Autoriser de nouvelles catégories mais sans résultat global -tooltip_explain_status = - +tooltip_explain_status = - = Statut inconnu (Pas encore de résultat)\nOK = Résultat valide\nNon partant = Ne participe pas\nAnnulé = Inscription annulée (apparaît dans les listes de départ)\nPM = Poinçons Manquants\nAband. = Abandon\nDisq. = Disqualifié\nTemps max = Dépasse le temps ou l'heure maximale\nNC = Non classé Placering = Place Resultat från tidigare etapper = Résultats des étapes précédentes -Input Results = Saisir les résultats [Input Results] -Input Results - X = Saisir les résultats - X +Input Results = Résultats initiaux +Input Results - X = Résultats initiaux - X Individuella resultat = Résultats individuels Avdrag = Réduction Team Rogaining = Course au score en équipe Övertid = Dépassement en temps Kunde inte öppna tävlingen = Ouverture de la compétition impossible warn:opennewversion = La compétition a été créée avec MeOS X. Les données peuvent être perdues si vous continuez.\n\nVoulez-vous continuer ? -District id number = Identifiants distincts +District id number = Identifiant de la région Kunde inte ladda X\n\n(Y) = Chargement impossible de X\n\n(Y) Narrow Results = Réduire la liste des résultats Club id number = Identifiant du club @@ -1898,8 +1901,8 @@ OL-Skytte med tidstillägg = Orientation/Tir avec pénalité en temps OL-Skytte utan tidstillägg = Orientation/Tir sans pénalité en temps OL-Skytte stafettresultat = Relais Orientation/Tir Sluttid = Temps final -olshooting:timepunishment = Liste de résultats Orientation/Tir avec pénalité en temps.\n\nActiver les support pour la course au score et les ajustements manuels de points. Utilisez ensuite la réduction de points sur la page Compétiteurs pour spécifier les pénalités sous la forme PPPLLSS, où PPP est l'erreur de position en millimètres, LL est le nombre de tirs ratés allongé et SS est le nombre de tirs ratés debout. Exemple 30201 signifie 3 mm d'erreur, 2 tirs allongés et 1 tir debout ratés. -olshooting:notimepunishment = Liste de résultats Orientation/Tir sans pénalité en temps.\n\nActiver les support pour la course au score et les ajustements manuels de points. Utilisez ensuite la réduction de points sur la page Compétiteurs pour spécifier les pénalités sous la forme LLSS, où LL est le nombre de tirs ratés allongé et SS est le nombre de tirs ratés debout. Exemple: 0201 signifie 2 tirs allongés et 1 tir debout ratés. +olshooting:timepunishment = Liste de résultats Orientation/Tir avec pénalité en temps.\n\nActiver les support pour la course au score et les ajustements manuels de points. Utilisez ensuite la réduction de points sur la page Coureurs pour spécifier les pénalités sous la forme PPPLLSS, où PPP est l'erreur de position en millimètres, LL est le nombre de tirs ratés allongé et SS est le nombre de tirs ratés debout. Exemple 30201 signifie 3 mm d'erreur, 2 tirs allongés et 1 tir debout ratés. +olshooting:notimepunishment = Liste de résultats Orientation/Tir sans pénalité en temps.\n\nActiver les support pour la course au score et les ajustements manuels de points. Utilisez ensuite la réduction de points sur la page Coureurs pour spécifier les pénalités sous la forme LLSS, où LL est le nombre de tirs ratés allongé et SS est le nombre de tirs ratés debout. Exemple: 0201 signifie 2 tirs allongés et 1 tir debout ratés. Namnet kan inte vara tomt = Le nom ne peut pas être vide Ingen / okänd = Aucun / inconnu Inget nummer = Aucun nombre @@ -1940,14 +1943,14 @@ Hantera laget = Gérer l'équipe Med avkortning = Avec raccourci info_shortening = Sélectionnez un circuit existant qui raccourcit le circuit sélectionné. Plusieurs niveaux de raccourcissement sont possibles. Tilldela starttider = Attribuer des heures de départ -Avkortar: X = Raccourcit: X +Avkortar: X = Raccourci: X Vill du nollställa alla manuellt tilldelade banor? = Voulez-vous effacer tous les circuits manuellement attribués ? Ange löpande numrering eller första nummer i klassen = Spécifier une numérotation consécutive entre catégories ou le premier numéro de la catégorie Ange relation mellan lagets och deltagarnas nummerlappar = Spécifier la relation entre le dossard de l'équipe et les dossards des coureurs de l'équipe Lagmedlem = Membre de l'équipe Löpande = Consécutif Oberoende = Indépendant -Samma = identique +Samma = Identique Ökande = Croissant Manuell = Manuel Vill du uppdatera alla nummerlappar? = Voulez-vous mettre à jour tous les dossards ? @@ -1964,8 +1967,8 @@ Number of shortenings = Nombre de raccourcissements Längd = Distance Redigera sträcklängder = Modifier les distances Redigera sträcklängder för X = Modifier les distances du circuit 'X' -Oordnade parallella sträckor = Branches parallèles dans le désordre ($1963) -Tillåt löpare inom en parallell grupp att springa gruppens banor i godtycklig ordning = Autoriser les compétiteurs d'un groupe parallèle à courir les circuits du groupe dans un ordre quelconque +Oordnade parallella sträckor = Branches parallèles dans n'importe quel ordre +Tillåt löpare inom en parallell grupp att springa gruppens banor i godtycklig ordning = Autoriser les coureurs d'un groupe parallèle à courir les circuits du groupe dans un ordre quelconque Laguppställningen hade fel, som har rättats = La constitution de l'équipe a été corrigée ControlClasses = Catégories du poste ControlCodes = Numéros du poste @@ -1985,10 +1988,10 @@ Control = Poste Control Statistics = Statistiques du poste Control Statistics - X = Statistiques du poste - X Course = Course -FilterSameParallel = Variations identiques +FilterSameParallel = Grouper les variations identiques Kontrollrapport - X = Rapport du poste - X Maxbom = Erreur maximale -Control Overview = Aperçut général du poste +Control Overview = Aperçu général du poste Medianbom = Erreur médiane N.N. = X Endast på obligatoriska sträckor = Traiter uniquement les variations non optionnelles. @@ -1996,7 +1999,7 @@ Fyll obesatta sträckor i alla lag med anonyma tillfälliga lagmedlemmar (N.N.) Skapa anonyma lagmedlemmar = Créer des membres d'équipe anonyme temporaires Tillsätt tillfälliga anonyma lagmedlemmar = Ajouter des membres d'équipe anonymes temporaires Tillsätt = Nommer -help:anonymous_team = Créer et nommer des membres (temporaires) d'équipe pour toutes les équipes, auxquels vous pouvez assigner une puce, un circuit, etc. +help:anonymous_team = Créer et nommer des membres (temporaires) d'équipe pour toutes les équipes, auxquels vous pouvez affecter une puce, un circuit, etc. Anonymt namn = Nom anonyme Med anmälningsavgift (lagets klubb) = Avec les frais d'inscription (pour le club de l'équipe) Tar bort X = Retrait de X @@ -2006,56 +2009,56 @@ Verktyg = Outils Automatisk = Automatique Avstånd = Distance Extra avstånd ovanför textblock = Distance additionnelle -FilterSameParallelNotFirst = Variations identiques sauf la première +FilterSameParallelNotFirst = Grouper les variations identiques sauf la première RunnerLeg = Concurrent (variation spécifique) Texten ska innehålla tecknet X, som byts ut mot tävlingsspecifik data = Le texte doit inclure le symbole X, qui est remplacé par les données spécifiques à la compétition Tabellverktyg = Outils table Antal reserverade nummerlappsnummer mellan klasser = Nombre de dossards réservés entre les catégories -help:bibs = Vous pouvez gérer les dossards manuellement ou automatiquement. Ici vous pouvez assigner les dossards manuellement pour une certaine catégorie en spécifiant la méthode Manuelle et en fournissant le premier numéro pour cette catégorie.\n\nLa méthode automatique fonctionne de la même façon, avec la différence que MeOS mettra à jour les dossards de toutes les catégories d'un coup. Bien qu'il soit possible de faire ce paramétrage ici, il est préférable d'utiliser le Paramétrage rapide pour les catégories afin d'avoir une vue d'ensemble de toutes les catégories.\n\nUtiliser la méthode Automatique avec les méthodes Aucun ou Consécutifs, qui indique que le dernier numéro de la catégorie précédente est utilisé comme premier numéro. Le nombre de dossards réservés définit le saut de numérotation entre catégories.\n\nPour les catégories d'équipes vous pouvez spécifier la relation existant entre les numéros de dossard des équipiers et celui de l'équipe. Il peut être Identique, Indépendant, Croissant (Équipe 1: 101, 102, 103, 104, Équipe 2: 111, 112, 113, 114 etc.) ou par Combinaison (100-1, 100-2, 100-3 etc). -RunnerGeneralPlace = Classement individuel ou par équipe du concurrent ($2011) -RunnerGeneralTimeAfter = Retard individuel ou par équipe du concurrent ($2012) -RunnerGeneralTimeStatus = Temps / statut individuel ou de l'équipe du concurrent ($2013) +help:bibs = Vous pouvez gérer les dossards manuellement ou automatiquement. Ici vous pouvez affecter les dossards manuellement pour une certaine catégorie en spécifiant la méthode Manuelle et en fournissant le premier numéro pour cette catégorie.\n\nLa méthode automatique fonctionne de la même façon, avec la différence que MeOS mettra à jour les dossards de toutes les catégories d'un coup. Bien qu'il soit possible de faire ce paramétrage ici, il est préférable d'utiliser le Paramétrage rapide pour les catégories afin d'avoir une vue d'ensemble de toutes les catégories.\n\nUtiliser la méthode Automatique avec les méthodes Aucun ou Consécutifs, qui indique que le dernier numéro de la catégorie précédente est utilisé comme premier numéro. Le nombre de dossards réservés définit le saut de numérotation entre catégories.\n\nPour les catégories d'équipes vous pouvez spécifier la relation existant entre les numéros de dossard des équipiers et celui de l'équipe. Il peut être Identique, Indépendant, Croissant (Équipe 1: 101, 102, 103, 104, Équipe 2: 111, 112, 113, 114 etc.) ou par Combinaison (100-1, 100-2, 100-3 etc). +RunnerGeneralPlace = Place du coureur ou du relayeur +RunnerGeneralTimeAfter = Retard du coureur ou du relayeur +RunnerGeneralTimeStatus = Temps / statut du coureur ou du relayeur open_error = Impossible d'ouvrir X.\n\nY. open_error_locked = Cette compétition est déjà ouverte dans MeOS.\n\nVous devez utiliser une base de données pour ouvrir plus d'un exemplaire d'une compétition. Ogiltigt bricknummer = Numéro de puce invalide ask:updatelegs = Les longueurs des variations individuelles peut nécessiter une mise à jour après ce changement.\n\nSouhaitez-vous corriger cela maintenant ? warn:updatelegs = Les longueurs des variations individuelles peut nécessiter une mise à jour après ce changement. Ingen deltagare vald = Aucun concurrent sélectionné -Från klubben = Du Club +Från klubben = Du club Från laget = De l'équipe -Gafflingsnyckel X = Clef de variation X +Gafflingsnyckel X = Clé de variation X help:teamwork = Les coureurs ont échangés leur place. Vous pouvez faire une succession d'échanges pour obtenir la nouvelle composition d'équipe. Ordnat = Trié -Str. X = Variation X +Str. X = Relayeur X Vill du att X går in i laget? = Voulez-vous mettre X dans l'équipe ? Vill du att X och Y byter sträcka? = Voulez-vous que X et Y changent de variation ? -Vill du att X tar sträckan istället för Y? = Voulez-vous que X coure cette variation à la place de Y ? +Vill du att X tar sträckan istället för Y? = Voulez-vous que X courre cette variation à la place de Y ? Ändra lagets gaffling = Changer les variations de l'équipe Deltagarens klass styrs av laget = La catégorie est définie par l'équipe -För att delta i en lagklass måste deltagaren ingå i ett lag = Pour participer à une catégorie d'équipe vous devez assigner une équipe au compétiteur -Dela upp = Scinder +För att delta i en lagklass måste deltagaren ingå i ett lag = Pour participer à une catégorie d'équipe vous devez affecter une équipe au coureur +Dela upp = Diviser Alla sträckor = Toutes les variantes Liveresultat, deltagare = Résultats en direct, individuels -Använd enhets-id istället för tävlings-id = Utiliser l'identifiant de l'appareil au lieu de l'identifiant de la compétition ($2035) +Använd enhets-id istället för tävlings-id = Utiliser l'identifiant de l'appareil au lieu de l'identifiant de la compétition Enhetens ID-nummer (MAC) = Identifiant de l'appareil (MAC) -Antal deltagare: X = Nombre de compétiteurs : X -Dela efter placering = Scinder par résultat -Dela efter tid = scinder par temps -Dela slumpmässigt = Scinder aléatoirement +Antal deltagare: X = Nombre de coureurs : X +Dela efter placering = Diviser par résultat +Dela efter tid = Diviser par temps +Dela slumpmässigt = Diviser aléatoirement Jämna klasser (placering) = Faire des catégories égales (résultats) Jämna klasser (ranking) = Faire des catégories égales (classement) Jämna klasser (tid) = Faire des catégories égales (Temps) Klass X = Catégorie X -Not yet implemented = Non encore implémenté -Tidstillägg = Pénalité (M:S) -help:seeding_info = L'allocation ensemencée des heures de départ signifie qu'un résultat ou un classement précédent contrôle en partie le processus. Dans le champ Groupes ensemencés vous pouvez entrer une taille de groupe unique, ce qui indique que la catégorie entière est à partitionner dans des groupes de cette taille. La taille de groupe "1" indique que l'ordre d'ensemencement est rigoureusement respecté. Vous pouvez également spécifier plusieurs tailles de groupes. "15, 1000" signifiera un groupe d'ensemencement contenant les 15 coureurs les mieux placés et les autres coureurs (au plus 1000) seront placés dans un groupe non ensemencé. +Not yet implemented = Pas encore implémenté +Tidstillägg = Pénalité (M:SS) +help:seeding_info = L'allocation répartie des heures de départ signifie qu'un résultat ou un classement précédent contrôle en partie le processus. Dans le champ Groupes de répartition, vous pouvez entrer une taille de groupe unique, ce qui indique que la catégorie entière est à partitionner dans des groupes de cette taille. La taille de groupe "1" indique que l'ordre de répartition est rigoureusement respecté. Vous pouvez également spécifier plusieurs tailles de groupes. "15, 1000" signifiera un groupe de répartition contenant les 15 coureurs les mieux placés et les autres coureurs (au plus 1000) seront placés dans un groupe non réparti. Ange en gruppstorlek (som repeteras) eller flera kommaseparerade gruppstorlekar = Fournir une taille de groupe (qui sera répétée) ou plusieurs tailles séparées par des virgules Hindra att deltagare från samma klubb startar på angränsande tider = Empêcher que des coureurs du même club partent à des horaires consécutifs. -Låt de bästa start först = Faire ne sorte que le mieux classé parte en premier -Seedningsgrupper = Groupes ensemencés -Seedningskälla = Données d'ensemencement -error:invalidmethod = La méthode sélectionnée ne génère pas de distribution. Les données d'ensemencement sont insuffisantes. -Ogiltig storlek på seedningsgrupper X = Taille des groupes d'ensemencement invalide : X +Låt de bästa start först = Faire partir le mieux classé en premier +Seedningsgrupper = Groupes de répartition +Seedningskälla = Données de répartition +error:invalidmethod = La méthode sélectionnée ne génère pas de distribution. Les données de répartition sont insuffisantes. +Ogiltig storlek på seedningsgrupper X = Taille des groupes de répartition invalide : X Bananvändning = Fréquentation des circuits Antal banor = Nombre de circuits Could not load list 'X' = Impossible de charger la liste 'X' @@ -2065,13 +2068,13 @@ Vakanser - X = Vacants - X Kopiera = Copier Kopiera till urklipp = Copier dans le presse papier RunnerStartCond = Heure de départ du concurrent (si individuel) -StartTimeForClassRange = Plage d'heure de départ de la catégorie +StartTimeForClassRange = Plage d'heures de départ de la catégorie TeamStartCond = Heure de départ de l'équipe (si individuel) Liveresultat = Résultats en direct Visa rullande tider mellan kontroller i helskärmsläge = Afficher les temps s'écoulant entre deux postes en mode plein écran -help:liveresultat = Cette méthode démarre un chronomètre en mode plein écran quand un compétiteur d'une catégorie sélectionnée poinçonne le poste , et mesure le temps jusqu'à ce que le poste soit atteint. Sinon la liste des meilleurs temps est affichée. Les deux postes doivent bien sûr être des postes radio et si vous utilisez un réseau, vérifiez bien que vous avez activé pour obtenir rapidement des temps les plus précis possibles. -Result at a control = Résultat à la balise -Total/team result at a control = Résultat total/de l'équipe à une balise +help:liveresultat = Cette méthode démarre un chronomètre en mode plein écran quand un coureur d'une catégorie sélectionnée poinçonne le poste , et mesure le temps jusqu'à ce que le poste soit atteint. Sinon la liste des meilleurs temps est affichée. Les deux postes doivent bien sûr être des postes radio et si vous utilisez un réseau, vérifiez bien que vous avez activé pour obtenir rapidement des temps les plus précis possibles. +Result at a control = Résultat au poste +Total/team result at a control = Résultat total/de l'équipe à un poste prefsAccount = Numéro de compte par défaut prefsAddress = Adresse par défaut prefsAdvancedClassSettings = Afficher les paramètres avancés des catégories @@ -2080,8 +2083,8 @@ prefsCardFee = Tarif de location de puce par défaut prefsClient = Nom du client sur le réseau Vissa inställningar kräver omstart av MeOS för att ha effekt = Certains paramètres nécessitent le redémarrage de MeOS pour prendre effet prefsAutoTie = Lier automatiquement coureur et puce -prefsControlFrom = Temps depuis la balise ($2079) -prefsControlTo = Temps jusqu'à la balise ($2080) +prefsControlFrom = Temps depuis le poste radio... +prefsControlTo = Temps jusqu'au poste radio... prefsCurrencyFactor = Facteur d'échelle monétaire prefsCurrencyPreSymbol = Placer le symbole monétaire en premier prefsCurrencySeparator = Séparateur décimal monétaire @@ -2089,8 +2092,8 @@ prefsCurrencySymbol = Symbole monétaire prefsDatabase = Utiliser la base de données des coureurs prefsDatabaseUpdate = Dernière mise à jour de la base des coureurs prefsDefaultDrawMethod = Méthode de tirage par défaut -prefsDirectPort = Port réseau pour les poinçons anticipés -prefsEMail = Courriel +prefsDirectPort = Port réseau pour les poinçons radios +prefsEMail = E-mail prefsEliteFee = Tarif par défaut pour les élites prefsEntryFee = Tarif par défaut prefsEventorBase = URL d'Eventor @@ -2111,7 +2114,7 @@ prefsRentCard = Puce louée prefsSeniorAge = Age sénior prefsServer = Serveur réseau par défaut prefsSpeakerShortNames = Utiliser les initiales dans les noms -prefsStreet = Nom de rue de l'organisateur +prefsStreet = Adresse club prefsSynchronizationTimeOut = Délai d'attente de mise à jour réseau (ms) prefsTextFont = Police utilisée par MeOS prefsUseDirectSocket = Utiliser les données anticipées de poinçonnage @@ -2149,7 +2152,7 @@ Du kan använda en SI-enhet för att läsa in bricknummer = Vous pouvez utiliser Ignorera startstämpling = Ignorer le poinçon de départ Uppdatera inte starttiden vid startstämpling = Ne pas mettre à jour l'horaire de départ avec le poinçon de départ Ändra lokala inställningar = Modifier les paramètres -Gafflingsnyckel = Clef de variation +Gafflingsnyckel = Clé de variation Felaktigt datumformat 'X' (Använd ÅÅÅÅ-MM-DD) = Format de date incorrect 'X' (AAAA-MM-JJ) Felaktigt tidsformat 'X' (Använd TT:MM:SS) = Format d'heure incorrect 'X' (HH:MM:SS) Hämta inställningar från föregående lottning = Récupérer les paramètres des sessions précédentes @@ -2179,7 +2182,7 @@ Bricka X används också av = La puce X est aussi utilisée par reused card = puce réutilisée Varning: Brickan X används redan av Y = Attention ! La puce X est déjà utilisée par Y Invalid filter X = Filtre X invalide -Invalid font X = Fonte X invalide +Invalid font X = Police X invalide Aktivera stöd för tider över 24 timmar = Supporter les durées de course de plus de 24h. Inkludera information om flera lopp per löpare = Inclure les informations sur les courses multiples pour un coureur individuel. Alla uthyrda brickor har bockats av = Toutes les puces louées ont été rendues @@ -2204,8 +2207,8 @@ sekunder = secondes var först i mål med tiden X = était le premier à terminer avec un temps de X var först vid X med tiden Y = était le premier au poste X avec un temps de Y var först vid växeln med tiden X = était le premier au passage de relais avec un temps de X -är nu på X plats med tiden Y = est maintenant à la X ème place avec un temps de Y -är nu på delad X plats med tiden Y = est maintenant à égalité à la X ème place avec un temps de Y +är nu på X plats med tiden Y = est maintenant à la X è place avec un temps de Y +är nu på delad X plats med tiden Y = est maintenant à égalité à la X è place avec un temps de Y är X efter = est en retard de X är X efter Y = est en retard de X derrière Y är X efter; har tappat Y = est en retard de X; a perdu Y @@ -2215,11 +2218,11 @@ leder med X; sprang Y snabbare än de jagande = est en tête avec X; court Y plu leder med X = est en tête avec X delar placering med X = est à égalité avec X sekund = seconde -skickar ut X = envoyer X +skickar ut X = lance X Export language = Langue Use French Federation of Orienteering mapping = Utiliser le format de la Fédération Française de CO Export split times = Exporter les temps intermédiaires -Climb (m) = Dénivelée (m) +Climb (m) = Dénivelé (m) Utrymme: X = Taille : X [Radera] = [Supprimer] prefsNumSplitsOnePage = Nombre de puces par page @@ -2240,22 +2243,22 @@ Max antal brickor per sida = Nombre maximum de puces par page Sträcktider i kolumner (för standardpapper) = Temps en colonnes (pour imprimante A4) Spara inmatade tider i tävlingen utan att tilldela starttider = Enregistrer les paramètres et les heures de départ de chaque catégorie pour y revenir plus tard SRR Dongle = Dongle SRR -red channel = Chaine rouge -blue channel = Chaine bleue +red channel = Réseau rouge +blue channel = Réseau bleu Printing failed (X: Y) Z = Port par défaut prefsNameMode = Format du nom : X Kommunikationen med en SI-enhet avbröts = Connection perdue à la base SI-master Varning: avgiften kan ej faktureras = Attention : impossible de générer de facture pour ce montant Gamla brickor utan stöd för långa tider = Puces anciennes ne prenant pas en charge les longues courses -ask:convert_to_patrol = Certaines catégories contiennent des requêtes pour que certains coureurs aient la même heure de départ. Voulez-vous convertir ces catégories en catégories pour co-compétiteurs (type raid) ? +ask:convert_to_patrol = Certaines catégories contiennent des requêtes pour que certains coureurs aient la même heure de départ. Voulez-vous convertir ces catégories en catégories en binôme (type raid) ? Antal som inte importerades: X = Nombre d'inscriptions sautées : X Det finns anmälningsdata för flera etapper = Il y a des données pour plusieurs étapes Välj etapp att importera = Sélectionner l'étape à importer ask:savespeaker = Voulez-vous sauvegarder les paramètres d'affichage et de catégorie sur cet ordinateur ? Spara fönster- och speakerinställningar på datorn = Enregistrer la fenêtre et les paramètres sur cet ordinateur -ask:loadspeaker = Voulez-vous recréer des fenêtres sauvegardées précédemment sur cet ordinateur ? -Återskapa = Régénérer -Återskapa tidigare sparade fönster- och speakerinställningar = Régénérer les fenêtres et paramètres enregistrés précédemment +ask:loadspeaker = Voulez-vous réorganiser les fenêtres et paramètres comme enregistré précédemment sur cet ordinateur ? +Återskapa = Réorganiser +Återskapa tidigare sparade fönster- och speakerinställningar = Réorganiser les fenêtres et paramètres comme enregistré précédemment Inkludera resultat från tidigare etapper = Inclure les résultats de toutes les étapes Animation = Animation Bakgrund = Arrière plan @@ -2268,7 +2271,7 @@ Justera visningsinställningar = Ajuster les paramètres de visualisation Marginal = Marge Sidor per skärm = Pages par écran Textfärg = Couleur du texte -Utseende = Apparence +Utseende = Affichage Visningsinställningar för 'X' = Paramètres d'affichage pour 'X' Visningstid = Afficher le temps Visning = Mode d'affichage @@ -2279,7 +2282,7 @@ warn:missingResult = X coureurs ne sont toujours pas rentrés et ne sont donc pa Lås gafflingar = Verrouiller les variations Markera för att förhindra oavsiktlig ändring av gafflingsnycklar = Vérifier pour empêcher toute erreur dans la répartition des variations Tillåt gafflingsändringar = Déverrouiller les variations -ask:updatetimes = Voulez-vous conserver autant que possible les horaires de départ déjà assignés ? Répondez Non pour décaler la compétition dans le temps +ask:updatetimes = Voulez-vous conserver autant que possible les horaires de départ déjà affectés ? Répondez Non pour décaler la compétition dans le temps X har en tid (Y) som inte är kompatibel med förändringen = X a une heure de départ (Y) ce qui n'est pas compatible avec ce changement warn:latestarttime = Utiliser des heures de départ plus de X heures après l'heure zéro n'est pas conseillé Anm. tid = Heure d'inscription @@ -2292,7 +2295,7 @@ Ekonomihantering, X = Gestion financière, X Manuellt gjorda justeringar = Ajustements manuels Antal förfrågningar: X = Nombre de requêtes Genomsnittlig svarstid: X ms = Temps moyen de réponse : X -Informationsserver = Informations serveur +Informationsserver = MeOS Information Server Längsta svarstid: X ms = Temps de réponse maximal : X MeOS Informationsserver REST-API = MeOS Information Server REST-API Testa servern = Tester le serveur @@ -2305,24 +2308,24 @@ Lås startlista = Verrouiller la liste de départ FilterNoCancel = Pas annulés CourseStartTime = Circuit, heure de départ Startlista, banvis = Liste de départ par circuit -Stämplingsintervall, rogaining-patrull = Intervalle de poinçonnage dans la patrouille +Stämplingsintervall, rogaining-patrull = Intervalle de poinçonnage maximal d'une patrouille Patrullresultat (STOR) = Résultats de la patrouille (GRAND) Patrol Team Rogaining = Course au score en patrouille Rogaining results for a patrol = Résultats de course au score pour binôme (ou plus) -Exportera ett kalkylblad med lottningsinställningar som du kan redigera och sedan läsa in igen = 0 +Exportera ett kalkylblad med lottningsinställningar som du kan redigera och sedan läsa in igen = Exporter un tableur avec les paramètres de départ que vous pouvez éditer, puis réimporter Kalkylblad/csv = Tableur/csv Importerar lottningsinställningar = Importer les paramètres des listes de départ help:exportdraw = Vous pouvez exporter un tableur en CSV avec les catégories, le nombre d'inscrits et les paramètres des listes de départ par catégories. Il est ensuite possible d'éditer ces données et de les ré-importer dans MeOS pour créer les listes de départ. prefsDrawInterlace = Entrelacer catégorie/circuits dans la liste de départ prefsServicePort = Port par défaut X -Ingen nummerlapp = Num de dossard +Ingen nummerlapp = No de dossard Rogaining results for a team, where each team member collects points individually = Résultats de course au score pour binôme où chaque membre collecte des points de façon individuelle prefsCodePage = Code table pour l'import/export en 8 bits Inga klasser tillåter direktanmälan. På sidan klasser kan du ändra denna egenskap. = Aucune catégorie n'autorise les inscriptions rapides.\n\nVous pouvez modifier ce paramètre à la page 'Catégories'. Database is used and cannot be deleted = La base de donnée est utilisée et ne peut être supprimée Classes together = Catégories regroupées Finish order = Ordre d'arrivée -First to finish = Premier qui a fini +First to finish = Premier à finir Individual result by finish time = Résultat individuel sur l'heure d'arrivée Endast tidtagning = Chronométrage seul AllPunches = Tous les poinçons @@ -2352,12 +2355,12 @@ ask:removescheme = Si vous retirez le schéma de qualification, les résultats s ClassKnockoutTotalResult = Class, knock-out total result Support intermediate legs = Supporter les variations spécifiques en relais help:custom_text_lines = Vous pouvez insérer du texte spécifique en ajoutant en dessous [DonnéeSpécifique]. Les infos disponibles sont visibles dans le tableau déroulant à droite.\n\nPar exemple : Bravo [RunnerName] ! -Importerar ranking = Importer le ranking -Klart. X värden tilldelade = Terminé. X valeurs assignées +Importerar ranking = Importer le classement +Klart. X värden tilldelade = Terminé. X valeurs affectées Felaktigt rankingformat i X. Förväntat: Y = Format de classement incorrect pour X.\nY attendu Importerar RAID patrull csv-fil = Importer les données RAID en csv Varning: Följande deltagare har ett osäkert resultat = Attention : les informations sur ce coureur ne sont pas claires -Direkt tidtagning = Chronométrage en direct +Direkt tidtagning = Chrono en direct Klassval för 'X' = Sélection de la catégorie pour 'X' Endast tidtagning (utan banor) = Chronométrage seul (pas de circuits) Knockout total = Résumé des éliminations @@ -2427,18 +2430,28 @@ Vill du tömma listan med hyrbrickor? = Voulez-vous supprimer la liste des puces prefsLastExportTarget = Cible du dernier export prefsServiceRootMap = Fonctions standard pour la source du serveur Web prefsshowheader = Afficher les titres -help:registerhiredcards = Pré-inscrivez des puces comme puces louées pour assigner automatiquement le statut et le tarif correspondant quand cette puce est assignée. +help:registerhiredcards = Pré-inscrivez des puces comme puces louées pour affecter automatiquement le statut et le tarif correspondant quand cette puce est affectée. Lagändringblankett = Modifications d'équipes -Mappa rootadressen (http:///localhost:port/) till funktion = Map root address (http:///localhost:port/) to function ($2428) +Mappa rootadresssen (http:///localhost:port/) till funktion = Imposer l'adresse (http:///localhost:port/) pour fonctionner ClassAvailableMaps = Cartes disponibles pour la catégorie ClassTotalMaps = Nombre total de cartes pour la catégorie Export split times = Exporter les temps intermédiaires + + +prefsVacantPercent = Pourcentage de vacants +ClassNumEntries = Nombre d'inscrits dans la catégorie +Före X = Avant X +Efter X = Après X +Slå ihop X = Fusionner X +Slå ihop med = Fusionner avec + + Age (on last day of current year) = Age (au dernier jour de l'année en cours) Age above or equal implies senior/pensioner = Limite d'âge haute des jeunes (défini dans Compétition/Configuration de la competition) Age below or equal implies youth = Limite d'âge haute des jeunes (défini dans Compétition/Configuration de la competition) ClassNumEntries = Nombres d'inscrits dans la catégorie Endast tidtagning = chronométrage seul -Flera lopp i valfri ordning = Plusieurs circuits dans un ordre quelconque +Flera lopp i valfri ordning = Somme de plusieurs circuits Från första = Dép. au premier poste Heat = Manche Inkludera bana = Inclure le circuit @@ -2454,7 +2467,7 @@ Målstämpling tillåts inte (X) = Arrivée radio désactivée (x) [Finish punch Plac. E[stageno] = Place E Poäng E[stageno] = Points E Poängreduktion = Réduction -Radio = Radio +Radio = Postes Radio tillåts inte (X) = Postes de contrôle radios désactivés (X) [Radio controls disallowed] Referens = Référence Result module = Module de résultats @@ -2473,17 +2486,14 @@ Status code for running out-of-competition = Code de statut pour non classé (NC Stigning = Dénivellé Tid E[stageno] = Temps E Till sista = Arr. au dernier poste -Tillåt = Autoriser +Tillåt = Autoriser radios Utom tävlan = NC X anmälda = X inscrits ask:usecourseinclass = Le circuit n'est utilisé par aucun autre coureur dans cette catégorie\n\nVoulez-vous tout de même l'utiliser ? warn:printmodeonly = Attention, notez bien que vous ne faites qu'imprimer les données de la puce sans l'enregistrer.\n\nPour l'intégrer à la course, utilisez la fonction Lecture des puces/Radios. Åldersfiltrering = Filtrer par âge There is no result module with X as identifier = Aucun module de résultat n'a X comme identifiant -prefsVacantPercent = Pourcentage de vacants -ClassNumEntries = Nombre d'inscrits dans la catégorie -Före X = Avant X -Efter X = Après X -Slå ihop X = Fusionner X -Slå ihop med = Fusionner avec -Ett okänt fel inträffade = Une erreur inconnue s'est produite +Vakansplacering = Emplacement des vacants +Lottat = Répartis +Först = En premier +Sist = En dernier \ No newline at end of file diff --git a/code/gdiconstants.h b/code/gdiconstants.h index 9dc3cc9..3dc8f9e 100644 --- a/code/gdiconstants.h +++ b/code/gdiconstants.h @@ -47,7 +47,4 @@ enum FlowOperation { FlowAborted }; - - -const int GDI_BUTTON_SPACING = 8; #endif diff --git a/code/gdioutput.h b/code/gdioutput.h index d83bc12..2f3c42d 100644 --- a/code/gdioutput.h +++ b/code/gdioutput.h @@ -76,6 +76,10 @@ enum gdiFonts; #define START_YP 30 #define NOTIMEOUT 0x0AAAAAAA +constexpr int baseButtonWidth = 150; + +constexpr int GDI_BUTTON_SPACING = 8; + typedef list ToolList; /* enum FontEncoding { diff --git a/code/generalresult.cpp b/code/generalresult.cpp index 9106986..f8a37bc 100644 --- a/code/generalresult.cpp +++ b/code/generalresult.cpp @@ -476,15 +476,15 @@ pair GeneralResult::score(oTeam &team, RunnerStatus st, int rt, int po } RunnerStatus GeneralResult::deduceStatus(oTeam &team) const { - return team.getStatus(); + return team.deduceComputedStatus(); } int GeneralResult::deduceTime(oTeam &team) const { - return team.getRunningTime(false); + return team.deduceComputedRunningTime();//team.getRunningTime(false); } int GeneralResult::deducePoints(oTeam &team) const { - return team.getRogainingPoints(false, false); + return team.deduceComputedPoints();//team.getRogainingPoints(false, false); } pair GeneralResult::score(oRunner &runner, RunnerStatus st, int time, int points, bool asTeamMember) const { @@ -1075,6 +1075,7 @@ void DynamicResult::declareSymbols(DynamicMethods m, bool clear) const { } void DynamicResult::getSymbols(vector< pair > &symb) const { + symb.clear(); parser.getSymbols(symb); } @@ -1162,7 +1163,7 @@ void DynamicResult::prepareCommon(oAbstractRunner &runner, bool classResult) con parser.addSymbol("Start", runner.getStartTime()); parser.addSymbol("Finish", ft); parser.addSymbol("Time", runner.getRunningTime(useComputed)); - parser.addSymbol("Place", runner.getPlace()); + parser.addSymbol("Place", runner.getPlace(false)); parser.addSymbol("Points", runner.getRogainingPoints(useComputed, false)); parser.addSymbol("PointReduction", runner.getRogainingReduction(useComputed)); parser.addSymbol("PointOvertime", runner.getRogainingOvertime(useComputed)); @@ -1173,7 +1174,7 @@ void DynamicResult::prepareCommon(oAbstractRunner &runner, bool classResult) con parser.addSymbol("TotalStatus", runner.getTotalStatus()); parser.addSymbol("TotalTime", runner.getTotalRunningTime()); - parser.addSymbol("TotalPlace", runner.getTotalPlace()); + parser.addSymbol("TotalPlace", runner.getTotalPlace(false)); parser.addSymbol("InputStatus", runner.getInputStatus()); parser.addSymbol("InputTime", runner.getInputTime()); @@ -1233,6 +1234,10 @@ void DynamicResult::prepareCalculations(oTeam &team, bool classResult) const { start[k] = res.getStartTime(); finish[k] = res.getFinishTime(); points[k] = res.getPoints(); + if (classResult) { + r->updateComputedResultFromTemp(); + } + runnerOutputTimes[k] = res.outputTimes; runnerOutputNumbers[k] = res.outputNumbers; } @@ -1276,7 +1281,7 @@ void DynamicResult::prepareCalculations(oTeam &team, bool classResult) const { pClass cls = team.getClassRef(true); if (cls) { int nl = max(1, cls->getNumStages() - 1); - parser.addSymbol("ShortestClassTime", cls->getTotalLegLeaderTime(nl, false, false)); + parser.addSymbol("ShortestClassTime", cls->getTotalLegLeaderTime(oClass::AllowRecompute::Yes, nl, false, false)); } } @@ -1389,7 +1394,7 @@ void DynamicResult::prepareCalculations(oRunner &runner, bool classResult) const pClass cls = runner.getClassRef(true); if (cls) { int nl = runner.getLegNumber(); - parser.addSymbol("ShortestClassTime", cls->getBestLegTime(nl, false)); + parser.addSymbol("ShortestClassTime", cls->getBestLegTime(oClass::AllowRecompute::Yes, nl, false)); } vector delta; vector place; diff --git a/code/iof30interface.cpp b/code/iof30interface.cpp index d2e272f..49efeb3 100644 --- a/code/iof30interface.cpp +++ b/code/iof30interface.cpp @@ -2706,13 +2706,14 @@ void IOF30Interface::writeResultList(xmlparser &xml, const set &classes, vector c; oe.getClasses(c, false); + vector rToUse; + vector tToUse; for (size_t k = 0; k < c.size(); k++) { - if (classes.empty() || classes.count(c[k]->getId())) { - vector rToUse; - vector tToUse; getRunnersToUse(c[k], rToUse, tToUse, leg, false); + oe.sortRunners(SortOrder::ClassResult, rToUse); + oe.sortTeams(SortOrder::ClassResult, -1, false, tToUse); if (!rToUse.empty() || !tToUse.empty()) { writeClassResult(xml, *c[k], rToUse, tToUse); @@ -2778,9 +2779,9 @@ void IOF30Interface::writeClass(xmlparser &xml, const oClass &c) { xml.write("Name", c.getName()); oClass::ClassStatus stat = c.getClassStatus(); - if (stat == oClass::Invalid) + if (stat == oClass::ClassStatus::Invalid) xml.write("Status", L"Invalidated"); - else if (stat == oClass::InvalidRefund) + else if (stat == oClass::ClassStatus::InvalidRefund) xml.write("Status", L"InvalidatedNoFee"); xml.endTag(); @@ -2990,7 +2991,8 @@ void IOF30Interface::writeResult(xmlparser &xml, const oRunner &rPerson, const o int tleg = r.getLegNumber() >= 0 ? r.getLegNumber() : 0; if (stat == StatusOK && hasTiming) { - int after = r.getTotalRunningTime() - r.getClassRef(true)->getTotalLegLeaderTime(tleg, true, true); + int after = r.getTotalRunningTime() - + r.getClassRef(true)->getTotalLegLeaderTime(oClass::AllowRecompute::Yes, tleg, true, true); if (after >= 0) xml.write("TimeBehind", after); } @@ -3284,13 +3286,14 @@ void IOF30Interface::writeStartList(xmlparser &xml, const set &classes, boo vector c; oe.getClasses(c, false); + vector rToUse; + vector tToUse; for (size_t k = 0; k < c.size(); k++) { - if (classes.empty() || classes.count(c[k]->getId())) { - vector rToUse; - vector tToUse; getRunnersToUse(c[k], rToUse, tToUse, -1, true); + oe.sortRunners(SortOrder::ClassStartTime, rToUse); + oe.sortTeams(SortOrder::ClassStartTime, 0, false, tToUse); if (!rToUse.empty() || !tToUse.empty()) { writeClassStartList(xml, *c[k], rToUse, tToUse); } @@ -3793,7 +3796,24 @@ pCourse IOF30Interface::readCourse(const xmlobject &xcrs) { if (!xcrs) return 0; - int cid = xcrs.getObjectInt("Id"); + string sId; + xcrs.getObjectString("Id", sId); + int cid = 0; + if (sId.length() > 0) { + sId = trim(sId); + if (isNumber(sId)) + cid = atoi(sId.c_str()); + else { + // Handle non-numeric id. Hash. Uniqeness ensured below. + for (size_t j = 0; j < sId.length(); j++) + cid = 31 * cid + sId.at(j); + + cid = cid & 0xFFFFFFF; + } + } + + if (!readCrsIds.insert(cid).second) + cid = 0; // Ignore for duplicates wstring name = constructCourseName(xcrs); /*, family; @@ -3867,6 +3887,8 @@ pCourse IOF30Interface::readCourse(const xmlobject &xcrs) { pc = oe.getCourse(name); if (pc == 0) pc = oe.addCourse(name); + + readCrsIds.insert(pc->getId()); } if (pc) { diff --git a/code/iof30interface.h b/code/iof30interface.h index fc891cb..0c0205d 100644 --- a/code/iof30interface.h +++ b/code/iof30interface.h @@ -271,6 +271,8 @@ class IOF30Interface { void readId(const xmlobject &person, int &pid, __int64 &extId) const; + set readCrsIds; + public: IOF30Interface(oEvent *oe, bool forceSplitFee); virtual ~IOF30Interface() {} diff --git a/code/meos.cpp b/code/meos.cpp index 4fb53eb..7dd945b 100644 --- a/code/meos.cpp +++ b/code/meos.cpp @@ -310,6 +310,7 @@ int APIENTRY WinMain(HINSTANCE hInstance, lang.get().addLangResource(L"Dansk", L"106"); lang.get().addLangResource(L"Český", L"108"); lang.get().addLangResource(L"Français", L"110"); + lang.get().addLangResource(L"Español", L"111"); lang.get().addLangResource(L"Russian", L"107"); if (fileExist(L"extra.lng")) { @@ -424,8 +425,23 @@ int APIENTRY WinMain(HINSTANCE hInstance, else return ANSI; }*/ - - gdi_main->setFont(gEvent->getPropertyInt("TextSize", 0), + int defSize = 0; + { + RECT desktop; + const HWND hDesktop = GetDesktopWindow(); + // Get the size of screen to the variable desktop + GetWindowRect(hDesktop, &desktop); + int d = max(desktop.right, desktop.bottom); + if (d <= 1024) + defSize = 0; + else if (d <= 2000) + defSize = 1; + else if (d <= 2500) + defSize = 2; + else + defSize = 3; + } + gdi_main->setFont(gEvent->getPropertyInt("TextSize", defSize), gEvent->getPropertyString("TextFont", L"Arial")); if (hSplash != nullptr) { @@ -765,8 +781,8 @@ BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) int xp = gEvent->getPropertyInt("xpos", 50); int yp = gEvent->getPropertyInt("ypos", 20); - int xs = gEvent->getPropertyInt("xsize", max(850, min(int(rc.right)-yp, 1124))); - int ys = gEvent->getPropertyInt("ysize", max(650, min(int(rc.bottom)-yp-40, 800))); + int xs = gEvent->getPropertyInt("xsize", max(850, min(int(rc.right)-yp, (rc.right*9)/10))); + int ys = gEvent->getPropertyInt("ysize", max(650, min(int(rc.bottom)-yp-40, (rc.bottom*8)/10))); gEvent->setProperty("ypos", yp + 16); gEvent->setProperty("xpos", xp + 32); diff --git a/code/meos.rc b/code/meos.rc index 631bfdf..213e8f3 100644 --- a/code/meos.rc +++ b/code/meos.rc @@ -165,14 +165,14 @@ BEGIN BEGIN BLOCK "041d04b0" BEGIN - VALUE "CompanyName", " " + VALUE "CompanyName", "Melin Software HB" VALUE "FileDescription", "meos" - VALUE "FileVersion", "3.3.0.1" + VALUE "FileVersion", "3.7.0.1" VALUE "InternalName", "meos" VALUE "LegalCopyright", "Copyright 2007-2020" VALUE "OriginalFilename", "meos.exe" VALUE "ProductName", " meos" - VALUE "ProductVersion", "3.4.0.1" + VALUE "ProductVersion", "3.7.0.1" END END BLOCK "VarFileInfo" diff --git a/code/meosdb/MeosSQL.cpp b/code/meosdb/MeosSQL.cpp index 8a879fd..662023d 100644 --- a/code/meosdb/MeosSQL.cpp +++ b/code/meosdb/MeosSQL.cpp @@ -1633,7 +1633,7 @@ OpFailStatus MeosSQL::storeRunner(const Row &row, oRunner &r, r.Removed = row["Removed"]; r.sqlUpdated = row["Modified"]; r.counter = row["Counter"]; - + int oldHeat = r.getDCI().getInt("Heat"); storeData(r.getDI(), row, oe->dataRevision); if (oldSno != r.StartNo || oldBib != r.getBib()) @@ -1683,7 +1683,7 @@ OpFailStatus MeosSQL::storeRunner(const Row &row, oRunner &r, } else r.Class=0; - if (oldClass != r.Class) + if (oldClass != r.Class || oldHeat != r.getDCI().getInt("Heat")) oe->classIdToRunnerHash.reset(); if (int(row["Club"])!=0){ diff --git a/code/meosdb/meosdb.cpp b/code/meosdb/meosdb.cpp index c820922..dd8746a 100644 --- a/code/meosdb/meosdb.cpp +++ b/code/meosdb/meosdb.cpp @@ -48,8 +48,6 @@ using namespace std; #include "../oEvent.h" #include "../Localizer.h" -#include - #ifdef BUILD_DB_DLL HINSTANCE hInst=0; Localizer lang; diff --git a/code/meoslang.rc b/code/meoslang.rc index 60e9780..08f30e0 100644 --- a/code/meoslang.rc +++ b/code/meoslang.rc @@ -6,6 +6,7 @@ #define IDR_3006 108 #define IDR_3007 109 #define IDR_3008 110 +#define IDR_3011 111 IDR_3001 300 DISCARDABLE "swedish.lng" IDR_3002 300 DISCARDABLE "english.lng" @@ -14,5 +15,6 @@ IDR_3004 300 DISCARDABLE "danish.lng" IDR_3005 300 DISCARDABLE "russian.lng" IDR_3006 300 DISCARDABLE "czech.lng" IDR_3008 300 DISCARDABLE "french.lng" +IDR_3011 300 DISCARDABLE "spanish.lng" ///////////////////////////////////////////////////////////////////////////// diff --git a/code/meosversion.cpp b/code/meosversion.cpp index 7e33fe8..7ccf81a 100644 --- a/code/meosversion.cpp +++ b/code/meosversion.cpp @@ -30,18 +30,18 @@ //V35: abcdef //V36: abcdef int getMeosBuild() { - string revision("$Rev: 1004 $"); + string revision("$Rev: 1014 $"); return 174 + atoi(revision.substr(5, string::npos).c_str()); } //V37: a wstring getMeosDate() { - wstring date(L"$Date: 2020-02-25 21:05:03 +0100 (ti, 25 feb 2020) $"); + wstring date(L"$Date: 2020-05-01 16:22:46 +0200 (fr, 01 maj 2020) $"); return date.substr(7,10); } wstring getBuildType() { - return L"RC1"; // No parantheses (...) + return L"RC2"; // No parantheses (...) } wstring getMajorVersion() { @@ -145,6 +145,7 @@ void getSupporters(vector &supp, vector &developSupp) supp.emplace_back(L"Nyköpings OK"); supp.emplace_back(L"Thomas Engberg, VK Uvarna"); supp.emplace_back(L"LG Axmalm, Sävedalens AIK"); + supp.emplace_back(L"Falköpings AIK OK"); reverse(supp.begin(), supp.end()); } diff --git a/code/metalist.cpp b/code/metalist.cpp index ab660c9..f1f9e27 100644 --- a/code/metalist.cpp +++ b/code/metalist.cpp @@ -2845,6 +2845,16 @@ void MetaListContainer::getGeneralResults(vector &rmAll) { } } + +void MetaListContainer::getFreeResultModules(vector>> &res) const { + for (auto &r : freeResultModules) { + auto dynRes = dynamic_pointer_cast(r.second.ptr); + if (dynRes) { + res.emplace_back(r.first, dynRes); + } + } +} + wstring DynamicResultRef::getAnnotation() const { if (ctr) return ctr->getListName(); diff --git a/code/metalist.h b/code/metalist.h index 94f57e5..2867391 100644 --- a/code/metalist.h +++ b/code/metalist.h @@ -364,6 +364,9 @@ public: virtual ~MetaListContainer(); + + void getFreeResultModules(vector>> &res) const; + string getUniqueId(EStdListType code) const; EStdListType getCodeFromUnqiueId(const string &id) const; wstring makeUniqueParamName(const wstring &nameIn) const; diff --git a/code/methodeditor.cpp b/code/methodeditor.cpp index 1b86202..de45538 100644 --- a/code/methodeditor.cpp +++ b/code/methodeditor.cpp @@ -573,6 +573,27 @@ int MethodEditor::methodCb(gdioutput &gdi, int type, BaseInfo &data) { currentResult->prepareCalculations(*rr[k], false); int rt = 0, pt = 0; RunnerStatus st = StatusUnknown; + + { + wstring err; + wstring str; + try { + rt = currentResult->deduceTime(*rr[k], rr[k]->getStartTime()); + str = formatTime(rt); + } + catch (meosException &ex) { + err = ex.wwhat(); + errors.insert(ex.wwhat()); + str = L"Error"; + } + TextInfo &ti = gdi.addStringUT(yp, txp, 0, str, w[wi] - diff); + if (!err.empty()) { + ti.setColor(colorRed); + gdi.addToolTip("", err, 0, &ti.textRect); + } + txp += w[wi++]; + } + { wstring err; wstring str; @@ -593,26 +614,7 @@ int MethodEditor::methodCb(gdioutput &gdi, int type, BaseInfo &data) { } txp += w[wi++]; } - { - wstring err; - wstring str; - try { - rt = currentResult->deduceTime(*rr[k], rr[k]->getStartTime()); - str = formatTime(rt); - } - catch (meosException &ex) { - err = ex.wwhat(); - errors.insert(ex.wwhat()); - str = L"Error"; - } - TextInfo &ti = gdi.addStringUT(yp, txp, 0, str, w[wi]-diff); - if (!err.empty()) { - ti.setColor(colorRed); - gdi.addToolTip("", err, 0, &ti.textRect); - } - txp += w[wi++]; - } - + { wstring err; wstring str; @@ -675,6 +677,26 @@ int MethodEditor::methodCb(gdioutput &gdi, int type, BaseInfo &data) { currentResult->prepareCalculations(*tr[k], false); int rt = 0, pt = 0; RunnerStatus st = StatusUnknown; + { + wstring err; + wstring str; + try { + rt = currentResult->deduceTime(*tr[k]); + str = formatTime(rt); + } + catch (meosException &ex) { + err = ex.wwhat(); + errors.insert(ex.wwhat()); + str = L"Error"; + } + TextInfo &ti = gdi.addStringUT(yp, txp, 0, str, w[wi] - diff); + if (!err.empty()) { + ti.setColor(colorRed); + gdi.addToolTip("", err, 0, &ti.textRect); + } + txp += w[wi++]; + } + { wstring err; wstring str; @@ -694,26 +716,7 @@ int MethodEditor::methodCb(gdioutput &gdi, int type, BaseInfo &data) { } txp += w[wi++]; } - { - wstring err; - wstring str; - try { - rt = currentResult->deduceTime(*tr[k]); - str = formatTime(rt); - } - catch (meosException &ex) { - err = ex.wwhat(); - errors.insert(ex.wwhat()); - str = L"Error"; - } - TextInfo &ti = gdi.addStringUT(yp, txp, 0, str, w[wi]-diff); - if (!err.empty()) { - ti.setColor(colorRed); - gdi.addToolTip("", err, 0, &ti.textRect); - } - txp += w[wi++]; - } - + { wstring err; wstring str; @@ -1009,6 +1012,18 @@ void MethodEditor::debug(gdioutput &gdi_in, int id, bool isTeam) { int rt = 0, pt = 0; RunnerStatus st = StatusUnknown; gdi.dropLine(); + + try { + rt = currentResult->deduceTime(r, r.getStartTime()); + gdi.addStringUT(1, L"ComputedTime: " + formatTime(rt)).setColor(colorGreen); + } + catch (meosException &ex) { + wstring err = lang.tl(ex.wwhat()); + gdi.addString("", 0, L"Time Calculation Failed: X#" + err).setColor(colorRed); + } + if (currentResult->hasMethod(DynamicResult::MDeduceRTime)) + currentResult->debugDumpVariables(gdi, false); + try { st = currentResult->deduceStatus(r); currentResult->debugDumpVariables(gdi, true); @@ -1022,18 +1037,7 @@ void MethodEditor::debug(gdioutput &gdi_in, int id, bool isTeam) { } if (currentResult->hasMethod(DynamicResult::MDeduceRStatus)) currentResult->debugDumpVariables(gdi, false); - - try { - rt = currentResult->deduceTime(r, r.getStartTime()); - gdi.addStringUT(1, L"ComputedTime: " + formatTime(rt)).setColor(colorGreen); - } - catch (meosException &ex) { - wstring err = lang.tl(ex.wwhat()); - gdi.addString("", 0, L"Time Calculation Failed: X#" + err).setColor(colorRed); - } - if (currentResult->hasMethod(DynamicResult::MDeduceRTime)) - currentResult->debugDumpVariables(gdi, false); - + try { pt = currentResult->deducePoints(r); gdi.addStringUT(1, "ComputedPoints: " + itos(pt)).setColor(colorGreen); @@ -1065,6 +1069,17 @@ void MethodEditor::debug(gdioutput &gdi_in, int id, bool isTeam) { int rt = 0, pt = 0; RunnerStatus st = StatusUnknown; gdi.dropLine(); + try { + rt = currentResult->deduceTime(t); + gdi.addStringUT(1, L"ComputedTime: " + formatTime(rt)).setColor(colorGreen); + } + catch (meosException &ex) { + wstring err = lang.tl(ex.wwhat()); + gdi.addString("", 0, L"Time Calculation Failed: X#" + err).setColor(colorRed); + } + if (currentResult->hasMethod(DynamicResult::MDeduceRTime)) + currentResult->debugDumpVariables(gdi, false); + try { st = currentResult->deduceStatus(t); currentResult->debugDumpVariables(gdi, true); @@ -1078,18 +1093,7 @@ void MethodEditor::debug(gdioutput &gdi_in, int id, bool isTeam) { } if (currentResult->hasMethod(DynamicResult::MDeduceTStatus)) currentResult->debugDumpVariables(gdi, false); - - try { - rt = currentResult->deduceTime(t); - gdi.addStringUT(1, L"ComputedTime: " + formatTime(rt)).setColor(colorGreen); - } - catch (meosException &ex) { - wstring err = lang.tl(ex.wwhat()); - gdi.addString("", 0, L"Time Calculation Failed: X#" + err).setColor(colorRed); - } - if (currentResult->hasMethod(DynamicResult::MDeduceRTime)) - currentResult->debugDumpVariables(gdi, false); - + try { pt = currentResult->deducePoints(t); gdi.addStringUT(1, "ComputedPoints: " + itos(pt)).setColor(colorGreen); diff --git a/code/oClass.cpp b/code/oClass.cpp index fff2d09..18a665c 100644 --- a/code/oClass.cpp +++ b/code/oClass.cpp @@ -1714,11 +1714,12 @@ int oClass::getNumDistinctRunnersMinimal() const return max(ndist, 1); } -void oClass::resetLeaderTime() { +void oClass::resetLeaderTime() const { for (size_t k = 0; kdataRevision) + updateLeaderTimes(); + leg = mapLeg(leg); if (leg < 0) throw meosException(); @@ -1849,23 +1853,75 @@ oClass::LeaderInfo &oClass::getLeaderInfo(int leg) const { return tLeaderTime[leg]; } -void oClass::LeaderInfo::updateComputed(int rt, Type t) { +bool oClass::LeaderInfo::updateComputed(int rt, Type t) { + bool update = false; + switch (t) { case Type::Leg: - if (bestTimeOnLegComputed == 0 || bestTimeOnLegComputed > rt) - bestTimeOnLegComputed = rt; + if (bestTimeOnLegComputed <= 0 || bestTimeOnLegComputed > rt) + bestTimeOnLegComputed = rt, update = true; break; case Type::Total: - if (totalLeaderTimeComputed == 0 || totalLeaderTimeComputed > rt) - totalLeaderTimeComputed = rt; + if (totalLeaderTimeComputed <= 0 || totalLeaderTimeComputed > rt) + totalLeaderTimeComputed = rt, update = true; break; case Type::TotalInput: - if (totalLeaderTimeInputComputed == 0 || totalLeaderTimeInputComputed > rt) - totalLeaderTimeInputComputed = rt; + if (totalLeaderTimeInputComputed <= 0 || totalLeaderTimeInputComputed > rt) + totalLeaderTimeInputComputed = rt, update = true; break; + default: + assert(false); } + return update; +} + +bool oClass::LeaderInfo::update(int rt, Type t) { + bool update = false; + switch (t) { + case Type::Leg: + if (rt >= 0 && (bestTimeOnLeg < 0 || bestTimeOnLeg > rt)) + bestTimeOnLeg = rt, update = true; + break; + + case Type::Total: + if (rt >= 0 && (totalLeaderTime < 0 || totalLeaderTime > rt)) + totalLeaderTime = rt, update = true; + break; + + case Type::TotalInput: + if (rt >= 0 && (totalLeaderTimeInput < 0 || totalLeaderTimeInput > rt)) + totalLeaderTimeInput = rt, update = true; + break; + + case Type::Input: + if (rt >= 0 && (inputTime < 0 || inputTime > rt)) + inputTime = rt, update = true; + break; + default: + assert(false); + } + return update; +} + +void oClass::updateLeaderTimes() const { + resetLeaderTime(); + vector runners; + oe->getRunners(Id, 0, runners, false); + bool needupdate = true; + int leg = 0; + while (needupdate) { + needupdate = false; + for (auto r : runners) { + if (r->tLeg == leg) + r->storeTimes(); + else if (r->tLeg > leg) + needupdate = true; + } + leg++; + } + leaderTimeVersion = oe->dataRevision; } void oClass::LeaderInfo::resetComputed(Type t) { @@ -1908,14 +1964,22 @@ int oClass::LeaderInfo::getLeader(Type t, bool computed) const { return 0; } -int oClass::getBestLegTime(int leg, bool computedTime) const { +int oClass::getBestLegTime(AllowRecompute recompute, int leg, bool computedTime) const { leg = mapLeg(leg); if (unsigned(leg) >= tLeaderTime.size()) return 0; - return getLeaderInfo(leg).getLeader(LeaderInfo::Type::Leg, computedTime); + int bt = getLeaderInfo(recompute, leg).getLeader(LeaderInfo::Type::Leg, computedTime); + if (bt == -1 && recompute == AllowRecompute::Yes) { + updateLeaderTimes(); + bt = tLeaderTime[leg].getInputTime(); + } + return bt; } -int oClass::getBestTimeCourse(int courseId) const { +int oClass::getBestTimeCourse(AllowRecompute recompute, int courseId) const { + if (recompute == AllowRecompute::Yes && leaderTimeVersion != oe->dataRevision) + updateLeaderTimes(); + map::const_iterator res = tBestTimePerCourse.find(courseId); if (res == tBestTimePerCourse.end()) return 0; @@ -1923,24 +1987,40 @@ int oClass::getBestTimeCourse(int courseId) const { return res->second; } -int oClass::getBestInputTime(int leg) const { +int oClass::getBestInputTime(AllowRecompute recompute, int leg) const { leg = mapLeg(leg); if (unsigned(leg)>=tLeaderTime.size()) return 0; - else - return tLeaderTime[leg].inputTime; + else { + int it = getLeaderInfo(recompute, leg).getInputTime(); + if (it == -1 && recompute == AllowRecompute::Yes) { + updateLeaderTimes(); + it = getLeaderInfo(AllowRecompute::No, leg).getInputTime(); + } + return -1; + } } -int oClass::getTotalLegLeaderTime(int leg, bool computedTime, bool includeInput) const { +int oClass::getTotalLegLeaderTime(AllowRecompute recompute, int leg, bool computedTime, bool includeInput) const { leg = mapLeg(leg); - if (unsigned(leg)>=tLeaderTime.size()) + if (unsigned(leg) >= tLeaderTime.size()) return 0; - if (includeInput) - return getLeaderInfo(leg).getLeader(LeaderInfo::Type::TotalInput, computedTime); - else - return getLeaderInfo(leg).getLeader(LeaderInfo::Type::Total, computedTime); + int res = -1; + int iter = -1; + while (res == -1 && ++iter<2) { + if (includeInput) + res = getLeaderInfo(recompute, leg).getLeader(LeaderInfo::Type::TotalInput, computedTime); + else + res = getLeaderInfo(recompute, leg).getLeader(LeaderInfo::Type::Total, computedTime); + + if (res == -1 && recompute == AllowRecompute::Yes) { + recompute = AllowRecompute::No; + updateLeaderTimes(); + } + } + return res; } void oClass::mergeClass(int classIdSec) { @@ -3619,11 +3699,11 @@ oClass::ClassStatus oClass::getClassStatus() const { if (tStatusRevision != oe->dataRevision) { wstring s = getDCI().getString("Status"); if (s == L"I") - tStatus = Invalid; + tStatus = ClassStatus::Invalid; else if (s == L"IR") - tStatus = InvalidRefund; + tStatus = ClassStatus::InvalidRefund; else - tStatus = Normal; + tStatus = ClassStatus::Normal; tStatusRevision = oe->dataRevision; } diff --git a/code/oClass.h b/code/oClass.h index 4249304..a4f1a07 100644 --- a/code/oClass.h +++ b/code/oClass.h @@ -153,7 +153,8 @@ class Table; class oClass : public oBase { public: - enum ClassStatus {Normal, Invalid, InvalidRefund}; + enum class ClassStatus {Normal, Invalid, InvalidRefund}; + enum class AllowRecompute {Yes, No }; static void getSplitMethods(vector< pair > &methods); static void getSeedingMethods(vector< pair > &methods); @@ -168,21 +169,7 @@ protected: //First: best time on leg //Second: Total leader time (total leader) struct LeaderInfo { - LeaderInfo() { - reset(); - } - void reset() { - bestTimeOnLeg = 0; - bestTimeOnLegComputed = 0; - - totalLeaderTime = 0; - totalLeaderTimeComputed = 0; - - inputTime = 0; - totalLeaderTimeInput = 0; - totalLeaderTimeInputComputed = 0; - } - + private: int bestTimeOnLeg; int bestTimeOnLegComputed; // Computed be default result module @@ -193,21 +180,48 @@ protected: int totalLeaderTimeInputComputed; //Team total including input int inputTime; + public: + LeaderInfo() { + reset(); + } + void reset() { + bestTimeOnLeg = -1; + bestTimeOnLegComputed = -1; + + totalLeaderTime = -1; + totalLeaderTimeComputed = -1; + + inputTime = -1; + totalLeaderTimeInput = -1; + totalLeaderTimeInputComputed = -1; + } + enum class Type { Leg, Total, - TotalInput + TotalInput, + Input, }; + + int getInputTime() const { + return inputTime; + } + void resetComputed(Type t); - void updateComputed(int rt, Type t); + + bool update(int rt, Type t); + bool updateComputed(int rt, Type t); int getLeader(Type t, bool computed) const; }; - LeaderInfo &getLeaderInfo(int leg) const; + void updateLeaderTimes() const; + LeaderInfo &getLeaderInfo(AllowRecompute recompute, int leg) const; + + mutable int leaderTimeVersion = -1; mutable vector tLeaderTime; - map tBestTimePerCourse; + mutable map tBestTimePerCourse; int tSplitRevision; map > tSplitAnalysisData; @@ -288,7 +302,7 @@ protected: /** Map to correct leg number for diff class/runner class (for example qual/final)*/ int mapLeg(int inputLeg) const { - if (inputLeg > 0 && legInfo.size() == 1) + if (inputLeg > 0 && legInfo.size() <= 1) return 0; // The case with different class for team/runner. Leg is an index in another class. return inputLeg; } @@ -475,11 +489,11 @@ public: void getStatistics(const set &feeLock, int &entries, int &started) const; - int getBestInputTime(int leg) const; - int getBestLegTime(int leg, bool computedTime) const; - int getBestTimeCourse(int courseId) const; + int getBestInputTime(AllowRecompute recompute, int leg) const; + int getBestLegTime(AllowRecompute recompute, int leg, bool computedTime) const; + int getBestTimeCourse(AllowRecompute recompute, int courseId) const; - int getTotalLegLeaderTime(int leg, bool computedTime, bool includeInput) const; + int getTotalLegLeaderTime(AllowRecompute recompute, int leg, bool computedTime, bool includeInput) const; wstring getInfo() const; // Returns true if the class has a pool of courses @@ -491,7 +505,8 @@ public: // Update changed course pool void updateChangedCoursePool(); - void resetLeaderTime(); + /** Reset cache of leader times */ + void resetLeaderTime() const; ClassType getClassType() const; diff --git a/code/oClub.cpp b/code/oClub.cpp index b4e1e22..b2e9d46 100644 --- a/code/oClub.cpp +++ b/code/oClub.cpp @@ -540,7 +540,7 @@ void oClub::addRunnerInvoiceLine(const pRunner r, bool inTeam, if (res != definedPayModes.end()) payMode = ", " + res->second; */ - if (r->getClassRef(false) && r->getClassRef(false)->getClassStatus() == oClass::InvalidRefund) { + if (r->getClassRef(false) && r->getClassRef(false)->getClassStatus() == oClass::ClassStatus::InvalidRefund) { fee = 0; card = 0; } @@ -587,7 +587,7 @@ void oClub::addTeamInvoiceLine(const pTeam t, const map &definedPa } - if (t->getClassRef(false) && t->getClassRef(false)->getClassStatus() == oClass::InvalidRefund) { + if (t->getClassRef(false) && t->getClassRef(false)->getClassStatus() == oClass::ClassStatus::InvalidRefund) { fee = 0; } @@ -1013,7 +1013,7 @@ void oEvent::setupClubInfoData() { int id = r.Club->Id; ++runners[id]; oDataConstInterface di = r.getDCI(); - bool skip = r.Class && r.Class->getClassStatus() == oClass::InvalidRefund; + bool skip = r.Class && r.Class->getClassStatus() == oClass::ClassStatus::InvalidRefund; if (!skip) { int cardFee = di.getInt("CardFee"); @@ -1033,7 +1033,7 @@ void oEvent::setupClubInfoData() { if (t.Club) { int id = t.Club->Id; oDataConstInterface di = t.getDCI(); - bool skip = t.Class && t.Class->getClassStatus() == oClass::InvalidRefund; + bool skip = t.Class && t.Class->getClassStatus() == oClass::ClassStatus::InvalidRefund; if (!skip) { fee[id] += di.getInt("Fee"); diff --git a/code/oEvent.cpp b/code/oEvent.cpp index e9f376e..12a1205 100644 --- a/code/oEvent.cpp +++ b/code/oEvent.cpp @@ -485,7 +485,7 @@ oEvent::oEvent(gdioutput &gdi):oBase(0), gdibase(gdi) oClassData->addVariableInt("Unordered", oDataContainer::oIS8U, "Oordnade parallella"); oClassData->addVariableInt("Heat", oDataContainer::oIS8U, "Heat"); oClassData->addVariableInt("Locked", oDataContainer::oIS8U, "Låst gaffling", make_shared("Locked")); - oClassData->addVariableString("Qualification", "Kvalschema"); + oClassData->addVariableString("Qualification", "Kvalschema", make_shared()); oClassData->addVariableInt("NumberMaps", oDataContainer::oIS16, "Kartor"); oClassData->addVariableString("Result", 24, "Result module", make_shared()); oClassData->addVariableInt("TransferFlags", oDataContainer::oIS32, "Överföring", make_shared()); @@ -541,7 +541,6 @@ oEvent::~oEvent() } void oEvent::initProperties() { - setProperty("TextSize", getPropertyString("TextSize", L"0")); setProperty("Language", getPropertyString("Language", L"103")); setProperty("Interactive", getPropertyString("Interactive", L"1")); @@ -1532,7 +1531,6 @@ pRunner oEvent::dbLookUpByName(const wstring &name, int clubId, int classId, int if (dbr) { sRunner.init(*dbr, false); - sRunner.setExtIdentifier(int(dbr->getExtId())); return &sRunner; } @@ -1561,15 +1559,15 @@ bool oEvent::saveRunnerDatabase(const wchar_t *filename, bool onlyLocal) void oEvent::updateRunnerDatabase() { - if (Name==L"!TESTTÄVLING") + if (Name == L"!TESTTÄVLING") return; if (useRunnerDb()) { oRunnerList::iterator it; map clubIdMap; - for (it=Runners.begin(); it != Runners.end(); ++it){ + for (it = Runners.begin(); it != Runners.end(); ++it) { if (it->Card && it->Card->cardNo == it->cardNumber && - it->getDI().getInt("CardFee")==0 && it->Card->getNumPunches()>5) + it->getDI().getInt("CardFee") == 0 && it->Card->getNumPunches() > 5) updateRunnerDatabase(&*it, clubIdMap); } runnerDB->refreshTables(); @@ -1585,6 +1583,16 @@ void oEvent::updateRunnerDatabase() ml.save(file, this); } } + }vector>> freeMod; + listContainer->getFreeResultModules(freeMod); + + for (size_t k = 0; k < freeMod.size(); k++) { + wstring uid = gdibase.widen(freeMod[k].first) + L".rules"; + wchar_t file[260]; + getUserFile(file, uid.c_str()); + if (!fileExist(file)) { + freeMod[k].second->save(file); + } } } } @@ -3755,6 +3763,9 @@ void oEvent::reEvaluateCourse(int CourseId, bool doSync) void oEvent::reEvaluateAll(const set &cls, bool doSync) { + if (disableRecalculate) + return; + if (doSync) autoSynchronizeLists(false); @@ -3776,12 +3787,23 @@ void oEvent::reEvaluateAll(const set &cls, bool doSync) } oRunnerList::iterator it; - for (it=Runners.begin(); it != Runners.end(); ++it) { - if (!cls.empty() && cls.count(it->getClassId(true)) == 0) - continue; + if (cls.size() < 5) { + vector runners; + getRunners(cls, runners); + for (pRunner it : runners) { + if (!it->tInTeam || it->Class != it->tInTeam->Class || (it->Class && it->Class->isQualificationFinalBaseClass())) { + it->apply(ChangeType::Quiet, nullptr); + } + } + } + else { + for (it = Runners.begin(); it != Runners.end(); ++it) { + if (!cls.empty() && cls.count(it->getClassId(true)) == 0) + continue; - if (!it->tInTeam || it->Class != it->tInTeam->Class || (it->Class && it->Class->isQualificationFinalBaseClass())) { - it->apply(ChangeType::Quiet, nullptr); + if (!it->tInTeam || it->Class != it->tInTeam->Class || (it->Class && it->Class->isQualificationFinalBaseClass())) { + it->apply(ChangeType::Quiet, nullptr); + } } } @@ -3942,6 +3964,20 @@ void oEvent::reCalculateLeaderTimes(int classId) { if (disableRecalculate) return; + + if (classId) { + pClass cls = getClass(classId); + if (cls) + cls->resetLeaderTime(); + } + else { + for (auto &c : Classes) { + if (!c.isRemoved()) + c.resetLeaderTime(); + } + } + + /* #ifdef _DEBUG wchar_t bf[128]; swprintf_s(bf, L"Calculate leader times %d\n", classId); @@ -3964,7 +4000,7 @@ void oEvent::reCalculateLeaderTimes(int classId) } } leg++; - } + }*/ } @@ -5678,7 +5714,7 @@ void oEvent::sanityCheck(gdioutput &gdi, bool expectResult, int onlyThisClass) { for (oClassList::iterator it = Classes.begin(); it != Classes.end(); ++it) { if (it->isRemoved()) continue; - if (it->getClassStatus() != oClass::Normal) + if (it->getClassStatus() != oClass::ClassStatus::Normal) continue; if (onlyThisClass > 0 && it->getId() != onlyThisClass) diff --git a/code/oEventResult.cpp b/code/oEventResult.cpp index bdbdd67..b5d2ca9 100644 --- a/code/oEventResult.cpp +++ b/code/oEventResult.cpp @@ -70,7 +70,7 @@ template void calculatePlace(vectorgetClassRef(true); useResults = true;// cls ? cls->getNoTiming() == false : true; - invalidClass = cls ? cls->getClassStatus() != oClass::Normal : false; + invalidClass = cls ? cls->getClassStatus() != oClass::ClassStatus::Normal : false; } if (invalidClass) { @@ -151,10 +151,10 @@ void oEvent::calculateSplitResults(int controlIdFrom, int controlIdTo) { cTime=it->tempRT; - it->tPlace.update(*this, vPlace); // XXX User other result container + it->tPlace.update(*this, vPlace, false); // XXX User other result container } else - it->tPlace.update(*this, 0); + it->tPlace.update(*this, 0, false); } } @@ -263,7 +263,7 @@ void oEvent::calculateResults(const set &classes, ResultType resultType, bo for (auto &cls : Classes) { if (!cls.isRemoved() && (all || classes.count(cls.getId()))) { for (unsigned leg = 0; leg < cls.getNumStages(); leg++) - cls.getLeaderInfo(leg).resetComputed(oClass::LeaderInfo::Type::Leg); + cls.getLeaderInfo(oClass::AllowRecompute::No,leg).resetComputed(oClass::LeaderInfo::Type::Leg); } } @@ -288,13 +288,12 @@ void oEvent::calculateResults(const set &classes, ResultType resultType, bo ge->calculateIndividualResults(resCalc.second, true, oListInfo::ResultType::Classwise, false, 0); for (pRunner r : resCalc.second) { - r->tComputedTime = r->getTempResult().getRunningTime(); - r->tComputedPoints = r->getTempResult().getPoints(); - r->tComputedStatus = r->getTempResult().getStatus(); - r->tPlace.update(*oe, r->getTempResult().getPlace()); + r->updateComputedResultFromTemp(); + r->tPlace.update(*oe, r->getTempResult().getPlace(), false); if (r->tComputedStatus == StatusOK && r->tComputedTime>0) { pClass cls = r->getClassRef(true); - cls->getLeaderInfo(cls->mapLeg(r->getLegNumber())).updateComputed(r->tComputedTime, oClass::LeaderInfo::Type::Leg); + cls->getLeaderInfo(oClass::AllowRecompute::No, + cls->mapLeg(r->getLegNumber())).updateComputed(r->tComputedTime, oClass::LeaderInfo::Type::Leg); } } } @@ -367,14 +366,16 @@ void oEvent::calculateRunnerResults(ResultType resultType, resData.emplace_back(groupId, score, it); } + bool useStdResultCtr = resultType == ResultType::ClassResultDefault || resultType == ResultType::TotalResultDefault; + if (courseResults) - calculatePlace(resData, [this](DT &res, int value) {res.dst->tCoursePlace.update(*this, value); }); + calculatePlace(resData, [this, useStdResultCtr](DT &res, int value) {res.dst->tCoursePlace.update(*this, value, useStdResultCtr); }); else if (classCourseResults) - calculatePlace(resData, [this](DT &res, int value) {res.dst->tCourseClassPlace.update(*this, value); }); + calculatePlace(resData, [this, useStdResultCtr](DT &res, int value) {res.dst->tCourseClassPlace.update(*this, value, useStdResultCtr); }); else if (totalResults) - calculatePlace(resData, [this](DT &res, int value) {res.dst->tTotalPlace.update(*this, value); }); + calculatePlace(resData, [this, useStdResultCtr](DT &res, int value) {res.dst->tTotalPlace.update(*this, value, useStdResultCtr); }); else - calculatePlace(resData, [this](DT &res, int value) {res.dst->tPlace.update(*this, value); }); + calculatePlace(resData, [this, useStdResultCtr](DT &res, int value) {res.dst->tPlace.update(*this, value, useStdResultCtr); }); } bool oEvent::calculateTeamResults(vector &teams, int leg, ResultType resType) { @@ -405,7 +406,7 @@ bool oEvent::calculateTeamResults(vector &teams, int leg, ResultTy cPlace = 0; vPlace = 0; cTime = 0; - invalidClass = it->Class->getClassStatus() != oClass::Normal; + invalidClass = it->Class->getClassStatus() != oClass::ClassStatus::Normal; } int sleg; @@ -435,11 +436,13 @@ bool oEvent::calculateTeamResults(vector &teams, int leg, ResultTy p = 0; } - if (resType == ResultType::TotalResult) - it->getTeamPlace(sleg).totalP.update(*this, p); + bool tmpDefaultResult = resType == ResultType::ClassResultDefault || resType == ResultType::TotalResultDefault; + if (resType == ResultType::TotalResult || resType == ResultType::TotalResultDefault) { + it->getTeamPlace(sleg).totalP.update(*this, p, tmpDefaultResult); + } else { - it->getTeamPlace(sleg).p.update(*this, p); - res.version = dataRevision; + it->getTeamPlace(sleg).p.update(*this, p, tmpDefaultResult); + res.version = tmpDefaultResult ? -1 : dataRevision; res.status = it->_cachedStatus; res.time = it->_sortTime; it->setComputedResult(sleg, res); @@ -560,8 +563,8 @@ void oEvent::calculateModuleTeamResults(const set &cls, vector &te if (c->isRogaining()) rgClasses.insert(id); for (unsigned leg = 0; leg < c->getNumStages(); leg++) { - c->getLeaderInfo(leg).resetComputed(oClass::LeaderInfo::Type::Total); - c->getLeaderInfo(leg).resetComputed(oClass::LeaderInfo::Type::TotalInput); + c->getLeaderInfo(oClass::AllowRecompute::No, leg).resetComputed(oClass::LeaderInfo::Type::Total); + c->getLeaderInfo(oClass::AllowRecompute::No, leg).resetComputed(oClass::LeaderInfo::Type::TotalInput); } cls2Mod[c->Id] = c->getResultModuleTag(); @@ -605,8 +608,8 @@ void oEvent::calculateModuleTeamResults(const set &cls, vector &te resData.emplace_back(clsId, totScore, t); for (int i = 0; i < t->getNumRunners(); i++) { - t->getTeamPlace(i).p.update(*this, t->getTempResult().getPlace()); - t->getTeamPlace(i).totalP.update(*this, t->getTempResult().getPlace()); + t->getTeamPlace(i).p.update(*this, t->getTempResult().getPlace(), false); + t->getTeamPlace(i).totalP.update(*this, t->getTempResult().getPlace(), false); oTeam::ComputedLegResult res; res.version = dataRevision; int legTime = 0; @@ -624,7 +627,7 @@ void oEvent::calculateModuleTeamResults(const set &cls, vector &te else if (lt != LTIgnore && lt != LTExtra) timePar = res.time; - teamClass->getLeaderInfo(i).updateComputed(res.time, oClass::LeaderInfo::Type::Leg); + teamClass->getLeaderInfo(oClass::AllowRecompute::No, i).updateComputed(res.time, oClass::LeaderInfo::Type::Leg); } else { ok = false; @@ -635,8 +638,8 @@ void oEvent::calculateModuleTeamResults(const set &cls, vector &te legTime = t->tComputedTime; else legTime = timeAcc + timePar; - teamClass->getLeaderInfo(i).updateComputed(legTime, oClass::LeaderInfo::Type::Total); - teamClass->getLeaderInfo(i).updateComputed(t->getInputTime() + legTime, oClass::LeaderInfo::Type::TotalInput); + teamClass->getLeaderInfo(oClass::AllowRecompute::No, i).updateComputed(legTime, oClass::LeaderInfo::Type::Total); + teamClass->getLeaderInfo(oClass::AllowRecompute::No, i).updateComputed(t->getInputTime() + legTime, oClass::LeaderInfo::Type::TotalInput); } auto ltNext = teamClass->getLegType(i + 1); @@ -680,13 +683,13 @@ void oEvent::calculateModuleTeamResults(const set &cls, vector &te } calculatePlace(legResultsData, [this](DR &res, int value) { - res.dst->tPlace.update(*this, value); - res.dst->tTotalPlace.update(*this, value); }); + res.dst->tPlace.update(*this, value, false); + res.dst->tTotalPlace.update(*this, value, false); }); // Calculate and store total result calculatePlace(resData, [this](DT &res, int value) { for (int i = 0; i < res.dst->getNumRunners(); i++) { - res.dst->getTeamPlace(i).totalP.update(*this, value); + res.dst->getTeamPlace(i).totalP.update(*this, value, false); }}); } } diff --git a/code/oListInfo.cpp b/code/oListInfo.cpp index 0e7a884..1561786 100644 --- a/code/oListInfo.cpp +++ b/code/oListInfo.cpp @@ -636,7 +636,7 @@ const wstring &oEvent::formatPunchStringAux(const oPrintPost &pp, const oListPar const wstring *wsptr = 0; bfw[0] = 0; pClass pc = r ? r->getClassRef(true) : 0; - bool invalidClass = pc && pc->getClassStatus() != oClass::Normal; + bool invalidClass = pc && pc->getClassStatus() != oClass::ClassStatus::Normal; oCounter counter(counterIn); static bool reentrantLock = false; @@ -1014,7 +1014,7 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara auto noTimingTeam = [&]() { return (pc ? pc->getNoTiming() : false) || (t ? t->getStatusComputed() == StatusNoTiming : false); }; - bool invalidClass = pc && pc->getClassStatus() != oClass::Normal; + bool invalidClass = pc && pc->getClassStatus() != oClass::ClassStatus::Normal; int legIndex = pp.legIndex; if(pc && pp.type != lResultModuleNumber && pp.type != lResultModuleNumberTeam && pp.type != lResultModuleTime && pp.type != lResultModuleTimeTeam) @@ -1363,7 +1363,7 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara int tleg = r->tLeg >= 0 ? r->tLeg:0; if (r->getTotalStatus()==StatusOK) { if ( (t && t->getNumShortening(tleg) == 0) || (!t && r->getNumShortening() == 0)) { - int after = r->getTotalRunningTime() - pc->getTotalLegLeaderTime(tleg, true, true); + int after = r->getTotalRunningTime() - pc->getTotalLegLeaderTime(oClass::AllowRecompute::Yes, tleg, true, true); if (after > 0) swprintf_s(wbf, L"+%d:%02d", after/60, after%60); } @@ -1376,7 +1376,7 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara int tleg=r->tLeg>=0 ? r->tLeg:0; if (r->tStatus==StatusOK && pc && !noTimingRunner()) { if (r->getNumShortening() == 0) { - int after = r->getRunningTime(true) - pc->getBestLegTime(tleg, true); + int after = r->getRunningTime(true) - pc->getBestLegTime(oClass::AllowRecompute::Yes, tleg, true); if (after > 0) swprintf_s(wbf, L"+%d:%02d", after/60, after%60); } @@ -1528,8 +1528,8 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara if (r && pc && !invalidClass) { int tleg = r->tLeg >= 0 ? r->tLeg:0; if (r->getTotalStatus() == StatusOK && pc && !noTimingRunner()) { - int after = r->getTotalRunningTime() - pc->getTotalLegLeaderTime(tleg, true, true); - int afterOld = r->inputTime - pc->getBestInputTime(tleg); + int after = r->getTotalRunningTime() - pc->getTotalLegLeaderTime(oClass::AllowRecompute::Yes, tleg, true, true); + int afterOld = r->inputTime - pc->getBestInputTime(oClass::AllowRecompute::Yes, tleg); int ad = after - afterOld; if (ad > 0) swprintf_s(wbf, L"+%d:%02d", ad / 60, ad % 60); @@ -1600,7 +1600,7 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara int after = 0; if (pp.resultModuleIndex == -1) { int tleg=r->tLeg>=0 ? r->tLeg:0; - int brt = pc->getBestLegTime(tleg, true); + int brt = pc->getBestLegTime(oClass::AllowRecompute::Yes, tleg, true); if (r->prelStatusOK(true, true) && brt > 0) { after=r->getRunningTime(true) - brt; } @@ -1623,7 +1623,7 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara int tleg = r->tLeg >= 0 ? r->tLeg:0; if (r->getTotalStatus()==StatusOK && pc && !noTimingRunner()) { if ( (t && t->getNumShortening(tleg) == 0) || (!t && r->getNumShortening() == 0)) { - int after = r->getTotalRunningTime() - pc->getTotalLegLeaderTime(tleg, true, true); + int after = r->getTotalRunningTime() - pc->getTotalLegLeaderTime(oClass::AllowRecompute::Yes, tleg, true, true); if (after > 0) swprintf_s(wbf, L"+%d:%02d", after/60, after%60); } @@ -1637,7 +1637,7 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara if (r && pc && !invalidClass) { pCourse crs = r->getCourse(false); if (crs && r->tStatus==StatusOK && !noTimingRunner()) { - int after = r->getRunningTime(true) - pc->getBestTimeCourse(crs->getId()); + int after = r->getRunningTime(true) - pc->getBestTimeCourse(oClass::AllowRecompute::Yes, crs->getId()); if (after > 0) swprintf_s(wbf, L"+%d:%02d", after/60, after%60); } @@ -1836,7 +1836,7 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara break; case lTeamGrossTime: if (t && !invalidClass) { - int tm = t->getLegRunningTimeUnadjusted(legIndex, false); + int tm = t->getLegRunningTimeUnadjusted(legIndex, false, false); wsptr = &formatTime(tm); } break; @@ -2050,7 +2050,7 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara if (t && pc && !invalidClass) { int tleg = t->getNumRunners() - 1; if (t->getTotalStatus()==StatusOK && pc && !noTimingTeam()) { - int after = t->getTotalRunningTime() - pc->getTotalLegLeaderTime(tleg, true, true); + int after = t->getTotalRunningTime() - pc->getTotalLegLeaderTime(oClass::AllowRecompute::Yes, tleg, true, true); if (after > 0) swprintf_s(wbf, L"+%d:%02d", after/60, after%60); } @@ -2060,8 +2060,8 @@ const wstring &oEvent::formatListStringAux(const oPrintPost &pp, const oListPara if (t && pc && !invalidClass) { int tleg = t->getNumRunners() - 1; if (t->getTotalStatus()==StatusOK && pc && !noTimingTeam()) { - int after = t->getTotalRunningTime() - pc->getTotalLegLeaderTime(tleg, true, true); - int afterOld = t->inputTime - pc->getBestInputTime(tleg); + int after = t->getTotalRunningTime() - pc->getTotalLegLeaderTime(oClass::AllowRecompute::Yes, tleg, true, true); + int afterOld = t->inputTime - pc->getBestInputTime(oClass::AllowRecompute::Yes, tleg); int ad = after - afterOld; if (ad > 0) swprintf_s(wbf, L"+%d:%02d", ad/60, ad%60); diff --git a/code/oRunner.cpp b/code/oRunner.cpp index 9fe2730..65b710f 100644 --- a/code/oRunner.cpp +++ b/code/oRunner.cpp @@ -54,9 +54,27 @@ bool oAbstractRunner::DynamicValue::isOld(const oEvent &oe) const { return oe.dataRevision != dataRevision; } -void oAbstractRunner::DynamicValue::update(const oEvent &oe, int v) { - value = v; - dataRevision = oe.dataRevision; +oAbstractRunner::DynamicValue &oAbstractRunner::DynamicValue::update(const oEvent &oe, int v, bool preferStd) { + if (preferStd) + valueStd = v; // A temporary result for "default" when computing with result modules (internal calculation) + else { + value = v; + dataRevision = oe.dataRevision; + } + return *this; +} + +int oAbstractRunner::DynamicValue::get(bool preferStd) const { + if (preferStd && valueStd >= 0) + return valueStd; + + return value; +} + +void oAbstractRunner::DynamicValue::reset() { + value = -1; + valueStd = -1; + dataRevision = -1; } const wstring &oAbstractRunner::encodeStatus(RunnerStatus st, bool allowError) { @@ -1611,19 +1629,19 @@ bool oRunner::evaluateCard(bool doApply, vector & MissingPunches, if (clz && changeType == ChangeType::Update) { bool update = false; if (tInTeam) { - int t1 = clz->getTotalLegLeaderTime(tLeg, false, false); + int t1 = clz->getTotalLegLeaderTime(oClass::AllowRecompute::No, tLeg, false, false); int t2 = tInTeam->getLegRunningTime(tLeg, false, false); if (t2<=t1 && t2>0) update = true; - int t3 = clz->getTotalLegLeaderTime(tLeg, false, true); + int t3 = clz->getTotalLegLeaderTime(oClass::AllowRecompute::No, tLeg, false, true); int t4 = tInTeam->getLegRunningTime(tLeg, false, true); if (t4<=t3 && t4>0) update = true; } if (!update) { - int t1 = clz->getBestLegTime(tLeg, false); + int t1 = clz->getBestLegTime(oClass::AllowRecompute::No, tLeg, false); int t2 = getRunningTime(false); if (t2<=t1 && t2>0) update = true; @@ -1741,17 +1759,27 @@ bool oRunner::storeTimesAux(pClass targetClass) { for (int leg = firstLeg; legtLeaderTime[leg].bestTimeOnLeg; + //int &bt=targetClass->tLeaderTime[leg].bestTimeOnLeg; int rt=getRunningTime(false); - if (rt > 0 && (bt == 0 || rt < bt)) { + if (targetClass->tLeaderTime[leg].update(rt, oClass::LeaderInfo::Type::Leg)) + updated = true; + /*if (rt > 0 && (bt == 0 || rt < bt)) { bt=rt; updated = true; - } + }*/ + } + + if (getStatusComputed() == StatusOK) { + int rt = getRunningTime(true); + if (targetClass->tLeaderTime[leg].updateComputed(rt, oClass::LeaderInfo::Type::Leg)) + updated = true; } } bool updateTotal = true; bool updateTotalInput = true; + bool updateTotalC = true; + bool updateTotalInputC = true; int basePLeg = firstLeg; while (basePLeg > 0 && targetClass->legInfo[basePLeg].isParallel()) @@ -1761,6 +1789,9 @@ bool oRunner::storeTimesAux(pClass targetClass) { while (ix < nleg && (ix == basePLeg || targetClass->legInfo[ix].isParallel()) ) { updateTotal = updateTotal && tInTeam->getLegStatus(ix, false, false)==StatusOK; updateTotalInput = updateTotalInput && tInTeam->getLegStatus(ix, false, true)==StatusOK; + + updateTotalC = updateTotalC && tInTeam->getLegStatus(ix, true, false) == StatusOK; + updateTotalInputC = updateTotalInputC && tInTeam->getLegStatus(ix, true, true) == StatusOK; ix++; } @@ -1773,11 +1804,25 @@ bool oRunner::storeTimesAux(pClass targetClass) { } for (int leg = firstLeg; legtLeaderTime[leg].totalLeaderTime; + /*int &bt=targetClass->tLeaderTime[leg].totalLeaderTime; if (rt > 0 && (bt == 0 || rt < bt)) { bt=rt; updated = true; - } + }*/ + if (targetClass->tLeaderTime[leg].update(rt, oClass::LeaderInfo::Type::Total)) + updated = true; + } + } + if (updateTotalC) { + int rt = 0; + int ix = basePLeg; + while (ix < nleg && (ix == basePLeg || targetClass->legInfo[ix].isParallel())) { + rt = max(rt, tInTeam->getLegRunningTime(ix, true, false)); + ix++; + } + for (int leg = firstLeg; legtLeaderTime[leg].updateComputed(rt, oClass::LeaderInfo::Type::Total)) + updated = true; } } if (updateTotalInput) { @@ -1789,11 +1834,25 @@ bool oRunner::storeTimesAux(pClass targetClass) { ix++; } for (int leg = firstLeg; legtLeaderTime[leg].totalLeaderTimeInput; - if (rt > 0 && (bt == 0 || rt < bt)) { + /*int &bt=targetClass->tLeaderTime[leg].totalLeaderTimeInput; + if (rt > 0 && (bt <= 0 || rt < bt)) { bt=rt; updated = true; - } + }*/ + if (targetClass->tLeaderTime[leg].update(rt, oClass::LeaderInfo::Type::TotalInput)) + updated = true; + } + } + if (updateTotalInputC) { + int rt = 0; + int ix = basePLeg; + while (ix < nleg && (ix == basePLeg || targetClass->legInfo[ix].isParallel())) { + rt = max(rt, tInTeam->getLegRunningTime(ix, true, true)); + ix++; + } + for (int leg = firstLeg; legtLeaderTime[leg].updateComputed(rt, oClass::LeaderInfo::Type::TotalInput)) + updated = true; } } } @@ -1802,35 +1861,56 @@ bool oRunner::storeTimesAux(pClass targetClass) { size_t dupLeg = targetClass->mapLeg(tDuplicateLeg); if (targetClass && dupLeg < targetClass->tLeaderTime.size()) { if (tStatus == StatusOK) { - int &bt = targetClass->tLeaderTime[dupLeg].bestTimeOnLeg; int rt = getRunningTime(false); - if (rt > 0 && (bt == 0 || rt < bt)) { + /*int &bt = targetClass->tLeaderTime[dupLeg].bestTimeOnLeg; + if (rt > 0 && (bt <= 0 || rt < bt)) { bt = rt; updated = true; - } + }*/ + if (targetClass->tLeaderTime[dupLeg].update(rt, oClass::LeaderInfo::Type::Leg)) + updated = true; + + } - int &bt = targetClass->tLeaderTime[dupLeg].totalLeaderTime; - int rt = getRaceRunningTime(dupLeg); - if (rt > 0 && (bt == 0 || rt < bt)) { + if (getStatusComputed() == StatusOK) { + int rt = getRunningTime(true); + if (targetClass->tLeaderTime[dupLeg].updateComputed(rt, oClass::LeaderInfo::Type::Leg)) + updated = true; + } + + int rt = getRaceRunningTime(false, dupLeg); + if (targetClass->tLeaderTime[dupLeg].update(rt, oClass::LeaderInfo::Type::Total)) + updated = true; + + rt = getRaceRunningTime(true, dupLeg); + if (targetClass->tLeaderTime[dupLeg].updateComputed(rt, oClass::LeaderInfo::Type::Total)) + updated = true; + + /*int &bt = targetClass->tLeaderTime[dupLeg].totalLeaderTime; + if (rt > 0 && (bt <= 0 || rt < bt)) { bt = rt; updated = true; targetClass->tLeaderTime[dupLeg].totalLeaderTimeInput = rt; - } + }*/ } } size_t mappedLeg = targetClass->mapLeg(tLeg); // Best input time if (mappedLegtLeaderTime.size()) { - int &it = targetClass->tLeaderTime[mappedLeg].inputTime; - if (inputTime > 0 && inputStatus == StatusOK && (it == 0 || inputTime < it) ) { + /*int &it = targetClass->tLeaderTime[mappedLeg].inputTime; + if (inputTime > 0 && inputStatus == StatusOK && (it <= 0 || inputTime < it) ) { it = inputTime; updated = true; + }*/ + if (inputStatus == StatusOK) { + if (targetClass->tLeaderTime[mappedLeg].update(inputTime, oClass::LeaderInfo::Type::Input)) + updated = true; } } if (targetClass && tStatus==StatusOK) { - int rt = getRunningTime(false); + int rt = getRunningTime(true); pCourse pCrs = getCourse(false); if (pCrs && rt > 0) { map::iterator res = targetClass->tBestTimePerCourse.find(pCrs->getId()); @@ -1847,17 +1927,16 @@ bool oRunner::storeTimesAux(pClass targetClass) { return updated; } -int oRunner::getRaceRunningTime(int leg) const -{ +int oRunner::getRaceRunningTime(bool computedTime, int leg) const { if (tParentRunner) - return tParentRunner->getRaceRunningTime(leg); + return tParentRunner->getRaceRunningTime(computedTime, leg); - if (leg==-1) - leg=multiRunner.size()-1; + if (leg == -1) + leg = multiRunner.size() - 1; - if (leg==0) { + if (leg == 0) { /// XXX This code is buggy if (getTotalStatus() == StatusOK) - return getRunningTime(false) + inputTime; + return getRunningTime(computedTime) + inputTime; else return 0; } leg--; @@ -1870,23 +1949,24 @@ int oRunner::getRaceRunningTime(int leg) const switch(lt) { case LTNormal: - if (r->statusOK(false)) { - int dt=leg>0 ? r->getRaceRunningTime(leg)+r->getRunningTime(false):0; + if (r->statusOK(computedTime)) { + int dt=leg>0 ? r->getRaceRunningTime(computedTime, leg)+r->getRunningTime(computedTime):0; return max(r->getFinishTime()-tStartTime, dt); // ### Luckor, jaktstart??? } else return 0; break; case LTSum: - if (r->statusOK(false)) - return r->getRunningTime(false)+getRaceRunningTime(leg); + if (r->statusOK(computedTime)) + return r->getRunningTime(computedTime)+getRaceRunningTime(computedTime, leg); else return 0; default: return 0; } } - else return getRunningTime(false); + else + return getRunningTime(computedTime); } return 0; } @@ -1915,7 +1995,7 @@ bool oRunner::operator<(const oRunner &c) const { const oClass * cClass = c.getClassRef(true); if (!myClass || !cClass) return size_t(myClass) < size_t(cClass); - else if (Class == cClass && Class->getClassStatus() != oClass::Normal) + else if (Class == cClass && Class->getClassStatus() != oClass::ClassStatus::Normal) return CompareString(LOCALE_USER_DEFAULT, 0, tRealName.c_str(), tRealName.length(), c.tRealName.c_str(), c.tRealName.length()) == CSTR_LESS_THAN; @@ -2416,14 +2496,14 @@ void oRunner::updateStartNo(int no) { } } -int oRunner::getPlace() const { - if (tPlace.isOld(*oe)) { +int oRunner::getPlace(bool allowUpdate) const { + if (allowUpdate && tPlace.isOld(*oe)) { if (Class) { oEvent::ResultType rt = oEvent::ResultType::ClassResult; oe->calculateResults({ getClassId(true) }, rt, false); } } - return tPlace.value; + return tPlace.get(!allowUpdate); } int oRunner::getCoursePlace(bool perClass) const { @@ -2432,7 +2512,7 @@ int oRunner::getCoursePlace(bool perClass) const { oEvent::ResultType rt = oEvent::ResultType::ClassCourseResult; oe->calculateResults({ getClassId(true) }, rt, false); } - return tCourseClassPlace.value; + return tCourseClassPlace.get(false); } else { @@ -2440,20 +2520,19 @@ int oRunner::getCoursePlace(bool perClass) const { oEvent::ResultType rt = oEvent::ResultType::CourseResult; oe->calculateResults({ getClassId(true) }, rt, false); } - return tCoursePlace.value; + return tCoursePlace.get(false); } } -int oRunner::getTotalPlace() const -{ +int oRunner::getTotalPlace(bool allowUpdate) const { if (tInTeam) - return tInTeam->getLegPlace(getParResultLeg(), true); + return tInTeam->getLegPlace(getParResultLeg(), true, allowUpdate); else { - if (tTotalPlace.isOld(*oe) && Class) { + if (allowUpdate && tTotalPlace.isOld(*oe) && Class) { oEvent::ResultType rt = oEvent::ResultType::TotalResult; oe->calculateResults({ getClassId(true) }, rt, false); } - return tTotalPlace.value; + return tTotalPlace.get(!allowUpdate); } } @@ -3489,7 +3568,8 @@ void oRunner::apply(ChangeType changeType, pRunner src) { if (st == STTime) { pCourse crs = getCourse(false); int startType = crs ? crs->getStartPunchType() : oPunch::PunchStart; - if (!Card || Card->getPunchByType(startType) == 0 || !pc->hasFreeStart()) { + bool hasStartPunch = Card && Card->getPunchByType(startType) != nullptr; + if (!hasStartPunch || pc->ignoreStartPunch()) { setStartTime(pc->getStartData(tDuplicateLeg), false, changeType); tUseStartPunch = false; } @@ -3514,8 +3594,8 @@ void oRunner::apply(ChangeType changeType, pRunner src) { int lastStart = 0; if (r && r->FinishTime > 0 && r->statusOK(false)) { - int rt = r->getRaceRunningTime(tDuplicateLeg - 1); - int timeAfter = rt - pc->getTotalLegLeaderTime(r->tDuplicateLeg, false, true); + int rt = r->getRaceRunningTime(false, tDuplicateLeg - 1); + int timeAfter = rt - pc->getTotalLegLeaderTime(oClass::AllowRecompute::No, r->tDuplicateLeg, false, true); if (rt > 0 && timeAfter >= 0) lastStart = pc->getStartData(tDuplicateLeg) + timeAfter; } @@ -4282,12 +4362,12 @@ int oRunner::getTimeAfter(int leg) const if (!Class || Class->tLeaderTime.size()<=unsigned(leg)) return -1; - int t=getRaceRunningTime(leg); + int t=getRaceRunningTime(true, leg); if (t<=0) return -1; - return t-Class->getTotalLegLeaderTime(leg, true, true); + return t-Class->getTotalLegLeaderTime(oClass::AllowRecompute::Yes, leg, true, true); } int oRunner::getTimeAfter() const { @@ -4305,7 +4385,7 @@ int oRunner::getTimeAfter() const { if (t<=0) return -1; - return t - Class->getBestLegTime(leg, true); + return t - Class->getBestLegTime(oClass::AllowRecompute::Yes, leg, true); } int oRunner::getTimeAfterCourse() const @@ -4322,7 +4402,7 @@ int oRunner::getTimeAfterCourse() const if (t<=0) return -1; - int bt = Class->getBestTimeCourse(crs->getId()); + int bt = Class->getBestTimeCourse(oClass::AllowRecompute::Yes, crs->getId()); if (bt <= 0) return -1; @@ -5882,7 +5962,7 @@ void oRunner::setInputData(const oRunner &r) { inputStatus = r.tInTeam->getTotalStatus(); } inputPoints = r.getRogainingPoints(true, true); - inputPlace = r.tTotalPlace.value; + inputPlace = r.tTotalPlace.get(false); } else { // Copy input @@ -6212,6 +6292,12 @@ void oAbstractRunner::setTempResultZero(const TempResult &tr) { tmpResult = tr; } +void oAbstractRunner::updateComputedResultFromTemp() { + tComputedTime = tmpResult.getRunningTime(); + tComputedPoints = tmpResult.getPoints(); + tComputedStatus = tmpResult.getStatus(); +} + const wstring &oAbstractRunner::TempResult::getStatusS(RunnerStatus inputStatus) const { if (inputStatus == StatusOK) return oEvent::formatStatus(getStatus(), true); @@ -6618,7 +6704,7 @@ const pair oRunner::getRaceInfo() { res.first = lang.tl("Placering: ") + itow(p) + L"."; } else { - if (ok && rtComp != rtActual || pointsActual != pointsComp) { + if (ok) { res.first += lang.tl("Resultat: "); if (compStatus != baseStatus) res.first = oe->formatStatus(compStatus, true) + L", "; diff --git a/code/oRunner.h b/code/oRunner.h index 16c4e1c..422dd01 100644 --- a/code/oRunner.h +++ b/code/oRunner.h @@ -272,6 +272,9 @@ public: void setTempResultZero(const TempResult &tr); + /** Set the class computed result from tmp result.*/ + void updateComputedResultFromTemp(); + // Time void setInputTime(const wstring &time); wstring getInputTimeS() const; @@ -378,14 +381,17 @@ public: virtual int getPrelRunningTime() const; + virtual const pair getRaceInfo() = 0; + + wstring getPlaceS() const; wstring getPrintPlaceS(bool withDot) const; wstring getTotalPlaceS() const; wstring getPrintTotalPlaceS(bool withDot) const; - virtual int getPlace() const = 0; - virtual int getTotalPlace() const = 0; + virtual int getPlace(bool allowUpdate = true) const = 0; + virtual int getTotalPlace(bool allowUpdate = true) const = 0; RunnerStatus getStatusComputed() const { return tComputedStatus != StatusUnknown ? tComputedStatus : tStatus; } virtual RunnerStatus getStatus() const { return tStatus;} @@ -444,10 +450,16 @@ public: virtual ~oAbstractRunner() {}; struct DynamicValue { - int dataRevision; - int value; + private: + int dataRevision = -1; + int value = -1; + int valueStd = -1; // Value without result module + public: + void reset(); bool isOld(const oEvent &oe) const; - void update(const oEvent &oe, int v); + DynamicValue &update(const oEvent &oe, int v, bool setStd); + void invalidate(bool invalid) { if (invalid) dataRevision = -1; } + int get(bool preferStd) const; }; friend class oListInfo; @@ -741,7 +753,7 @@ public: int getTotalRunningTime() const override; //Get total running time after leg - int getRaceRunningTime(int leg) const; + int getRaceRunningTime(bool computedTime, int leg) const; // Get the complete name, including team and club. wstring getCompleteIdentification(bool includeExtra = true) const; @@ -758,7 +770,7 @@ public: int getRogainingOvertime(bool computed) const override; const wstring &getProblemDescription() const {return tProblemDescription;} - const pair getRaceInfo(); + const pair getRaceInfo() override; // Leg statistics access methods wstring getMissedTimeS() const; wstring getMissedTimeS(int ctrlNo) const; @@ -842,9 +854,9 @@ public: oSpeakerObject &spk) const; bool needNoCard() const; - int getPlace() const; + int getPlace(bool allowUpdate = true) const override; int getCoursePlace(bool perClass) const; - int getTotalPlace() const; + int getTotalPlace(bool allowUpdate = true) const override; // Normalized = true means permuted to the unlooped version of the course const vector &getSplitTimes(bool normalized) const; diff --git a/code/oTeam.cpp b/code/oTeam.cpp index 8551050..15a7d68 100644 --- a/code/oTeam.cpp +++ b/code/oTeam.cpp @@ -444,6 +444,7 @@ int oTeam::getRunningTime(bool computedTime) const { int oTeam::getLegRunningTime(int leg, bool computedTime, bool multidayTotal) const { if (computedTime) { + leg = getLegToUse(leg); auto &cr = getComputedResult(leg); int addon = 0; @@ -458,10 +459,10 @@ int oTeam::getLegRunningTime(int leg, bool computedTime, bool multidayTotal) con } } - return getLegRunningTimeUnadjusted(leg, multidayTotal) + getTimeAdjustment(); + return getLegRunningTimeUnadjusted(leg, multidayTotal, false) + getTimeAdjustment(); } -int oTeam::getLegRestingTime(int leg) const { +int oTeam::getLegRestingTime(int leg, bool useComputedRunnerTime) const { if (!Class) return 0; @@ -471,7 +472,7 @@ int oTeam::getLegRestingTime(int leg) const { if (Class->getStartType(k) == STHunting && !Class->isParallel(k) && Runners[k] && Runners[k-1]) { - int ft = getLegRunningTimeUnadjusted(k-1, false) + tStartTime; + int ft = getLegRunningTimeUnadjusted(k-1, false, useComputedRunnerTime) + tStartTime; int st = Runners[k]->getStartTime(); if (ft > 0 && st > 0) @@ -482,7 +483,7 @@ int oTeam::getLegRestingTime(int leg) const { } -int oTeam::getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const { +int oTeam::getLegRunningTimeUnadjusted(int leg, bool multidayTotal, bool useComputedRunnerTime) const { leg = getLegToUse(leg); int addon = 0; @@ -500,18 +501,19 @@ int oTeam::getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const { switch(lt) { case LTNormal: - if (Runners[leg]->prelStatusOK(false, true)) { - int dt = leg>0 ? getLegRunningTimeUnadjusted(leg-1, false)+Runners[leg]->getRunningTime(false):0; - return addon + max(Runners[leg]->getFinishTimeAdjusted()-(tStartTime + getLegRestingTime(leg)), dt); + if (Runners[leg]->prelStatusOK(useComputedRunnerTime, true)) { + int dt = leg>0 ? getLegRunningTimeUnadjusted(leg-1, false, useComputedRunnerTime)+Runners[leg]->getRunningTime(useComputedRunnerTime):0; + return addon + max(Runners[leg]->getFinishTimeAdjusted() - + (tStartTime + getLegRestingTime(leg, useComputedRunnerTime)), dt); } else return 0; break; case LTParallelOptional: case LTParallel: //Take the longest time of this runner and the previous - if (Runners[leg]->prelStatusOK(false, false)) { - int pt=leg>0 ? getLegRunningTimeUnadjusted(leg-1, false) : 0; - int rest = getLegRestingTime(leg); + if (Runners[leg]->prelStatusOK(useComputedRunnerTime, false)) { + int pt=leg>0 ? getLegRunningTimeUnadjusted(leg-1, false, useComputedRunnerTime) : 0; + int rest = getLegRestingTime(leg, useComputedRunnerTime); int finishT = Runners[leg]->getFinishTimeAdjusted(); return addon + max(finishT-(tStartTime + rest), pt); } @@ -527,7 +529,7 @@ int oTeam::getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const { baseLeg--; int baseTime = 0; if (baseLeg > 0) - baseTime = getLegRunningTimeUnadjusted(baseLeg-1, multidayTotal); + baseTime = getLegRunningTimeUnadjusted(baseLeg-1, multidayTotal, useComputedRunnerTime); else baseTime = addon; @@ -536,9 +538,9 @@ int oTeam::getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const { bool bad = false; do { if (Runners[cLeg] && Runners[cLeg]->getFinishTime() > 0) { - int rt = Runners[cLeg]->getRunningTime(false); + int rt = Runners[cLeg]->getRunningTime(useComputedRunnerTime); if (legTime == 0 || rt < legTime) { - bad = !Runners[cLeg]->prelStatusOK(false, false); + bad = !Runners[cLeg]->prelStatusOK(useComputedRunnerTime, false); legTime = rt; } } @@ -554,15 +556,15 @@ int oTeam::getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const { break; case LTSum: - if (Runners[leg]->prelStatusOK(false, false)) { + if (Runners[leg]->prelStatusOK(useComputedRunnerTime, false)) { if (leg==0) - return addon + Runners[leg]->getRunningTime(false); + return addon + Runners[leg]->getRunningTime(useComputedRunnerTime); else { - int prev = getLegRunningTimeUnadjusted(leg-1, multidayTotal); + int prev = getLegRunningTimeUnadjusted(leg-1, multidayTotal, useComputedRunnerTime); if (prev == 0) return 0; else - return Runners[leg]->getRunningTime(false) + prev; + return Runners[leg]->getRunningTime(useComputedRunnerTime) + prev; } } else return 0; @@ -571,7 +573,7 @@ int oTeam::getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const { if (leg==0) return 0; else - return getLegRunningTimeUnadjusted(leg-1, multidayTotal); + return getLegRunningTimeUnadjusted(leg-1, multidayTotal, useComputedRunnerTime); break; @@ -579,9 +581,9 @@ int oTeam::getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const { if (Class->getResultModuleTag().empty()) return 0; else { - int dt = Runners[leg]->getRunningTime(false); + int dt = Runners[leg]->getRunningTime(useComputedRunnerTime); if (leg > 0) - dt += getLegRunningTimeUnadjusted(leg - 1, multidayTotal); + dt += getLegRunningTimeUnadjusted(leg - 1, multidayTotal, useComputedRunnerTime); return dt; } } @@ -590,8 +592,9 @@ int oTeam::getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const { int dt=addon + max(Runners[leg]->getFinishTime()-tStartTime, 0); int dt2=0; - if (leg>0) - dt2=getLegRunningTimeUnadjusted(leg-1, multidayTotal)+Runners[leg]->getRunningTime(false); + if (leg > 0) + dt2 = getLegRunningTimeUnadjusted(leg - 1, multidayTotal, useComputedRunnerTime) + + Runners[leg]->getRunningTime(useComputedRunnerTime); return max(dt, dt2); } @@ -688,12 +691,72 @@ RunnerStatus oTeam::getLegStatus(int leg, bool computed, bool multidayTotal) con return RunnerStatus(s); } +RunnerStatus oTeam::deduceComputedStatus() const { + int leg = Runners.size() - 1; + leg = getLegToUse(leg); // Ignore optional runners + int s = 0; + if (!Class) + return StatusUnknown; + + while (leg>0 && Class->getLegType(leg) == LTIgnore) + leg--; + + for (int i = 0; i <= leg; i++) { + // Ignore runners to be ignored + while (igetLegType(i) == LTIgnore) + i++; + + int st = Runners[i] ? Runners[i]->getStatusComputed() : StatusDNS; + int bestTime = Runners[i] ? Runners[i]->getFinishTime() : 0; + + //When Type Extra is used, the runner with the best time + //is used for change. Then the status of this runner + //should be carried forward. + if (Class) while ((i + 1) < int(Runners.size()) && Class->getLegType(i + 1) == LTExtra) { + i++; + + if (Runners[i]) { + if (bestTime == 0 || (Runners[i]->getFinishTime()>0 && + Runners[i]->getFinishTime()getStatusComputed(); + bestTime = Runners[i]->getFinishTime(); + } + } + } + + if (st == 0) + return RunnerStatus(s == StatusOK ? 0 : s); + + s = max(s, st); + } + + // Allow global status DNS + if (s == StatusUnknown && tStatus == StatusDNS) + return tStatus; + return RunnerStatus(s); +} + +int oTeam::deduceComputedRunningTime() const { + return getLegRunningTimeUnadjusted(Runners.size() - 1, false, true) + getTimeAdjustment(); +} + +int oTeam::deduceComputedPoints() const { + int pt = 0; + for (size_t k = 0; k < Runners.size(); k++) { + if (Runners[k]) + pt += Runners[k]->getRogainingPoints(true, false); + } + pt = max(0, pt + getPointAdjustment()); + return pt; +} + + const wstring &oTeam::getLegStatusS(int leg, bool computed, bool multidayTotal) const { return oe->formatStatus(getLegStatus(leg, computed, multidayTotal), true); } -int oTeam::getLegPlace(int leg, bool multidayTotal) const { +int oTeam::getLegPlace(int leg, bool multidayTotal, bool allowUpdate) const { if (leg == -1) leg = Runners.size() - 1; @@ -703,16 +766,16 @@ int oTeam::getLegPlace(int leg, bool multidayTotal) const { } auto &p = getTeamPlace(leg); if (!multidayTotal) { - if (Class && p.p.isOld(*oe)) { + if (Class && allowUpdate && p.p.isOld(*oe)) { oe->calculateTeamResults({getClassId(true)}, oEvent::ResultType::ClassResult); } - return p.p.value; + return p.p.get(!allowUpdate); } else { - if (Class && p.totalP.isOld(*oe)) { + if (Class && allowUpdate && p.totalP.isOld(*oe)) { oe->calculateTeamResults({ getClassId(true) }, oEvent::ResultType::TotalResult); } - return p.totalP.value; + return p.totalP.get(!allowUpdate); } } @@ -1146,11 +1209,11 @@ void oTeam::apply(ChangeType changeType, pRunner source) { bool setStart = false; if (i>0 && Runners[i-1]) { if (lt == LTNormal || lt == LTSum || availableStartTimes.empty()) { - int rt = getLegRunningTimeUnadjusted(i-1, false); + int rt = getLegRunningTimeUnadjusted(i-1, false, false); if (rt>0) setStart = true; - int leaderTime = pc->getTotalLegLeaderTime(i-1, false, false); + int leaderTime = pc->getTotalLegLeaderTime(oClass::AllowRecompute::No, i-1, false, false); int timeAfter = leaderTime > 0 ? rt - leaderTime : 0; if (rt>0 && timeAfter>=0) @@ -1587,7 +1650,7 @@ int oTeam::getTimeAfter(int leg) const { if (t<=0) return -1; - return t-Class->getTotalLegLeaderTime(leg, true, false); + return t-Class->getTotalLegLeaderTime(oClass::AllowRecompute::Yes, leg, true, false); } int oTeam::getLegStartTime(int leg) const @@ -1786,7 +1849,7 @@ void oTeam::setInputData(const oTeam &t) { inputTime = t.getTotalRunningTime(); inputStatus = t.getTotalStatus(); inputPoints = t.getRogainingPoints(true, true); - int tp = t.getTotalPlace(); + int tp = t.getTotalPlace(true); inputPlace = tp; oDataInterface dest = getDI(); @@ -2391,8 +2454,72 @@ oTeam::TeamPlace &oTeam::getTeamPlace(int leg) const { bool oTeam::isResultUpdated(bool totalResult) const { auto &p = getTeamPlace(Runners.size() - 1); - if (totalResult) + if (!totalResult) return !p.p.isOld(*oe); else return !p.totalP.isOld(*oe); } + +const pair oTeam::getRaceInfo() { + pair res; + RunnerStatus baseStatus = getStatus(); + int rtActual = getRunningTime(false); + + if (isResultStatus(baseStatus) || (isPossibleResultStatus(baseStatus) && rtActual>0)) { + int p = getPlace(true); + int rtComp = getRunningTime(true); + int pointsActual = getRogainingPoints(false, false); + int pointsComp = getRogainingPoints(true, false); + RunnerStatus compStatus = getStatusComputed(); + bool ok = compStatus == StatusOK || compStatus == StatusOutOfCompetition + || compStatus == StatusNoTiming; + res.second = ok ? 1 : -1; + if (compStatus == baseStatus && rtComp == rtActual && pointsComp == pointsActual) { + if (ok && p > 0) + res.first = lang.tl("Placering: ") + itow(p) + L"."; + } + else { + if (ok) { + res.first += lang.tl("Resultat: "); + if (compStatus != baseStatus) + res.first = oe->formatStatus(compStatus, true) + L", "; + if (pointsActual != pointsComp) + res.first += itow(pointsComp) + L", "; + + res.first += formatTime(rtComp); + + if (p > 0) + res.first += L" (" + itow(p) + L")"; + } + else if (!ok && compStatus != baseStatus) { + res.first = lang.tl("Resultat: ") + oe->formatStatus(compStatus, true); + } + /* + if (ok && getRogainingReduction(true) > 0) { + tProblemDescription = L"Tidsavdrag: X poäng.#" + itow(getRogainingReduction(true)); + } + + if (!getProblemDescription().empty()) { + if (!res.first.empty()) { + if (res.first.back() != ')') + res.first += L", "; + else + res.first += L" "; + } + res.first += lang.tl(getProblemDescription()); + }*/ + } + } + else { + vector pl; + oe->synchronizeList(oListId::oLPunchId); + oe->getPunchesForRunner(Id, true, pl); + if (!pl.empty()) { + res.first = lang.tl(L"Senast sedd: X vid Y.#" + + oe->getAbsTime(pl.back()->Time) + + L"#" + pl.back()->getType()); + } + } + + return res; +} diff --git a/code/oTeam.h b/code/oTeam.h index 3c00fe6..a76deed 100644 --- a/code/oTeam.h +++ b/code/oTeam.h @@ -44,9 +44,9 @@ public: }; private: - int getLegRunningTimeUnadjusted(int leg, bool multidayTotal) const; + int getLegRunningTimeUnadjusted(int leg, bool multidayTotal, bool useComputedRunnerTime) const; /** Return the total time the team has been resting (pursuit start etc.) up to the specified leg */ - int getLegRestingTime(int leg) const; + int getLegRestingTime(int leg, bool useComputedRunnerTime) const; void speakerLegInfo(int leg, int specifiedLeg, int courseControlId, int &missingLeg, int &totalLeg, @@ -138,6 +138,13 @@ protected: public: + /** Deduce from computed runner times.*/ + RunnerStatus deduceComputedStatus() const; + int deduceComputedRunningTime() const; + int deduceComputedPoints() const; + + const pair getRaceInfo() override; + static const shared_ptr &getTable(oEvent *oe); /** Check the the main leg is set if any parallel is set. Returns true if corrections where made.*/ @@ -224,8 +231,8 @@ public: void importRunners(const vector &rns); void importRunners(const vector &rns); - int getPlace() const {return getLegPlace(-1, false);} - int getTotalPlace() const {return getLegPlace(-1, true);} + int getPlace(bool allowUpdate = true) const override {return getLegPlace(-1, false, allowUpdate);} + int getTotalPlace(bool allowUpdate = true) const override {return getLegPlace(-1, true, allowUpdate);} int getNumShortening() const; // Number of shortenings up to and including a leg @@ -255,7 +262,7 @@ public: wstring getLegPlaceS(int leg, bool multidayTotal) const; wstring getLegPrintPlaceS(int leg, bool multidayTotal, bool withDot) const; - int getLegPlace(int leg, bool multidayTotal) const; + int getLegPlace(int leg, bool multidayTotal, bool allowUpdate = true) const; bool isResultUpdated(bool totalResult) const override; diff --git a/code/swedish.lng b/code/swedish.lng index 87e33b0..769601e 100644 --- a/code/swedish.lng +++ b/code/swedish.lng @@ -2473,7 +2473,7 @@ Result module = Resultatmodul ask:usecourseinclass = Banan används inte av någon annan deltagare i klassen.\n\nVill du använda den i alla fall? Inkludera bana = Inkludera bana Rogaining points before automatic reduction = Poäng före tidsavdrag -Runner/team earlier stage places = Deltagare/lag: plarcering på etapper +Runner/team earlier stage places = Deltagare/lag: placering på etapper Runner/team earlier stage points = Deltagare/lag: poäng på etapper Runner/team earlier stage running times = Deltagare/lag: tid på etapper Runner/team earlier stage statuses = Deltagare/lag: status på etapper @@ -2500,3 +2500,4 @@ Först = Först Lottat = Lottat Sist = Sist Fakturadatum = Fakturadatum +Youth Cup X = Ungdomscup X