From bfb25f4d16d17b3c4dc383e806c52e1282b48828 Mon Sep 17 00:00:00 2001 From: cedrick2711 Date: Wed, 26 Aug 2026 22:33:24 -0400 Subject: [PATCH] ajout d'un toggle pour permission d'upload des documents dans admin pannel ajout de compteur d'heure disponible ajout du calendrier de dispo dans les profils publics --- app/models/admin_settings.py | 11 +- app/routes/admin.py | 19 + app/routes/users/accounts.py | 52 +- app/routes/users/contracts.py | 20 + app/static/css/style.css | 58 ++ app/templates/pages/admin.html | 27 + app/templates/pages/users.html | 8 + app/templates/pages/view_user.html | 25 + app/timeslots.py | 36 + app/translations/en/LC_MESSAGES/messages.mo | Bin 47844 -> 48012 bytes app/translations/en/LC_MESSAGES/messages.po | 764 ++++++++++++++++++- app/translations/fr/LC_MESSAGES/messages.mo | Bin 52350 -> 52547 bytes app/translations/fr/LC_MESSAGES/messages.po | 768 +++++++++++++++++++- tests/test_admin_document_uploads_toggle.py | 135 ++++ tests/test_admin_route_map.py | 1 + tests/test_availability_views.py | 116 +++ 16 files changed, 1966 insertions(+), 74 deletions(-) create mode 100644 tests/test_admin_document_uploads_toggle.py create mode 100644 tests/test_availability_views.py diff --git a/app/models/admin_settings.py b/app/models/admin_settings.py index 73bb7b6..3346598 100644 --- a/app/models/admin_settings.py +++ b/app/models/admin_settings.py @@ -18,11 +18,12 @@ class AppSettings(db.Model): # ------------------------------------------------------------------ # Well-known keys (documented here for discoverability) # ------------------------------------------------------------------ - # tryouts_open – "true" / "false" (default: "true") - # season_active – "true" / "false" (default: "false") - # season_name – e.g. "Fall 2026" - # season_start – ISO date string - # season_end – ISO date string + # tryouts_open – "true" / "false" (default: "true") + # document_uploads_enabled – "true" / "false" (default: "true") + # season_active – "true" / "false" (default: "false") + # season_name – e.g. "Fall 2026" + # season_start – ISO date string + # season_end – ISO date string @staticmethod def get(key, default=None): diff --git a/app/routes/admin.py b/app/routes/admin.py index 74db6ec..0fdb3a9 100644 --- a/app/routes/admin.py +++ b/app/routes/admin.py @@ -73,6 +73,7 @@ def dashboard(): settings = { 'tryouts_open': AppSettings.get_bool('tryouts_open', default=True), + 'document_uploads_enabled': AppSettings.get_bool('document_uploads_enabled', default=True), 'season_active': AppSettings.get_bool('season_active', default=False), 'season_name': AppSettings.get('season_name') or 'Not set', 'season_start': AppSettings.get('season_start') or 'Not set', @@ -326,6 +327,24 @@ def end_season(): _log('season_ended', f'Season: {name}, End: {end_date}') flash(f'Season "{name}" has ended.', 'success') return redirect(url_for('admin.dashboard')) +@admin_bp.route('/toggle-document-uploads', methods=['POST']) +@login_required +def toggle_document_uploads(): + """Enable or disable document uploads for non-admin users.""" + if not require_admin(): + return redirect(url_for('main.dashboard')) + + current = AppSettings.get_bool('document_uploads_enabled', default=True) + new_value = not current + AppSettings.set_bool('document_uploads_enabled', new_value) + + state = 'enabled' if new_value else 'disabled' + _log('document_uploads_toggled', f'Document uploads {state}') + flash(f'Document uploads are now {state}.', 'success') + return redirect(url_for('admin.dashboard')) + + + # --------------------------------------------------------------------------- diff --git a/app/routes/users/accounts.py b/app/routes/users/accounts.py index 1b64b82..caaa44e 100644 --- a/app/routes/users/accounts.py +++ b/app/routes/users/accounts.py @@ -44,6 +44,7 @@ from app.routes.users._shared import ( ) from app.routes.users.blueprint import users_bp from app.storage import discard_documents +from app.timeslots import total_hours from app.validators import CreateUserSchema, EditUserSchema @@ -59,7 +60,39 @@ def list_users(): # query without a stable ORDER BY can show the same row twice and never # show another (MNT-14). page = paginate(User.query.order_by(User.role, User.username, User.id)) - return render_template('pages/users.html', users=page.items, pagination=page, roles=USER_TYPES) + + # Build a per-user hours map for the current page with two bounded + # queries (one per availability table), avoiding an N+1 per row. + user_ids = [u.id for u in page.items] + hours_by_user: dict[int, float] = {} + + for slots, fk in [ + ( + PlayerDisponibility.query.filter( + PlayerDisponibility.player_id.in_(user_ids), + ).all(), + 'player_id', + ), + ( + CoachAvailability.query.filter( + CoachAvailability.coach_id.in_(user_ids), + ).all(), + 'coach_id', + ), + ]: + buckets: dict[int, list] = {} + for slot in slots: + buckets.setdefault(getattr(slot, fk), []).append(slot) + for uid, group in buckets.items(): + hours_by_user[uid] = total_hours(group) + + return render_template( + 'pages/users.html', + users=page.items, + pagination=page, + roles=USER_TYPES, + hours=hours_by_user, + ) @users_bp.route('//edit', methods=['GET', 'POST']) @@ -380,4 +413,19 @@ def create_user(): def view_user(user_id): """View a public profile for any user.""" user = db.get_or_404(User, user_id) - return render_template('pages/view_user.html', profile_user=user) + + # Load availability for players and coaches so the public profile + # can render a read-only weekly grid. + availability = None + if user.role == 'player': + availability = user.disponibilities + elif user.role == 'coach': + availability = user.coach_availabilities + availability_hours = total_hours(availability) if availability else None + + return render_template( + 'pages/view_user.html', + profile_user=user, + availability=availability, + availability_hours=availability_hours, + ) diff --git a/app/routes/users/contracts.py b/app/routes/users/contracts.py index fb43412..39ee655 100644 --- a/app/routes/users/contracts.py +++ b/app/routes/users/contracts.py @@ -11,6 +11,7 @@ from werkzeug.utils import secure_filename from app.extensions import db from app.models import Admin, Coach, Contract, Manager, Player, User +from app.models.admin_settings import AppSettings from app.permissions import can_manage_player_contract, coach_player_ids from app.routes.users._shared import ( ALLOWED_CONTRACT_EXTENSIONS, @@ -49,6 +50,17 @@ def manageable_players(): return User.query.filter_by(role='player', is_active_account=True).order_by(User.username).all() +def document_uploads_locked(): + """Return True when document uploads are globally disabled. + + Admins are always allowed to bypass the lock. Managers, coaches, and + players are blocked when the toggle is off. + """ + if isinstance(current_user, Admin): + return False + return not AppSettings.get_bool('document_uploads_enabled', default=True) + + @users_bp.route('/contracts') @login_required def list_contracts(): @@ -92,6 +104,10 @@ def upload_contract(): flash(_('Only presidents, managers, and coaches can upload contracts.'), 'danger') return redirect(url_for('users.list_contracts')) + if document_uploads_locked(): + flash(_('Document uploads are currently disabled.'), 'danger') + return redirect(url_for('users.list_contracts')) + players = manageable_players() if request.method == 'POST': @@ -169,6 +185,10 @@ def upload_signed_contract(contract_id): flash(_('Only the player can upload their signed contract.'), 'danger') return redirect(url_for('users.list_contracts')) + if document_uploads_locked(): + flash(_('Document uploads are currently disabled.'), 'danger') + return redirect(url_for('users.list_contracts')) + file = request.files.get('signed_file') error = pdf_upload_error(file, ALLOWED_SIGNED_EXTENSIONS) if error: diff --git a/app/static/css/style.css b/app/static/css/style.css index bf182ed..1660733 100644 --- a/app/static/css/style.css +++ b/app/static/css/style.css @@ -1256,6 +1256,64 @@ a:hover { color: var(--primary-dark); } color: white !important; border-color: #4f46e5 !important; } +/* Read-only weekly availability grid (public profile) */ +.readonly-availability-grid { + display: grid; + grid-template-columns: repeat(7, 1fr); + gap: 8px; + margin-top: 8px; +} + +.ra-day-column { + background: var(--bg-secondary); + border-radius: 8px; + padding: 8px; + min-height: 120px; +} + +.ra-day-header { + text-align: center; + font-weight: 600; + padding: 6px 0; + border-bottom: 1px solid var(--border-color); + margin-bottom: 6px; + color: var(--primary); + font-size: 0.85rem; +} + +.ra-slot { + padding: 4px 6px; + margin: 3px 0; + border-radius: 4px; + font-size: 0.75rem; + text-align: center; + background: var(--bg-secondary); + border: 1px solid var(--border-color); +} + +.ra-slot.selected { + background: var(--primary); + color: white; + border-color: var(--primary-dark); +} + +.ra-slot.ra-empty { + color: var(--gray-400); + border: 1px dashed var(--gray-300); + background: transparent; +} + +@media (max-width: 768px) { + .readonly-availability-grid { + grid-template-columns: repeat(3, 1fr); + } +} + +@media (max-width: 480px) { + .readonly-availability-grid { + grid-template-columns: 1fr; + } +} .merged-disponibility-time-block.high-availability { background: var(--success); diff --git a/app/templates/pages/admin.html b/app/templates/pages/admin.html index 818abd4..524efc5 100644 --- a/app/templates/pages/admin.html +++ b/app/templates/pages/admin.html @@ -82,6 +82,33 @@ +
+
+

Document Uploads

+
+
+

+ Status: + + {% if settings.document_uploads_enabled %}ENABLED{% else %}DISABLED{% endif %} + +

+

+ {% if settings.document_uploads_enabled %} + Managers and coaches can upload contracts. Players can upload signed contracts. + {% else %} + Only admins can upload or sign contracts. Other roles are blocked. + {% endif %} +

+
+ + +
+
+
+

Season Management

diff --git a/app/templates/pages/users.html b/app/templates/pages/users.html index 2c83f2f..eb67b45 100644 --- a/app/templates/pages/users.html +++ b/app/templates/pages/users.html @@ -21,6 +21,7 @@ {{ _('Username') }} {{ _('Email') }} {{ _('Role') }} + {{ _('Hours') }} {{ _('Status') }} {{ _('Joined') }} {{ _('Actions') }} @@ -38,6 +39,13 @@ {{ u.username }} {{ u.email }} {{ u.role | capitalize }} + + {% if u.role in ('player', 'coach') %} + {{ '%.1f'|format(hours.get(u.id, 0.0)) }} + {% else %} + — + {% endif %} + {% if u.is_active_account %} Active diff --git a/app/templates/pages/view_user.html b/app/templates/pages/view_user.html index d881efd..a1b8326 100644 --- a/app/templates/pages/view_user.html +++ b/app/templates/pages/view_user.html @@ -81,6 +81,31 @@
{% endif %} + + {% if profile_user.role in ('player', 'coach') and availability %} +
+

{{ _('Availability') }} + ({{ '%.1f'|format(availability_hours or 0.0) }} h) +

+
+ {% set day_names = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] %} + {% for day_idx in range(7) %} +
+
{{ day_names[day_idx][:3] }}
+ {% set day_slots = availability | selectattr('day_of_week', 'equalto', day_idx) | list %} + {% if day_slots %} + {% for slot in day_slots | sort(attribute='start_time') %} +
+ {{ slot.start_time.strftime('%H:%M') }}–{{ slot.end_time.strftime('%H:%M') }} +
+ {% endfor %} + {% else %} +
—
+ {% endif %} +
+ {% endfor %} +
+ {% endif %}
{% endblock %} \ No newline at end of file diff --git a/app/timeslots.py b/app/timeslots.py index 5858807..f2ea86a 100644 --- a/app/timeslots.py +++ b/app/timeslots.py @@ -58,3 +58,39 @@ def day_name(day_of_week): if 0 <= day_of_week < len(DAY_NAMES): return DAY_NAMES[day_of_week] return f'Day {day_of_week}' + + +def slot_duration_minutes(start_time, end_time): + """Minutes a slot spans, wrapping past midnight like slot_end does. + + Works on SQLite where ``Time`` columns are stored as text — the + arithmetic stays in pure Python so it is portable across databases. + + Args: + start_time: A ``datetime.time``. + end_time: A ``datetime.time`` (may be earlier if the slot wraps + past midnight). + + Returns: + int: Duration in whole minutes. + """ + anchor = date_cls(2000, 1, 1) + start_dt = datetime.combine(anchor, start_time) + end_dt = datetime.combine(anchor, end_time) + if end_dt <= start_dt: + end_dt += timedelta(days=1) + return int((end_dt - start_dt).total_seconds() // 60) + + +def total_hours(slots): + """Aggregate slot durations into a single float, rounded to one decimal. + + Args: + slots: Iterable of objects with ``start_time`` and ``end_time`` + attributes (``PlayerDisponibility`` or ``CoachAvailability``). + + Returns: + float: Total hours across all slots, e.g. ``8.5``. + """ + total_minutes = sum(slot_duration_minutes(s.start_time, s.end_time) for s in slots) + return round(total_minutes / 60, 1) diff --git a/app/translations/en/LC_MESSAGES/messages.mo b/app/translations/en/LC_MESSAGES/messages.mo index 6fbd4fbef4accd23d064fa560f755d9c24e93418..080beb97a0b95e8b1f9854a03833b4a60ff96428 100644 GIT binary patch delta 11089 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 HKaKl82D9op delta 10938 zcmZA533N!;zQ^$s%{(F`5g`#mL?$F8rUa>(7-C9mC}N(cqB!RA%u(DbrRM2U)YSIn zYNM21JXBrO@Kmc*>2OP1L+|&Oz1Mncy)O0Hd!KXm{_p?(pA#&4QtHlcrQ923Jy$yX zx1p5dL}65U_5Sa_s07C;OSh6W731kQM}9fO`7Ih(VB$#eC~X>nzknt89O_?H{xKuWbK5DiEbX^OVLQtcIGuj_v2D z&-zYh8k%?jYKK!$JAVt6i7lv!icvebj0Er8N8KNuVyum^^xL8`GZJ-Fv(X!O+wlXa zfIdf86Msd+2k)b9`~`#Y4}1xIQ~4hQQ7J8tI;tepj_RWpY>j%ZH|qWo$Z0wgQMIrU zBk&{=yK^hmah(7fA+;SR4l80VHbvdI95vBS48a4oUyNGlpI92NSs!2-`p;3%h14+% zMW6z1iCV7{>Uys_eBI>#8sEmAz zs;S4QBMVG-oR_g04#1(v9vt@^4NXvraJ5h%mc=Mk04b;mGf)e+#vJU99HX-q_52xB zrY@s4bOZI=kEnTHppGWEzBz&zWIoqPv;z%LN6`Xx<3P;9NvH*mpeKHcI>VEwYQKm| zMrWq&iDbnL3HA>0Cvv8`gyUH=&WrZ&5f3wX;Q78P{Ps z{2067c?`uk3L_jdQThAw8gX2F{bDD^*K$=i@^ ziX;$I7>`6{s0~)f(O8ml)cqS#6Yj>6VnrR@r>G;kf(q~kCgWYyePJ$n(!w$5g>_J` zPX_9SmZ*$$LIuzdOW}M}5iUf2IV<=r8!y>@SThq)57b!?z!;o@5%>-&v+f6W;1otO za2pl*bJUTPYi@tIpvK#x?(2t|U>fQu3Q_O>PSj5Kp^EWC)J9IC?mv&w_#HC8>v&Uf zDu$|4#sx41{LvL)I$1<>HY}x#5$-z>!Xe&4;4Tk^uoc|6Gx%~{2WyS=P*$3 z|2HKK&K^~C&ruUZwJ;OJq0Y7zYJvJ#5u2fosy9}`5q5kb>S(s1p4*F>?;})k9!GEd z5`$RZxkkea@1b`32$eeDmZo~kqZW!sO;8^-VN2AJbVLO<2vsX%QD3;(sMIgF*Wa;j zMP+Uux?1QE4NX{VZ}_LZ;WFxr_BHyTe=8F}S=9ZpsMo6&CSnt8i^H%39=6xLTbqkwjDhYr*WP#?m5HBGMdRPb^rMk)hm(P->WQdgT!cD;ZCD*Y!>;%M zbzd{0(nforGE{&%>WOX1zZP1_fKsx@-gv-z3{_lbtoKp(`?NEEs*OP%T^=eE`KSd( zpaPkW)o=^?<7rg!UBYy{=h{Yed&jBCKvzse*SZ@u!4=emFE9?{$Zrj7i&b$P>bcdZ zd5)v*e~3v~KG*#4X^wikW}xPE_uIy0jAh`N?MHVsXPkqIxIOBkc-ODD2&ki|27R3!+z8P=TQOOM(zAQDl;!I8LM=$ zuN|ru2BAJoGf;v24Heii48c=&{E8j-$TQddCF?t(G_+t8s*0P%;# z-iC#!;@OUM@eJxU_UL8;sEC>`0c&Gj)H(&&7l&gEp6N#ZwS$KYDDtPM>h|YjpfgHE zO`MM^vhk=umZEmF1_N*}D$tM66Hj3oJd2wD7Al}0QR_Um*S&g>f2B6Ohe=^AREnCS zimok2U?x?-9ODse;0^UJQ`~st}Mt}2{&m7F5 zKN&S|5$f%Eg08ACaDX|h4Af2=qf*}-mHIqXwGXpSLsk1y>pE1bccD^y7rc)LQ7P!4M3gcaP&kM6~G+S!mF@6Zbnt{hZv1#Q42go1s*Wa z7>mC2Gf^9Bh6=dLK=QBGrVj%lxB??_6KaAY)Pt8W7H^<3<}t{;&q>y*HBUZ$1sDO%58F*y-Aw$d` zFdAYu<72QY?#BfD3TvY4G1N>@3suG4aRSc6`uGf0G-<=kgdGT(&=KU0P|IetmD0&2cUSxeImxczGU}G%8EPRI9*l47=J`EM|-);Xgwx{ni z%2a<>>_&eSCgBOp#ebs$&KYe!Y@@Lu{Y@CG_x~o1AO;?yUZ-amh!w|};)=%@`i)R2 z?`55gs*#mg=)o5db(C4-jGZx_egP)n64VhL#YDV<$*k{qk2gO~)3Gl7e2l>*s59GZ zy@)EFC+LS2IHyWj6-#4NRMB-teGi6WFwVhpxB|7&?HGcG(A5r3(9na|u{{2U+DX7f z)31!Wo`zbm9hSkN7>ZM^%dDGG^Bl4Lv$lWR_J6niz}LyYB8h$7OjHLIVGGm(dA2{$ z_Q#_po`>4uTGY-Dp#nRJ3g}zZ2L3>$I&hM?KhxR;^*WE3ME;eUWen)7wxBnjMV;9t zR6x#TGjTBb(2Ygimw-xfZF~u{(HC5=Nl$dq1I}sfZTK%daxyGp^m7C zT@1hl_WDXx^}dTL!Xk{sTh^zjjD$@!&sRdtR|6GLH`IayZGRH7j_b^)QI89Sn1-it zJib8fY}_>SLunCeCxsY=@1c&O2(^I|sD;ki{!P@;eUD1{W7Nh1rkm%=V`;trm1wA_ zl2K=tgD>N&$PX%KBi2D5?$rbhPz&XtiYyNmz#vpHjz%p!6LWAWrs9{V=e=f_Ood=D zV@?mi zVogI=#gsuqXV)8RU;*k2xEQtY8q`jZ|7`Pa_QexC1t!KNwa0+fX|@j+OBes>=V3 zUC?j7`C#=z74;a~Ux2>!*P#M%x6)8b4xtwQ1Qq$0s88t=RKx)b%!1*lvyDe(tO2S< za!^Oq8I^%qSRJ=xNy^cW{#Dd`cTC@PexjkX`x8B}%zv2(!%!cPX!OGlsD*o=7Y;>z z4@TSTE-E7nPywvLQg{q~uo#u;FEAT}7OKzrcc7t&mZ81_YcU4*qdq_vQK@}k`yPu- zkw&5dPe&a|J5-GfvE#E*#k>af{6W-FoJMcFjU|8ozegjGfnQKN{R{Pg-(vHgS4J(+ z1hv2`n1B}h5DkNABCFFMIF_ARAB3|H11r+`3KSXhykVkl)d4i z^#&?+_fQKxL{0eAUiVyXu7_X}+~m^eK;x0Up-G`h zc_%ExcmdYJ*HLG=3A^Keqh8PQD@-P8qH3m@?RUq<^hcwLdJn1?kE4#@ChGNcpVR0{ zquN{M#wngUI{hlv?pTxlVpJ**TkoKrFSFXrR}bUp_re-D8>`|j)N|*s zrr!T&G!#JfznL>^kB#WRfwl1nYU2CWkhjejG7UA}9d*W2F%;)wG`@{m=qRctzC#_s zLsXIatzo0A??lj0DyyO>r6v84nQqD2DO7XQK{aB5qKU|3-?hA_^mYoMWS{di~8A750kMc zhT(kF^XpL?If4r0f7X(J?f7>F^tyPgGZ)IB#xt$WtZh*l$iqtbD(bbJf(mF3Dv*^J zgF8@}I*r=kb<_s$qcY~aOa65sN~O% zRlG+q3X4%Satrkqc&#_DaV9E&E-npC*bh}~!%z#Y!@jr~W6*1Z3A8%u!MdpGZiYId z!B_zcF%oy90y&8#HG(BySX7|Dq9?i@@0kycH!2emsDR>73nkm@jZvx1MWwJmDnpY| zMK>Fji3OF z$DvZ1Y0bep^mDN)&O#OER@8iZQ1>6S*NaKiw4MCxLc|VpAr}+rPsd!` zg}U)6_QYyC&A)_BM+I;cGw@&5GP}(6HW!p*3_4xUI4Z_4@vTIuh@_W`4Ii z4MpDEnvcHp$DnpL1r_l^)N8XEL+}gKhvpjU`Nyc|g5Ec&55rpYGqDC1SQn%2JBWNQ zT&IYJekfcxd=DNev5tdD6Qn3@@mnr{p0{%e?o zJ_k)d9aHJQhP7GWDWs8($59jiiF%;sA@dq_$0qdOwEYvPFW+O#!nDIC@bQ>J{~*@H zZ*4#1i20Y&EL8O`#%{O`T`ly2MlL2EH4#q5I`p?=L%fE;82+Its_LlMDGhZ5T`&~; zVhoN)rF^AzABNFCgHBxhz##?02h<$bASNz;#DP~5D*GPz^9_H$14(ned=6wR%1c=h YF?NVgdQ9!i26ZzI%pY6e_y4Z{2Mv9+w*UYD diff --git a/app/translations/en/LC_MESSAGES/messages.po b/app/translations/en/LC_MESSAGES/messages.po index 3365170..7e1f100 100644 --- a/app/translations/en/LC_MESSAGES/messages.po +++ b/app/translations/en/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: team-tryouts VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-08-25 19:38-0400\n" +"POT-Creation-Date: 2026-08-26 22:04-0400\n" "PO-Revision-Date: 2026-08-07 20:22-0400\n" "Last-Translator: FULL NAME \n" "Language: en\n" @@ -18,14 +18,17 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.18.0\n" + #: app/app.py:564 msgid "Please log in to access this page." msgstr "Please log in to access this page." + #: app/forms.py:37 app/routes/auth.py:230 app/routes/auth.py:389 -#: app/routes/auth.py:403 app/routes/users/contracts.py:104 +#: app/routes/auth.py:403 app/routes/users/contracts.py:120 #, python-format msgid "%(field)s: %(msg)s" msgstr "%(field)s: %(msg)s" + #: app/validators.py:50 msgid "" "Password must be at least 8 characters with uppercase, lowercase, and a " @@ -33,182 +36,241 @@ msgid "" msgstr "" "Password must be at least 8 characters with uppercase, lowercase, and a " "number." + #: app/validators.py:68 msgid "Username must be 3-30 characters (letters, numbers, underscore, hyphen)." msgstr "Username must be 3-30 characters (letters, numbers, underscore, hyphen)." + #: app/validators.py:87 msgid "Invalid Discord username format." msgstr "Invalid Discord username format." + #: app/validators.py:104 msgid "Discord User ID must be a 17-20 digit number." msgstr "Discord User ID must be a 17-20 digit number." + #: app/validators.py:122 msgid "Invalid phone number format." msgstr "Invalid phone number format." + #: app/validators.py:201 msgid "Username is required." msgstr "Username is required." + #: app/validators.py:205 msgid "Password is required." msgstr "Password is required." + #: app/validators.py:227 app/validators.py:324 msgid "Username must be 3-80 characters." msgstr "Username must be 3-80 characters." + #: app/validators.py:233 msgid "Email must be 120 characters or less." msgstr "Email must be 120 characters or less." + #: app/validators.py:246 app/validators.py:339 app/validators.py:370 #: app/validators.py:433 msgid "Full name is required." msgstr "Full name is required." + #: app/validators.py:276 msgid "Passwords do not match." msgstr "Passwords do not match." + #: app/validators.py:284 app/validators.py:924 msgid "Unknown game." msgstr "Unknown game." + #: app/validators.py:291 msgid "Gamertag must be between 1 and 120 characters." msgstr "Gamertag must be between 1 and 120 characters." + #: app/validators.py:297 msgid "Platform must be 30 characters or less." msgstr "Platform must be 30 characters or less." + #: app/validators.py:306 msgid "Unknown platform for this game." msgstr "Unknown platform for this game." + #: app/validators.py:343 app/validators.py:378 msgid "Invalid role selected." msgstr "Invalid role selected." + #: app/validators.py:473 app/validators.py:596 app/validators.py:629 msgid "Player must be selected." msgstr "Player must be selected." + #: app/validators.py:476 msgid "Notes must be 2000 characters or less." msgstr "Notes must be 2000 characters or less." + #: app/validators.py:513 app/validators.py:994 msgid "Invalid coach selection." msgstr "Invalid coach selection." + #: app/validators.py:519 app/validators.py:1000 msgid "Invalid manager selection." msgstr "Invalid manager selection." + #: app/validators.py:537 app/validators.py:595 app/validators.py:628 msgid "Invalid player selection." msgstr "Invalid player selection." + #: app/validators.py:546 msgid "Unknown roster status." msgstr "Unknown roster status." + #: app/validators.py:559 msgid "Unknown tryout status." msgstr "Unknown tryout status." + #: app/validators.py:570 msgid "Unknown registration status." msgstr "Unknown registration status." + #: app/validators.py:583 msgid "Team name must be between 1 and 100 characters." msgstr "Team name must be between 1 and 100 characters." + #: app/validators.py:603 msgid "Position must be 50 characters or less." msgstr "Position must be 50 characters or less." + #: app/validators.py:616 msgid "Note content must be between 1 and 5000 characters." msgstr "Note content must be between 1 and 5000 characters." + #: app/validators.py:642 msgid "Select at most one note context." msgstr "Select at most one note context." + #: app/validators.py:654 msgid "Rejection reason must be 2000 characters or less." msgstr "Rejection reason must be 2000 characters or less." + #: app/validators.py:678 msgid "Date must be in YYYY-MM-DD format." msgstr "Date must be in YYYY-MM-DD format." + #: app/validators.py:679 msgid "A date is required." msgstr "A date is required." + #: app/validators.py:685 app/validators.py:750 msgid "Start time must be in HH:MM format." msgstr "Start time must be in HH:MM format." + #: app/validators.py:686 app/validators.py:751 msgid "A start time is required." msgstr "A start time is required." + #: app/validators.py:692 msgid "End time must be in HH:MM format." msgstr "End time must be in HH:MM format." + #: app/validators.py:693 msgid "An end time is required." msgstr "An end time is required." + #: app/validators.py:697 msgid "Points must be 2000 characters or less." msgstr "Points must be 2000 characters or less." + #: app/validators.py:712 msgid "End time must be after start time." msgstr "End time must be after start time." + #: app/validators.py:741 app/validators.py:743 msgid "Day must be 0 (Monday) to 6 (Sunday)." msgstr "Day must be 0 (Monday) to 6 (Sunday)." + #: app/validators.py:744 msgid "A day is required." msgstr "A day is required." + #: app/validators.py:779 msgid "Player selection is malformed." msgstr "Player selection is malformed." + #: app/validators.py:805 app/validators.py:915 msgid "A title is required." msgstr "A title is required." + #: app/validators.py:814 msgid "Invalid date format." msgstr "Invalid date format." + #: app/validators.py:819 app/validators.py:826 msgid "Invalid time format." msgstr "Invalid time format." + #: app/validators.py:820 msgid "Start time is required. Please select a time slot." msgstr "Start time is required. Please select a time slot." + #: app/validators.py:834 msgid "Unknown match status." msgstr "Unknown match status." + #: app/validators.py:850 msgid "The end time must come after the start time." msgstr "The end time must come after the start time." + #: app/validators.py:864 msgid "Unknown match type." msgstr "Unknown match type." + #: app/validators.py:876 msgid "A team cannot play against itself." msgstr "A team cannot play against itself." + #: app/validators.py:929 msgid "Invalid start date format." msgstr "Invalid start date format." + #: app/validators.py:930 msgid "A start date is required." msgstr "A start date is required." + #: app/validators.py:936 msgid "Invalid end date format." msgstr "Invalid end date format." + #: app/validators.py:944 msgid "A tryout must allow at least one player." msgstr "A tryout must allow at least one player." + #: app/validators.py:947 msgid "The player limit must be a whole number." msgstr "The player limit must be a whole number." + #: app/validators.py:960 msgid "End date cannot be before start date." msgstr "End date cannot be before start date." + #: app/validators.py:987 app/validators.py:988 msgid "Team name is required." msgstr "Team name is required." + #: app/validators.py:1012 msgid "Scores run from 1 to 10." msgstr "Scores run from 1 to 10." + #: app/validators.py:1013 msgid "A score must be a whole number from 1 to 10." msgstr "A score must be a whole number from 1 to 10." + #: app/routes/auth.py:247 msgid "This account has been deactivated." msgstr "This account has been deactivated." + #: app/routes/auth.py:282 #, python-format msgid "Welcome back, %(username)s!" msgstr "Welcome back, %(username)s!" + #: app/routes/auth.py:312 msgid "" "Login unsuccessful. Please check your username and password, or ask a " @@ -216,25 +278,32 @@ msgid "" msgstr "" "Login unsuccessful. Please check your username and password, or ask a " "president for help." + #: app/routes/auth.py:378 msgid "Your registration could not be processed. Please try again." msgstr "Your registration could not be processed. Please try again." -#: app/routes/auth.py:420 app/routes/users/accounts.py:343 + +#: app/routes/auth.py:420 app/routes/users/accounts.py:376 msgid "Username already exists." msgstr "Username already exists." -#: app/routes/auth.py:424 app/routes/users/accounts.py:347 + +#: app/routes/auth.py:424 app/routes/users/accounts.py:380 msgid "Email already registered." msgstr "Email already registered." + #: app/routes/auth.py:431 app/routes/auth.py:624 -#: app/routes/users/accounts.py:121 +#: app/routes/users/accounts.py:154 msgid "This Discord account is already linked to another account." msgstr "This Discord account is already linked to another account." + #: app/routes/auth.py:473 msgid "Your account has been created! You can now log in." msgstr "Your account has been created! You can now log in." + #: app/routes/auth.py:498 msgid "Discord OAuth2 is not configured." msgstr "Discord OAuth2 is not configured." + #: app/routes/auth.py:547 msgid "" "Discord authorization could not be verified. Please start the connection " @@ -242,51 +311,67 @@ msgid "" msgstr "" "Discord authorization could not be verified. Please start the connection " "again from this page." + #: app/routes/auth.py:556 msgid "Discord authorization failed. No code received." msgstr "Discord authorization failed. No code received." + #: app/routes/auth.py:580 msgid "Failed to connect to Discord. Please try again." msgstr "Failed to connect to Discord. Please try again." + #: app/routes/auth.py:584 msgid "Failed to obtain Discord access token." msgstr "Failed to obtain Discord access token." + #: app/routes/auth.py:599 app/routes/auth.py:609 msgid "Failed to fetch Discord user profile." msgstr "Failed to fetch Discord user profile." + #: app/routes/auth.py:616 msgid "Please log in to connect your Discord account." msgstr "Please log in to connect your Discord account." + #: app/routes/auth.py:635 msgid "Discord account connected!" msgstr "Discord account connected!" + #: app/routes/auth.py:682 msgid "Discord account connected! Your profile has been pre-filled." msgstr "Discord account connected! Your profile has been pre-filled." + #: app/routes/auth.py:710 msgid "You have been logged out." msgstr "You have been logged out." + #: app/routes/evaluations.py:53 msgid "You do not have permission to view evaluations." msgstr "You do not have permission to view evaluations." + #: app/routes/evaluations.py:143 msgid "You do not have permission to evaluate players." msgstr "You do not have permission to evaluate players." + #: app/routes/evaluations.py:148 app/routes/evaluations.py:234 msgid "You do not have permission to evaluate players in this tryout." msgstr "You do not have permission to evaluate players in this tryout." + #: app/routes/evaluations.py:159 msgid "Player is not registered for this tryout." msgstr "Player is not registered for this tryout." + #: app/routes/evaluations.py:164 msgid "Can only evaluate players." msgstr "Can only evaluate players." + #: app/routes/evaluations.py:210 msgid "Evaluation submitted successfully!" msgstr "Evaluation submitted successfully!" + #: app/routes/evaluations.py:212 msgid "Evaluation updated!" msgstr "Evaluation updated!" + #: app/routes/evaluations.py:229 app/routes/teams.py:340 #: app/routes/teams.py:383 app/routes/teams.py:426 app/routes/teams.py:454 #: app/routes/teams.py:482 app/routes/teams.py:519 app/routes/tryouts.py:507 @@ -295,418 +380,548 @@ msgstr "Evaluation updated!" #: app/routes/tryouts.py:677 msgid "Permission denied." msgstr "Permission denied." + #: app/routes/main.py:55 msgid "That language is not available." msgstr "That language is not available." + #: app/routes/matches.py:383 msgid "You do not have permission to schedule matches for this tryout." msgstr "You do not have permission to schedule matches for this tryout." + #: app/routes/matches.py:387 app/routes/matches.py:463 msgid "This tryout has ended. Matches can no longer be created or modified." msgstr "This tryout has ended. Matches can no longer be created or modified." + #: app/routes/matches.py:445 msgid "Match scheduled successfully!" msgstr "Match scheduled successfully!" + #: app/routes/matches.py:459 app/routes/team_matches.py:235 msgid "You do not have permission to edit this match." msgstr "You do not have permission to edit this match." + #: app/routes/matches.py:552 app/routes/team_matches.py:265 msgid "Match updated successfully!" msgstr "Match updated successfully!" + #: app/routes/matches.py:588 app/routes/team_matches.py:284 msgid "You do not have permission to delete this match." msgstr "You do not have permission to delete this match." + #: app/routes/matches.py:591 msgid "This tryout has ended. Matches can no longer be deleted." msgstr "This tryout has ended. Matches can no longer be deleted." + #: app/routes/matches.py:604 app/routes/team_matches.py:289 msgid "Match deleted successfully." msgstr "Match deleted successfully." + #: app/routes/team_matches.py:128 msgid "You do not have permission to schedule matches for this team." msgstr "You do not have permission to schedule matches for this team." + #: app/routes/team_matches.py:220 #, python-format msgid "Team match \"%(title)s\" scheduled successfully!" msgstr "Team match \"%(title)s\" scheduled successfully!" + #: app/routes/teams.py:43 msgid "Use My Team(s) to view your teams." msgstr "Use My Team(s) to view your teams." + #: app/routes/teams.py:46 msgid "You do not have permission to view teams." msgstr "You do not have permission to view teams." + #: app/routes/teams.py:78 msgid "This page is for players." msgstr "This page is for players." + #: app/routes/teams.py:185 msgid "You do not have permission to create teams." msgstr "You do not have permission to create teams." + #: app/routes/teams.py:196 app/routes/teams.py:238 #, python-format msgid "Team \"%(name)s\" already exists." msgstr "Team \"%(name)s\" already exists." + #: app/routes/teams.py:217 #, python-format msgid "Team \"%(name)s\" created successfully!" msgstr "Team \"%(name)s\" created successfully!" + #: app/routes/teams.py:227 msgid "You do not have permission to edit this team." msgstr "You do not have permission to edit this team." + #: app/routes/teams.py:271 #, python-format msgid "Team \"%(name)s\" updated successfully!" msgstr "Team \"%(name)s\" updated successfully!" + #: app/routes/teams.py:299 msgid "You do not have permission to delete teams." msgstr "You do not have permission to delete teams." + #: app/routes/teams.py:330 #, python-format msgid "Team \"%(name)s\" deleted successfully." msgstr "Team \"%(name)s\" deleted successfully." + #: app/routes/teams.py:347 msgid "Please select a coach." msgstr "Please select a coach." + #: app/routes/teams.py:352 msgid "Only coaches can be assigned as coach." msgstr "Only coaches can be assigned as coach." + #: app/routes/teams.py:358 #, python-format msgid "%(username)s is already a coach of %(name)s." msgstr "%(username)s is already a coach of %(name)s." + #: app/routes/teams.py:371 #, python-format msgid "%(username)s added as coach of %(name)s." msgstr "%(username)s added as coach of %(name)s." + #: app/routes/teams.py:390 msgid "Please select a manager." msgstr "Please select a manager." + #: app/routes/teams.py:395 msgid "Only managers can be assigned as manager." msgstr "Only managers can be assigned as manager." + #: app/routes/teams.py:401 #, python-format msgid "%(username)s is already a manager of %(name)s." msgstr "%(username)s is already a manager of %(name)s." + #: app/routes/teams.py:414 #, python-format msgid "%(username)s added as manager of %(name)s." msgstr "%(username)s added as manager of %(name)s." + #: app/routes/teams.py:444 #, python-format msgid "Coach removed from %(name)s." msgstr "Coach removed from %(name)s." + #: app/routes/teams.py:472 #, python-format msgid "Manager removed from %(name)s." msgstr "Manager removed from %(name)s." + #: app/routes/teams.py:489 app/routes/tryouts.py:568 msgid "Please select a player." msgstr "Please select a player." + #: app/routes/teams.py:495 msgid "Can only assign players to teams." msgstr "Can only assign players to teams." + #: app/routes/teams.py:501 #, python-format msgid "%(username)s is already on %(name)s." msgstr "%(username)s is already on %(name)s." + #: app/routes/teams.py:509 #, python-format msgid "%(username)s added to %(name)s!" msgstr "%(username)s added to %(name)s!" + #: app/routes/teams.py:526 app/routes/teams.py:604 #, python-format msgid "%(username)s is not on %(name)s." msgstr "%(username)s is not on %(name)s." + #: app/routes/teams.py:534 #, python-format msgid "%(username)s removed from %(name)s." msgstr "%(username)s removed from %(name)s." + #: app/routes/teams.py:571 app/routes/teams.py:593 msgid "You do not have permission to add notes to this team." msgstr "You do not have permission to add notes to this team." + #: app/routes/teams.py:583 msgid "Team notes added successfully!" msgstr "Team notes added successfully!" + #: app/routes/teams.py:598 app/routes/users/notes.py:222 #: app/routes/users/notes.py:262 msgid "Can only add notes for players." msgstr "Can only add notes for players." + #: app/routes/teams.py:618 #, python-format msgid "Note added for %(username)s!" msgstr "Note added for %(username)s!" + #: app/routes/tryouts.py:147 msgid "You do not have permission to create tryouts." msgstr "You do not have permission to create tryouts." + #: app/routes/tryouts.py:194 msgid "Tryout created successfully!" msgstr "Tryout created successfully!" + #: app/routes/tryouts.py:211 msgid "You do not have permission to edit this tryout." msgstr "You do not have permission to edit this tryout." + #: app/routes/tryouts.py:215 msgid "This tryout has ended and can no longer be modified." msgstr "This tryout has ended and can no longer be modified." + #: app/routes/tryouts.py:261 msgid "Tryout updated successfully!" msgstr "Tryout updated successfully!" + #: app/routes/tryouts.py:301 msgid "You do not have permission to view this tryout." msgstr "You do not have permission to view this tryout." + #: app/routes/tryouts.py:469 msgid "Only players can register for tryouts." msgstr "Only players can register for tryouts." + #: app/routes/tryouts.py:474 msgid "This tryout is not accepting registrations." msgstr "This tryout is not accepting registrations." + #: app/routes/tryouts.py:481 msgid "You are already registered for this tryout." msgstr "You are already registered for this tryout." + #: app/routes/tryouts.py:487 app/routes/tryouts.py:590 msgid "This tryout is full." msgstr "This tryout is full." + #: app/routes/tryouts.py:493 msgid "Successfully registered for tryout!" msgstr "Successfully registered for tryout!" + #: app/routes/tryouts.py:517 #, python-format msgid "Tryout status updated to %(new_status)s." msgstr "Tryout status updated to %(new_status)s." + #: app/routes/tryouts.py:545 msgid "Registration status updated." msgstr "Registration status updated." + #: app/routes/tryouts.py:576 msgid "Can only register players." msgstr "Can only register players." + #: app/routes/tryouts.py:582 #, python-format msgid "%(username)s is already registered for this tryout." msgstr "%(username)s is already registered for this tryout." + #: app/routes/tryouts.py:596 #, python-format msgid "%(username)s registered for tryout!" msgstr "%(username)s registered for tryout!" + #: app/routes/tryouts.py:636 #, python-format msgid "%(username)s removed from tryout." msgstr "%(username)s removed from tryout." + #: app/routes/tryouts.py:662 #, python-format msgid "Team \"%(team_name)s\" created!" msgstr "Team \"%(team_name)s\" created!" + #: app/routes/tryouts.py:699 app/routes/users/notes.py:350 msgid "That player is not registered for this tryout." msgstr "That player is not registered for this tryout." + #: app/routes/tryouts.py:704 msgid "Player is already on this team." msgstr "Player is already on this team." + #: app/routes/tryouts.py:709 msgid "Player added to team!" msgstr "Player added to team!" + #: app/routes/tryouts.py:723 msgid "You do not have permission to delete this tryout." msgstr "You do not have permission to delete this tryout." + #: app/routes/tryouts.py:759 msgid "Tryout deleted successfully." msgstr "Tryout deleted successfully." + #: app/routes/users/_shared.py:54 msgid "No file selected." msgstr "No file selected." + #: app/routes/users/_shared.py:58 msgid "Only PDF files are allowed for contracts." msgstr "Only PDF files are allowed for contracts." + #: app/routes/users/_shared.py:64 app/routes/users/_shared.py:75 #: app/routes/users/_shared.py:77 msgid "That file is not a PDF, whatever its name says." msgstr "That file is not a PDF, whatever its name says." -#: app/routes/users/accounts.py:55 + +#: app/routes/users/accounts.py:56 msgid "Only the president can manage users." msgstr "Only the president can manage users." -#: app/routes/users/accounts.py:70 + +#: app/routes/users/accounts.py:103 msgid "Only the president can edit users." msgstr "Only the president can edit users." -#: app/routes/users/accounts.py:111 + +#: app/routes/users/accounts.py:144 msgid "Email already in use by another account." msgstr "Email already in use by another account." -#: app/routes/users/accounts.py:138 + +#: app/routes/users/accounts.py:171 msgid "You cannot change your own role. Ask another president to do it." msgstr "You cannot change your own role. Ask another president to do it." -#: app/routes/users/accounts.py:151 + +#: app/routes/users/accounts.py:184 msgid "" "This is the last active president. Promote another account before " "changing this one." msgstr "" "This is the last active president. Promote another account before " "changing this one." -#: app/routes/users/accounts.py:228 + +#: app/routes/users/accounts.py:261 #, python-format msgid "User %(username)s updated successfully!" msgstr "User %(username)s updated successfully!" -#: app/routes/users/accounts.py:249 + +#: app/routes/users/accounts.py:282 msgid "Only the president can delete users." msgstr "Only the president can delete users." -#: app/routes/users/accounts.py:253 + +#: app/routes/users/accounts.py:286 msgid "You cannot delete your own account." msgstr "You cannot delete your own account." -#: app/routes/users/accounts.py:312 + +#: app/routes/users/accounts.py:345 #, python-format msgid "User %(deleted_username)s has been removed." msgstr "User %(deleted_username)s has been removed." -#: app/routes/users/accounts.py:323 + +#: app/routes/users/accounts.py:356 msgid "Only the president can create users." msgstr "Only the president can create users." -#: app/routes/users/accounts.py:371 + +#: app/routes/users/accounts.py:404 #, python-format msgid "User %(full_name)s created as %(role)s!" msgstr "User %(full_name)s created as %(role)s!" + #: app/routes/users/availability.py:210 msgid "Only coaches can manage availability." msgstr "Only coaches can manage availability." -#: app/routes/users/contracts.py:92 + +#: app/routes/users/contracts.py:104 msgid "Only presidents, managers, and coaches can upload contracts." msgstr "Only presidents, managers, and coaches can upload contracts." -#: app/routes/users/contracts.py:111 + +#: app/routes/users/contracts.py:108 app/routes/users/contracts.py:189 +msgid "Document uploads are currently disabled." +msgstr "Document uploads are currently disabled." + +#: app/routes/users/contracts.py:127 msgid "You do not have permission to upload a contract for this player." msgstr "You do not have permission to upload a contract for this player." -#: app/routes/users/contracts.py:138 app/routes/users/contracts.py:188 -#: app/routes/users/contracts.py:211 app/routes/users/contracts.py:230 + +#: app/routes/users/contracts.py:155 app/routes/users/contracts.py:210 +#: app/routes/users/contracts.py:233 app/routes/users/contracts.py:252 msgid "Contract storage is temporarily unavailable. Please try again later." msgstr "Contract storage is temporarily unavailable. Please try again later." -#: app/routes/users/contracts.py:153 + +#: app/routes/users/contracts.py:171 #, python-format msgid "Contract uploaded successfully for %(username)s!" msgstr "Contract uploaded successfully for %(username)s!" -#: app/routes/users/contracts.py:167 + +#: app/routes/users/contracts.py:185 msgid "Only the player can upload their signed contract." msgstr "Only the player can upload their signed contract." -#: app/routes/users/contracts.py:196 + +#: app/routes/users/contracts.py:218 msgid "Signed contract uploaded successfully!" msgstr "Signed contract uploaded successfully!" -#: app/routes/users/contracts.py:206 app/routes/users/contracts.py:222 + +#: app/routes/users/contracts.py:228 app/routes/users/contracts.py:244 msgid "You do not have permission to download this contract." msgstr "You do not have permission to download this contract." -#: app/routes/users/contracts.py:225 + +#: app/routes/users/contracts.py:247 msgid "No signed contract available." msgstr "No signed contract available." + #: app/routes/users/notes.py:43 msgid "This page is for players only." msgstr "This page is for players only." + #: app/routes/users/notes.py:80 msgid "Only coaches can access the notes dashboard." msgstr "Only coaches can access the notes dashboard." + #: app/routes/users/notes.py:172 msgid "Only coaches can manage team notes." msgstr "Only coaches can manage team notes." + #: app/routes/users/notes.py:178 msgid "You are not assigned to a team." msgstr "You are not assigned to a team." + #: app/routes/users/notes.py:195 msgid "Team notes saved successfully!" msgstr "Team notes saved successfully!" + #: app/routes/users/notes.py:210 msgid "Only coaches can manage personal notes." msgstr "Only coaches can manage personal notes." + #: app/routes/users/notes.py:226 app/routes/users/notes.py:266 #: app/routes/users/notes.py:346 app/routes/users/notes.py:411 msgid "You can only write notes about players you work with." msgstr "You can only write notes about players you work with." + #: app/routes/users/notes.py:236 app/routes/users/notes.py:306 #, python-format msgid "Note added for %(username)s." msgstr "Note added for %(username)s." + #: app/routes/users/notes.py:250 app/routes/users/notes.py:320 #: app/routes/users/notes.py:384 msgid "Only coaches can add personal notes." msgstr "Only coaches can add personal notes." + #: app/routes/users/notes.py:272 msgid "You cannot use that match as note context." msgstr "You cannot use that match as note context." + #: app/routes/users/notes.py:275 msgid "That player did not participate in the selected match." msgstr "That player did not participate in the selected match." + #: app/routes/users/notes.py:281 msgid "You cannot use that tryout as note context." msgstr "You cannot use that tryout as note context." + #: app/routes/users/notes.py:284 msgid "That player is not registered for the selected tryout." msgstr "That player is not registered for the selected tryout." + #: app/routes/users/notes.py:290 msgid "You cannot use that team as note context." msgstr "You cannot use that team as note context." + #: app/routes/users/notes.py:293 msgid "That player is not on the selected team." msgstr "That player is not on the selected team." + #: app/routes/users/notes.py:325 msgid "You do not have permission to add notes for this tryout." msgstr "You do not have permission to add notes for this tryout." + #: app/routes/users/notes.py:342 msgid "Invalid tryout context." msgstr "Invalid tryout context." + #: app/routes/users/notes.py:361 app/routes/users/notes.py:426 msgid "Note added successfully." msgstr "Note added successfully." + #: app/routes/users/notes.py:389 msgid "You do not have permission to add notes for this match." msgstr "You do not have permission to add notes for this match." + #: app/routes/users/notes.py:407 msgid "Invalid match context." msgstr "Invalid match context." + #: app/routes/users/notes.py:415 msgid "That player did not participate in this match." msgstr "That player did not participate in this match." + #: app/routes/users/one_on_one.py:22 msgid "Only players can request One on One sessions." msgstr "Only players can request One on One sessions." + #: app/routes/users/one_on_one.py:35 msgid "You do not have a coach assigned to your team." msgstr "You do not have a coach assigned to your team." + #: app/routes/users/one_on_one.py:66 msgid "Cannot request One on One - no coach assigned." msgstr "Cannot request One on One - no coach assigned." + #: app/routes/users/one_on_one.py:92 msgid "The requested time is not within the coach's availability." msgstr "The requested time is not within the coach's availability." + #: app/routes/users/one_on_one.py:120 msgid "Your One on One request has been submitted!" msgstr "Your One on One request has been submitted!" + #: app/routes/users/one_on_one.py:165 msgid "Only coaches can accept One on One requests." msgstr "Only coaches can accept One on One requests." + #: app/routes/users/one_on_one.py:171 app/routes/users/one_on_one.py:221 msgid "This request is not for you." msgstr "This request is not for you." + #: app/routes/users/one_on_one.py:175 app/routes/users/one_on_one.py:225 msgid "This request has already been processed." msgstr "This request has already been processed." + #: app/routes/users/one_on_one.py:202 #, python-format msgid "One on One request from %(player)s has been approved!" msgstr "One on One request from %(player)s has been approved!" + #: app/routes/users/one_on_one.py:215 msgid "Only coaches can reject One on One requests." msgstr "Only coaches can reject One on One requests." + #: app/routes/users/one_on_one.py:262 #, python-format msgid "One on One request from %(player)s has been rejected." msgstr "One on One request from %(player)s has been rejected." + #: app/routes/users/profile.py:82 msgid "Username already taken." msgstr "Username already taken." + #: app/routes/users/profile.py:92 msgid "Email already in use." msgstr "Email already in use." + #: app/routes/users/profile.py:131 msgid "Profile updated successfully!" msgstr "Profile updated successfully!" + #: app/templates/errors/400.html:2 msgid "400 Bad Request" msgstr "400 Bad Request" + #: app/templates/errors/400.html:3 msgid "Bad Request" msgstr "Bad Request" + #: app/templates/errors/400.html:9 msgid "400 — Bad Request" msgstr "400 — Bad Request" + #: app/templates/errors/400.html:10 msgid "" "The request could not be understood by the server. Please check your " @@ -714,19 +929,24 @@ msgid "" msgstr "" "The request could not be understood by the server. Please check your " "input and try again." + #: app/templates/errors/400.html:12 app/templates/errors/403.html:12 #: app/templates/errors/429.html:12 msgid "Go Back" msgstr "Go Back" + #: app/templates/errors/403.html:2 msgid "403 Forbidden" msgstr "403 Forbidden" + #: app/templates/errors/403.html:3 msgid "Access Denied" msgstr "Access Denied" + #: app/templates/errors/403.html:9 msgid "403 — Forbidden" msgstr "403 — Forbidden" + #: app/templates/errors/403.html:10 msgid "" "You do not have permission to access this resource. If you believe this " @@ -734,15 +954,19 @@ msgid "" msgstr "" "You do not have permission to access this resource. If you believe this " "is an error, please contact an administrator." + #: app/templates/errors/404.html:2 msgid "404 Not Found" msgstr "404 Not Found" + #: app/templates/errors/404.html:3 msgid "Page Not Found" msgstr "Page Not Found" + #: app/templates/errors/404.html:9 msgid "404 — Not Found" msgstr "404 — Not Found" + #: app/templates/errors/404.html:10 msgid "" "The page you are looking for does not exist. It may have been moved or " @@ -750,18 +974,23 @@ msgid "" msgstr "" "The page you are looking for does not exist. It may have been moved or " "deleted." + #: app/templates/errors/404.html:12 msgid "Return Home" msgstr "Return Home" + #: app/templates/errors/429.html:2 msgid "429 Too Many Requests" msgstr "429 Too Many Requests" + #: app/templates/errors/429.html:3 msgid "Rate Limit Exceeded" msgstr "Rate Limit Exceeded" + #: app/templates/errors/429.html:9 msgid "429 — Too Many Requests" msgstr "429 — Too Many Requests" + #: app/templates/errors/429.html:10 msgid "" "You have sent too many requests in a short period. Please wait a moment " @@ -769,15 +998,19 @@ msgid "" msgstr "" "You have sent too many requests in a short period. Please wait a moment " "and try again." + #: app/templates/errors/500.html:2 msgid "500 Server Error" msgstr "500 Server Error" + #: app/templates/errors/500.html:3 msgid "Internal Server Error" msgstr "Internal Server Error" + #: app/templates/errors/500.html:9 msgid "500 — Internal Server Error" msgstr "500 — Internal Server Error" + #: app/templates/errors/500.html:10 msgid "" "Something went wrong on our end. The error has been logged and will be " @@ -785,98 +1018,124 @@ msgid "" msgstr "" "Something went wrong on our end. The error has been logged and will be " "investigated. Please try again later." + #: app/templates/errors/500.html:15 msgid "Reference to quote if you report this:" msgstr "Reference to quote if you report this:" + #: app/templates/errors/500.html:18 msgid "Try Again" msgstr "Try Again" + #: app/templates/layouts/_language_switcher.html:10 msgid "Language" msgstr "Language" + #: app/templates/layouts/_pagination.html:19 msgid "Pagination" msgstr "Pagination" + #: app/templates/layouts/_pagination.html:22 #: app/templates/layouts/_pagination.html:24 msgid "Previous" msgstr "Previous" + #: app/templates/layouts/_pagination.html:28 #, python-format msgid "Page %(page)s of %(pages)s" msgstr "Page %(page)s of %(pages)s" + #: app/templates/layouts/_pagination.html:30 #, python-format msgid "%(total)s in total" msgstr "%(total)s in total" + #: app/templates/layouts/_pagination.html:35 #: app/templates/layouts/_pagination.html:37 msgid "Next" msgstr "Next" + #: app/templates/layouts/base.html:48 app/templates/layouts/base.html:154 #: app/templates/pages/dashboard.html:2 app/templates/pages/dashboard.html:3 msgid "Dashboard" msgstr "Dashboard" + #: app/templates/layouts/base.html:54 app/templates/pages/tryouts.html:2 #: app/templates/pages/tryouts.html:3 msgid "Tryouts" msgstr "Tryouts" + #: app/templates/layouts/base.html:60 app/templates/pages/calendar.html:2 #: app/templates/pages/calendar.html:3 msgid "Calendar" msgstr "Calendar" + #: app/templates/layouts/base.html:67 app/templates/pages/dashboard.html:43 #: app/templates/pages/evaluations.html:3 #: app/templates/pages/evaluations.html:4 msgid "Evaluations" msgstr "Evaluations" + #: app/templates/layouts/base.html:75 app/templates/pages/my_teams.html:2 #: app/templates/pages/my_teams.html:3 msgid "My Team(s)" msgstr "My Team(s)" + #: app/templates/layouts/base.html:82 msgid "Manage Teams" msgstr "Manage Teams" + #: app/templates/layouts/base.html:90 app/templates/pages/users.html:3 #: app/templates/pages/users.html:4 msgid "Manage Users" msgstr "Manage Users" + #: app/templates/layouts/base.html:104 #: app/templates/pages/player_personal_notes.html:2 #: app/templates/pages/player_personal_notes.html:3 msgid "My Notes" msgstr "My Notes" + #: app/templates/layouts/base.html:112 msgid "Notes & One on One" msgstr "Notes & One on One" + #: app/templates/layouts/base.html:119 app/templates/pages/contracts.html:2 #: app/templates/pages/contracts.html:3 app/templates/pages/profile.html:9 msgid "Contracts" msgstr "Contracts" + #: app/templates/layouts/base.html:126 app/templates/pages/profile.html:2 #: app/templates/pages/profile.html:3 msgid "My Profile" msgstr "My Profile" + #: app/templates/layouts/base.html:137 msgid "Logout" msgstr "Logout" + #: app/templates/layouts/base.html:158 msgid "Toggle dark mode" msgstr "Toggle dark mode" + #: app/templates/layouts/base.html:170 app/templates/layouts/base.html:189 msgid "Dismiss" msgstr "Dismiss" + #: app/templates/layouts/base.html:199 msgid "UdeS team manager" msgstr "UdeS team manager" + #: app/templates/layouts/macros.html:116 msgid "Close" msgstr "Close" + #: app/templates/pages/add_note.html:2 app/templates/pages/add_note.html:3 #: app/templates/pages/add_note.html:22 app/templates/pages/notes.html:38 #: app/templates/pages/personal_notes.html:9 msgid "Add Personal Note" msgstr "Add Personal Note" + #: app/templates/pages/add_note.html:47 app/templates/pages/contracts.html:25 #: app/templates/pages/dashboard.html:249 #: app/templates/pages/dashboard.html:363 app/templates/pages/my_teams.html:52 @@ -886,39 +1145,50 @@ msgstr "Add Personal Note" #: app/templates/pages/view_tryout.html:498 msgid "Player" msgstr "Player" + #: app/templates/pages/add_note.html:49 app/templates/pages/teams.html:216 #: app/templates/pages/upload_contract.html:18 #: app/templates/pages/view_tryout.html:130 msgid "-- Select a player --" msgstr "-- Select a player --" + #: app/templates/pages/add_note.html:59 app/templates/pages/notes.html:58 #: app/templates/pages/personal_notes.html:29 msgid "Note Content" msgstr "Note Content" + #: app/templates/pages/add_note.html:60 msgid "Enter your coaching notes..." msgstr "Enter your coaching notes..." + #: app/templates/pages/add_note.html:65 msgid "Link to Tryout (Optional)" msgstr "Link to Tryout (Optional)" + #: app/templates/pages/add_note.html:67 msgid "-- No tryout --" msgstr "-- No tryout --" + #: app/templates/pages/add_note.html:75 msgid "Link to Match (Optional)" msgstr "Link to Match (Optional)" + #: app/templates/pages/add_note.html:77 msgid "-- No match --" msgstr "-- No match --" + #: app/templates/pages/add_note.html:85 msgid "Link to Team (Optional)" msgstr "Link to Team (Optional)" + #: app/templates/pages/add_note.html:87 msgid "-- No team --" msgstr "-- No team --" + #: app/templates/pages/add_note.html:97 msgid "Team Notes (Reference)" msgstr "Team Notes (Reference)" + #: app/templates/pages/add_note.html:120 #: app/templates/pages/evaluate_player.html:131 #: app/templates/pages/notes.html:100 @@ -926,111 +1196,144 @@ msgstr "Team Notes (Reference)" #: app/templates/pages/view_tryout.html:309 msgid "Add Note" msgstr "Add Note" + #: app/templates/pages/calendar.html:9 app/templates/pages/view_tryout.html:302 msgid "Schedule" msgstr "Schedule" + #: app/templates/pages/calendar.html:13 msgid "Month" msgstr "Month" + #: app/templates/pages/calendar.html:16 msgid "Week" msgstr "Week" + #: app/templates/pages/calendar.html:19 msgid "Day" msgstr "Day" + #: app/templates/pages/calendar.html:22 msgid "List" msgstr "List" + #: app/templates/pages/calendar.html:37 msgid "Create New Event" msgstr "Create New Event" + #: app/templates/pages/calendar.html:41 msgid "Date:" msgstr "Date:" + #: app/templates/pages/calendar.html:46 msgid "Schedule Tryout Match" msgstr "Schedule Tryout Match" + #: app/templates/pages/calendar.html:47 msgid "Add a scrim/match inside an existing tryout" msgstr "Add a scrim/match inside an existing tryout" + #: app/templates/pages/calendar.html:50 msgid "-- Select a tryout --" msgstr "-- Select a tryout --" + #: app/templates/pages/calendar.html:53 app/templates/pages/calendar.html:68 msgid "Go" msgstr "Go" + #: app/templates/pages/calendar.html:61 app/templates/pages/teams.html:131 msgid "Schedule Team Match" msgstr "Schedule Team Match" + #: app/templates/pages/calendar.html:62 msgid "Regular season match for an org team" msgstr "Regular season match for an org team" + #: app/templates/pages/calendar.html:65 msgid "-- Select a team --" msgstr "-- Select a team --" + #: app/templates/pages/calendar.html:76 msgid "Create New Tryout" msgstr "Create New Tryout" + #: app/templates/pages/calendar.html:77 msgid "Create a brand new tryout event" msgstr "Create a brand new tryout event" + #: app/templates/pages/calendar.html:79 msgid "Create Tryout" msgstr "Create Tryout" + #: app/templates/pages/calendar.html:92 msgid "Event Details" msgstr "Event Details" + #: app/templates/pages/calendar.html:98 msgid "Confirm" msgstr "Confirm" + #: app/templates/pages/calendar.html:102 #: app/templates/pages/team_matches.html:103 msgid "Delete Match" msgstr "Delete Match" + #: app/templates/pages/calendar.html:105 #: app/templates/pages/team_matches.html:98 msgid "Edit Match" msgstr "Edit Match" + #: app/templates/pages/calendar.html:108 msgid "View Tryout" msgstr "View Tryout" + #: app/templates/pages/coach_availability.html:2 #: app/templates/pages/coach_availability.html:3 msgid "Manage Availability" msgstr "Manage Availability" + #: app/templates/pages/coach_availability.html:9 msgid "Set Your Weekly Availability" msgstr "Set Your Weekly Availability" + #: app/templates/pages/coach_availability.html:10 msgid "Select time slots when you're available for One on One sessions" msgstr "Select time slots when you're available for One on One sessions" + #: app/templates/pages/coach_availability.html:14 #: app/templates/pages/profile.html:256 msgid "Loading availability grid..." msgstr "Loading availability grid..." + #: app/templates/pages/coach_availability.html:19 msgid "Save Availability" msgstr "Save Availability" + #: app/templates/pages/coach_availability.html:22 #: app/templates/pages/profile.html:240 app/templates/pages/profile.html:260 msgid "Clear All" msgstr "Clear All" + #: app/templates/pages/contracts.html:9 #: app/templates/pages/upload_contract.html:2 #: app/templates/pages/upload_contract.html:3 #: app/templates/pages/upload_contract.html:39 msgid "Upload Contract" msgstr "Upload Contract" + #: app/templates/pages/contracts.html:17 msgid "Contract Dropbox" msgstr "Contract Dropbox" + #: app/templates/pages/contracts.html:26 app/templates/pages/notes.html:87 #: app/templates/pages/team_matches.html:27 msgid "Team" msgstr "Team" + #: app/templates/pages/contracts.html:27 msgid "Contract" msgstr "Contract" + #: app/templates/pages/contracts.html:28 app/templates/pages/dashboard.html:95 #: app/templates/pages/dashboard.html:118 #: app/templates/pages/dashboard.html:175 @@ -1040,39 +1343,48 @@ msgstr "Contract" #: app/templates/pages/notes.html:126 app/templates/pages/one_on_one.html:73 #: app/templates/pages/team_match_form.html:61 #: app/templates/pages/team_matches.html:33 app/templates/pages/teams.html:146 -#: app/templates/pages/users.html:24 app/templates/pages/view_tryout.html:155 +#: app/templates/pages/users.html:25 app/templates/pages/view_tryout.html:155 #: app/templates/pages/view_tryout.html:327 msgid "Status" msgstr "Status" + #: app/templates/pages/contracts.html:29 msgid "Uploaded" msgstr "Uploaded" + #: app/templates/pages/contracts.html:30 app/templates/pages/dashboard.html:175 #: app/templates/pages/notes.html:127 app/templates/pages/team_matches.html:34 -#: app/templates/pages/teams.html:151 app/templates/pages/users.html:26 +#: app/templates/pages/teams.html:151 app/templates/pages/users.html:27 #: app/templates/pages/view_tryout.html:160 #: app/templates/pages/view_tryout.html:329 msgid "Actions" msgstr "Actions" + #: app/templates/pages/contracts.html:49 app/templates/pages/contracts.html:50 msgid "Download" msgstr "Download" + #: app/templates/pages/contracts.html:53 msgid "Download Signed" msgstr "Download Signed" + #: app/templates/pages/contracts.html:54 msgid "Signed" msgstr "Signed" + #: app/templates/pages/contracts.html:58 app/templates/pages/contracts.html:89 #: app/templates/pages/contracts.html:102 msgid "Upload Signed Contract" msgstr "Upload Signed Contract" + #: app/templates/pages/contracts.html:59 msgid "Return Signed" msgstr "Return Signed" + #: app/templates/pages/contracts.html:72 msgid "No contracts found" msgstr "No contracts found" + #: app/templates/pages/contracts.html:74 msgid "" "No contracts have been uploaded for you yet. Contact your coach or " @@ -1080,6 +1392,7 @@ msgid "" msgstr "" "No contracts have been uploaded for you yet. Contact your coach or " "manager." + #: app/templates/pages/contracts.html:76 msgid "" "No contracts have been uploaded yet. Upload a contract using the button " @@ -1087,100 +1400,126 @@ msgid "" msgstr "" "No contracts have been uploaded yet. Upload a contract using the button " "above." + #: app/templates/pages/contracts.html:96 msgid "Select Signed Contract File" msgstr "Select Signed Contract File" + #: app/templates/pages/contracts.html:98 #: app/templates/pages/upload_contract.html:28 msgid "Accepted format: PDF" msgstr "Accepted formats: PDF, DOC, DOCX, JPG, PNG" + #: app/templates/pages/contracts.html:101 #: app/templates/pages/match_form.html:265 app/templates/pages/notes.html:189 #: app/templates/pages/teams.html:48 app/templates/pages/teams.html:295 #: app/templates/pages/view_tryout.html:245 msgid "Cancel" msgstr "Cancel" + #: app/templates/pages/create_user.html:2 #: app/templates/pages/create_user.html:3 #: app/templates/pages/create_user.html:47 msgid "Create User" msgstr "Create User" + #: app/templates/pages/create_user.html:13 #: app/templates/pages/edit_profile.html:17 #: app/templates/pages/edit_user.html:13 app/templates/pages/register.html:10 msgid "Full Name" msgstr "Full Name" + #: app/templates/pages/create_user.html:14 msgid "Enter full name" msgstr "Enter full name" + #: app/templates/pages/create_user.html:17 #: app/templates/pages/edit_profile.html:13 app/templates/pages/login.html:7 #: app/templates/pages/register.html:15 app/templates/pages/users.html:21 msgid "Username" msgstr "Username" + #: app/templates/pages/create_user.html:18 msgid "Choose username" msgstr "Choose username" + #: app/templates/pages/create_user.html:23 #: app/templates/pages/edit_profile.html:23 #: app/templates/pages/edit_user.html:17 app/templates/pages/register.html:20 #: app/templates/pages/teams.html:148 app/templates/pages/users.html:22 msgid "Email" msgstr "Email" + #: app/templates/pages/create_user.html:24 msgid "Enter email" msgstr "Enter email" + #: app/templates/pages/create_user.html:27 #: app/templates/pages/edit_profile.html:27 #: app/templates/pages/edit_user.html:23 app/templates/pages/teams.html:149 msgid "Phone" msgstr "Phone" + #: app/templates/pages/create_user.html:28 msgid "Phone number" msgstr "Phone number" + #: app/templates/pages/create_user.html:31 #: app/templates/pages/dashboard.html:74 app/templates/pages/edit_user.html:27 #: app/templates/pages/users.html:23 msgid "Role" msgstr "Role" + #: app/templates/pages/create_user.html:41 app/templates/pages/login.html:11 #: app/templates/pages/register.html:137 msgid "Password" msgstr "Password" + #: app/templates/pages/create_user.html:42 msgid "Set password" msgstr "Set password" + #: app/templates/pages/dashboard.html:16 msgid "Total Users" msgstr "Total Users" + #: app/templates/pages/dashboard.html:25 app/templates/pages/dashboard.html:175 msgid "Players" msgstr "Players" + #: app/templates/pages/dashboard.html:34 msgid "Total Tryouts" msgstr "Total Tryouts" + #: app/templates/pages/dashboard.html:52 msgid "Active Tryouts" msgstr "Active Tryouts" + #: app/templates/pages/dashboard.html:61 #: app/templates/pages/view_tryout.html:21 msgid "Upcoming" msgstr "Upcoming" + #: app/templates/pages/dashboard.html:69 msgid "Recent Users" msgstr "Recent Users" + #: app/templates/pages/dashboard.html:74 app/templates/pages/users.html:20 msgid "Name" msgstr "Name" -#: app/templates/pages/dashboard.html:74 app/templates/pages/users.html:25 + +#: app/templates/pages/dashboard.html:74 app/templates/pages/users.html:26 msgid "Joined" msgstr "Joined" + #: app/templates/pages/dashboard.html:90 msgid "Recent Tryouts" msgstr "Recent Tryouts" + #: app/templates/pages/dashboard.html:95 app/templates/pages/dashboard.html:175 msgid "Title" msgstr "Title" + #: app/templates/pages/dashboard.html:95 app/templates/pages/dashboard.html:175 #: app/templates/pages/dashboard.html:249 #: app/templates/pages/dashboard.html:321 @@ -1191,10 +1530,12 @@ msgstr "Title" #: app/templates/pages/view_tryout.html:323 msgid "Date" msgstr "Date" + #: app/templates/pages/dashboard.html:114 #: app/templates/pages/dashboard.html:198 app/templates/pages/my_teams.html:84 msgid "Upcoming Matches" msgstr "Upcoming Matches" + #: app/templates/pages/dashboard.html:118 #: app/templates/pages/dashboard.html:202 #: app/templates/pages/dashboard.html:285 app/templates/pages/my_teams.html:90 @@ -1202,6 +1543,7 @@ msgstr "Upcoming Matches" #: app/templates/pages/teams.html:132 app/templates/pages/view_tryout.html:321 msgid "Match" msgstr "Match" + #: app/templates/pages/dashboard.html:118 #: app/templates/pages/dashboard.html:202 #: app/templates/pages/dashboard.html:249 @@ -1209,88 +1551,112 @@ msgstr "Match" #: app/templates/pages/dashboard.html:321 app/templates/pages/notes.html:78 msgid "Tryout" msgstr "Tryout" + #: app/templates/pages/dashboard.html:118 #: app/templates/pages/dashboard.html:202 #: app/templates/pages/dashboard.html:285 msgid "Date & Time" msgstr "Date & Time" + #: app/templates/pages/dashboard.html:145 #: app/templates/pages/dashboard.html:169 #: app/templates/pages/dashboard.html:273 msgid "My Tryouts" msgstr "My Tryouts" + #: app/templates/pages/dashboard.html:154 msgid "Active" msgstr "Active" + #: app/templates/pages/dashboard.html:163 msgid "My Evaluations" msgstr "My Evaluations" + #: app/templates/pages/dashboard.html:229 msgid "Evaluations Done" msgstr "Evaluations Done" + #: app/templates/pages/dashboard.html:238 #: app/templates/pages/one_on_one.html:85 msgid "Pending" msgstr "Pending" + #: app/templates/pages/dashboard.html:244 msgid "Recent Evaluations" msgstr "Recent Evaluations" + #: app/templates/pages/dashboard.html:249 msgid "Score" msgstr "Score" + #: app/templates/pages/dashboard.html:280 msgid "My Next Matches" msgstr "My Next Matches" + #: app/templates/pages/dashboard.html:285 app/templates/pages/my_teams.html:91 #: app/templates/pages/team_matches.html:28 msgid "Opponent" msgstr "Opponent" + #: app/templates/pages/dashboard.html:311 msgid "No upcoming matches yet." msgstr "No upcoming matches yet." + #: app/templates/pages/dashboard.html:317 msgid "My Registrations" msgstr "My Registrations" + #: app/templates/pages/dashboard.html:344 msgid "Total Players" msgstr "Total Players" + #: app/templates/pages/dashboard.html:353 msgid "Total Evaluations" msgstr "Total Evaluations" + #: app/templates/pages/dashboard.html:359 msgid "Top Rated Players" msgstr "Top Rated Players" + #: app/templates/pages/dashboard.html:363 msgid "Avg Score" msgstr "Avg Score" + #: app/templates/pages/dashboard.html:373 #: app/templates/pages/view_tryout.html:532 msgid "No evaluations yet." msgstr "No evaluations yet." + #: app/templates/pages/edit_profile.html:2 #: app/templates/pages/edit_profile.html:3 app/templates/pages/profile.html:12 msgid "Edit Profile" msgstr "Edit Profile" + #: app/templates/pages/edit_profile.html:33 #: app/templates/pages/edit_user.html:43 app/templates/pages/profile.html:63 #: app/templates/pages/register.html:81 msgid "E-Sports Profile" msgstr "E-Sports Profile" + #: app/templates/pages/edit_profile.html:34 msgid "Update your competitive gaming profile for tryouts." msgstr "Update your competitive gaming profile for tryouts." + #: app/templates/pages/edit_profile.html:37 #: app/templates/pages/register.html:85 msgid "Games You Play" msgstr "Games You Play" + #: app/templates/pages/edit_profile.html:47 #: app/templates/pages/register.html:99 msgid "Select all games you're signing in for." msgstr "Select all games you're signing in for." + #: app/templates/pages/edit_profile.html:53 #: app/templates/pages/edit_user.html:61 msgid "Gamertags for TRN" msgstr "Gamertags for TRN" + #: app/templates/pages/edit_profile.html:54 msgid "" "Enter your gamertag for each selected game to link to your Tracker " @@ -1298,86 +1664,110 @@ msgid "" msgstr "" "Enter your gamertag for each selected game to link to your Tracker " "Network profile." + #: app/templates/pages/edit_profile.html:62 #: app/templates/pages/edit_user.html:70 app/templates/pages/edit_user.html:71 #: app/templates/pages/view_user.html:58 msgid "Gamertag" msgstr "Gamertag" + #: app/templates/pages/edit_profile.html:67 #: app/templates/pages/edit_user.html:75 app/templates/pages/view_user.html:59 msgid "Platform" msgstr "Platform" + #: app/templates/pages/edit_profile.html:69 #: app/templates/pages/edit_user.html:77 msgid "Select Platform" msgstr "Select Platform" + #: app/templates/pages/edit_profile.html:83 #: app/templates/pages/edit_user.html:91 msgid "Discord Username" msgstr "Discord Username" + #: app/templates/pages/edit_profile.html:84 #: app/templates/pages/edit_user.html:92 msgid "e.g. Name#1234" msgstr "e.g. Name#1234" + #: app/templates/pages/edit_profile.html:87 #: app/templates/pages/register.html:57 msgid "Reconnect" msgstr "Reconnect" + #: app/templates/pages/edit_profile.html:87 #: app/templates/pages/register.html:67 msgid "Connect Discord Account" msgstr "Connect Discord Account" + #: app/templates/pages/edit_profile.html:93 #: app/templates/pages/edit_user.html:100 msgid "League OS Connection" msgstr "League OS Connection" + #: app/templates/pages/edit_profile.html:94 #: app/templates/pages/edit_user.html:101 app/templates/pages/register.html:129 msgid "League OS profile link or ID" msgstr "League OS profile link or ID" + #: app/templates/pages/edit_profile.html:99 msgid "Change Password" msgstr "Change Password" + #: app/templates/pages/edit_profile.html:100 msgid "Leave blank to keep your current password." msgstr "Leave blank to keep your current password." + #: app/templates/pages/edit_profile.html:102 msgid "New Password" msgstr "New Password" + #: app/templates/pages/edit_profile.html:103 #: app/templates/pages/edit_user.html:107 msgid "Enter new password" msgstr "Enter new password" + #: app/templates/pages/edit_profile.html:108 app/templates/pages/teams.html:296 msgid "Save Changes" msgstr "Save Changes" + #: app/templates/pages/edit_user.html:3 msgid "Edit User" msgstr "Edit User" + #: app/templates/pages/edit_user.html:46 msgid "Games" msgstr "Games" + #: app/templates/pages/edit_user.html:62 msgid "Enter gamertag for each selected game to link to Tracker Network." msgstr "Enter gamertag for each selected game to link to Tracker Network." + #: app/templates/pages/edit_user.html:95 msgid "(for DMs)" msgstr "(for DMs)" + #: app/templates/pages/edit_user.html:96 msgid "Numeric ID (e.g. 123456789012345678)" msgstr "Numeric ID (e.g. 123456789012345678)" + #: app/templates/pages/edit_user.html:97 msgid "Enable Developer Mode in Discord → Right-click profile → Copy ID" msgstr "Enable Developer Mode in Discord → Right-click profile → Copy ID" + #: app/templates/pages/edit_user.html:106 msgid "(leave blank to keep current)" msgstr "(leave blank to keep current)" + #: app/templates/pages/edit_user.html:111 msgid "Update User" msgstr "Update User" + #: app/templates/pages/evaluate_player.html:10 msgid "Player Evaluation" msgstr "Player Evaluation" + #: app/templates/pages/evaluate_player.html:24 msgid "" "You have already evaluated this player. Your previous scores are shown " @@ -1385,166 +1775,213 @@ msgid "" msgstr "" "You have already evaluated this player. Your previous scores are shown " "below." + #: app/templates/pages/evaluate_player.html:33 msgid "Mecanics (1-10)" msgstr "Mecanics (1-10)" + #: app/templates/pages/evaluate_player.html:40 msgid "Cohesion (1-10)" msgstr "Cohesion (1-10)" + #: app/templates/pages/evaluate_player.html:47 msgid "Communication (1-10)" msgstr "Communication (1-10)" + #: app/templates/pages/evaluate_player.html:57 msgid "Gamesense (1-10)" msgstr "Gamesense (1-10)" + #: app/templates/pages/evaluate_player.html:64 msgid "Versatility (1-10)" msgstr "Versatility (1-10)" + #: app/templates/pages/evaluate_player.html:71 msgid "Discipline (1-10)" msgstr "Discipline (1-10)" + #: app/templates/pages/evaluate_player.html:81 msgid "Analysis (1-10)" msgstr "Analysis (1-10)" + #: app/templates/pages/evaluate_player.html:88 msgid "Sport Ethics (1-10)" msgstr "Sport Ethics (1-10)" + #: app/templates/pages/evaluate_player.html:95 msgid "Mental (1-10)" msgstr "Mental (1-10)" + #: app/templates/pages/evaluate_player.html:106 msgid "Recommended Position" msgstr "Recommended Position" + #: app/templates/pages/evaluate_player.html:109 #: app/templates/pages/view_tryout.html:280 msgid "-- Select Position --" msgstr "-- Select Position --" + #: app/templates/pages/evaluate_player.html:115 msgid "Enter position (optional)" msgstr "Enter position (optional)" + #: app/templates/pages/evaluate_player.html:121 msgid "Comments" msgstr "Comments" + #: app/templates/pages/evaluate_player.html:122 msgid "Enter your evaluation notes..." msgstr "Enter your evaluation notes..." + #: app/templates/pages/evaluate_player.html:130 msgid "Add note for this player" msgstr "Add note for this player" + #: app/templates/pages/evaluate_player.html:147 #: app/templates/pages/view_tryout.html:499 msgid "Evaluator" msgstr "Evaluator" + #: app/templates/pages/evaluate_player.html:148 #: app/templates/pages/view_tryout.html:500 msgid "Mecanics" msgstr "Mecanics" + #: app/templates/pages/evaluate_player.html:149 #: app/templates/pages/view_tryout.html:501 msgid "Cohesion" msgstr "Cohesion" + #: app/templates/pages/evaluate_player.html:150 #: app/templates/pages/view_tryout.html:502 msgid "Communication" msgstr "Communication" + #: app/templates/pages/evaluate_player.html:151 #: app/templates/pages/view_tryout.html:503 msgid "Gamesense" msgstr "Gamesense" + #: app/templates/pages/evaluate_player.html:152 #: app/templates/pages/view_tryout.html:504 msgid "Versatility" msgstr "Versatility" + #: app/templates/pages/evaluate_player.html:153 #: app/templates/pages/view_tryout.html:505 msgid "Discipline" msgstr "Discipline" + #: app/templates/pages/evaluate_player.html:154 #: app/templates/pages/view_tryout.html:506 msgid "Analysis" msgstr "Analysis" + #: app/templates/pages/evaluate_player.html:155 #: app/templates/pages/view_tryout.html:507 msgid "Sport Ethics" msgstr "Sport Ethics" + #: app/templates/pages/evaluate_player.html:156 #: app/templates/pages/view_tryout.html:508 msgid "Mental" msgstr "Mental" + #: app/templates/pages/evaluate_player.html:157 #: app/templates/pages/view_tryout.html:509 msgid "Overall" msgstr "Overall" + #: app/templates/pages/evaluate_player.html:158 #: app/templates/pages/my_teams.html:54 #: app/templates/pages/view_tryout.html:286 msgid "Position" msgstr "Position" + #: app/templates/pages/evaluations.html:97 msgid "No evaluations yet" msgstr "No evaluations yet" + #: app/templates/pages/login.html:2 msgid "Login" msgstr "Login" + #: app/templates/pages/login.html:8 msgid "Enter your username" msgstr "Enter your username" + #: app/templates/pages/login.html:12 msgid "Enter your password" msgstr "Enter your password" + #: app/templates/pages/login.html:14 msgid "Sign In" msgstr "Sign In" + #: app/templates/pages/login.html:15 msgid "Don't have an account?" msgstr "Don't have an account?" + #: app/templates/pages/login.html:15 msgid "Register here" msgstr "Register here" + #: app/templates/pages/match_form.html:34 msgid "Match Type" msgstr "Match Type" + #: app/templates/pages/match_form.html:36 msgid "Team vs Team" msgstr "Team vs Team" + #: app/templates/pages/match_form.html:37 msgid "Player vs Player" msgstr "Player vs Player" + #: app/templates/pages/match_form.html:38 msgid "Player Scrim" msgstr "Player Scrim" + #: app/templates/pages/match_form.html:48 #: app/templates/pages/team_match_form.html:17 msgid "Match Title" msgstr "Match Title" + #: app/templates/pages/match_form.html:49 msgid "e.g., Alpha vs Bravo Scrimmage" msgstr "e.g., Alpha vs Bravo Scrimmage" + #: app/templates/pages/match_form.html:62 #: app/templates/pages/team_match_form.html:63 msgid "Scheduled" msgstr "Scheduled" + #: app/templates/pages/match_form.html:63 #: app/templates/pages/team_match_form.html:64 #: app/templates/pages/view_tryout.html:23 msgid "Completed" msgstr "Completed" + #: app/templates/pages/match_form.html:64 #: app/templates/pages/team_match_form.html:65 msgid "Cancelled" msgstr "Cancelled" + #: app/templates/pages/match_form.html:69 app/templates/pages/my_teams.html:94 #: app/templates/pages/team_match_form.html:54 #: app/templates/pages/team_matches.html:31 #: app/templates/pages/tryout_form.html:49 msgid "Location" msgstr "Location" + #: app/templates/pages/match_form.html:70 msgid "Match location" msgstr "Match location" + #: app/templates/pages/match_form.html:77 msgid "Select Match Time" msgstr "Select Match Time" + #: app/templates/pages/match_form.html:79 msgid "" "Click time slots consecutively to set match duration. Players available " @@ -1552,70 +1989,89 @@ msgid "" msgstr "" "Click time slots consecutively to set match duration. Players available " "in all selected time blocks are shown below." + #: app/templates/pages/match_form.html:80 msgid "Reset time selection" msgstr "Reset time selection" + #: app/templates/pages/match_form.html:81 msgid "Reset Time" msgstr "Reset Time" + #: app/templates/pages/match_form.html:86 app/templates/pages/profile.html:236 msgid "Loading..." msgstr "Loading..." + #: app/templates/pages/match_form.html:103 #: app/templates/pages/one_on_one.html:140 #: app/templates/pages/team_match_form.html:40 msgid "Start Time" msgstr "Start Time" + #: app/templates/pages/match_form.html:107 #: app/templates/pages/one_on_one.html:146 #: app/templates/pages/team_match_form.html:45 msgid "End Time" msgstr "End Time" + #: app/templates/pages/match_form.html:114 #: app/templates/pages/tryout_form.html:110 msgid "Description" msgstr "Description" + #: app/templates/pages/match_form.html:115 msgid "Optional notes about this match" msgstr "Optional notes about this match" + #: app/templates/pages/match_form.html:121 msgid "Select Teams" msgstr "Select Teams" + #: app/templates/pages/match_form.html:125 #: app/templates/pages/match_form.html:219 msgid "Team 1" msgstr "Team 1" + #: app/templates/pages/match_form.html:127 msgid "-- Select Team 1 --" msgstr "-- Select Team 1 --" + #: app/templates/pages/match_form.html:134 #: app/templates/pages/match_form.html:231 msgid "Team 2" msgstr "Team 2" + #: app/templates/pages/match_form.html:136 msgid "-- Select Team 2 --" msgstr "-- Select Team 2 --" + #: app/templates/pages/match_form.html:158 #: app/templates/pages/match_form.html:184 msgid "Click to toggle presence" msgstr "Click to toggle presence" + #: app/templates/pages/match_form.html:164 #: app/templates/pages/match_form.html:190 app/templates/pages/teams.html:197 msgid "No players assigned" msgstr "No players assigned" + #: app/templates/pages/match_form.html:201 #: app/templates/pages/match_form.html:243 msgid "Select Players" msgstr "Select Players" + #: app/templates/pages/match_form.html:206 msgid "Randomize Teams:" msgstr "Randomize Teams:" + #: app/templates/pages/match_form.html:211 msgid "Randomize" msgstr "Randomize" + #: app/templates/pages/match_form.html:214 msgid "Select players then click Randomize to split them into teams." msgstr "Select players then click Randomize to split them into teams." + #: app/templates/pages/match_form.html:226 msgid "" "All registered players are shown. Click time slots to filter available " @@ -1623,96 +2079,123 @@ msgid "" msgstr "" "All registered players are shown. Click time slots to filter available " "players." + #: app/templates/pages/match_form.html:246 msgid "Green indicators show player availability for the match date/time" msgstr "Green indicators show player availability for the match date/time" + #: app/templates/pages/match_form.html:632 msgid "Click time slots consecutively to set match duration" msgstr "Click time slots consecutively to set match duration" + #: app/templates/pages/match_form.html:899 msgid "No players registered" msgstr "No players registered" + #: app/templates/pages/match_form.html:932 msgid "T1" msgstr "T1" + #: app/templates/pages/match_form.html:933 msgid "T2" msgstr "T2" + #: app/templates/pages/match_form.html:938 msgid "No players available" msgstr "No players available" + #: app/templates/pages/my_teams.html:18 app/templates/pages/teams.html:84 #: app/templates/pages/teams.html:273 msgid "Coaches" msgstr "Coaches" + #: app/templates/pages/my_teams.html:30 app/templates/pages/teams.html:106 #: app/templates/pages/teams.html:284 msgid "Managers" msgstr "Managers" + #: app/templates/pages/my_teams.html:45 msgid "Team Roster" msgstr "Team Roster" + #: app/templates/pages/my_teams.html:79 msgid "No players on this team." msgstr "No players on this team." + #: app/templates/pages/my_teams.html:93 app/templates/pages/notes.html:124 #: app/templates/pages/one_on_one.html:71 #: app/templates/pages/team_matches.html:30 #: app/templates/pages/view_tryout.html:325 msgid "Time" msgstr "Time" + #: app/templates/pages/my_teams.html:95 #: app/templates/pages/team_match_form.html:115 #: app/templates/pages/team_matches.html:32 #: app/templates/pages/view_tryout.html:326 msgid "Presence" msgstr "Presence" + #: app/templates/pages/my_teams.html:96 msgid "My Status" msgstr "My Status" + #: app/templates/pages/my_teams.html:154 msgid "No upcoming matches scheduled." msgstr "No upcoming matches scheduled." + #: app/templates/pages/my_teams.html:165 msgid "No Teams" msgstr "No Teams" + #: app/templates/pages/my_teams.html:166 msgid "You are not currently assigned to any team." msgstr "You are not currently assigned to any team." + #: app/templates/pages/notes.html:2 app/templates/pages/notes.html:3 #: app/templates/pages/teams.html:75 msgid "Notes" msgstr "Notes" + #: app/templates/pages/notes.html:12 app/templates/pages/one_on_one.html:11 #: app/templates/pages/player_personal_notes.html:55 #: app/templates/pages/team_notes.html:2 app/templates/pages/team_notes.html:3 msgid "Team Notes" msgstr "Team Notes" + #: app/templates/pages/notes.html:20 app/templates/pages/team_notes.html:19 msgid "Team Notes Content" msgstr "Team Notes Content" + #: app/templates/pages/notes.html:21 app/templates/pages/team_notes.html:20 msgid "Enter improvement suggestions and notes for your team..." msgstr "Enter improvement suggestions and notes for your team..." + #: app/templates/pages/notes.html:22 app/templates/pages/team_notes.html:21 msgid "These notes will be visible to all players on your team." msgstr "These notes will be visible to all players on your team." + #: app/templates/pages/notes.html:48 app/templates/pages/personal_notes.html:19 #: app/templates/pages/upload_contract.html:16 msgid "Select Player" msgstr "Select Player" + #: app/templates/pages/notes.html:50 app/templates/pages/personal_notes.html:21 msgid "-- Select a Player --" msgstr "-- Select a Player --" + #: app/templates/pages/notes.html:59 app/templates/pages/personal_notes.html:30 msgid "Enter personal feedback or coaching tips for this player..." msgstr "Enter personal feedback or coaching tips for this player..." + #: app/templates/pages/notes.html:60 app/templates/pages/personal_notes.html:31 msgid "These notes will only be visible to the selected player." msgstr "These notes will only be visible to the selected player." + #: app/templates/pages/notes.html:64 msgid "Context (Optional)" msgstr "Context (Optional)" + #: app/templates/pages/notes.html:65 msgid "" "Link this note to a specific match, tryout, or team for better " @@ -1720,69 +2203,90 @@ msgid "" msgstr "" "Link this note to a specific match, tryout, or team for better " "organization." + #: app/templates/pages/notes.html:71 msgid "-- Select Match --" msgstr "-- Select Match --" + #: app/templates/pages/notes.html:80 msgid "-- Select Tryout --" msgstr "-- Select Tryout --" + #: app/templates/pages/notes.html:89 msgid "-- Select Team --" msgstr "-- Select Team --" + #: app/templates/pages/notes.html:111 msgid "One on One Requests" msgstr "One on One Requests" + #: app/templates/pages/notes.html:125 app/templates/pages/one_on_one.html:72 msgid "Discussion Points" msgstr "Discussion Points" + #: app/templates/pages/notes.html:150 app/templates/pages/notes.html:151 msgid "Accept" msgstr "Accept" + #: app/templates/pages/notes.html:154 app/templates/pages/notes.html:155 msgid "Refuse" msgstr "Refuse" + #: app/templates/pages/notes.html:167 msgid "No One on One requests from your players yet." msgstr "No One on One requests from your players yet." + #: app/templates/pages/notes.html:177 msgid "Reject One on One Request" msgstr "Reject One on One Request" + #: app/templates/pages/notes.html:184 msgid "Reason for rejection (optional):" msgstr "Reason for rejection (optional):" + #: app/templates/pages/notes.html:185 msgid "Let the player know why this time doesn't work..." msgstr "Let the player know why this time doesn't work..." + #: app/templates/pages/notes.html:190 msgid "Reject Request" msgstr "Reject Request" + #: app/templates/pages/notes.html:201 msgid "Team Notes History" msgstr "Team Notes History" + #: app/templates/pages/notes.html:207 app/templates/pages/team_notes.html:42 msgid "Last Updated" msgstr "Last Updated" + #: app/templates/pages/notes.html:208 app/templates/pages/team_notes.html:43 msgid "Content Preview" msgstr "Content Preview" + #: app/templates/pages/notes.html:228 msgid "Recent Personal Notes" msgstr "Recent Personal Notes" + #: app/templates/pages/notes.html:243 #: app/templates/pages/player_personal_notes.html:27 msgid "From match" msgstr "From match" + #: app/templates/pages/notes.html:246 #: app/templates/pages/player_personal_notes.html:32 msgid "From team" msgstr "From team" + #: app/templates/pages/notes.html:249 #: app/templates/pages/player_personal_notes.html:37 msgid "From tryout" msgstr "From tryout" + #: app/templates/pages/one_on_one.html:2 app/templates/pages/one_on_one.html:3 msgid "One on One" msgstr "One on One" + #: app/templates/pages/one_on_one.html:28 #: app/templates/pages/player_personal_notes.html:72 msgid "" @@ -1791,12 +2295,14 @@ msgid "" msgstr "" "No team notes have been added yet. Your coach will post improvement " "suggestions here." + #: app/templates/pages/one_on_one.html:36 #: app/templates/pages/personal_notes.html:2 #: app/templates/pages/personal_notes.html:3 #: app/templates/pages/player_personal_notes.html:11 msgid "Personal Notes" msgstr "Personal Notes" + #: app/templates/pages/one_on_one.html:53 #: app/templates/pages/player_personal_notes.html:47 msgid "" @@ -1805,41 +2311,53 @@ msgid "" msgstr "" "No personal notes have been added yet. Your coach may provide individual " "feedback here." + #: app/templates/pages/one_on_one.html:62 msgid "My One on One Requests" msgstr "My One on One Requests" + #: app/templates/pages/one_on_one.html:74 msgid "Coach Response" msgstr "Coach Response" + #: app/templates/pages/one_on_one.html:87 msgid "Approved" msgstr "Approved" + #: app/templates/pages/one_on_one.html:89 msgid "Rejected" msgstr "Rejected" + #: app/templates/pages/one_on_one.html:111 msgid "You haven't made any One on One requests yet." msgstr "You haven't made any One on One requests yet." + #: app/templates/pages/one_on_one.html:120 #: app/templates/pages/player_personal_notes.html:81 msgid "Request One on One Session" msgstr "Request One on One Session" + #: app/templates/pages/one_on_one.html:132 msgid "Select Date" msgstr "Select Date" + #: app/templates/pages/one_on_one.html:142 msgid "-- Select Date First --" msgstr "-- Select Date First --" + #: app/templates/pages/one_on_one.html:148 #: app/templates/pages/one_on_one.html:271 msgid "-- Select Start Time First --" msgstr "-- Select Start Time First --" + #: app/templates/pages/one_on_one.html:155 msgid "Enter topics you'd like to cover in your One on One session..." msgstr "Enter topics you'd like to cover in your One on One session..." + #: app/templates/pages/one_on_one.html:160 msgid "Send Request" msgstr "Send Request" + #: app/templates/pages/one_on_one.html:165 msgid "" "You need to be assigned to a team with a coach to request a One on One " @@ -1847,58 +2365,76 @@ msgid "" msgstr "" "You need to be assigned to a team with a coach to request a One on One " "session." + #: app/templates/pages/one_on_one.html:246 msgid "-- Select Start Time --" msgstr "-- Select Start Time --" + #: app/templates/pages/one_on_one.html:294 msgid "-- Select End Time --" msgstr "-- Select End Time --" + #: app/templates/pages/personal_notes.html:46 msgid "Recent Notes" msgstr "Recent Notes" + #: app/templates/pages/players_to_evaluate.html:2 #: app/templates/pages/players_to_evaluate.html:3 msgid "Players to Evaluate" msgstr "Players to Evaluate" + #: app/templates/pages/profile.html:21 msgid "Account Information" msgstr "Account Information" + #: app/templates/pages/profile.html:68 app/templates/pages/view_user.html:52 msgid "Gamertags" msgstr "Gamertags" + #: app/templates/pages/profile.html:94 msgid "Discord" msgstr "Discord" + #: app/templates/pages/profile.html:104 app/templates/pages/view_user.html:39 msgid "League OS" msgstr "League OS" + #: app/templates/pages/profile.html:121 msgid "My Statistics" msgstr "My Statistics" + #: app/templates/pages/profile.html:128 msgid "Tryouts Registered" msgstr "Tryouts Registered" + #: app/templates/pages/profile.html:132 msgid "Team Assignments" msgstr "Team Assignments" + #: app/templates/pages/profile.html:139 msgid "Evaluations Given" msgstr "Evaluations Given" + #: app/templates/pages/profile.html:143 msgid "No statistics available for this role." msgstr "No statistics available for this role." + #: app/templates/pages/profile.html:195 msgid "My Contracts" msgstr "My Contracts" + #: app/templates/pages/profile.html:217 msgid "View All Contracts" msgstr "View All Contracts" + #: app/templates/pages/profile.html:221 msgid "No contracts have been uploaded for you yet." msgstr "No contracts have been uploaded for you yet." + #: app/templates/pages/profile.html:231 msgid "My Disponibilities" msgstr "My Disponibilities" + #: app/templates/pages/profile.html:234 msgid "" "Select your available time blocks for matches (5pm to 12am). Green = " @@ -1906,9 +2442,11 @@ msgid "" msgstr "" "Select your available time blocks for matches (5pm to 12am). Green = " "selected, Gray = available to select." + #: app/templates/pages/profile.html:251 msgid "My Coaching Availability" msgstr "My Coaching Availability" + #: app/templates/pages/profile.html:252 msgid "" "Select time slots when you're available for One on One sessions (8am to " @@ -1916,33 +2454,43 @@ msgid "" msgstr "" "Select time slots when you're available for One on One sessions (8am to " "10pm)." + #: app/templates/pages/profile.html:500 msgid "Click or click-and-drag to select your available hours" msgstr "Click or click-and-drag to select your available hours" + #: app/templates/pages/register.html:2 msgid "Register" msgstr "Register" + #: app/templates/pages/register.html:8 msgid "Personal Information" msgstr "Personal Information" + #: app/templates/pages/register.html:11 msgid "Enter your full name" msgstr "Enter your full name" + #: app/templates/pages/register.html:16 msgid "Choose a username" msgstr "Choose a username" + #: app/templates/pages/register.html:21 msgid "Enter your email" msgstr "Enter your email" + #: app/templates/pages/register.html:25 msgid "Phone (Optional)" msgstr "Phone (Optional)" + #: app/templates/pages/register.html:26 msgid "Enter your phone number" msgstr "Enter your phone number" + #: app/templates/pages/register.html:33 msgid "Discord Connection" msgstr "Discord Connection" + #: app/templates/pages/register.html:34 msgid "" "Connect your Discord account to automatically fill your gamertags from " @@ -1950,9 +2498,11 @@ msgid "" msgstr "" "Connect your Discord account to automatically fill your gamertags from " "your connected game accounts." + #: app/templates/pages/register.html:52 msgid "Connected" msgstr "Connected" + #: app/templates/pages/register.html:61 msgid "" "Discord connected. Game connections have been used to pre-fill your " @@ -1960,309 +2510,411 @@ msgid "" msgstr "" "Discord connected. Game connections have been used to pre-fill your " "profile below." + #: app/templates/pages/register.html:69 msgid "Connect to pre-fill your gamertags from Steam, Battle.net, Xbox, etc." msgstr "Connect to pre-fill your gamertags from Steam, Battle.net, Xbox, etc." + #: app/templates/pages/register.html:72 msgid "Discord Username (Manual)" msgstr "Discord Username (Manual)" + #: app/templates/pages/register.html:73 msgid "e.g. YourName" msgstr "e.g. YourName" + #: app/templates/pages/register.html:82 msgid "Set up your competitive gaming profile for tryouts." msgstr "Set up your competitive gaming profile for tryouts." + #: app/templates/pages/register.html:127 msgid "League OS Connection (Optional)" msgstr "League OS Connection (Optional)" + #: app/templates/pages/register.html:131 msgid "Connect your League OS profile for organized play." msgstr "Connect your League OS profile for organized play." + #: app/templates/pages/register.html:135 msgid "Security" msgstr "Security" + #: app/templates/pages/register.html:138 msgid "Create a password" msgstr "Create a password" + #: app/templates/pages/register.html:142 msgid "Confirm Password" msgstr "Confirm Password" + #: app/templates/pages/register.html:143 msgid "Confirm your password" msgstr "Confirm your password" + #: app/templates/pages/register.html:157 msgid "Create Account" msgstr "Create Account" + #: app/templates/pages/team_match_form.html:20 msgid "e.g., Regular Season vs Opponent" msgstr "e.g., Regular Season vs Opponent" + #: app/templates/pages/team_match_form.html:24 msgid "Opponent (optional)" msgstr "Opponent (optional)" + #: app/templates/pages/team_match_form.html:27 msgid "e.g., University of Toronto" msgstr "e.g., University of Toronto" + #: app/templates/pages/team_match_form.html:48 msgid "Auto-calculated if left empty (start + 30 min)" msgstr "Auto-calculated if left empty (start + 30 min)" + #: app/templates/pages/team_match_form.html:57 msgid "e.g., Online, Gym A" msgstr "e.g., Online, Gym A" + #: app/templates/pages/team_match_form.html:72 msgid "Description (optional)" msgstr "Description (optional)" + #: app/templates/pages/team_match_form.html:74 msgid "Additional details about the match..." msgstr "Additional details about the match..." + #: app/templates/pages/team_match_form.html:81 msgid "Team Roster (auto-included)" msgstr "Team Roster (auto-included)" + #: app/templates/pages/team_match_form.html:98 msgid "No players on this team. Add players in the Teams page first." msgstr "No players on this team. Add players in the Teams page first." + #: app/templates/pages/team_match_form.html:107 #: app/templates/pages/view_tryout.html:324 msgid "Participants" msgstr "Participants" + #: app/templates/pages/team_match_form.html:134 msgid "No participants recorded." msgstr "No participants recorded." + #: app/templates/pages/team_matches.html:3 #: app/templates/pages/team_matches.html:4 msgid "Team Matches" msgstr "Team Matches" + #: app/templates/pages/team_matches.html:11 msgid "+ Schedule Match" msgstr "+ Schedule Match" + #: app/templates/pages/team_matches.html:101 msgid "Delete this match?" msgstr "Delete this match?" + #: app/templates/pages/team_matches.html:133 msgid "No Team Matches" msgstr "No Team Matches" + #: app/templates/pages/team_matches.html:134 msgid "Regular season matches have not been scheduled yet." msgstr "Regular season matches have not been scheduled yet." + #: app/templates/pages/team_matches.html:138 msgid "-- Schedule a Match --" msgstr "-- Schedule a Match --" + #: app/templates/pages/team_notes.html:9 msgid "Team Improvement Notes" msgstr "Team Improvement Notes" + #: app/templates/pages/team_notes.html:26 msgid "Add Team Notes" msgstr "Add Team Notes" + #: app/templates/pages/team_notes.html:36 msgid "Note History" msgstr "Note History" + #: app/templates/pages/teams.html:2 app/templates/pages/teams.html:3 #: app/templates/pages/view_tryout.html:231 msgid "Teams" msgstr "Teams" + #: app/templates/pages/teams.html:9 app/templates/pages/view_tryout.html:234 msgid "New Team" msgstr "New Team" + #: app/templates/pages/teams.html:18 msgid "Create New Team" msgstr "Create New Team" + #: app/templates/pages/teams.html:25 app/templates/pages/teams.html:266 msgid "Team Name" msgstr "Team Name" + #: app/templates/pages/teams.html:26 msgid "e.g., Varsity, JV, U14" msgstr "e.g., Varsity, JV, U14" + #: app/templates/pages/teams.html:29 msgid "Assigned Coach" msgstr "Assigned Coach" + #: app/templates/pages/teams.html:31 msgid "-- No coach assigned --" msgstr "-- No coach assigned --" + #: app/templates/pages/teams.html:38 msgid "Assigned Manager" msgstr "Assigned Manager" + #: app/templates/pages/teams.html:40 msgid "-- No manager assigned --" msgstr "-- No manager assigned --" + #: app/templates/pages/teams.html:49 app/templates/pages/teams.html:243 msgid "Create Team" msgstr "Create Team" -#: app/templates/pages/teams.html:64 app/templates/pages/users.html:51 + +#: app/templates/pages/teams.html:64 app/templates/pages/users.html:59 #: app/templates/pages/view_tryout.html:29 #: app/templates/pages/view_tryout.html:459 msgid "Edit" msgstr "Edit" + #: app/templates/pages/teams.html:66 #, python-format msgid "Delete team %(name)s? It will be unassigned from any linked tryouts." msgstr "Delete team %(name)s? It will be unassigned from any linked tryouts." + #: app/templates/pages/teams.html:69 msgid "Delete" msgstr "Delete" + #: app/templates/pages/teams.html:74 msgid "Add Notes" msgstr "Add Notes" + #: app/templates/pages/teams.html:92 #, python-format msgid "Remove coach %(coach)s from %(team)s?" msgstr "Remove coach %(coach)s from %(team)s?" + #: app/templates/pages/teams.html:95 msgid "Remove Coach" msgstr "Remove Coach" + #: app/templates/pages/teams.html:114 #, python-format msgid "Remove manager %(manager)s from %(team)s?" msgstr "Remove manager %(manager)s from %(team)s?" + #: app/templates/pages/teams.html:117 msgid "Remove Manager" msgstr "Remove Manager" + #: app/templates/pages/teams.html:127 msgid "View Team Matches" msgstr "View Team Matches" + #: app/templates/pages/teams.html:128 msgid "Matches" msgstr "Matches" + #: app/templates/pages/teams.html:134 msgid "Schedule Practice" msgstr "Schedule Practice" + #: app/templates/pages/teams.html:135 msgid "Practice" msgstr "Practice" + #: app/templates/pages/teams.html:147 msgid "Position / Role" msgstr "Position / Role" + #: app/templates/pages/teams.html:183 #, python-format msgid "Remove %(player)s from %(team)s?" msgstr "Remove %(player)s from %(team)s?" + #: app/templates/pages/teams.html:186 app/templates/pages/view_tryout.html:211 msgid "Remove" msgstr "Remove" + #: app/templates/pages/teams.html:199 msgid "Add players to this team using the form below." msgstr "Add players to this team using the form below." + #: app/templates/pages/teams.html:224 msgid "Starter" msgstr "Starter" + #: app/templates/pages/teams.html:225 msgid "Substitute" msgstr "Substitute" + #: app/templates/pages/teams.html:228 msgid "Add to Team" msgstr "Add to Team" + #: app/templates/pages/teams.html:240 msgid "No teams yet" msgstr "No teams yet" + #: app/templates/pages/teams.html:242 msgid "Create organization teams and assign coaches to manage tryouts." msgstr "Create organization teams and assign coaches to manage tryouts." + #: app/templates/pages/teams.html:245 msgid "There are no teams to display." msgstr "There are no teams to display." + #: app/templates/pages/teams.html:257 msgid "Edit Team" msgstr "Edit Team" + #: app/templates/pages/teams.html:280 msgid "Hold Ctrl/Cmd to select multiple. Only unassigned coaches shown." msgstr "Hold Ctrl/Cmd to select multiple. Only unassigned coaches shown." + #: app/templates/pages/teams.html:291 msgid "Hold Ctrl/Cmd to select multiple. Only unassigned managers shown." msgstr "Hold Ctrl/Cmd to select multiple. Only unassigned managers shown." + #: app/templates/pages/tryout_form.html:23 msgid "Tryout Title" msgstr "Tryout Title" + #: app/templates/pages/tryout_form.html:24 msgid "e.g., Spring Season Tryouts" msgstr "e.g., Spring Season Tryouts" + #: app/templates/pages/tryout_form.html:29 #: app/templates/pages/view_user.html:57 msgid "Game" msgstr "Game" + #: app/templates/pages/tryout_form.html:31 msgid "-- Select a game --" msgstr "-- Select a game --" + #: app/templates/pages/tryout_form.html:38 msgid "Start Date" msgstr "Start Date" + #: app/templates/pages/tryout_form.html:42 msgid "End Date" msgstr "End Date" + #: app/templates/pages/tryout_form.html:44 msgid "Optional. Leave blank for single-day tryout." msgstr "Optional. Leave blank for single-day tryout." + #: app/templates/pages/tryout_form.html:50 msgid "e.g., Online" msgstr "e.g., Online" + #: app/templates/pages/tryout_form.html:53 msgid "Max Players" msgstr "Max Players" + #: app/templates/pages/tryout_form.html:54 msgid "Leave blank for unlimited" msgstr "Leave blank for unlimited" + #: app/templates/pages/tryout_form.html:59 msgid "Target Team" msgstr "Target Team" + #: app/templates/pages/tryout_form.html:61 msgid "-- No target team --" msgstr "-- No target team --" + #: app/templates/pages/tryout_form.html:70 msgid "Assigned Managers" msgstr "Assigned Managers" + #: app/templates/pages/tryout_form.html:85 msgid "Select one or more managers for this tryout." msgstr "Select one or more managers for this tryout." + #: app/templates/pages/tryout_form.html:90 msgid "Assigned Coaches" msgstr "Assigned Coaches" + #: app/templates/pages/tryout_form.html:106 msgid "Select one or more coaches for this tryout." msgstr "Select one or more coaches for this tryout." + #: app/templates/pages/tryout_form.html:111 msgid "Enter any details about the tryout..." msgstr "Enter any details about the tryout..." + #: app/templates/pages/tryouts.html:9 msgid "New Tryout" msgstr "New Tryout" + #: app/templates/pages/tryouts.html:80 msgid "View Details" msgstr "View Details" + #: app/templates/pages/tryouts.html:84 msgid "Evaluate" msgstr "Evaluate" + #: app/templates/pages/tryouts.html:94 msgid "No tryouts found" msgstr "No tryouts found" + #: app/templates/pages/tryouts.html:96 msgid "Get started by creating a new tryout." msgstr "Get started by creating a new tryout." + #: app/templates/pages/upload_contract.html:9 msgid "Upload Contract for Player" msgstr "Upload Contract for Player" + #: app/templates/pages/upload_contract.html:26 msgid "Contract File" msgstr "Contract File" + #: app/templates/pages/upload_contract.html:32 msgid "Notes (Optional)" msgstr "Notes (Optional)" + #: app/templates/pages/upload_contract.html:33 msgid "Add any notes about this contract..." msgstr "Add any notes about this contract..." + #: app/templates/pages/users.html:9 msgid "Add User" msgstr "Add User" -#: app/templates/pages/users.html:54 + +#: app/templates/pages/users.html:24 +msgid "Hours" +msgstr "Hours" + +#: app/templates/pages/users.html:62 #, python-format msgid "Delete %(name)s? This cannot be undone." msgstr "Delete %(name)s? This cannot be undone." + #: app/templates/pages/view_tryout.html:10 msgid "Tryout Details" msgstr "Tryout Details" + #: app/templates/pages/view_tryout.html:14 #: app/templates/pages/view_tryout.html:306 msgid "Schedule Match" msgstr "Schedule Match" + #: app/templates/pages/view_tryout.html:22 msgid "In Progress" msgstr "In Progress" + #: app/templates/pages/view_tryout.html:33 msgid "" "Delete this entire tryout? This removes all its matches, teams, " @@ -2270,33 +2922,43 @@ msgid "" msgstr "" "Delete this entire tryout? This removes all its matches, teams, " "registrations and evaluations." + #: app/templates/pages/view_tryout.html:36 msgid "Delete Tryout" msgstr "Delete Tryout" + #: app/templates/pages/view_tryout.html:114 msgid "Register for this Tryout" msgstr "Register for this Tryout" + #: app/templates/pages/view_tryout.html:124 msgid "Add Player to Tryout" msgstr "Add Player to Tryout" + #: app/templates/pages/view_tryout.html:137 msgid "Register Player" msgstr "Register Player" + #: app/templates/pages/view_tryout.html:157 msgid "Evaluation" msgstr "Evaluation" + #: app/templates/pages/view_tryout.html:179 msgid "Registered" msgstr "Registered" + #: app/templates/pages/view_tryout.html:180 msgid "Attended" msgstr "Attended" + #: app/templates/pages/view_tryout.html:181 msgid "No Show" msgstr "No Show" + #: app/templates/pages/view_tryout.html:200 msgid "Evaluate player" msgstr "Evaluate player" + #: app/templates/pages/view_tryout.html:208 #, python-format msgid "" @@ -2305,61 +2967,85 @@ msgid "" msgstr "" "Remove %(name)s from this tryout? They will also be removed from every " "team and match within it." + #: app/templates/pages/view_tryout.html:210 msgid "Remove player from tryout" msgstr "Remove player from tryout" + #: app/templates/pages/view_tryout.html:220 msgid "No players registered yet." msgstr "No players registered yet." + #: app/templates/pages/view_tryout.html:243 msgid "Team name" msgstr "Team name" + #: app/templates/pages/view_tryout.html:244 msgid "Create" msgstr "Create" + #: app/templates/pages/view_tryout.html:263 msgid "No players assigned yet." msgstr "No players assigned yet." + #: app/templates/pages/view_tryout.html:271 msgid "Select player..." msgstr "Select player..." + #: app/templates/pages/view_tryout.html:288 msgid "Add" msgstr "Add" + #: app/templates/pages/view_tryout.html:293 msgid "No teams created yet." msgstr "No teams created yet." + #: app/templates/pages/view_tryout.html:322 msgid "Type" msgstr "Type" + #: app/templates/pages/view_tryout.html:387 msgid "Toggle your attendance" msgstr "Toggle your attendance" + #: app/templates/pages/view_tryout.html:462 msgid "Add Note for this Match" msgstr "Add Note for this Match" + #: app/templates/pages/view_tryout.html:463 msgid "Note" msgstr "Note" + #: app/templates/pages/view_tryout.html:481 msgid "No matches scheduled yet. Check back later!" msgstr "No matches scheduled yet. Check back later!" + #: app/templates/pages/view_tryout.html:491 msgid "Evaluation Summary" msgstr "Evaluation Summary" + #: app/templates/pages/view_tryout.html:510 msgid "Recommendation" msgstr "Recommendation" + #: app/templates/pages/view_user.html:60 msgid "Profile" msgstr "Profile" + #: app/templates/pages/view_user.html:72 msgid "View Profile" msgstr "View Profile" + +#: app/templates/pages/view_user.html:87 +msgid "Availability" +msgstr "Availability" + #~ msgid "×" #~ msgstr "×" + #~ msgid "One on One request from %(value)s has been approved!" #~ msgstr "" + #~ msgid "" #~ "Account is locked due to too many" #~ " failed attempts. Please try again in" @@ -2368,6 +3054,7 @@ msgstr "View Profile" #~ "Account is locked due to too many" #~ " failed attempts. Please try again in" #~ " %(remaining)s minute(s)." + #~ msgid "" #~ "Account locked after %(attempts)s failed " #~ "attempts. Please try again in " @@ -2376,29 +3063,40 @@ msgstr "View Profile" #~ "Account locked after %(attempts)s failed " #~ "attempts. Please try again in " #~ "%(minutes)s minutes." + #~ msgid "Login unsuccessful. %(remaining)s attempt(s) remaining before lockout." #~ msgstr "Login unsuccessful. %(remaining)s attempt(s) remaining before lockout." + #~ msgid "Incorrect CAPTCHA answer. Please try again." #~ msgstr "Incorrect CAPTCHA answer. Please try again." + #~ msgid "Answer" #~ msgstr "Answer" + #~ msgid "Invalid start time format." #~ msgstr "Invalid start time format." + #~ msgid "Invalid end time format." #~ msgstr "Invalid end time format." + #~ msgid "Invalid date or time format." #~ msgstr "Invalid date or time format." -#~ msgid "Availability" -#~ msgstr "Availability" + #~ msgid "Team Tryout Management System" #~ msgstr "Team Tryout Management System" + #~ msgid "Player and content are required." #~ msgstr "Player and content are required." + #~ msgid "Save Disponibilities" #~ msgstr "Save Disponibilities" + #~ msgid "Contact" #~ msgstr "Contact" + #~ msgid "Attendance" #~ msgstr "Attendance" + #~ msgid "No players registered for this tryout." -#~ msgstr "No players registered for this tryout." \ No newline at end of file +#~ msgstr "No players registered for this tryout." + diff --git a/app/translations/fr/LC_MESSAGES/messages.mo b/app/translations/fr/LC_MESSAGES/messages.mo index 1182cd7fa81e91cf381e7ca298601c82cf0f6a5e..5e241b7b4ba3fcc560488b12ef38aeb2f06acc98 100644 GIT binary patch delta 11114 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 NDJU&JzT!yA{{WAM9%cXl delta 10938 zcmYM(2V7Ux|Htu5$`k=Xh79?tsE8m-1zb2V6<3&~V$L*2xC_(&Pp>15a{b&Zf0jv_ zBU4N(4NbJvuw^(J*5A>vvaP>%|8gCl+JF)%*XyVv`&vly00g4HM~iLH>4%`Byxy#bi8)E$}KPU|4g<$;52* zU@_1sX@{S%PWbV^XQ zumz*=eI$10n>5FDYS9Qzcbvu;gMG0R>c-`$iFRNxmfLoVIBH+QO^Zu zn1!NH0e3^KSAe=cB!m2`dLL&%MYs^7al5q=m61!R39g|c{{b{4t zH5Oq@T#irTd#H`IWzZY@yEL?uBGl_Q4s{d@Q4uahO}y6jx1rANb*zgOs0GiWp8E=w zk!z@$x`{fnz*dga6%%k2jz{+3xF6Bb1P>6d77D~rj70^IikdJRwQvv2!vV-KIxnD} zKZDBDdDMn3p`QC0HSayt(FA3gBk&;exlXbjXoEV62T?aZj=A_WYJoSgCLTkb;rpm+ zKZ{D`O;oYoLDiCzZ31e7P3fj!AQqxFG7|Gx-i$Wn+L?zbxD~bYPq7|eLDke8%zA~G%KFZJ8vXDpYJse_W`Q24018k? zF&34|DX0bJqB61q72sOb4!58(w#WJwDnpf+h^H_de@9ml`Vp2=)(~~J-BAlJv97V# zH=|O10=47s?RY?Yld&{ZfbFmo_Ck{CEJbDNePm7NbJV&K9mszN8fpA17AK*0wixT< zCajBx@nQS~!>}=h5s5jdegP`r(Wn3>qB1fYweWMOz+XV!e*{%SXLDV%;MWW&^}pi% zx1pmcl0ZylJQ|gud~AY~@qWrt_isT>xC`$WE9&Tup^oSxD!@zF0>4Au7vYj8E$l&W z%s{<9*{B=3p)yi{3ScBYfTgG+T!j4XtmI!EvD)?{I-7t7qRx60dT=I2;YL(u-Tijp z6h<>}85Q|m)RENfVt=@x#(Sdf8;P1=7V0Qgpx*x-sGaUb7315ejl7S#{}YVIZ;|<3 z$A^kjF*L#?Y>(+U7JK0aRK(w*7Sd--_eWt(%s>U2g*uY{r~rncH;%{O8s(s zeWUdiROa@gtA!5G(1exthAMl*dDIu}OZ3Hn?k0dx)cp-nuUB(S#tzsMpTItN&|dfH zVNzZXRqQF)9CLe+f1TwM3=F^p_QtPJnfMJ=Gy(ahACG)HoNQE8m!OJqG3p4mVG}%o zh4>TdzRpCYjSfU*Xf*1mOL~%jEwq{erQ|hxW4ZMxs<_TrucPkw?PY$e^`MTfKPnSN zs0AjV0-22oScU<38dZGN*b0AeZ6m(7<1}NS5R=ih?m|s)5jEjGY>bV`Z&U1vjc^+3 zxwWWyj-&3sfhic?*ZlD5f_l5=pyqY=*~WQn$iN-jkAKLVaULq--l+F>1ZttVsG4{U zbp!`62tPsX^cxJsAJGs0jXDai0`n_gB=S1D&KMe+$VH{_S=5Fkxp#@`6Rh)qS*cla2FAT#W z=)ox%iYrh%EJN*ZA1Y%f?f7}yzlwDk{{uCzU!kduP;`~D92$zaBP!w^sGSYM+Bg+; zrgKnl!y;7iY{yJIgL;j<9x(yLpyo@$bj(DpGa83uF?#UKBjjH@xWRxTzm2Ny06qpf zqcqgSMW`Zs5*5fY)Q&b_E!=|&^bpp>Q&)f>0y$6zir8aV)NnvwT ziaMc+t|vxe0cwKrs0F8?7I0A+TaF6gCDa0YP(LFoPyu|7s*Uf^gTeenYL00xjbs{+ zqR#p`)E908=HdnHgHc5+j$=?0eu_GZuWkPh>L~mNn_6m*N_kgog1xX9r=gzz2DNeb zXBtYW*Q3Tj%%C5M`mp4qigO}r!V=W|v+VU!e1QHg>mF2w_MwiV0^_j~b+lKk{zLBf zT_=@>s=g4lz%=VjR7U1v1g=0u{wnH-4xj=#YOjBQdMhql|3U@gH`E+OU2H)=4fXsm zjL`c(jz%g2bFeg~COuBtF_lsT(x)K1%@Qr`uY`u?bDf5JKoRqe~Hn^39ViAwE3)KR{R zdK*rnGI<^q*j207X!5U!>yI`Ux}l0~6zVLCu_n5x0G>fDyavN@E2@g$#(4Y?wZIKj z;I$q%Hbg)AIjD_wMg{!vi|@$##^W3{hgyCUW3ZW7L37dsDLU_8TiHa zgU6X)Fxp~A#;0H-+=oec4x6FtHQr3n996{w@F`q~S$GFkG%cSn6HY)a_%f#8N49?# z)95!VHsAarY(;-DYTje0`+q~dMe!5(eUbH@zBDwj6x(A3=Heafi0vkt>$6Z1@3#H( z*qgrZBvbu`_z3+;n1b(NU;GmlaNcC|VVjI?>A#FYdjG$sQJaAqsMqNZ24c(x$923o0_`veJ7GUufvZrdYC6aKFv&-yvH+v;G4#RN=#L9fJ6wj^z>BEYdN=Bb z4xx_rW7Pc@v7X-lD>PymxQj|{^jsFf);JMMF#~U*9!#2NQr8kyjNMQ>AA-u*XnTDI z4yC^so8phC0K(>*z+*9l^_@mEG*L^`ndIC45Zj-I+QC9p4QxcEaG&jeg1zW}kHOgL z8S^uuD=Gu|sPDu;RL17o>!s+XF|dS&c2Zr0%ndxEs1(-trG3<=X7m|Oa{4;yuSJc_of7X1Xb8tBQr!Wi8VIc;U zngvFo5B(C1!&#^uZ$uBiih3JPqaR*G1$G&=!9PpMzjosLocX}SqHb)39kBx@ql>Ay z3)|wCI0B=dHyN0TD!PT3jVn>rUxj+!e~}5OHEQ7js3RZm(#WSV2lc=QsI&E3Y+kdb zsNx)fns_!w;X&)i_WBQ~O!_RL0I?zJxl(L`W!MO-P#gRe6^Q#cjaoDUmzoEnupa$Z z*1i}>e;jJz5>({NP|ua2j%+VxVihK%v&{5UP(?Wcwcr#~#-Bl+cb)Y#;u$Ez8h8S0 z<0(wX^B9Ew|Fi*OP5P}+0kuH|@-S+FVVHnZ(HqyIYGe}*#;rIEo#i@0&VM)!rQ{fD z=O17yUPBdC_zJU7CMwWg)?!r37h@7`M;+Z+)N{XMLkwAIGL(rP`h73}C!r7PJ2PqM zy`GEyxDLZ`3pT(5*c2~dV{}%TKX^1j72^;bfa_5U|Arn6UTw}i4V8)hn1V&9440y- zRIZ_+g*RdemZ8o(c8!U=8P=trhf4V%RB=s3Wo{X2fpw^(`WI?}-57$0Y`@C(KgUqU ze_TWUbvE}HQ0l$cnzM{Y-OwC$y#s2(uBdist=#c>xc3j9rMf@kdYKT);ihQGk~m_`;V;*F??%drj~LoM_fYJ%&iBdD{<1RQ}{pc#6w zgLN2co;lb8m!WE;0=4jQogY#9SU8OFR~&b%wC`ioG{k3?mx1a(w9F&eL6EZ#$9AZD96qO5J?-UG(VdVi0hc2lc-!N{GaXtGfY_rOGa6!qhF0XD>asD-OhHSjlT!O&f1qZz2;>yFC2 zJBWsE7=}uji~hI?wa_-y8NQ9GjcWAZpQ!u7cbo4)JnFs#48UB}Liu)lFzP5uP#Io= z9HHxMrjfuvIo8DssMqjkOvU8a%zOPPwx_=ub>CSWjNfAc=It?`)HPU4{}yTkqh2>Z zo~NTSvIV=~A-w{sP+Bb+n&iYrKWcvBd#1PtgI+U$5611~TwNY=>S4&HwN3fa&yC-~c?1T`~4e z^C20D9qG?T)y5Ij!go={n)wzVC+vsXz;5ej*4uB9f4xQx-!|`OPke;_BJ72iQ7KD3 zWCHAqdTr)eOEHrEQjEe^tVb|{{smO(f5C9{I&8)xQ5kRH+C~m)f;@Y}5DcULr0tiY zcD5OHUp1<@ZlEUq57xwxcg%v}7)ZY<>i(9ffO?|`N1-<6E}#)jqYUHlDC!I^p{o2l zR4Q*_H;kw-J06NkX$k83Ce;0hF&C>a3j>ds*EbIv)1QUf*vr^d@Bcy5aK5(s9_2q8 za6>A##f_+)o<|kq71T~{q86b~x%w`wqIgO6bgoQ+Ai8}I-8zd)l8 z1EI(GoZ<*n(N$nO{1rQ4N~QUEJ_$9^ek{c+*b$45vncLH73odXk+nNvGBDM;6E%Jn z+q*QP-!nTMh%M=_!W=w>3ZTaO=D&1yM5S~o=Hq*Iyv|8}9?&0#?eSIA^WWKigH!y7 z*L94;H?auMq1%N<`f2@9h+i&I@BMkyc+C&Y&by<&e9xn*c|GdPciQpOSdaciOu|2~ zIo7W---&$Gk&Qv8apL3SMi-B2Hm!}PapHvX!AbS~$`@t?_?N%c*4wxIc;|OgeOr0b jbJ}EPmzPe>t5yExthib$r=AEc@BLh+fBCa34!8L~n<3xe diff --git a/app/translations/fr/LC_MESSAGES/messages.po b/app/translations/fr/LC_MESSAGES/messages.po index 0033a19..a77f6c2 100644 --- a/app/translations/fr/LC_MESSAGES/messages.po +++ b/app/translations/fr/LC_MESSAGES/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: team-tryouts VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-08-25 19:38-0400\n" +"POT-Creation-Date: 2026-08-26 22:04-0400\n" "PO-Revision-Date: 2026-08-07 20:22-0400\n" "Last-Translator: FULL NAME \n" "Language: fr\n" @@ -18,14 +18,17 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.18.0\n" + #: app/app.py:564 msgid "Please log in to access this page." msgstr "Veuillez vous connecter pour accéder à cette page." + #: app/forms.py:37 app/routes/auth.py:230 app/routes/auth.py:389 -#: app/routes/auth.py:403 app/routes/users/contracts.py:104 +#: app/routes/auth.py:403 app/routes/users/contracts.py:120 #, python-format msgid "%(field)s: %(msg)s" msgstr "%(field)s : %(msg)s" + #: app/validators.py:50 msgid "" "Password must be at least 8 characters with uppercase, lowercase, and a " @@ -33,184 +36,243 @@ msgid "" msgstr "" "Le mot de passe doit compter au moins 8 caractères, dont une majuscule, " "une minuscule et un chiffre." + #: app/validators.py:68 msgid "Username must be 3-30 characters (letters, numbers, underscore, hyphen)." msgstr "" "Le nom d’utilisateur doit compter de 3 à 30 caractères (lettres, " "chiffres, tiret bas, trait d’union)." + #: app/validators.py:87 msgid "Invalid Discord username format." msgstr "Format de nom d’utilisateur Discord invalide." + #: app/validators.py:104 msgid "Discord User ID must be a 17-20 digit number." msgstr "L’identifiant Discord doit être un nombre de 17 à 20 chiffres." + #: app/validators.py:122 msgid "Invalid phone number format." msgstr "Format de numéro de téléphone invalide." + #: app/validators.py:201 msgid "Username is required." msgstr "Le nom d’utilisateur est obligatoire." + #: app/validators.py:205 msgid "Password is required." msgstr "Le mot de passe est obligatoire." + #: app/validators.py:227 app/validators.py:324 msgid "Username must be 3-80 characters." msgstr "Le nom d’utilisateur doit compter de 3 à 80 caractères." + #: app/validators.py:233 msgid "Email must be 120 characters or less." msgstr "L’adresse courriel ne doit pas dépasser 120 caractères." + #: app/validators.py:246 app/validators.py:339 app/validators.py:370 #: app/validators.py:433 msgid "Full name is required." msgstr "Le nom complet est obligatoire." + #: app/validators.py:276 msgid "Passwords do not match." msgstr "Les mots de passe ne concordent pas." + #: app/validators.py:284 app/validators.py:924 msgid "Unknown game." msgstr "Jeu inconnu." + #: app/validators.py:291 msgid "Gamertag must be between 1 and 120 characters." msgstr "Le gamertag doit compter de 1 à 120 caractères." + #: app/validators.py:297 msgid "Platform must be 30 characters or less." msgstr "La plateforme ne doit pas dépasser 30 caractères." + #: app/validators.py:306 msgid "Unknown platform for this game." msgstr "Plateforme inconnue pour ce jeu." + #: app/validators.py:343 app/validators.py:378 msgid "Invalid role selected." msgstr "Rôle sélectionné invalide." + #: app/validators.py:473 app/validators.py:596 app/validators.py:629 msgid "Player must be selected." msgstr "Vous devez choisir un joueur." + #: app/validators.py:476 msgid "Notes must be 2000 characters or less." msgstr "Les notes ne doivent pas dépasser 2000 caractères." + #: app/validators.py:513 app/validators.py:994 msgid "Invalid coach selection." msgstr "Sélection de coach invalide." + #: app/validators.py:519 app/validators.py:1000 msgid "Invalid manager selection." msgstr "Sélection de gérant invalide." + #: app/validators.py:537 app/validators.py:595 app/validators.py:628 msgid "Invalid player selection." msgstr "Sélection de joueur invalide." + #: app/validators.py:546 msgid "Unknown roster status." msgstr "Statut d'effectif inconnu." + #: app/validators.py:559 msgid "Unknown tryout status." msgstr "Statut de sélection inconnu." + #: app/validators.py:570 msgid "Unknown registration status." msgstr "Statut d’inscription inconnu." + #: app/validators.py:583 msgid "Team name must be between 1 and 100 characters." msgstr "Le nom de l’équipe doit compter de 1 à 100 caractères." + #: app/validators.py:603 msgid "Position must be 50 characters or less." msgstr "La position ne doit pas dépasser 50 caractères." + #: app/validators.py:616 msgid "Note content must be between 1 and 5000 characters." msgstr "La note doit compter de 1 à 5000 caractères." + #: app/validators.py:642 msgid "Select at most one note context." msgstr "Sélectionnez au plus un contexte pour la note." + #: app/validators.py:654 msgid "Rejection reason must be 2000 characters or less." msgstr "Le motif de refus ne doit pas dépasser 2000 caractères." + #: app/validators.py:678 msgid "Date must be in YYYY-MM-DD format." msgstr "La date doit être au format AAAA-MM-JJ." + #: app/validators.py:679 msgid "A date is required." msgstr "Une date est requise." + #: app/validators.py:685 app/validators.py:750 msgid "Start time must be in HH:MM format." msgstr "L’heure de début doit être au format HH:MM." + #: app/validators.py:686 app/validators.py:751 msgid "A start time is required." msgstr "Une heure de début est requise." + #: app/validators.py:692 msgid "End time must be in HH:MM format." msgstr "L’heure de fin doit être au format HH:MM." + #: app/validators.py:693 msgid "An end time is required." msgstr "Une heure de fin est requise." + #: app/validators.py:697 msgid "Points must be 2000 characters or less." msgstr "Les points ne doivent pas dépasser 2000 caractères." + #: app/validators.py:712 msgid "End time must be after start time." msgstr "L'heure de fin doit être postérieure à l'heure de début." + #: app/validators.py:741 app/validators.py:743 msgid "Day must be 0 (Monday) to 6 (Sunday)." msgstr "Le jour doit aller de 0 (lundi) à 6 (dimanche)." + #: app/validators.py:744 msgid "A day is required." msgstr "Un jour est requis." + #: app/validators.py:779 msgid "Player selection is malformed." msgstr "La sélection de joueurs est mal formée." + #: app/validators.py:805 app/validators.py:915 msgid "A title is required." msgstr "Un titre est requis." + #: app/validators.py:814 msgid "Invalid date format." msgstr "Format de date invalide." + #: app/validators.py:819 app/validators.py:826 msgid "Invalid time format." msgstr "Format d’heure invalide." + #: app/validators.py:820 msgid "Start time is required. Please select a time slot." msgstr "L’heure de début est obligatoire. Choisissez une plage horaire." + #: app/validators.py:834 msgid "Unknown match status." msgstr "Statut de match inconnu." + #: app/validators.py:850 msgid "The end time must come after the start time." msgstr "L'heure de fin doit être postérieure à l'heure de début." + #: app/validators.py:864 msgid "Unknown match type." msgstr "Type de match inconnu." + #: app/validators.py:876 msgid "A team cannot play against itself." msgstr "Une équipe ne peut pas jouer contre elle-même." + #: app/validators.py:929 msgid "Invalid start date format." msgstr "Format de date de début invalide." + #: app/validators.py:930 msgid "A start date is required." msgstr "Une date de début est requise." + #: app/validators.py:936 msgid "Invalid end date format." msgstr "Format de date de fin invalide." + #: app/validators.py:944 msgid "A tryout must allow at least one player." msgstr "Une sélection doit accepter au moins un joueur." + #: app/validators.py:947 msgid "The player limit must be a whole number." msgstr "La limite de joueurs doit être un nombre entier." + #: app/validators.py:960 msgid "End date cannot be before start date." msgstr "La date de fin ne peut pas précéder la date de début." + #: app/validators.py:987 app/validators.py:988 msgid "Team name is required." msgstr "Le nom de l’équipe est obligatoire." + #: app/validators.py:1012 msgid "Scores run from 1 to 10." msgstr "Les notes vont de 1 à 10." + #: app/validators.py:1013 msgid "A score must be a whole number from 1 to 10." msgstr "Une note doit être un nombre entier de 1 à 10." + #: app/routes/auth.py:247 msgid "This account has been deactivated." msgstr "Ce compte a été désactivé." + #: app/routes/auth.py:282 #, python-format msgid "Welcome back, %(username)s!" msgstr "Bon retour, %(username)s !" + #: app/routes/auth.py:312 msgid "" "Login unsuccessful. Please check your username and password, or ask a " @@ -218,25 +280,32 @@ msgid "" msgstr "" "Échec de la connexion. Vérifiez le nom d’utilisateur et le mot de passe, " "ou demandez de l’aide à un président." + #: app/routes/auth.py:378 msgid "Your registration could not be processed. Please try again." msgstr "Votre inscription n'a pas pu être traitée. Veuillez réessayer." -#: app/routes/auth.py:420 app/routes/users/accounts.py:343 + +#: app/routes/auth.py:420 app/routes/users/accounts.py:376 msgid "Username already exists." msgstr "Ce nom d’utilisateur est déjà pris." -#: app/routes/auth.py:424 app/routes/users/accounts.py:347 + +#: app/routes/auth.py:424 app/routes/users/accounts.py:380 msgid "Email already registered." msgstr "Cette adresse courriel est déjà enregistrée." + #: app/routes/auth.py:431 app/routes/auth.py:624 -#: app/routes/users/accounts.py:121 +#: app/routes/users/accounts.py:154 msgid "This Discord account is already linked to another account." msgstr "Ce compte Discord est déjà lié à un autre compte." + #: app/routes/auth.py:473 msgid "Your account has been created! You can now log in." msgstr "Votre compte a été créé. Vous pouvez maintenant vous connecter." + #: app/routes/auth.py:498 msgid "Discord OAuth2 is not configured." msgstr "La connexion Discord n’est pas configurée." + #: app/routes/auth.py:547 msgid "" "Discord authorization could not be verified. Please start the connection " @@ -244,51 +313,67 @@ msgid "" msgstr "" "L’autorisation Discord n’a pas pu être vérifiée. Relancez la connexion " "depuis cette page." + #: app/routes/auth.py:556 msgid "Discord authorization failed. No code received." msgstr "L’autorisation Discord a échoué : aucun code reçu." + #: app/routes/auth.py:580 msgid "Failed to connect to Discord. Please try again." msgstr "Impossible de joindre Discord. Veuillez réessayer." + #: app/routes/auth.py:584 msgid "Failed to obtain Discord access token." msgstr "Impossible d’obtenir le jeton d’accès Discord." + #: app/routes/auth.py:599 app/routes/auth.py:609 msgid "Failed to fetch Discord user profile." msgstr "Impossible de récupérer le profil Discord." + #: app/routes/auth.py:616 msgid "Please log in to connect your Discord account." msgstr "Veuillez vous connecter pour lier votre compte Discord." + #: app/routes/auth.py:635 msgid "Discord account connected!" msgstr "Compte Discord connecté !" + #: app/routes/auth.py:682 msgid "Discord account connected! Your profile has been pre-filled." msgstr "Compte Discord connecté. Votre profil a été pré-rempli." + #: app/routes/auth.py:710 msgid "You have been logged out." msgstr "Vous avez été déconnecté." + #: app/routes/evaluations.py:53 msgid "You do not have permission to view evaluations." msgstr "Vous n’avez pas les droits pour consulter les évaluations." + #: app/routes/evaluations.py:143 msgid "You do not have permission to evaluate players." msgstr "Vous n’avez pas les droits pour évaluer des joueurs." + #: app/routes/evaluations.py:148 app/routes/evaluations.py:234 msgid "You do not have permission to evaluate players in this tryout." msgstr "Vous n’avez pas les droits pour évaluer des joueurs dans cette sélection." + #: app/routes/evaluations.py:159 msgid "Player is not registered for this tryout." msgstr "Ce joueur n’est pas inscrit à cette sélection." + #: app/routes/evaluations.py:164 msgid "Can only evaluate players." msgstr "Seuls des joueurs peuvent être évalués." + #: app/routes/evaluations.py:210 msgid "Evaluation submitted successfully!" msgstr "Évaluation enregistrée." + #: app/routes/evaluations.py:212 msgid "Evaluation updated!" msgstr "Évaluation mise à jour." + #: app/routes/evaluations.py:229 app/routes/teams.py:340 #: app/routes/teams.py:383 app/routes/teams.py:426 app/routes/teams.py:454 #: app/routes/teams.py:482 app/routes/teams.py:519 app/routes/tryouts.py:507 @@ -297,424 +382,556 @@ msgstr "Évaluation mise à jour." #: app/routes/tryouts.py:677 msgid "Permission denied." msgstr "Accès refusé." + #: app/routes/main.py:55 msgid "That language is not available." msgstr "Cette langue n’est pas disponible." + #: app/routes/matches.py:383 msgid "You do not have permission to schedule matches for this tryout." msgstr "Vous n’avez pas les droits pour planifier des matchs pour cette sélection." + #: app/routes/matches.py:387 app/routes/matches.py:463 msgid "This tryout has ended. Matches can no longer be created or modified." msgstr "" "Cette sélection est terminée. Les matchs ne peuvent plus être créés ni " "modifiés." + #: app/routes/matches.py:445 msgid "Match scheduled successfully!" msgstr "Match planifié." + #: app/routes/matches.py:459 app/routes/team_matches.py:235 msgid "You do not have permission to edit this match." msgstr "Vous n’avez pas les droits pour modifier ce match." + #: app/routes/matches.py:552 app/routes/team_matches.py:265 msgid "Match updated successfully!" msgstr "Match mis à jour." + #: app/routes/matches.py:588 app/routes/team_matches.py:284 msgid "You do not have permission to delete this match." msgstr "Vous n’avez pas les droits pour supprimer ce match." + #: app/routes/matches.py:591 msgid "This tryout has ended. Matches can no longer be deleted." msgstr "Cette sélection est terminée. Les matchs ne peuvent plus être supprimés." + #: app/routes/matches.py:604 app/routes/team_matches.py:289 msgid "Match deleted successfully." msgstr "Match supprimé." + #: app/routes/team_matches.py:128 msgid "You do not have permission to schedule matches for this team." msgstr "Vous n’avez pas les droits pour planifier des matchs pour cette équipe." + #: app/routes/team_matches.py:220 #, python-format msgid "Team match \"%(title)s\" scheduled successfully!" msgstr "Match d’équipe « %(title)s » planifié." + #: app/routes/teams.py:43 msgid "Use My Team(s) to view your teams." msgstr "Utilisez « Mon ou mes équipes » pour consulter vos équipes." + #: app/routes/teams.py:46 msgid "You do not have permission to view teams." msgstr "Vous n’avez pas les droits pour consulter les équipes." + #: app/routes/teams.py:78 msgid "This page is for players." msgstr "Cette page est réservée aux joueurs." + #: app/routes/teams.py:185 msgid "You do not have permission to create teams." msgstr "Vous n’avez pas les droits pour créer une équipe." + #: app/routes/teams.py:196 app/routes/teams.py:238 #, python-format msgid "Team \"%(name)s\" already exists." msgstr "L’équipe « %(name)s » existe déjà." + #: app/routes/teams.py:217 #, python-format msgid "Team \"%(name)s\" created successfully!" msgstr "Équipe « %(name)s » créée." + #: app/routes/teams.py:227 msgid "You do not have permission to edit this team." msgstr "Vous n’avez pas les droits pour modifier cette équipe." + #: app/routes/teams.py:271 #, python-format msgid "Team \"%(name)s\" updated successfully!" msgstr "Équipe « %(name)s » mise à jour." + #: app/routes/teams.py:299 msgid "You do not have permission to delete teams." msgstr "Vous n’avez pas les droits pour supprimer une équipe." + #: app/routes/teams.py:330 #, python-format msgid "Team \"%(name)s\" deleted successfully." msgstr "Équipe « %(name)s » supprimée." + #: app/routes/teams.py:347 msgid "Please select a coach." msgstr "Veuillez choisir un coach." + #: app/routes/teams.py:352 msgid "Only coaches can be assigned as coach." msgstr "Seuls les coachs peuvent être assignés comme coach." + #: app/routes/teams.py:358 #, python-format msgid "%(username)s is already a coach of %(name)s." msgstr "%(username)s est déjà coach de %(name)s." + #: app/routes/teams.py:371 #, python-format msgid "%(username)s added as coach of %(name)s." msgstr "%(username)s a été ajouté comme coach de %(name)s." + #: app/routes/teams.py:390 msgid "Please select a manager." msgstr "Veuillez choisir un gérant." + #: app/routes/teams.py:395 msgid "Only managers can be assigned as manager." msgstr "Seuls les gérants peuvent être assignés comme gérant." + #: app/routes/teams.py:401 #, python-format msgid "%(username)s is already a manager of %(name)s." msgstr "%(username)s est déjà gérant de %(name)s." + #: app/routes/teams.py:414 #, python-format msgid "%(username)s added as manager of %(name)s." msgstr "%(username)s a été ajouté comme gérant de %(name)s." + #: app/routes/teams.py:444 #, python-format msgid "Coach removed from %(name)s." msgstr "Coach retiré de %(name)s." + #: app/routes/teams.py:472 #, python-format msgid "Manager removed from %(name)s." msgstr "Gérant retiré de %(name)s." + #: app/routes/teams.py:489 app/routes/tryouts.py:568 msgid "Please select a player." msgstr "Veuillez choisir un joueur." + #: app/routes/teams.py:495 msgid "Can only assign players to teams." msgstr "Seuls des joueurs peuvent être assignés à une équipe." + #: app/routes/teams.py:501 #, python-format msgid "%(username)s is already on %(name)s." msgstr "%(username)s fait déjà partie de %(name)s." + #: app/routes/teams.py:509 #, python-format msgid "%(username)s added to %(name)s!" msgstr "%(username)s a été ajouté à %(name)s." + #: app/routes/teams.py:526 app/routes/teams.py:604 #, python-format msgid "%(username)s is not on %(name)s." msgstr "%(username)s ne fait pas partie de %(name)s." + #: app/routes/teams.py:534 #, python-format msgid "%(username)s removed from %(name)s." msgstr "%(username)s a été retiré de %(name)s." + #: app/routes/teams.py:571 app/routes/teams.py:593 msgid "You do not have permission to add notes to this team." msgstr "Vous n’avez pas les droits pour ajouter des notes à cette équipe." + #: app/routes/teams.py:583 msgid "Team notes added successfully!" msgstr "Notes d’équipe ajoutées." + #: app/routes/teams.py:598 app/routes/users/notes.py:222 #: app/routes/users/notes.py:262 msgid "Can only add notes for players." msgstr "Il n’est possible d’ajouter des notes que pour des joueurs." + #: app/routes/teams.py:618 #, python-format msgid "Note added for %(username)s!" msgstr "Note ajoutée pour %(username)s." + #: app/routes/tryouts.py:147 msgid "You do not have permission to create tryouts." msgstr "Vous n’avez pas les droits pour créer une sélection." + #: app/routes/tryouts.py:194 msgid "Tryout created successfully!" msgstr "Sélection créée." + #: app/routes/tryouts.py:211 msgid "You do not have permission to edit this tryout." msgstr "Vous n’avez pas les droits pour modifier cette sélection." + #: app/routes/tryouts.py:215 msgid "This tryout has ended and can no longer be modified." msgstr "Cette sélection est terminée et ne peut plus être modifiée." + #: app/routes/tryouts.py:261 msgid "Tryout updated successfully!" msgstr "Sélection mise à jour." + #: app/routes/tryouts.py:301 msgid "You do not have permission to view this tryout." msgstr "Vous n’avez pas les droits pour consulter cette sélection." + #: app/routes/tryouts.py:469 msgid "Only players can register for tryouts." msgstr "Seuls les joueurs peuvent s’inscrire à une sélection." + #: app/routes/tryouts.py:474 msgid "This tryout is not accepting registrations." msgstr "Cette sélection n’accepte pas d’inscriptions." + #: app/routes/tryouts.py:481 msgid "You are already registered for this tryout." msgstr "Vous êtes déjà inscrit à cette sélection." + #: app/routes/tryouts.py:487 app/routes/tryouts.py:590 msgid "This tryout is full." msgstr "Cette sélection est complète." + #: app/routes/tryouts.py:493 msgid "Successfully registered for tryout!" msgstr "Inscription à la sélection réussie." + #: app/routes/tryouts.py:517 #, python-format msgid "Tryout status updated to %(new_status)s." msgstr "Statut de la sélection mis à jour : %(new_status)s." + #: app/routes/tryouts.py:545 msgid "Registration status updated." msgstr "Statut d’inscription mis à jour." + #: app/routes/tryouts.py:576 msgid "Can only register players." msgstr "Seuls des joueurs peuvent être inscrits." + #: app/routes/tryouts.py:582 #, python-format msgid "%(username)s is already registered for this tryout." msgstr "%(username)s est déjà inscrit à cette sélection." + #: app/routes/tryouts.py:596 #, python-format msgid "%(username)s registered for tryout!" msgstr "%(username)s est inscrit à la sélection." + #: app/routes/tryouts.py:636 #, python-format msgid "%(username)s removed from tryout." msgstr "%(username)s a été retiré de la sélection." + #: app/routes/tryouts.py:662 #, python-format msgid "Team \"%(team_name)s\" created!" msgstr "Équipe « %(team_name)s » créée." + #: app/routes/tryouts.py:699 app/routes/users/notes.py:350 msgid "That player is not registered for this tryout." msgstr "Ce joueur n’est pas inscrit à cette sélection." + #: app/routes/tryouts.py:704 msgid "Player is already on this team." msgstr "Ce joueur est déjà dans cette équipe." + #: app/routes/tryouts.py:709 msgid "Player added to team!" msgstr "Joueur ajouté à l’équipe." + #: app/routes/tryouts.py:723 msgid "You do not have permission to delete this tryout." msgstr "Vous n’avez pas les droits pour supprimer cette sélection." + #: app/routes/tryouts.py:759 msgid "Tryout deleted successfully." msgstr "Sélection supprimée." + #: app/routes/users/_shared.py:54 msgid "No file selected." msgstr "Aucun fichier sélectionné." + #: app/routes/users/_shared.py:58 msgid "Only PDF files are allowed for contracts." msgstr "Seuls les fichiers PDF sont acceptés pour les contrats." + #: app/routes/users/_shared.py:64 app/routes/users/_shared.py:75 #: app/routes/users/_shared.py:77 msgid "That file is not a PDF, whatever its name says." msgstr "Ce fichier n’est pas un PDF, quel que soit son nom." -#: app/routes/users/accounts.py:55 + +#: app/routes/users/accounts.py:56 msgid "Only the president can manage users." msgstr "Seul le président peut gérer les utilisateurs." -#: app/routes/users/accounts.py:70 + +#: app/routes/users/accounts.py:103 msgid "Only the president can edit users." msgstr "Seul le président peut modifier des utilisateurs." -#: app/routes/users/accounts.py:111 + +#: app/routes/users/accounts.py:144 msgid "Email already in use by another account." msgstr "Cette adresse courriel est déjà utilisée par un autre compte." -#: app/routes/users/accounts.py:138 + +#: app/routes/users/accounts.py:171 msgid "You cannot change your own role. Ask another president to do it." msgstr "" "Vous ne pouvez pas modifier votre propre rôle. Demandez à un autre " "président de le faire." -#: app/routes/users/accounts.py:151 + +#: app/routes/users/accounts.py:184 msgid "" "This is the last active president. Promote another account before " "changing this one." msgstr "" "C’est le dernier président actif. Promouvez un autre compte avant de " "modifier celui-ci." -#: app/routes/users/accounts.py:228 + +#: app/routes/users/accounts.py:261 #, python-format msgid "User %(username)s updated successfully!" msgstr "Utilisateur %(username)s mis à jour." -#: app/routes/users/accounts.py:249 + +#: app/routes/users/accounts.py:282 msgid "Only the president can delete users." msgstr "Seul le président peut supprimer des utilisateurs." -#: app/routes/users/accounts.py:253 + +#: app/routes/users/accounts.py:286 msgid "You cannot delete your own account." msgstr "Vous ne pouvez pas supprimer votre propre compte." -#: app/routes/users/accounts.py:312 + +#: app/routes/users/accounts.py:345 #, python-format msgid "User %(deleted_username)s has been removed." msgstr "L’utilisateur %(deleted_username)s a été supprimé." -#: app/routes/users/accounts.py:323 + +#: app/routes/users/accounts.py:356 msgid "Only the president can create users." msgstr "Seul le président peut créer des utilisateurs." -#: app/routes/users/accounts.py:371 + +#: app/routes/users/accounts.py:404 #, python-format msgid "User %(full_name)s created as %(role)s!" msgstr "Utilisateur %(full_name)s créé avec le rôle %(role)s." + #: app/routes/users/availability.py:210 msgid "Only coaches can manage availability." msgstr "Seuls les coachs peuvent gérer leurs disponibilités." -#: app/routes/users/contracts.py:92 + +#: app/routes/users/contracts.py:104 msgid "Only presidents, managers, and coaches can upload contracts." msgstr "Seuls les présidents, gérants et coachs peuvent téléverser un contrat." -#: app/routes/users/contracts.py:111 + +#: app/routes/users/contracts.py:108 app/routes/users/contracts.py:189 +msgid "Document uploads are currently disabled." +msgstr "Les téléversements de documents sont actuellement désactivés." + +#: app/routes/users/contracts.py:127 msgid "You do not have permission to upload a contract for this player." msgstr "Vous n’avez pas les droits pour téléverser un contrat pour ce joueur." -#: app/routes/users/contracts.py:138 app/routes/users/contracts.py:188 -#: app/routes/users/contracts.py:211 app/routes/users/contracts.py:230 + +#: app/routes/users/contracts.py:155 app/routes/users/contracts.py:210 +#: app/routes/users/contracts.py:233 app/routes/users/contracts.py:252 msgid "Contract storage is temporarily unavailable. Please try again later." -msgstr "Le stockage des contrats est temporairement indisponible. Veuillez r\xc3\xa9essayer plus tard." -#: app/routes/users/contracts.py:153 +msgstr "" +"Le stockage des contrats est temporairement indisponible. Veuillez " +"r\\xc3\\xa9essayer plus tard." + +#: app/routes/users/contracts.py:171 #, python-format msgid "Contract uploaded successfully for %(username)s!" msgstr "Contrat téléversé pour %(username)s." -#: app/routes/users/contracts.py:167 + +#: app/routes/users/contracts.py:185 msgid "Only the player can upload their signed contract." msgstr "Seul le joueur peut téléverser son contrat signé." -#: app/routes/users/contracts.py:196 + +#: app/routes/users/contracts.py:218 msgid "Signed contract uploaded successfully!" msgstr "Contrat signé téléversé." -#: app/routes/users/contracts.py:206 app/routes/users/contracts.py:222 + +#: app/routes/users/contracts.py:228 app/routes/users/contracts.py:244 msgid "You do not have permission to download this contract." msgstr "Vous n’avez pas les droits pour télécharger ce contrat." -#: app/routes/users/contracts.py:225 + +#: app/routes/users/contracts.py:247 msgid "No signed contract available." msgstr "Aucun contrat signé disponible." + #: app/routes/users/notes.py:43 msgid "This page is for players only." msgstr "Cette page est réservée aux joueurs." + #: app/routes/users/notes.py:80 msgid "Only coaches can access the notes dashboard." msgstr "Seuls les coachs ont accès au tableau des notes." + #: app/routes/users/notes.py:172 msgid "Only coaches can manage team notes." msgstr "Seuls les coachs peuvent gérer les notes d’équipe." + #: app/routes/users/notes.py:178 msgid "You are not assigned to a team." msgstr "Vous n’êtes assigné à aucune équipe." + #: app/routes/users/notes.py:195 msgid "Team notes saved successfully!" msgstr "Notes d’équipe enregistrées." + #: app/routes/users/notes.py:210 msgid "Only coaches can manage personal notes." msgstr "Seuls les coachs peuvent gérer les notes personnelles." + #: app/routes/users/notes.py:226 app/routes/users/notes.py:266 #: app/routes/users/notes.py:346 app/routes/users/notes.py:411 msgid "You can only write notes about players you work with." msgstr "" "Vous ne pouvez écrire des notes que sur les joueurs avec qui vous " "travaillez." + #: app/routes/users/notes.py:236 app/routes/users/notes.py:306 #, python-format msgid "Note added for %(username)s." msgstr "Note ajoutée pour %(username)s." + #: app/routes/users/notes.py:250 app/routes/users/notes.py:320 #: app/routes/users/notes.py:384 msgid "Only coaches can add personal notes." msgstr "Seuls les coachs peuvent ajouter des notes personnelles." + #: app/routes/users/notes.py:272 msgid "You cannot use that match as note context." msgstr "Vous ne pouvez pas utiliser ce match comme contexte de note." + #: app/routes/users/notes.py:275 msgid "That player did not participate in the selected match." msgstr "Ce joueur n’a pas participé au match sélectionné." + #: app/routes/users/notes.py:281 msgid "You cannot use that tryout as note context." msgstr "Vous ne pouvez pas utiliser cette sélection comme contexte de note." + #: app/routes/users/notes.py:284 msgid "That player is not registered for the selected tryout." msgstr "Ce joueur n’est pas inscrit à la sélection choisie." + #: app/routes/users/notes.py:290 msgid "You cannot use that team as note context." msgstr "Vous ne pouvez pas utiliser cette équipe comme contexte de note." + #: app/routes/users/notes.py:293 msgid "That player is not on the selected team." msgstr "Ce joueur ne fait pas partie de l’équipe sélectionnée." + #: app/routes/users/notes.py:325 msgid "You do not have permission to add notes for this tryout." msgstr "Vous n’avez pas les droits pour ajouter des notes à cette sélection." + #: app/routes/users/notes.py:342 msgid "Invalid tryout context." msgstr "Contexte de sélection invalide." + #: app/routes/users/notes.py:361 app/routes/users/notes.py:426 msgid "Note added successfully." msgstr "Note ajoutée." + #: app/routes/users/notes.py:389 msgid "You do not have permission to add notes for this match." msgstr "Vous n’avez pas les droits pour ajouter des notes à ce match." + #: app/routes/users/notes.py:407 msgid "Invalid match context." msgstr "Contexte de match invalide." + #: app/routes/users/notes.py:415 msgid "That player did not participate in this match." msgstr "Ce joueur n’a pas participé à ce match." + #: app/routes/users/one_on_one.py:22 msgid "Only players can request One on One sessions." msgstr "Seuls les joueurs peuvent demander une rencontre individuelle." + #: app/routes/users/one_on_one.py:35 msgid "You do not have a coach assigned to your team." msgstr "Aucun coach n’est assigné à votre équipe." + #: app/routes/users/one_on_one.py:66 msgid "Cannot request One on One - no coach assigned." msgstr "Impossible de demander une rencontre : aucun coach assigné." + #: app/routes/users/one_on_one.py:92 msgid "The requested time is not within the coach's availability." msgstr "L’horaire demandé ne correspond à aucune disponibilité du coach." + #: app/routes/users/one_on_one.py:120 msgid "Your One on One request has been submitted!" msgstr "Votre demande de rencontre a été envoyée." + #: app/routes/users/one_on_one.py:165 msgid "Only coaches can accept One on One requests." msgstr "Seuls les coachs peuvent accepter une demande de rencontre." + #: app/routes/users/one_on_one.py:171 app/routes/users/one_on_one.py:221 msgid "This request is not for you." msgstr "Cette demande ne vous est pas destinée." + #: app/routes/users/one_on_one.py:175 app/routes/users/one_on_one.py:225 msgid "This request has already been processed." msgstr "Cette demande a déjà été traitée." + #: app/routes/users/one_on_one.py:202 #, python-format msgid "One on One request from %(player)s has been approved!" msgstr "La demande de rencontre de %(player)s a été approuvée." + #: app/routes/users/one_on_one.py:215 msgid "Only coaches can reject One on One requests." msgstr "Seuls les coachs peuvent refuser une demande de rencontre." + #: app/routes/users/one_on_one.py:262 #, python-format msgid "One on One request from %(player)s has been rejected." msgstr "La demande de rencontre de %(player)s a été refusée." + #: app/routes/users/profile.py:82 msgid "Username already taken." msgstr "Ce nom d’utilisateur est déjà pris." + #: app/routes/users/profile.py:92 msgid "Email already in use." msgstr "Cette adresse courriel est déjà utilisée." + #: app/routes/users/profile.py:131 msgid "Profile updated successfully!" msgstr "Profil mis à jour." + #: app/templates/errors/400.html:2 msgid "400 Bad Request" msgstr "400 Requête incorrecte" + #: app/templates/errors/400.html:3 msgid "Bad Request" msgstr "Requête incorrecte" + #: app/templates/errors/400.html:9 msgid "400 — Bad Request" msgstr "400 — Requête incorrecte" + #: app/templates/errors/400.html:10 msgid "" "The request could not be understood by the server. Please check your " @@ -722,19 +939,24 @@ msgid "" msgstr "" "Le serveur n’a pas pu interpréter la requête. Vérifiez votre saisie et " "réessayez." + #: app/templates/errors/400.html:12 app/templates/errors/403.html:12 #: app/templates/errors/429.html:12 msgid "Go Back" msgstr "Retour" + #: app/templates/errors/403.html:2 msgid "403 Forbidden" msgstr "403 Accès refusé" + #: app/templates/errors/403.html:3 msgid "Access Denied" msgstr "Accès refusé" + #: app/templates/errors/403.html:9 msgid "403 — Forbidden" msgstr "403 — Accès refusé" + #: app/templates/errors/403.html:10 msgid "" "You do not have permission to access this resource. If you believe this " @@ -742,32 +964,41 @@ msgid "" msgstr "" "Vous n’avez pas les droits d’accès à cette ressource. Si vous pensez " "qu’il s’agit d’une erreur, contactez un administrateur." + #: app/templates/errors/404.html:2 msgid "404 Not Found" msgstr "404 Page introuvable" + #: app/templates/errors/404.html:3 msgid "Page Not Found" msgstr "Page introuvable" + #: app/templates/errors/404.html:9 msgid "404 — Not Found" msgstr "404 — Page introuvable" + #: app/templates/errors/404.html:10 msgid "" "The page you are looking for does not exist. It may have been moved or " "deleted." msgstr "La page demandée n’existe pas. Elle a peut-être été déplacée ou supprimée." + #: app/templates/errors/404.html:12 msgid "Return Home" msgstr "Retour à l’accueil" + #: app/templates/errors/429.html:2 msgid "429 Too Many Requests" msgstr "429 Trop de requêtes" + #: app/templates/errors/429.html:3 msgid "Rate Limit Exceeded" msgstr "Limite de requêtes atteinte" + #: app/templates/errors/429.html:9 msgid "429 — Too Many Requests" msgstr "429 — Trop de requêtes" + #: app/templates/errors/429.html:10 msgid "" "You have sent too many requests in a short period. Please wait a moment " @@ -775,15 +1006,19 @@ msgid "" msgstr "" "Vous avez envoyé trop de requêtes en peu de temps. Patientez un instant " "puis réessayez." + #: app/templates/errors/500.html:2 msgid "500 Server Error" msgstr "500 Erreur du serveur" + #: app/templates/errors/500.html:3 msgid "Internal Server Error" msgstr "Erreur interne du serveur" + #: app/templates/errors/500.html:9 msgid "500 — Internal Server Error" msgstr "500 — Erreur interne du serveur" + #: app/templates/errors/500.html:10 msgid "" "Something went wrong on our end. The error has been logged and will be " @@ -791,98 +1026,124 @@ msgid "" msgstr "" "Une erreur est survenue de notre côté. Elle a été journalisée et sera " "examinée. Veuillez réessayer dans un instant." + #: app/templates/errors/500.html:15 msgid "Reference to quote if you report this:" msgstr "Référence à indiquer si vous signalez ce problème :" + #: app/templates/errors/500.html:18 msgid "Try Again" msgstr "Réessayer" + #: app/templates/layouts/_language_switcher.html:10 msgid "Language" msgstr "Langue" + #: app/templates/layouts/_pagination.html:19 msgid "Pagination" msgstr "Pagination" + #: app/templates/layouts/_pagination.html:22 #: app/templates/layouts/_pagination.html:24 msgid "Previous" msgstr "Précédent" + #: app/templates/layouts/_pagination.html:28 #, python-format msgid "Page %(page)s of %(pages)s" msgstr "Page %(page)s sur %(pages)s" + #: app/templates/layouts/_pagination.html:30 #, python-format msgid "%(total)s in total" msgstr "%(total)s au total" + #: app/templates/layouts/_pagination.html:35 #: app/templates/layouts/_pagination.html:37 msgid "Next" msgstr "Suivant" + #: app/templates/layouts/base.html:48 app/templates/layouts/base.html:154 #: app/templates/pages/dashboard.html:2 app/templates/pages/dashboard.html:3 msgid "Dashboard" msgstr "Tableau de bord" + #: app/templates/layouts/base.html:54 app/templates/pages/tryouts.html:2 #: app/templates/pages/tryouts.html:3 msgid "Tryouts" msgstr "Sélections" + #: app/templates/layouts/base.html:60 app/templates/pages/calendar.html:2 #: app/templates/pages/calendar.html:3 msgid "Calendar" msgstr "Calendrier" + #: app/templates/layouts/base.html:67 app/templates/pages/dashboard.html:43 #: app/templates/pages/evaluations.html:3 #: app/templates/pages/evaluations.html:4 msgid "Evaluations" msgstr "Évaluations" + #: app/templates/layouts/base.html:75 app/templates/pages/my_teams.html:2 #: app/templates/pages/my_teams.html:3 msgid "My Team(s)" msgstr "Mon ou mes équipes" + #: app/templates/layouts/base.html:82 msgid "Manage Teams" msgstr "Gestion des équipes" + #: app/templates/layouts/base.html:90 app/templates/pages/users.html:3 #: app/templates/pages/users.html:4 msgid "Manage Users" msgstr "Gestion des utilisateurs" + #: app/templates/layouts/base.html:104 #: app/templates/pages/player_personal_notes.html:2 #: app/templates/pages/player_personal_notes.html:3 msgid "My Notes" msgstr "Mes notes" + #: app/templates/layouts/base.html:112 msgid "Notes & One on One" msgstr "Notes et rencontres individuelles" + #: app/templates/layouts/base.html:119 app/templates/pages/contracts.html:2 #: app/templates/pages/contracts.html:3 app/templates/pages/profile.html:9 msgid "Contracts" msgstr "Contrats" + #: app/templates/layouts/base.html:126 app/templates/pages/profile.html:2 #: app/templates/pages/profile.html:3 msgid "My Profile" msgstr "Mon profil" + #: app/templates/layouts/base.html:137 msgid "Logout" msgstr "Déconnexion" + #: app/templates/layouts/base.html:158 msgid "Toggle dark mode" msgstr "Basculer le mode sombre" + #: app/templates/layouts/base.html:170 app/templates/layouts/base.html:189 msgid "Dismiss" msgstr "Fermer" + #: app/templates/layouts/base.html:199 msgid "UdeS team manager" msgstr "UdeS team manager" + #: app/templates/layouts/macros.html:116 msgid "Close" msgstr "Fermer" + #: app/templates/pages/add_note.html:2 app/templates/pages/add_note.html:3 #: app/templates/pages/add_note.html:22 app/templates/pages/notes.html:38 #: app/templates/pages/personal_notes.html:9 msgid "Add Personal Note" msgstr "Ajouter une note personnelle" + #: app/templates/pages/add_note.html:47 app/templates/pages/contracts.html:25 #: app/templates/pages/dashboard.html:249 #: app/templates/pages/dashboard.html:363 app/templates/pages/my_teams.html:52 @@ -892,39 +1153,50 @@ msgstr "Ajouter une note personnelle" #: app/templates/pages/view_tryout.html:498 msgid "Player" msgstr "Joueur" + #: app/templates/pages/add_note.html:49 app/templates/pages/teams.html:216 #: app/templates/pages/upload_contract.html:18 #: app/templates/pages/view_tryout.html:130 msgid "-- Select a player --" msgstr "-- Choisir un joueur --" + #: app/templates/pages/add_note.html:59 app/templates/pages/notes.html:58 #: app/templates/pages/personal_notes.html:29 msgid "Note Content" msgstr "Contenu de la note" + #: app/templates/pages/add_note.html:60 msgid "Enter your coaching notes..." msgstr "Vos notes de coaching..." + #: app/templates/pages/add_note.html:65 msgid "Link to Tryout (Optional)" msgstr "Lier à une sélection (facultatif)" + #: app/templates/pages/add_note.html:67 msgid "-- No tryout --" msgstr "-- Aucune sélection --" + #: app/templates/pages/add_note.html:75 msgid "Link to Match (Optional)" msgstr "Lier à un match (facultatif)" + #: app/templates/pages/add_note.html:77 msgid "-- No match --" msgstr "-- Aucun match --" + #: app/templates/pages/add_note.html:85 msgid "Link to Team (Optional)" msgstr "Lier à une équipe (facultatif)" + #: app/templates/pages/add_note.html:87 msgid "-- No team --" msgstr "-- Aucune équipe --" + #: app/templates/pages/add_note.html:97 msgid "Team Notes (Reference)" msgstr "Notes d’équipe (référence)" + #: app/templates/pages/add_note.html:120 #: app/templates/pages/evaluate_player.html:131 #: app/templates/pages/notes.html:100 @@ -932,113 +1204,146 @@ msgstr "Notes d’équipe (référence)" #: app/templates/pages/view_tryout.html:309 msgid "Add Note" msgstr "Ajouter une note" + #: app/templates/pages/calendar.html:9 app/templates/pages/view_tryout.html:302 msgid "Schedule" msgstr "Planifier" + #: app/templates/pages/calendar.html:13 msgid "Month" msgstr "Mois" + #: app/templates/pages/calendar.html:16 msgid "Week" msgstr "Semaine" + #: app/templates/pages/calendar.html:19 msgid "Day" msgstr "Jour" + #: app/templates/pages/calendar.html:22 msgid "List" msgstr "Liste" + #: app/templates/pages/calendar.html:37 msgid "Create New Event" msgstr "Créer un événement" + #: app/templates/pages/calendar.html:41 msgid "Date:" msgstr "Date :" + #: app/templates/pages/calendar.html:46 msgid "Schedule Tryout Match" msgstr "Planifier un match de sélection" + #: app/templates/pages/calendar.html:47 msgid "Add a scrim/match inside an existing tryout" msgstr "Ajouter un scrim ou un match dans une sélection existante" + #: app/templates/pages/calendar.html:50 msgid "-- Select a tryout --" msgstr "-- Choisir une sélection --" + #: app/templates/pages/calendar.html:53 app/templates/pages/calendar.html:68 msgid "Go" msgstr "Aller" + #: app/templates/pages/calendar.html:61 app/templates/pages/teams.html:131 msgid "Schedule Team Match" msgstr "Planifier un match d’équipe" + #: app/templates/pages/calendar.html:62 msgid "Regular season match for an org team" msgstr "Match de saison régulière pour une équipe du club" + #: app/templates/pages/calendar.html:65 msgid "-- Select a team --" msgstr "-- Choisir une équipe --" + #: app/templates/pages/calendar.html:76 msgid "Create New Tryout" msgstr "Créer une sélection" + #: app/templates/pages/calendar.html:77 msgid "Create a brand new tryout event" msgstr "Créer une nouvelle sélection" + #: app/templates/pages/calendar.html:79 msgid "Create Tryout" msgstr "Créer la sélection" + #: app/templates/pages/calendar.html:92 msgid "Event Details" msgstr "Détail de l’événement" + #: app/templates/pages/calendar.html:98 msgid "Confirm" msgstr "Confirmer" + #: app/templates/pages/calendar.html:102 #: app/templates/pages/team_matches.html:103 msgid "Delete Match" msgstr "Supprimer le match" + #: app/templates/pages/calendar.html:105 #: app/templates/pages/team_matches.html:98 msgid "Edit Match" msgstr "Modifier le match" + #: app/templates/pages/calendar.html:108 msgid "View Tryout" msgstr "Voir la sélection" + #: app/templates/pages/coach_availability.html:2 #: app/templates/pages/coach_availability.html:3 msgid "Manage Availability" msgstr "Gérer mes disponibilités" + #: app/templates/pages/coach_availability.html:9 msgid "Set Your Weekly Availability" msgstr "Définir vos disponibilités hebdomadaires" + #: app/templates/pages/coach_availability.html:10 msgid "Select time slots when you're available for One on One sessions" msgstr "" "Choisissez les plages où vous êtes disponible pour des rencontres " "individuelles" + #: app/templates/pages/coach_availability.html:14 #: app/templates/pages/profile.html:256 msgid "Loading availability grid..." msgstr "Chargement de la grille de disponibilités..." + #: app/templates/pages/coach_availability.html:19 msgid "Save Availability" msgstr "Enregistrer les disponibilités" + #: app/templates/pages/coach_availability.html:22 #: app/templates/pages/profile.html:240 app/templates/pages/profile.html:260 msgid "Clear All" msgstr "Tout effacer" + #: app/templates/pages/contracts.html:9 #: app/templates/pages/upload_contract.html:2 #: app/templates/pages/upload_contract.html:3 #: app/templates/pages/upload_contract.html:39 msgid "Upload Contract" msgstr "Téléverser un contrat" + #: app/templates/pages/contracts.html:17 msgid "Contract Dropbox" msgstr "Dépôt de contrats" + #: app/templates/pages/contracts.html:26 app/templates/pages/notes.html:87 #: app/templates/pages/team_matches.html:27 msgid "Team" msgstr "Équipe" + #: app/templates/pages/contracts.html:27 msgid "Contract" msgstr "Contrat" + #: app/templates/pages/contracts.html:28 app/templates/pages/dashboard.html:95 #: app/templates/pages/dashboard.html:118 #: app/templates/pages/dashboard.html:175 @@ -1048,39 +1353,48 @@ msgstr "Contrat" #: app/templates/pages/notes.html:126 app/templates/pages/one_on_one.html:73 #: app/templates/pages/team_match_form.html:61 #: app/templates/pages/team_matches.html:33 app/templates/pages/teams.html:146 -#: app/templates/pages/users.html:24 app/templates/pages/view_tryout.html:155 +#: app/templates/pages/users.html:25 app/templates/pages/view_tryout.html:155 #: app/templates/pages/view_tryout.html:327 msgid "Status" msgstr "Statut" + #: app/templates/pages/contracts.html:29 msgid "Uploaded" msgstr "Téléversé le" + #: app/templates/pages/contracts.html:30 app/templates/pages/dashboard.html:175 #: app/templates/pages/notes.html:127 app/templates/pages/team_matches.html:34 -#: app/templates/pages/teams.html:151 app/templates/pages/users.html:26 +#: app/templates/pages/teams.html:151 app/templates/pages/users.html:27 #: app/templates/pages/view_tryout.html:160 #: app/templates/pages/view_tryout.html:329 msgid "Actions" msgstr "Actions" + #: app/templates/pages/contracts.html:49 app/templates/pages/contracts.html:50 msgid "Download" msgstr "Télécharger" + #: app/templates/pages/contracts.html:53 msgid "Download Signed" msgstr "Télécharger la version signée" + #: app/templates/pages/contracts.html:54 msgid "Signed" msgstr "Signé" + #: app/templates/pages/contracts.html:58 app/templates/pages/contracts.html:89 #: app/templates/pages/contracts.html:102 msgid "Upload Signed Contract" msgstr "Téléverser le contrat signé" + #: app/templates/pages/contracts.html:59 msgid "Return Signed" msgstr "Retourner signé" + #: app/templates/pages/contracts.html:72 msgid "No contracts found" msgstr "Aucun contrat" + #: app/templates/pages/contracts.html:74 msgid "" "No contracts have been uploaded for you yet. Contact your coach or " @@ -1088,105 +1402,132 @@ msgid "" msgstr "" "Aucun contrat n’a encore été téléversé pour vous. Contactez votre coach " "ou votre gérant." + #: app/templates/pages/contracts.html:76 msgid "" "No contracts have been uploaded yet. Upload a contract using the button " "above." msgstr "Aucun contrat n’a encore été téléversé. Utilisez le bouton ci-dessus." + #: app/templates/pages/contracts.html:96 msgid "Select Signed Contract File" msgstr "Choisir le fichier du contrat signé" + #: app/templates/pages/contracts.html:98 #: app/templates/pages/upload_contract.html:28 msgid "Accepted format: PDF" msgstr "Format accepté : PDF" + #: app/templates/pages/contracts.html:101 #: app/templates/pages/match_form.html:265 app/templates/pages/notes.html:189 #: app/templates/pages/teams.html:48 app/templates/pages/teams.html:295 #: app/templates/pages/view_tryout.html:245 msgid "Cancel" msgstr "Annuler" + #: app/templates/pages/create_user.html:2 #: app/templates/pages/create_user.html:3 #: app/templates/pages/create_user.html:47 msgid "Create User" msgstr "Créer l’utilisateur" + #: app/templates/pages/create_user.html:13 #: app/templates/pages/edit_profile.html:17 #: app/templates/pages/edit_user.html:13 app/templates/pages/register.html:10 msgid "Full Name" msgstr "Nom complet" + #: app/templates/pages/create_user.html:14 msgid "Enter full name" msgstr "Saisir le nom complet" + #: app/templates/pages/create_user.html:17 #: app/templates/pages/edit_profile.html:13 app/templates/pages/login.html:7 #: app/templates/pages/register.html:15 app/templates/pages/users.html:21 msgid "Username" msgstr "Nom d’utilisateur" + #: app/templates/pages/create_user.html:18 msgid "Choose username" msgstr "Choisir un nom d’utilisateur" + #: app/templates/pages/create_user.html:23 #: app/templates/pages/edit_profile.html:23 #: app/templates/pages/edit_user.html:17 app/templates/pages/register.html:20 #: app/templates/pages/teams.html:148 app/templates/pages/users.html:22 msgid "Email" msgstr "Courriel" + #: app/templates/pages/create_user.html:24 msgid "Enter email" msgstr "Saisir le courriel" + #: app/templates/pages/create_user.html:27 #: app/templates/pages/edit_profile.html:27 #: app/templates/pages/edit_user.html:23 app/templates/pages/teams.html:149 msgid "Phone" msgstr "Téléphone" + #: app/templates/pages/create_user.html:28 msgid "Phone number" msgstr "Numéro de téléphone" + #: app/templates/pages/create_user.html:31 #: app/templates/pages/dashboard.html:74 app/templates/pages/edit_user.html:27 #: app/templates/pages/users.html:23 msgid "Role" msgstr "Rôle" + #: app/templates/pages/create_user.html:41 app/templates/pages/login.html:11 #: app/templates/pages/register.html:137 msgid "Password" msgstr "Mot de passe" + #: app/templates/pages/create_user.html:42 msgid "Set password" msgstr "Définir le mot de passe" + #: app/templates/pages/dashboard.html:16 msgid "Total Users" msgstr "Total des utilisateurs" + #: app/templates/pages/dashboard.html:25 app/templates/pages/dashboard.html:175 msgid "Players" msgstr "Joueurs" + #: app/templates/pages/dashboard.html:34 msgid "Total Tryouts" msgstr "Total des sélections" + #: app/templates/pages/dashboard.html:52 msgid "Active Tryouts" msgstr "Sélections en cours" + #: app/templates/pages/dashboard.html:61 #: app/templates/pages/view_tryout.html:21 msgid "Upcoming" msgstr "À venir" + #: app/templates/pages/dashboard.html:69 msgid "Recent Users" msgstr "Utilisateurs récents" + #: app/templates/pages/dashboard.html:74 app/templates/pages/users.html:20 msgid "Name" msgstr "Nom" -#: app/templates/pages/dashboard.html:74 app/templates/pages/users.html:25 + +#: app/templates/pages/dashboard.html:74 app/templates/pages/users.html:26 msgid "Joined" msgstr "Inscrit le" + #: app/templates/pages/dashboard.html:90 msgid "Recent Tryouts" msgstr "Sélections récentes" + #: app/templates/pages/dashboard.html:95 app/templates/pages/dashboard.html:175 msgid "Title" msgstr "Titre" + #: app/templates/pages/dashboard.html:95 app/templates/pages/dashboard.html:175 #: app/templates/pages/dashboard.html:249 #: app/templates/pages/dashboard.html:321 @@ -1197,10 +1538,12 @@ msgstr "Titre" #: app/templates/pages/view_tryout.html:323 msgid "Date" msgstr "Date" + #: app/templates/pages/dashboard.html:114 #: app/templates/pages/dashboard.html:198 app/templates/pages/my_teams.html:84 msgid "Upcoming Matches" msgstr "Matchs à venir" + #: app/templates/pages/dashboard.html:118 #: app/templates/pages/dashboard.html:202 #: app/templates/pages/dashboard.html:285 app/templates/pages/my_teams.html:90 @@ -1208,6 +1551,7 @@ msgstr "Matchs à venir" #: app/templates/pages/teams.html:132 app/templates/pages/view_tryout.html:321 msgid "Match" msgstr "Match" + #: app/templates/pages/dashboard.html:118 #: app/templates/pages/dashboard.html:202 #: app/templates/pages/dashboard.html:249 @@ -1215,88 +1559,112 @@ msgstr "Match" #: app/templates/pages/dashboard.html:321 app/templates/pages/notes.html:78 msgid "Tryout" msgstr "Sélection" + #: app/templates/pages/dashboard.html:118 #: app/templates/pages/dashboard.html:202 #: app/templates/pages/dashboard.html:285 msgid "Date & Time" msgstr "Date et heure" + #: app/templates/pages/dashboard.html:145 #: app/templates/pages/dashboard.html:169 #: app/templates/pages/dashboard.html:273 msgid "My Tryouts" msgstr "Mes sélections" + #: app/templates/pages/dashboard.html:154 msgid "Active" msgstr "Actif" + #: app/templates/pages/dashboard.html:163 msgid "My Evaluations" msgstr "Mes évaluations" + #: app/templates/pages/dashboard.html:229 msgid "Evaluations Done" msgstr "Évaluations réalisées" + #: app/templates/pages/dashboard.html:238 #: app/templates/pages/one_on_one.html:85 msgid "Pending" msgstr "En attente" + #: app/templates/pages/dashboard.html:244 msgid "Recent Evaluations" msgstr "Évaluations récentes" + #: app/templates/pages/dashboard.html:249 msgid "Score" msgstr "Note" + #: app/templates/pages/dashboard.html:280 msgid "My Next Matches" msgstr "Mes prochains matchs" + #: app/templates/pages/dashboard.html:285 app/templates/pages/my_teams.html:91 #: app/templates/pages/team_matches.html:28 msgid "Opponent" msgstr "Adversaire" + #: app/templates/pages/dashboard.html:311 msgid "No upcoming matches yet." msgstr "Aucun match à venir pour l’instant." + #: app/templates/pages/dashboard.html:317 msgid "My Registrations" msgstr "Mes inscriptions" + #: app/templates/pages/dashboard.html:344 msgid "Total Players" msgstr "Total des joueurs" + #: app/templates/pages/dashboard.html:353 msgid "Total Evaluations" msgstr "Total des évaluations" + #: app/templates/pages/dashboard.html:359 msgid "Top Rated Players" msgstr "Joueurs les mieux notés" + #: app/templates/pages/dashboard.html:363 msgid "Avg Score" msgstr "Note moyenne" + #: app/templates/pages/dashboard.html:373 #: app/templates/pages/view_tryout.html:532 msgid "No evaluations yet." msgstr "Aucune évaluation pour l’instant." + #: app/templates/pages/edit_profile.html:2 #: app/templates/pages/edit_profile.html:3 app/templates/pages/profile.html:12 msgid "Edit Profile" msgstr "Modifier le profil" + #: app/templates/pages/edit_profile.html:33 #: app/templates/pages/edit_user.html:43 app/templates/pages/profile.html:63 #: app/templates/pages/register.html:81 msgid "E-Sports Profile" msgstr "Profil e-sport" + #: app/templates/pages/edit_profile.html:34 msgid "Update your competitive gaming profile for tryouts." msgstr "Mettez à jour votre profil de joueur compétitif pour les sélections." + #: app/templates/pages/edit_profile.html:37 #: app/templates/pages/register.html:85 msgid "Games You Play" msgstr "Jeux auxquels vous jouez" + #: app/templates/pages/edit_profile.html:47 #: app/templates/pages/register.html:99 msgid "Select all games you're signing in for." msgstr "Sélectionnez tous les jeux pour lesquels vous vous inscrivez." + #: app/templates/pages/edit_profile.html:53 #: app/templates/pages/edit_user.html:61 msgid "Gamertags for TRN" msgstr "Pseudos pour Tracker Network" + #: app/templates/pages/edit_profile.html:54 msgid "" "Enter your gamertag for each selected game to link to your Tracker " @@ -1304,88 +1672,112 @@ msgid "" msgstr "" "Saisissez votre pseudo pour chaque jeu sélectionné afin de le lier à " "votre profil Tracker Network." + #: app/templates/pages/edit_profile.html:62 #: app/templates/pages/edit_user.html:70 app/templates/pages/edit_user.html:71 #: app/templates/pages/view_user.html:58 msgid "Gamertag" msgstr "Pseudo de jeu" + #: app/templates/pages/edit_profile.html:67 #: app/templates/pages/edit_user.html:75 app/templates/pages/view_user.html:59 msgid "Platform" msgstr "Plateforme" + #: app/templates/pages/edit_profile.html:69 #: app/templates/pages/edit_user.html:77 msgid "Select Platform" msgstr "Choisir une plateforme" + #: app/templates/pages/edit_profile.html:83 #: app/templates/pages/edit_user.html:91 msgid "Discord Username" msgstr "Nom d’utilisateur Discord" + #: app/templates/pages/edit_profile.html:84 #: app/templates/pages/edit_user.html:92 msgid "e.g. Name#1234" msgstr "ex. : Nom#1234" + #: app/templates/pages/edit_profile.html:87 #: app/templates/pages/register.html:57 msgid "Reconnect" msgstr "Reconnecter" + #: app/templates/pages/edit_profile.html:87 #: app/templates/pages/register.html:67 msgid "Connect Discord Account" msgstr "Connecter un compte Discord" + #: app/templates/pages/edit_profile.html:93 #: app/templates/pages/edit_user.html:100 msgid "League OS Connection" msgstr "Connexion League OS" + #: app/templates/pages/edit_profile.html:94 #: app/templates/pages/edit_user.html:101 app/templates/pages/register.html:129 msgid "League OS profile link or ID" msgstr "Lien ou identifiant du profil League OS" + #: app/templates/pages/edit_profile.html:99 msgid "Change Password" msgstr "Changer le mot de passe" + #: app/templates/pages/edit_profile.html:100 msgid "Leave blank to keep your current password." msgstr "Laissez vide pour conserver votre mot de passe actuel." + #: app/templates/pages/edit_profile.html:102 msgid "New Password" msgstr "Nouveau mot de passe" + #: app/templates/pages/edit_profile.html:103 #: app/templates/pages/edit_user.html:107 msgid "Enter new password" msgstr "Saisir le nouveau mot de passe" + #: app/templates/pages/edit_profile.html:108 app/templates/pages/teams.html:296 msgid "Save Changes" msgstr "Enregistrer les modifications" + #: app/templates/pages/edit_user.html:3 msgid "Edit User" msgstr "Modifier l’utilisateur" + #: app/templates/pages/edit_user.html:46 msgid "Games" msgstr "Jeux" + #: app/templates/pages/edit_user.html:62 msgid "Enter gamertag for each selected game to link to Tracker Network." msgstr "Saisissez un pseudo par jeu sélectionné pour le lier à Tracker Network." + #: app/templates/pages/edit_user.html:95 msgid "(for DMs)" msgstr "(pour les messages privés)" + #: app/templates/pages/edit_user.html:96 msgid "Numeric ID (e.g. 123456789012345678)" msgstr "Identifiant numérique (ex. : 123456789012345678)" + #: app/templates/pages/edit_user.html:97 msgid "Enable Developer Mode in Discord → Right-click profile → Copy ID" msgstr "" "Activez le mode développeur dans Discord → clic droit sur le profil → " "Copier l’identifiant" + #: app/templates/pages/edit_user.html:106 msgid "(leave blank to keep current)" msgstr "(laisser vide pour conserver l’actuel)" + #: app/templates/pages/edit_user.html:111 msgid "Update User" msgstr "Mettre à jour l’utilisateur" + #: app/templates/pages/evaluate_player.html:10 msgid "Player Evaluation" msgstr "Évaluation du joueur" + #: app/templates/pages/evaluate_player.html:24 msgid "" "You have already evaluated this player. Your previous scores are shown " @@ -1393,166 +1785,213 @@ msgid "" msgstr "" "Vous avez déjà évalué ce joueur. Vos notes précédentes sont affichées ci-" "dessous." + #: app/templates/pages/evaluate_player.html:33 msgid "Mecanics (1-10)" msgstr "Mécaniques (1-10)" + #: app/templates/pages/evaluate_player.html:40 msgid "Cohesion (1-10)" msgstr "Cohésion (1-10)" + #: app/templates/pages/evaluate_player.html:47 msgid "Communication (1-10)" msgstr "Communication (1-10)" + #: app/templates/pages/evaluate_player.html:57 msgid "Gamesense (1-10)" msgstr "Sens du jeu (1-10)" + #: app/templates/pages/evaluate_player.html:64 msgid "Versatility (1-10)" msgstr "Polyvalence (1-10)" + #: app/templates/pages/evaluate_player.html:71 msgid "Discipline (1-10)" msgstr "Discipline (1-10)" + #: app/templates/pages/evaluate_player.html:81 msgid "Analysis (1-10)" msgstr "Analyse (1-10)" + #: app/templates/pages/evaluate_player.html:88 msgid "Sport Ethics (1-10)" msgstr "Éthique sportive (1-10)" + #: app/templates/pages/evaluate_player.html:95 msgid "Mental (1-10)" msgstr "Mental (1-10)" + #: app/templates/pages/evaluate_player.html:106 msgid "Recommended Position" msgstr "Poste recommandé" + #: app/templates/pages/evaluate_player.html:109 #: app/templates/pages/view_tryout.html:280 msgid "-- Select Position --" msgstr "-- Choisir un poste --" + #: app/templates/pages/evaluate_player.html:115 msgid "Enter position (optional)" msgstr "Saisir un poste (facultatif)" + #: app/templates/pages/evaluate_player.html:121 msgid "Comments" msgstr "Commentaires" + #: app/templates/pages/evaluate_player.html:122 msgid "Enter your evaluation notes..." msgstr "Vos notes d’évaluation..." + #: app/templates/pages/evaluate_player.html:130 msgid "Add note for this player" msgstr "Ajouter une note pour ce joueur" + #: app/templates/pages/evaluate_player.html:147 #: app/templates/pages/view_tryout.html:499 msgid "Evaluator" msgstr "Évaluateur" + #: app/templates/pages/evaluate_player.html:148 #: app/templates/pages/view_tryout.html:500 msgid "Mecanics" msgstr "Mécaniques" + #: app/templates/pages/evaluate_player.html:149 #: app/templates/pages/view_tryout.html:501 msgid "Cohesion" msgstr "Cohésion" + #: app/templates/pages/evaluate_player.html:150 #: app/templates/pages/view_tryout.html:502 msgid "Communication" msgstr "Communication" + #: app/templates/pages/evaluate_player.html:151 #: app/templates/pages/view_tryout.html:503 msgid "Gamesense" msgstr "Sens du jeu" + #: app/templates/pages/evaluate_player.html:152 #: app/templates/pages/view_tryout.html:504 msgid "Versatility" msgstr "Polyvalence" + #: app/templates/pages/evaluate_player.html:153 #: app/templates/pages/view_tryout.html:505 msgid "Discipline" msgstr "Discipline" + #: app/templates/pages/evaluate_player.html:154 #: app/templates/pages/view_tryout.html:506 msgid "Analysis" msgstr "Analyse" + #: app/templates/pages/evaluate_player.html:155 #: app/templates/pages/view_tryout.html:507 msgid "Sport Ethics" msgstr "Éthique sportive" + #: app/templates/pages/evaluate_player.html:156 #: app/templates/pages/view_tryout.html:508 msgid "Mental" msgstr "Mental" + #: app/templates/pages/evaluate_player.html:157 #: app/templates/pages/view_tryout.html:509 msgid "Overall" msgstr "Global" + #: app/templates/pages/evaluate_player.html:158 #: app/templates/pages/my_teams.html:54 #: app/templates/pages/view_tryout.html:286 msgid "Position" msgstr "Poste" + #: app/templates/pages/evaluations.html:97 msgid "No evaluations yet" msgstr "Aucune évaluation" + #: app/templates/pages/login.html:2 msgid "Login" msgstr "Connexion" + #: app/templates/pages/login.html:8 msgid "Enter your username" msgstr "Saisissez votre nom d’utilisateur" + #: app/templates/pages/login.html:12 msgid "Enter your password" msgstr "Saisissez votre mot de passe" + #: app/templates/pages/login.html:14 msgid "Sign In" msgstr "Se connecter" + #: app/templates/pages/login.html:15 msgid "Don't have an account?" msgstr "Vous n’avez pas de compte ?" + #: app/templates/pages/login.html:15 msgid "Register here" msgstr "Inscrivez-vous ici" + #: app/templates/pages/match_form.html:34 msgid "Match Type" msgstr "Type de match" + #: app/templates/pages/match_form.html:36 msgid "Team vs Team" msgstr "Équipe contre équipe" + #: app/templates/pages/match_form.html:37 msgid "Player vs Player" msgstr "Joueur contre joueur" + #: app/templates/pages/match_form.html:38 msgid "Player Scrim" msgstr "Scrim entre joueurs" + #: app/templates/pages/match_form.html:48 #: app/templates/pages/team_match_form.html:17 msgid "Match Title" msgstr "Titre du match" + #: app/templates/pages/match_form.html:49 msgid "e.g., Alpha vs Bravo Scrimmage" msgstr "ex. : Scrim Alpha contre Bravo" + #: app/templates/pages/match_form.html:62 #: app/templates/pages/team_match_form.html:63 msgid "Scheduled" msgstr "Planifié" + #: app/templates/pages/match_form.html:63 #: app/templates/pages/team_match_form.html:64 #: app/templates/pages/view_tryout.html:23 msgid "Completed" msgstr "Terminé" + #: app/templates/pages/match_form.html:64 #: app/templates/pages/team_match_form.html:65 msgid "Cancelled" msgstr "Annulé" + #: app/templates/pages/match_form.html:69 app/templates/pages/my_teams.html:94 #: app/templates/pages/team_match_form.html:54 #: app/templates/pages/team_matches.html:31 #: app/templates/pages/tryout_form.html:49 msgid "Location" msgstr "Lieu" + #: app/templates/pages/match_form.html:70 msgid "Match location" msgstr "Lieu du match" + #: app/templates/pages/match_form.html:77 msgid "Select Match Time" msgstr "Choisir l’heure du match" + #: app/templates/pages/match_form.html:79 msgid "" "Click time slots consecutively to set match duration. Players available " @@ -1561,72 +2000,91 @@ msgstr "" "Cliquez des plages consécutives pour définir la durée du match. Les " "joueurs disponibles sur toutes les plages choisies apparaissent ci-" "dessous." + #: app/templates/pages/match_form.html:80 msgid "Reset time selection" msgstr "Réinitialiser la plage horaire" + #: app/templates/pages/match_form.html:81 msgid "Reset Time" msgstr "Réinitialiser l’heure" + #: app/templates/pages/match_form.html:86 app/templates/pages/profile.html:236 msgid "Loading..." msgstr "Chargement..." + #: app/templates/pages/match_form.html:103 #: app/templates/pages/one_on_one.html:140 #: app/templates/pages/team_match_form.html:40 msgid "Start Time" msgstr "Heure de début" + #: app/templates/pages/match_form.html:107 #: app/templates/pages/one_on_one.html:146 #: app/templates/pages/team_match_form.html:45 msgid "End Time" msgstr "Heure de fin" + #: app/templates/pages/match_form.html:114 #: app/templates/pages/tryout_form.html:110 msgid "Description" msgstr "Description" + #: app/templates/pages/match_form.html:115 msgid "Optional notes about this match" msgstr "Notes facultatives sur ce match" + #: app/templates/pages/match_form.html:121 msgid "Select Teams" msgstr "Choisir les équipes" + #: app/templates/pages/match_form.html:125 #: app/templates/pages/match_form.html:219 msgid "Team 1" msgstr "Équipe 1" + #: app/templates/pages/match_form.html:127 msgid "-- Select Team 1 --" msgstr "-- Choisir l’équipe 1 --" + #: app/templates/pages/match_form.html:134 #: app/templates/pages/match_form.html:231 msgid "Team 2" msgstr "Équipe 2" + #: app/templates/pages/match_form.html:136 msgid "-- Select Team 2 --" msgstr "-- Choisir l’équipe 2 --" + #: app/templates/pages/match_form.html:158 #: app/templates/pages/match_form.html:184 msgid "Click to toggle presence" msgstr "Cliquer pour basculer la présence" + #: app/templates/pages/match_form.html:164 #: app/templates/pages/match_form.html:190 app/templates/pages/teams.html:197 msgid "No players assigned" msgstr "Aucun joueur assigné" + #: app/templates/pages/match_form.html:201 #: app/templates/pages/match_form.html:243 msgid "Select Players" msgstr "Choisir des joueurs" + #: app/templates/pages/match_form.html:206 msgid "Randomize Teams:" msgstr "Répartition aléatoire :" + #: app/templates/pages/match_form.html:211 msgid "Randomize" msgstr "Répartir au hasard" + #: app/templates/pages/match_form.html:214 msgid "Select players then click Randomize to split them into teams." msgstr "" "Choisissez des joueurs puis cliquez sur « Répartir au hasard » pour " "former les équipes." + #: app/templates/pages/match_form.html:226 msgid "" "All registered players are shown. Click time slots to filter available " @@ -1634,98 +2092,125 @@ msgid "" msgstr "" "Tous les joueurs inscrits sont affichés. Cliquez des plages horaires pour" " filtrer ceux qui sont disponibles." + #: app/templates/pages/match_form.html:246 msgid "Green indicators show player availability for the match date/time" msgstr "" "Les indicateurs verts signalent les joueurs disponibles à la date et à " "l’heure du match" + #: app/templates/pages/match_form.html:632 msgid "Click time slots consecutively to set match duration" msgstr "Cliquez des plages consécutives pour définir la durée du match" + #: app/templates/pages/match_form.html:899 msgid "No players registered" msgstr "Aucun joueur inscrit" + #: app/templates/pages/match_form.html:932 msgid "T1" msgstr "É1" + #: app/templates/pages/match_form.html:933 msgid "T2" msgstr "É2" + #: app/templates/pages/match_form.html:938 msgid "No players available" msgstr "Aucun joueur disponible" + #: app/templates/pages/my_teams.html:18 app/templates/pages/teams.html:84 #: app/templates/pages/teams.html:273 msgid "Coaches" msgstr "Coachs" + #: app/templates/pages/my_teams.html:30 app/templates/pages/teams.html:106 #: app/templates/pages/teams.html:284 msgid "Managers" msgstr "Gérants" + #: app/templates/pages/my_teams.html:45 msgid "Team Roster" msgstr "Alignement" + #: app/templates/pages/my_teams.html:79 msgid "No players on this team." msgstr "Aucun joueur dans cette équipe." + #: app/templates/pages/my_teams.html:93 app/templates/pages/notes.html:124 #: app/templates/pages/one_on_one.html:71 #: app/templates/pages/team_matches.html:30 #: app/templates/pages/view_tryout.html:325 msgid "Time" msgstr "Heure" + #: app/templates/pages/my_teams.html:95 #: app/templates/pages/team_match_form.html:115 #: app/templates/pages/team_matches.html:32 #: app/templates/pages/view_tryout.html:326 msgid "Presence" msgstr "Présence" + #: app/templates/pages/my_teams.html:96 msgid "My Status" msgstr "Mon statut" + #: app/templates/pages/my_teams.html:154 msgid "No upcoming matches scheduled." msgstr "Aucun match à venir." + #: app/templates/pages/my_teams.html:165 msgid "No Teams" msgstr "Aucune équipe" + #: app/templates/pages/my_teams.html:166 msgid "You are not currently assigned to any team." msgstr "Vous n’êtes assigné à aucune équipe pour le moment." + #: app/templates/pages/notes.html:2 app/templates/pages/notes.html:3 #: app/templates/pages/teams.html:75 msgid "Notes" msgstr "Notes" + #: app/templates/pages/notes.html:12 app/templates/pages/one_on_one.html:11 #: app/templates/pages/player_personal_notes.html:55 #: app/templates/pages/team_notes.html:2 app/templates/pages/team_notes.html:3 msgid "Team Notes" msgstr "Notes d’équipe" + #: app/templates/pages/notes.html:20 app/templates/pages/team_notes.html:19 msgid "Team Notes Content" msgstr "Contenu des notes d’équipe" + #: app/templates/pages/notes.html:21 app/templates/pages/team_notes.html:20 msgid "Enter improvement suggestions and notes for your team..." msgstr "Suggestions d’amélioration et notes pour votre équipe..." + #: app/templates/pages/notes.html:22 app/templates/pages/team_notes.html:21 msgid "These notes will be visible to all players on your team." msgstr "Ces notes seront visibles par tous les joueurs de votre équipe." + #: app/templates/pages/notes.html:48 app/templates/pages/personal_notes.html:19 #: app/templates/pages/upload_contract.html:16 msgid "Select Player" msgstr "Choisir un joueur" + #: app/templates/pages/notes.html:50 app/templates/pages/personal_notes.html:21 msgid "-- Select a Player --" msgstr "-- Choisir un joueur --" + #: app/templates/pages/notes.html:59 app/templates/pages/personal_notes.html:30 msgid "Enter personal feedback or coaching tips for this player..." msgstr "Commentaires ou conseils personnalisés pour ce joueur..." + #: app/templates/pages/notes.html:60 app/templates/pages/personal_notes.html:31 msgid "These notes will only be visible to the selected player." msgstr "Ces notes ne seront visibles que par le joueur sélectionné." + #: app/templates/pages/notes.html:64 msgid "Context (Optional)" msgstr "Contexte (facultatif)" + #: app/templates/pages/notes.html:65 msgid "" "Link this note to a specific match, tryout, or team for better " @@ -1733,69 +2218,90 @@ msgid "" msgstr "" "Liez cette note à un match, une sélection ou une équipe pour mieux vous y" " retrouver." + #: app/templates/pages/notes.html:71 msgid "-- Select Match --" msgstr "-- Choisir un match --" + #: app/templates/pages/notes.html:80 msgid "-- Select Tryout --" msgstr "-- Choisir une sélection --" + #: app/templates/pages/notes.html:89 msgid "-- Select Team --" msgstr "-- Choisir une équipe --" + #: app/templates/pages/notes.html:111 msgid "One on One Requests" msgstr "Demandes de rencontre individuelle" + #: app/templates/pages/notes.html:125 app/templates/pages/one_on_one.html:72 msgid "Discussion Points" msgstr "Points à aborder" + #: app/templates/pages/notes.html:150 app/templates/pages/notes.html:151 msgid "Accept" msgstr "Accepter" + #: app/templates/pages/notes.html:154 app/templates/pages/notes.html:155 msgid "Refuse" msgstr "Refuser" + #: app/templates/pages/notes.html:167 msgid "No One on One requests from your players yet." msgstr "Aucune demande de rencontre de vos joueurs pour l’instant." + #: app/templates/pages/notes.html:177 msgid "Reject One on One Request" msgstr "Refuser la demande de rencontre" + #: app/templates/pages/notes.html:184 msgid "Reason for rejection (optional):" msgstr "Motif du refus (facultatif) :" + #: app/templates/pages/notes.html:185 msgid "Let the player know why this time doesn't work..." msgstr "Expliquez au joueur pourquoi ce créneau ne convient pas..." + #: app/templates/pages/notes.html:190 msgid "Reject Request" msgstr "Refuser la demande" + #: app/templates/pages/notes.html:201 msgid "Team Notes History" msgstr "Historique des notes d’équipe" + #: app/templates/pages/notes.html:207 app/templates/pages/team_notes.html:42 msgid "Last Updated" msgstr "Dernière mise à jour" + #: app/templates/pages/notes.html:208 app/templates/pages/team_notes.html:43 msgid "Content Preview" msgstr "Aperçu du contenu" + #: app/templates/pages/notes.html:228 msgid "Recent Personal Notes" msgstr "Notes personnelles récentes" + #: app/templates/pages/notes.html:243 #: app/templates/pages/player_personal_notes.html:27 msgid "From match" msgstr "Depuis le match" + #: app/templates/pages/notes.html:246 #: app/templates/pages/player_personal_notes.html:32 msgid "From team" msgstr "Depuis l’équipe" + #: app/templates/pages/notes.html:249 #: app/templates/pages/player_personal_notes.html:37 msgid "From tryout" msgstr "Depuis la sélection" + #: app/templates/pages/one_on_one.html:2 app/templates/pages/one_on_one.html:3 msgid "One on One" msgstr "Rencontre individuelle" + #: app/templates/pages/one_on_one.html:28 #: app/templates/pages/player_personal_notes.html:72 msgid "" @@ -1804,12 +2310,14 @@ msgid "" msgstr "" "Aucune note d’équipe pour l’instant. Votre coach y publiera ses " "suggestions d’amélioration." + #: app/templates/pages/one_on_one.html:36 #: app/templates/pages/personal_notes.html:2 #: app/templates/pages/personal_notes.html:3 #: app/templates/pages/player_personal_notes.html:11 msgid "Personal Notes" msgstr "Notes personnelles" + #: app/templates/pages/one_on_one.html:53 #: app/templates/pages/player_personal_notes.html:47 msgid "" @@ -1818,41 +2326,53 @@ msgid "" msgstr "" "Aucune note personnelle pour l’instant. Votre coach peut vous laisser des" " commentaires ici." + #: app/templates/pages/one_on_one.html:62 msgid "My One on One Requests" msgstr "Mes demandes de rencontre" + #: app/templates/pages/one_on_one.html:74 msgid "Coach Response" msgstr "Réponse du coach" + #: app/templates/pages/one_on_one.html:87 msgid "Approved" msgstr "Approuvée" + #: app/templates/pages/one_on_one.html:89 msgid "Rejected" msgstr "Refusée" + #: app/templates/pages/one_on_one.html:111 msgid "You haven't made any One on One requests yet." msgstr "Vous n’avez encore fait aucune demande de rencontre individuelle." + #: app/templates/pages/one_on_one.html:120 #: app/templates/pages/player_personal_notes.html:81 msgid "Request One on One Session" msgstr "Demander une rencontre individuelle" + #: app/templates/pages/one_on_one.html:132 msgid "Select Date" msgstr "Choisir une date" + #: app/templates/pages/one_on_one.html:142 msgid "-- Select Date First --" msgstr "-- Choisissez d’abord une date --" + #: app/templates/pages/one_on_one.html:148 #: app/templates/pages/one_on_one.html:271 msgid "-- Select Start Time First --" msgstr "-- Choisissez d’abord l’heure de début --" + #: app/templates/pages/one_on_one.html:155 msgid "Enter topics you'd like to cover in your One on One session..." msgstr "Sujets que vous aimeriez aborder pendant la rencontre..." + #: app/templates/pages/one_on_one.html:160 msgid "Send Request" msgstr "Envoyer la demande" + #: app/templates/pages/one_on_one.html:165 msgid "" "You need to be assigned to a team with a coach to request a One on One " @@ -1860,58 +2380,76 @@ msgid "" msgstr "" "Vous devez être assigné à une équipe ayant un coach pour demander une " "rencontre individuelle." + #: app/templates/pages/one_on_one.html:246 msgid "-- Select Start Time --" msgstr "-- Heure de début --" + #: app/templates/pages/one_on_one.html:294 msgid "-- Select End Time --" msgstr "-- Heure de fin --" + #: app/templates/pages/personal_notes.html:46 msgid "Recent Notes" msgstr "Notes récentes" + #: app/templates/pages/players_to_evaluate.html:2 #: app/templates/pages/players_to_evaluate.html:3 msgid "Players to Evaluate" msgstr "Joueurs à évaluer" + #: app/templates/pages/profile.html:21 msgid "Account Information" msgstr "Informations du compte" + #: app/templates/pages/profile.html:68 app/templates/pages/view_user.html:52 msgid "Gamertags" msgstr "Pseudos de jeu" + #: app/templates/pages/profile.html:94 msgid "Discord" msgstr "Discord" + #: app/templates/pages/profile.html:104 app/templates/pages/view_user.html:39 msgid "League OS" msgstr "League OS" + #: app/templates/pages/profile.html:121 msgid "My Statistics" msgstr "Mes statistiques" + #: app/templates/pages/profile.html:128 msgid "Tryouts Registered" msgstr "Sélections inscrites" + #: app/templates/pages/profile.html:132 msgid "Team Assignments" msgstr "Répartition des équipes" + #: app/templates/pages/profile.html:139 msgid "Evaluations Given" msgstr "Évaluations données" + #: app/templates/pages/profile.html:143 msgid "No statistics available for this role." msgstr "Aucune statistique pour ce rôle." + #: app/templates/pages/profile.html:195 msgid "My Contracts" msgstr "Mes contrats" + #: app/templates/pages/profile.html:217 msgid "View All Contracts" msgstr "Voir tous les contrats" + #: app/templates/pages/profile.html:221 msgid "No contracts have been uploaded for you yet." msgstr "Aucun contrat n’a encore été téléversé pour vous." + #: app/templates/pages/profile.html:231 msgid "My Disponibilities" msgstr "Mes disponibilités" + #: app/templates/pages/profile.html:234 msgid "" "Select your available time blocks for matches (5pm to 12am). Green = " @@ -1919,9 +2457,11 @@ msgid "" msgstr "" "Choisissez vos plages disponibles pour les matchs (17 h à minuit). Vert =" " sélectionné, gris = disponible." + #: app/templates/pages/profile.html:251 msgid "My Coaching Availability" msgstr "Mes disponibilités de coaching" + #: app/templates/pages/profile.html:252 msgid "" "Select time slots when you're available for One on One sessions (8am to " @@ -1929,33 +2469,43 @@ msgid "" msgstr "" "Choisissez les plages où vous êtes disponible pour des rencontres " "individuelles (8 h à 22 h)." + #: app/templates/pages/profile.html:500 msgid "Click or click-and-drag to select your available hours" msgstr "Cliquez ou faites glisser pour choisir vos heures de disponibilité" + #: app/templates/pages/register.html:2 msgid "Register" msgstr "S’inscrire" + #: app/templates/pages/register.html:8 msgid "Personal Information" msgstr "Renseignements personnels" + #: app/templates/pages/register.html:11 msgid "Enter your full name" msgstr "Saisissez votre nom complet" + #: app/templates/pages/register.html:16 msgid "Choose a username" msgstr "Choisissez un nom d’utilisateur" + #: app/templates/pages/register.html:21 msgid "Enter your email" msgstr "Saisissez votre courriel" + #: app/templates/pages/register.html:25 msgid "Phone (Optional)" msgstr "Téléphone (facultatif)" + #: app/templates/pages/register.html:26 msgid "Enter your phone number" msgstr "Saisissez votre numéro de téléphone" + #: app/templates/pages/register.html:33 msgid "Discord Connection" msgstr "Connexion Discord" + #: app/templates/pages/register.html:34 msgid "" "Connect your Discord account to automatically fill your gamertags from " @@ -1963,9 +2513,11 @@ msgid "" msgstr "" "Connectez votre compte Discord pour remplir automatiquement vos pseudos à" " partir de vos comptes de jeu liés." + #: app/templates/pages/register.html:52 msgid "Connected" msgstr "Connecté" + #: app/templates/pages/register.html:61 msgid "" "Discord connected. Game connections have been used to pre-fill your " @@ -1973,317 +2525,419 @@ msgid "" msgstr "" "Discord connecté. Vos comptes de jeu ont servi à pré-remplir le profil " "ci-dessous." + #: app/templates/pages/register.html:69 msgid "Connect to pre-fill your gamertags from Steam, Battle.net, Xbox, etc." msgstr "" "Connectez-vous pour pré-remplir vos pseudos depuis Steam, Battle.net, " "Xbox, etc." + #: app/templates/pages/register.html:72 msgid "Discord Username (Manual)" msgstr "Nom d’utilisateur Discord (saisie manuelle)" + #: app/templates/pages/register.html:73 msgid "e.g. YourName" msgstr "ex. : VotrePseudo" + #: app/templates/pages/register.html:82 msgid "Set up your competitive gaming profile for tryouts." msgstr "Configurez votre profil de joueur compétitif pour les sélections." + #: app/templates/pages/register.html:127 msgid "League OS Connection (Optional)" msgstr "Connexion League OS (facultative)" + #: app/templates/pages/register.html:131 msgid "Connect your League OS profile for organized play." msgstr "Liez votre profil League OS pour le jeu organisé." + #: app/templates/pages/register.html:135 msgid "Security" msgstr "Sécurité" + #: app/templates/pages/register.html:138 msgid "Create a password" msgstr "Créez un mot de passe" + #: app/templates/pages/register.html:142 msgid "Confirm Password" msgstr "Confirmer le mot de passe" + #: app/templates/pages/register.html:143 msgid "Confirm your password" msgstr "Confirmez votre mot de passe" + #: app/templates/pages/register.html:157 msgid "Create Account" msgstr "Créer le compte" + #: app/templates/pages/team_match_form.html:20 msgid "e.g., Regular Season vs Opponent" msgstr "ex. : Saison régulière contre adversaire" + #: app/templates/pages/team_match_form.html:24 msgid "Opponent (optional)" msgstr "Adversaire (facultatif)" + #: app/templates/pages/team_match_form.html:27 msgid "e.g., University of Toronto" msgstr "ex. : Université de Toronto" + #: app/templates/pages/team_match_form.html:48 msgid "Auto-calculated if left empty (start + 30 min)" msgstr "Calculée automatiquement si laissée vide (début + 30 min)" + #: app/templates/pages/team_match_form.html:57 msgid "e.g., Online, Gym A" msgstr "ex. : En ligne, Gymnase A" + #: app/templates/pages/team_match_form.html:72 msgid "Description (optional)" msgstr "Description (facultative)" + #: app/templates/pages/team_match_form.html:74 msgid "Additional details about the match..." msgstr "Précisions sur le match..." + #: app/templates/pages/team_match_form.html:81 msgid "Team Roster (auto-included)" msgstr "Alignement (inclus automatiquement)" + #: app/templates/pages/team_match_form.html:98 msgid "No players on this team. Add players in the Teams page first." msgstr "Aucun joueur dans cette équipe. Ajoutez-en d’abord depuis la page Équipes." + #: app/templates/pages/team_match_form.html:107 #: app/templates/pages/view_tryout.html:324 msgid "Participants" msgstr "Participants" + #: app/templates/pages/team_match_form.html:134 msgid "No participants recorded." msgstr "Aucun participant enregistré." + #: app/templates/pages/team_matches.html:3 #: app/templates/pages/team_matches.html:4 msgid "Team Matches" msgstr "Matchs d’équipe" + #: app/templates/pages/team_matches.html:11 msgid "+ Schedule Match" msgstr "+ Planifier un match" + #: app/templates/pages/team_matches.html:101 msgid "Delete this match?" msgstr "Supprimer ce match ?" + #: app/templates/pages/team_matches.html:133 msgid "No Team Matches" msgstr "Aucun match d’équipe" + #: app/templates/pages/team_matches.html:134 msgid "Regular season matches have not been scheduled yet." msgstr "Aucun match de saison régulière n’a encore été planifié." + #: app/templates/pages/team_matches.html:138 msgid "-- Schedule a Match --" msgstr "-- Planifier un match --" + #: app/templates/pages/team_notes.html:9 msgid "Team Improvement Notes" msgstr "Notes d’amélioration de l’équipe" + #: app/templates/pages/team_notes.html:26 msgid "Add Team Notes" msgstr "Ajouter des notes d’équipe" + #: app/templates/pages/team_notes.html:36 msgid "Note History" msgstr "Historique des notes" + #: app/templates/pages/teams.html:2 app/templates/pages/teams.html:3 #: app/templates/pages/view_tryout.html:231 msgid "Teams" msgstr "Équipes" + #: app/templates/pages/teams.html:9 app/templates/pages/view_tryout.html:234 msgid "New Team" msgstr "Nouvelle équipe" + #: app/templates/pages/teams.html:18 msgid "Create New Team" msgstr "Créer une équipe" + #: app/templates/pages/teams.html:25 app/templates/pages/teams.html:266 msgid "Team Name" msgstr "Nom de l’équipe" + #: app/templates/pages/teams.html:26 msgid "e.g., Varsity, JV, U14" msgstr "ex. : Varsity, JV, U14" + #: app/templates/pages/teams.html:29 msgid "Assigned Coach" msgstr "Coach assigné" + #: app/templates/pages/teams.html:31 msgid "-- No coach assigned --" msgstr "-- Aucun coach assigné --" + #: app/templates/pages/teams.html:38 msgid "Assigned Manager" msgstr "Gérant assigné" + #: app/templates/pages/teams.html:40 msgid "-- No manager assigned --" msgstr "-- Aucun gérant assigné --" + #: app/templates/pages/teams.html:49 app/templates/pages/teams.html:243 msgid "Create Team" msgstr "Créer l’équipe" -#: app/templates/pages/teams.html:64 app/templates/pages/users.html:51 + +#: app/templates/pages/teams.html:64 app/templates/pages/users.html:59 #: app/templates/pages/view_tryout.html:29 #: app/templates/pages/view_tryout.html:459 msgid "Edit" msgstr "Modifier" + #: app/templates/pages/teams.html:66 #, python-format msgid "Delete team %(name)s? It will be unassigned from any linked tryouts." msgstr "" "Supprimer l’équipe %(name)s ? Elle sera détachée de toutes les sélections" " liées." + #: app/templates/pages/teams.html:69 msgid "Delete" msgstr "Supprimer" + #: app/templates/pages/teams.html:74 msgid "Add Notes" msgstr "Ajouter des notes" + #: app/templates/pages/teams.html:92 #, python-format msgid "Remove coach %(coach)s from %(team)s?" msgstr "Retirer le coach %(coach)s de %(team)s ?" + #: app/templates/pages/teams.html:95 msgid "Remove Coach" msgstr "Retirer le coach" + #: app/templates/pages/teams.html:114 #, python-format msgid "Remove manager %(manager)s from %(team)s?" msgstr "Retirer le gérant %(manager)s de %(team)s ?" + #: app/templates/pages/teams.html:117 msgid "Remove Manager" msgstr "Retirer le gérant" + #: app/templates/pages/teams.html:127 msgid "View Team Matches" msgstr "Voir les matchs d’équipe" + #: app/templates/pages/teams.html:128 msgid "Matches" msgstr "Matchs" + #: app/templates/pages/teams.html:134 msgid "Schedule Practice" msgstr "Planifier un entraînement" + #: app/templates/pages/teams.html:135 msgid "Practice" msgstr "Entraînement" + #: app/templates/pages/teams.html:147 msgid "Position / Role" msgstr "Poste ou rôle" + #: app/templates/pages/teams.html:183 #, python-format msgid "Remove %(player)s from %(team)s?" msgstr "Retirer %(player)s de %(team)s ?" + #: app/templates/pages/teams.html:186 app/templates/pages/view_tryout.html:211 msgid "Remove" msgstr "Retirer" + #: app/templates/pages/teams.html:199 msgid "Add players to this team using the form below." msgstr "Ajoutez des joueurs à cette équipe avec le formulaire ci-dessous." + #: app/templates/pages/teams.html:224 msgid "Starter" msgstr "Partant" + #: app/templates/pages/teams.html:225 msgid "Substitute" msgstr "Remplaçant" + #: app/templates/pages/teams.html:228 msgid "Add to Team" msgstr "Ajouter à l’équipe" + #: app/templates/pages/teams.html:240 msgid "No teams yet" msgstr "Aucune équipe" + #: app/templates/pages/teams.html:242 msgid "Create organization teams and assign coaches to manage tryouts." msgstr "Créez des équipes et assignez-leur des coachs pour gérer les sélections." + #: app/templates/pages/teams.html:245 msgid "There are no teams to display." msgstr "Aucune équipe à afficher." + #: app/templates/pages/teams.html:257 msgid "Edit Team" msgstr "Modifier l’équipe" + #: app/templates/pages/teams.html:280 msgid "Hold Ctrl/Cmd to select multiple. Only unassigned coaches shown." msgstr "" "Maintenez Ctrl ou Cmd pour en choisir plusieurs. Seuls les coachs non " "assignés sont proposés." + #: app/templates/pages/teams.html:291 msgid "Hold Ctrl/Cmd to select multiple. Only unassigned managers shown." msgstr "" "Maintenez Ctrl ou Cmd pour en choisir plusieurs. Seuls les gérants non " "assignés sont proposés." + #: app/templates/pages/tryout_form.html:23 msgid "Tryout Title" msgstr "Titre de la sélection" + #: app/templates/pages/tryout_form.html:24 msgid "e.g., Spring Season Tryouts" msgstr "ex. : Sélections de la saison printanière" + #: app/templates/pages/tryout_form.html:29 #: app/templates/pages/view_user.html:57 msgid "Game" msgstr "Jeu" + #: app/templates/pages/tryout_form.html:31 msgid "-- Select a game --" msgstr "-- Choisir un jeu --" + #: app/templates/pages/tryout_form.html:38 msgid "Start Date" msgstr "Date de début" + #: app/templates/pages/tryout_form.html:42 msgid "End Date" msgstr "Date de fin" + #: app/templates/pages/tryout_form.html:44 msgid "Optional. Leave blank for single-day tryout." msgstr "Facultatif. Laissez vide pour une sélection d’une seule journée." + #: app/templates/pages/tryout_form.html:50 msgid "e.g., Online" msgstr "ex. : En ligne" + #: app/templates/pages/tryout_form.html:53 msgid "Max Players" msgstr "Nombre maximal de joueurs" + #: app/templates/pages/tryout_form.html:54 msgid "Leave blank for unlimited" msgstr "Laisser vide pour un nombre illimité" + #: app/templates/pages/tryout_form.html:59 msgid "Target Team" msgstr "Équipe visée" + #: app/templates/pages/tryout_form.html:61 msgid "-- No target team --" msgstr "-- Aucune équipe visée --" + #: app/templates/pages/tryout_form.html:70 msgid "Assigned Managers" msgstr "Gérants assignés" + #: app/templates/pages/tryout_form.html:85 msgid "Select one or more managers for this tryout." msgstr "Sélectionnez un ou plusieurs gérants pour cette sélection." + #: app/templates/pages/tryout_form.html:90 msgid "Assigned Coaches" msgstr "Coachs assignés" + #: app/templates/pages/tryout_form.html:106 msgid "Select one or more coaches for this tryout." msgstr "Choisissez un ou plusieurs coachs pour cette sélection." + #: app/templates/pages/tryout_form.html:111 msgid "Enter any details about the tryout..." msgstr "Précisions sur la sélection..." + #: app/templates/pages/tryouts.html:9 msgid "New Tryout" msgstr "Nouvelle sélection" + #: app/templates/pages/tryouts.html:80 msgid "View Details" msgstr "Voir le détail" + #: app/templates/pages/tryouts.html:84 msgid "Evaluate" msgstr "Évaluer" + #: app/templates/pages/tryouts.html:94 msgid "No tryouts found" msgstr "Aucune sélection" + #: app/templates/pages/tryouts.html:96 msgid "Get started by creating a new tryout." msgstr "Commencez par créer une sélection." + #: app/templates/pages/upload_contract.html:9 msgid "Upload Contract for Player" msgstr "Téléverser un contrat pour un joueur" + #: app/templates/pages/upload_contract.html:26 msgid "Contract File" msgstr "Fichier du contrat" + #: app/templates/pages/upload_contract.html:32 msgid "Notes (Optional)" msgstr "Notes (facultatives)" + #: app/templates/pages/upload_contract.html:33 msgid "Add any notes about this contract..." msgstr "Notes éventuelles sur ce contrat..." + #: app/templates/pages/users.html:9 msgid "Add User" msgstr "Ajouter un utilisateur" -#: app/templates/pages/users.html:54 + +#: app/templates/pages/users.html:24 +msgid "Hours" +msgstr "Heures" + +#: app/templates/pages/users.html:62 #, python-format msgid "Delete %(name)s? This cannot be undone." msgstr "Supprimer %(name)s ? Cette action est irréversible." + #: app/templates/pages/view_tryout.html:10 msgid "Tryout Details" msgstr "Détail de la sélection" + #: app/templates/pages/view_tryout.html:14 #: app/templates/pages/view_tryout.html:306 msgid "Schedule Match" msgstr "Planifier un match" + #: app/templates/pages/view_tryout.html:22 msgid "In Progress" msgstr "En cours" + #: app/templates/pages/view_tryout.html:33 msgid "" "Delete this entire tryout? This removes all its matches, teams, " @@ -2291,33 +2945,43 @@ msgid "" msgstr "" "Supprimer entièrement cette sélection ? Cela supprime tous ses matchs, " "équipes, inscriptions et évaluations." + #: app/templates/pages/view_tryout.html:36 msgid "Delete Tryout" msgstr "Supprimer la sélection" + #: app/templates/pages/view_tryout.html:114 msgid "Register for this Tryout" msgstr "S’inscrire à cette sélection" + #: app/templates/pages/view_tryout.html:124 msgid "Add Player to Tryout" msgstr "Ajouter un joueur à la sélection" + #: app/templates/pages/view_tryout.html:137 msgid "Register Player" msgstr "Inscrire un joueur" + #: app/templates/pages/view_tryout.html:157 msgid "Evaluation" msgstr "Évaluation" + #: app/templates/pages/view_tryout.html:179 msgid "Registered" msgstr "Inscrit" + #: app/templates/pages/view_tryout.html:180 msgid "Attended" msgstr "Présent" + #: app/templates/pages/view_tryout.html:181 msgid "No Show" msgstr "Absent" + #: app/templates/pages/view_tryout.html:200 msgid "Evaluate player" msgstr "Évaluer le joueur" + #: app/templates/pages/view_tryout.html:208 #, python-format msgid "" @@ -2326,61 +2990,85 @@ msgid "" msgstr "" "Retirer %(name)s de cette sélection ? Il sera aussi retiré de toutes ses " "équipes et de tous ses matchs." + #: app/templates/pages/view_tryout.html:210 msgid "Remove player from tryout" msgstr "Retirer le joueur de la sélection" + #: app/templates/pages/view_tryout.html:220 msgid "No players registered yet." msgstr "Aucun joueur inscrit pour l’instant." + #: app/templates/pages/view_tryout.html:243 msgid "Team name" msgstr "Nom de l’équipe" + #: app/templates/pages/view_tryout.html:244 msgid "Create" msgstr "Créer" + #: app/templates/pages/view_tryout.html:263 msgid "No players assigned yet." msgstr "Aucun joueur assigné pour l’instant." + #: app/templates/pages/view_tryout.html:271 msgid "Select player..." msgstr "Choisir un joueur..." + #: app/templates/pages/view_tryout.html:288 msgid "Add" msgstr "Ajouter" + #: app/templates/pages/view_tryout.html:293 msgid "No teams created yet." msgstr "Aucune équipe créée." + #: app/templates/pages/view_tryout.html:322 msgid "Type" msgstr "Type" + #: app/templates/pages/view_tryout.html:387 msgid "Toggle your attendance" msgstr "Basculer votre présence" + #: app/templates/pages/view_tryout.html:462 msgid "Add Note for this Match" msgstr "Ajouter une note pour ce match" + #: app/templates/pages/view_tryout.html:463 msgid "Note" msgstr "Note" + #: app/templates/pages/view_tryout.html:481 msgid "No matches scheduled yet. Check back later!" msgstr "Aucun match planifié pour l’instant. Revenez plus tard." + #: app/templates/pages/view_tryout.html:491 msgid "Evaluation Summary" msgstr "Synthèse de l’évaluation" + #: app/templates/pages/view_tryout.html:510 msgid "Recommendation" msgstr "Recommandation" + #: app/templates/pages/view_user.html:60 msgid "Profile" msgstr "Profil" + #: app/templates/pages/view_user.html:72 msgid "View Profile" msgstr "Voir le profil" + +#: app/templates/pages/view_user.html:87 +msgid "Availability" +msgstr "Disponibilités" + #~ msgid "×" #~ msgstr "×" + #~ msgid "One on One request from %(value)s has been approved!" #~ msgstr "" + #~ msgid "" #~ "Account is locked due to too many" #~ " failed attempts. Please try again in" @@ -2389,6 +3077,7 @@ msgstr "Voir le profil" #~ "Compte verrouillé après trop de " #~ "tentatives échouées. Réessayez dans " #~ "%(remaining)s minute(s)." + #~ msgid "" #~ "Account locked after %(attempts)s failed " #~ "attempts. Please try again in " @@ -2397,32 +3086,43 @@ msgstr "Voir le profil" #~ "Compte verrouillé après %(attempts)s " #~ "tentatives échouées. Réessayez dans " #~ "%(minutes)s minutes." + #~ msgid "Login unsuccessful. %(remaining)s attempt(s) remaining before lockout." #~ msgstr "" #~ "Échec de la connexion. Il reste " #~ "%(remaining)s tentative(s) avant le " #~ "verrouillage." + #~ msgid "Incorrect CAPTCHA answer. Please try again." #~ msgstr "Réponse au CAPTCHA incorrecte. Veuillez réessayer." + #~ msgid "Answer" #~ msgstr "Réponse" + #~ msgid "Invalid start time format." #~ msgstr "Format d’heure de début invalide." + #~ msgid "Invalid end time format." #~ msgstr "Format d’heure de fin invalide." + #~ msgid "Invalid date or time format." #~ msgstr "Format de date ou d’heure invalide." -#~ msgid "Availability" -#~ msgstr "Disponibilités" + #~ msgid "Team Tryout Management System" #~ msgstr "Système de gestion des sélections d’équipe" + #~ msgid "Player and content are required." #~ msgstr "Le joueur et le contenu sont obligatoires." + #~ msgid "Save Disponibilities" #~ msgstr "Enregistrer mes disponibilités" + #~ msgid "Contact" #~ msgstr "Coordonnées" + #~ msgid "Attendance" #~ msgstr "Présence" + #~ msgid "No players registered for this tryout." -#~ msgstr "Aucun joueur inscrit à cette sélection." \ No newline at end of file +#~ msgstr "Aucun joueur inscrit à cette sélection." + diff --git a/tests/test_admin_document_uploads_toggle.py b/tests/test_admin_document_uploads_toggle.py new file mode 100644 index 0000000..f07deff --- /dev/null +++ b/tests/test_admin_document_uploads_toggle.py @@ -0,0 +1,135 @@ +"""Admin document-upload toggle — enable/disable gate and enforcement +on contract upload routes. + +ADMIN-006 style. The document_uploads_enabled setting gates every +contract upload route for non-admins. Admins always bypass the lock. +""" + +import pytest + +from app.extensions import db +from app.models import AppSettings, Contract, User + +NON_ADMIN_ROLES = ['manager', 'coach'] + + +def _redirected(response): + return response.status_code in (301, 302) + + +class TestDocumentUploadToggle: + """Toggle logic — on/off round-trip and audit log.""" + + def test_toggle_from_enabled_to_disabled(self, client, as_role): + as_role('admin') + # Default is enabled + client.post('/admin/toggle-document-uploads', data={}, follow_redirects=False) + with client.application.app_context(): + assert not AppSettings.get_bool('document_uploads_enabled', default=True) + + def test_toggle_from_disabled_to_enabled(self, client, as_role): + as_role('admin') + client.post('/admin/toggle-document-uploads', data={}, follow_redirects=False) + client.post('/admin/toggle-document-uploads', data={}, follow_redirects=False) + with client.application.app_context(): + assert AppSettings.get_bool('document_uploads_enabled', default=True) + + def test_toggle_creates_audit_log(self, client, as_role): + from app.models import AuditLog + + as_role('admin') + client.post('/admin/toggle-document-uploads', data={}, follow_redirects=False) + + with client.application.app_context(): + entry = AuditLog.query.filter_by(action='document_uploads_toggled').first() + assert entry is not None + + def test_default_is_enabled(self, app): + with app.app_context(): + assert AppSettings.get_bool('document_uploads_enabled', default=True) + + +class TestDocumentUploadGateEnforcement: + """Non-admin roles are blocked when the toggle is off.""" + + def _contract_for(self, app, player_id): + """Create a minimal contract for enforcement tests.""" + from datetime import datetime + + with app.app_context(): + admin = User.query.filter_by(role='admin').first() + contract = Contract( + player_id=player_id, + uploaded_by_id=admin.id, + original_filename='test.pdf', + stored_filename='test.pdf', + file_path='contrats signes/test.pdf', + status='pending_player_signing', + uploaded_at=datetime.utcnow(), + ) + db.session.add(contract) + db.session.commit() + return contract.id + + @pytest.mark.parametrize('role', NON_ADMIN_ROLES) + def test_non_admin_cannot_upload_contract_when_disabled( + self, app, client, as_role, make_user, role + ): + as_role('admin') + client.post('/admin/toggle-document-uploads', data={}) # disable + as_role(role) + + response = client.post( + '/users/contracts/upload', + data={'player_id': '', 'contract_file': ''}, + follow_redirects=True, + ) + html = response.data.decode() + # Default locale is French — the flash message says "désactivés" + assert 'désactivés' in html or 'disabled' in html.lower() + + @pytest.mark.parametrize('role', NON_ADMIN_ROLES) + def test_admin_can_always_upload_contract(self, client, as_role, role): + as_role('admin') + # Pre-create a player for the contract + + as_role('player') + client.post('/admin/toggle-document-uploads', data={}) # disable + + # Admin should still be able to reach the upload page + response = client.get('/users/contracts/upload', follow_redirects=False) + assert _redirected(response) or response.status_code == 200 + + def test_player_cannot_upload_signed_when_disabled(self, app, client, as_role, make_user): + as_role('admin') + client.post('/admin/toggle-document-uploads', data={}) # disable while logged in as admin + player_id = make_user('player') + contract_id = self._contract_for(app, player_id) + + # Log in as the player + with app.app_context(): + username = db.session.get(User, player_id).username + client.post('/auth/login', data={'username': username, 'password': 'Password123'}) + + response = client.post( + f'/users/contracts/{contract_id}/upload_signed', + data={'signed_file': ''}, + follow_redirects=True, + ) + html = response.data.decode() + assert 'désactivés' in html or 'disabled' in html.lower() + + def test_admin_can_always_upload(self, app, client, as_role): + as_role('admin') + client.post('/admin/toggle-document-uploads', data={}) # disable + + # Admin GET the upload page — should be allowed (not redirected away) + response = client.get('/users/contracts/upload', follow_redirects=False) + # The admin bypasses the lock so they see the upload form (200) + # or get redirected (if no players exist, etc). Either way is fine + # as long as it's not the flash about uploads being disabled. + body = response.data.decode() if response.status_code == 200 else '' + # The toggle flash ("désactivés") could still be present, but the + # upload-disabled message ("désactivés") must not appear in the body. + # We check for the French lock message specifically. + assert 'actuellement désactivés' not in body diff --git a/tests/test_admin_route_map.py b/tests/test_admin_route_map.py index fd36390..f9f21cc 100644 --- a/tests/test_admin_route_map.py +++ b/tests/test_admin_route_map.py @@ -12,6 +12,7 @@ ADMIN_ROUTES = [ '/admin', '/admin/backup/create', '/admin/toggle-tryouts', + '/admin/toggle-document-uploads', '/admin/season/start', '/admin/season/end', '/admin/teams/wipe', diff --git a/tests/test_availability_views.py b/tests/test_availability_views.py new file mode 100644 index 0000000..73f4d9b --- /dev/null +++ b/tests/test_availability_views.py @@ -0,0 +1,116 @@ +"""Tests for the hours column in the user list and the read-only +availability grid on public profiles.""" + +from datetime import time + +from app.extensions import db +from app.models import ( + CoachAvailability, + PlayerDisponibility, +) + + +class TestHoursColumn: + """The manage-users table shows available hours for players/coaches.""" + + def test_admin_sees_hours_header(self, app, client, as_role): + as_role('admin') + body = client.get('/users').get_data(as_text=True) + # Default locale is French, so _("Hours") renders as "Heures" + assert 'Heures' in body + + def test_player_without_slots_shows_0(self, app, client, as_role, make_user): + as_role('admin') + make_user('player') # create a player but stay logged in as admin + body = client.get('/users').get_data(as_text=True) + assert '0.0' in body + + def test_player_with_slots_shows_hours(self, app, client, as_role, make_user): + as_role('admin') + player_id = make_user('player') + with app.app_context(): + db.session.add( + PlayerDisponibility( + player_id=player_id, + day_of_week=0, + start_time=time(17, 0), + end_time=time(19, 0), + ) + ) + db.session.add( + PlayerDisponibility( + player_id=player_id, + day_of_week=1, + start_time=time(18, 0), + end_time=time(20, 0), + ) + ) + db.session.commit() + + body = client.get('/users').get_data(as_text=True) + # 2h + 2h = 4.0 + assert '4.0' in body + + def test_coach_without_slots_shows_0(self, app, client, as_role, make_user): + as_role('admin') + make_user('coach') + body = client.get('/users').get_data(as_text=True) + assert '0.0' in body + + def test_admin_roles_show_dash(self, app, client, as_role, make_user): + as_role('admin') + make_user('manager') + make_user('scout') + body = client.get('/users').get_data(as_text=True) + # managers and scouts should show mdash + assert '\u2014' in body + + +class TestAvailabilityOnPublicProfile: + """view_user renders a weekly availability grid for players/coaches.""" + + def test_player_without_availability_shows_no_grid(self, app, client, as_role): + as_role('admin') + player_id = as_role('player') + body = client.get(f'/users/{player_id}/view').get_data(as_text=True) + # Default locale is French + assert 'Disponibilit\u00e9s' not in body + + def test_player_with_slots_shows_grid(self, app, client, as_role, make_user): + as_role('admin') + player_id = make_user('player') + with app.app_context(): + db.session.add( + PlayerDisponibility( + player_id=player_id, + day_of_week=2, + start_time=time(18, 0), + end_time=time(18, 30), + ) + ) + db.session.commit() + body = client.get(f'/users/{player_id}/view').get_data(as_text=True) + assert 'Disponibilit\u00e9s' in body + assert '18:00' in body + + def test_coach_with_slots_shows_grid(self, app, client, as_role, make_user): + as_role('admin') + coach_id = make_user('coach') + with app.app_context(): + db.session.add( + CoachAvailability( + coach_id=coach_id, + day_of_week=3, + start_time=time(10, 0), + end_time=time(10, 30), + ) + ) + db.session.commit() + body = client.get(f'/users/{coach_id}/view').get_data(as_text=True) + assert 'Disponibilit\u00e9s' in body + assert '10:00' in body + + def test_admin_profile_shows_no_grid(self, app, client, as_role): + admin_id = as_role('admin') + body = client.get(f'/users/{admin_id}/view').get_data(as_text=True) + assert 'Disponibilit\u00e9s' not in body