From fb033e30fb563bb5dfac9024f4533eb3e48667be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Coze?= <96086580+SebastienCozeDev@users.noreply.github.com> Date: Thu, 18 Jul 2024 10:54:05 +0200 Subject: [PATCH 01/13] [DONE] Improve the playlist card for the user usability (#1178) * :children_crossing: Improve the playlist card for the user usability * :lipstick: Fix the footer style --- pod/main/static/css/pod.css | 6 +++--- pod/playlist/static/playlist/css/playlist.css | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/pod/main/static/css/pod.css b/pod/main/static/css/pod.css index a939ca95c0..6bfaf34a96 100755 --- a/pod/main/static/css/pod.css +++ b/pod/main/static/css/pod.css @@ -534,7 +534,7 @@ a.btn-outline-primary:not(:hover) svg { /*** CARD ***/ .infinite-item .card-body { padding: 0.9rem; - height: 3.5rem; + /* height: 3.5rem; */ overflow: hidden; } @@ -589,8 +589,8 @@ div.card a img { .card-footer-pod { position: absolute; - bottom: 4rem; - right: 0.5rem; + bottom: 3.5rem; + right: 1rem; border: none; border-radius: 0.375rem; display: flex; diff --git a/pod/playlist/static/playlist/css/playlist.css b/pod/playlist/static/playlist/css/playlist.css index 27579b8dfa..271773a43b 100644 --- a/pod/playlist/static/playlist/css/playlist.css +++ b/pod/playlist/static/playlist/css/playlist.css @@ -12,6 +12,7 @@ a.link-for-playlist:hover { .link-playlist { right: 1rem; + bottom: 5rem; border-radius: 0.375rem; } From 84e914fd693c4c413bcb786b75fc336d64f54b8d Mon Sep 17 00:00:00 2001 From: Olivier Bado-Faustin Date: Thu, 18 Jul 2024 15:54:01 +0200 Subject: [PATCH 02/13] [DONE] Correct some typos + visual bug on video cards icons (#1180) * Correct smalls typos : * wrong quotes * strong instead of b * nbsp * Simplify some texts * Correct bug on video cards icons * Add missing help texts * :green_heart: Correct unit test * correct PR comments * :white_check_mark: Add some tests to improve coverage + correct "caracters" typo --- .../templates/bbb/live_publish_meeting.html | 4 +- pod/completion/models.py | 4 +- .../templates/video_completion.html | 2 +- pod/completion/tests/test_models.py | 17 +- pod/locale/fr/LC_MESSAGES/django.mo | Bin 227848 -> 229284 bytes pod/locale/fr/LC_MESSAGES/django.po | 237 +++++++++++------- pod/locale/fr/LC_MESSAGES/djangojs.mo | Bin 20753 -> 20776 bytes pod/locale/fr/LC_MESSAGES/djangojs.po | 6 +- pod/locale/nl/LC_MESSAGES/django.po | 125 ++++++--- pod/locale/nl/LC_MESSAGES/djangojs.po | 2 +- pod/main/configuration.json | 2 +- .../meeting/filter_aside_meeting.html | 2 +- pod/meeting/tests/test_models.py | 2 +- pod/meeting/webinar.py | 10 +- pod/recorder/models.py | 12 +- pod/speaker/models.py | 2 +- pod/video/forms.py | 7 +- pod/video/models.py | 40 +-- pod/video/templates/videos/card_select.html | 33 +-- pod/video/templates/videos/dashboard.html | 2 +- pod/video/templates/videos/filter_aside.html | 2 +- pod/video/templates/videos/video_edit.html | 12 +- pod/video/tests/test_bulk_update.py | 2 +- pod/video/views.py | 14 +- 24 files changed, 334 insertions(+), 205 deletions(-) diff --git a/pod/bbb/templates/bbb/live_publish_meeting.html b/pod/bbb/templates/bbb/live_publish_meeting.html index 12bb463cef..579556d251 100644 --- a/pod/bbb/templates/bbb/live_publish_meeting.html +++ b/pod/bbb/templates/bbb/live_publish_meeting.html @@ -77,7 +77,9 @@

{% trans "Are you sure you want to perform a BigBlueButton live?" %}

{% endspaceless %} {% endfor %} - {% trans 'Please note: shortly after clicking the "Perform a BigBlueButton live" button, the live stream will be available to users on the Lives page.' %}
+ + {% trans 'Please note: shortly after clicking the “Perform a BigBlueButton live” button, the live stream will be available to users on the  Lives page.' %} +
diff --git a/pod/completion/models.py b/pod/completion/models.py index f0cacb3d70..0217471364 100644 --- a/pod/completion/models.py +++ b/pod/completion/models.py @@ -111,9 +111,9 @@ def verify_attributs(self) -> list: if not self.name or self.name == "": msg.append(_("Please enter a name.")) elif len(self.name) < 2 or len(self.name) > 200: - msg.append(_("Please enter a name from 2 to 200 caracters.")) + msg.append(_("Please enter a name from 2 to 200 characters.")) if self.weblink and len(self.weblink) > 200: - msg.append(_("You cannot enter a weblink with more than 200 caracters.")) + msg.append(_("You cannot enter a weblink with more than 200 characters.")) if not self.role: msg.append(_("Please enter a role.")) return msg diff --git a/pod/completion/templates/video_completion.html b/pod/completion/templates/video_completion.html index d19c000750..3c920fcff4 100644 --- a/pod/completion/templates/video_completion.html +++ b/pod/completion/templates/video_completion.html @@ -209,7 +209,7 @@

{% trans "Help"%}

{% trans 'List of speakers related to this video.' %}

-

{% trans "You can add speakers to this video by searching by their last name, first name or job. If you can't find the speaker, contact a super admin." %}

+

{% trans "You can add speakers to this video by searching by their last name, first name or job. If you can’t find the speaker, contact a super admin." %}

{% endif %} diff --git a/pod/completion/tests/test_models.py b/pod/completion/tests/test_models.py index e3d345d4f7..245c89792c 100644 --- a/pod/completion/tests/test_models.py +++ b/pod/completion/tests/test_models.py @@ -1,4 +1,8 @@ -"""Unit tests for completion models.""" +""" +Unit tests for completion models. + +Test with `python manage.py test pod.completion.tests.test_models` +""" import base64 @@ -34,6 +38,7 @@ class ContributorModelTestCase(TestCase): ] def setUp(self) -> None: + """Set up general data for all ContributoModel tests.""" self.site = Site.objects.get(id=1) owner = User.objects.create(username="test") video_type = Type.objects.create(title="others") @@ -54,6 +59,7 @@ def setUp(self) -> None: Contributor.objects.create(video=video, name="contributor2") def test_attributs_full(self) -> None: + """Test contributor with all attributes.""" contributor = Contributor.objects.get(id=1) video = Video.objects.get(id=1) self.assertEqual(contributor.video, video) @@ -65,6 +71,7 @@ def test_attributs_full(self) -> None: print(" ---> test_attributs_full: OK! --- ContributorModel") def test_attributs(self) -> None: + """Test contributor with some empty attributes.""" contributor = Contributor.objects.get(id=2) video = Video.objects.get(id=1) self.assertEqual(contributor.video, video) @@ -77,15 +84,23 @@ def test_attributs(self) -> None: print(" ---> test_attributs: OK! --- ContributorModel") def test_bad_attributs(self) -> None: + """Test contributor with some bad attributes.""" video = Video.objects.get(id=1) contributor = Contributor() contributor.video = video contributor.role = "actor" + # A contributor must have a name self.assertRaises(ValidationError, contributor.clean) contributor.name = "t" + # Contributor's name must have at least 2 chars self.assertRaises(ValidationError, contributor.clean) contributor.name = "test" contributor.role = None + # Contributor's role can't be None + self.assertRaises(ValidationError, contributor.clean) + contributor.role = "actor" + # Contributor's weblink cannot have more than 200 chars + contributor.weblink = "x" * 201 self.assertRaises(ValidationError, contributor.clean) print(" ---> test_bad_attributs: OK! --- ContributorModel") diff --git a/pod/locale/fr/LC_MESSAGES/django.mo b/pod/locale/fr/LC_MESSAGES/django.mo index 7a6b0111afe3a87f2b4ae1d135a58ed23e7d7181..1993ede04a18d1bfcbe9df2b823d3ea2fc50475f 100644 GIT binary patch delta 50834 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 z z4eV4J+}KWF+e0X_o_GfF1$srwvcN#JHuV>=o5;@ta|gaV_!r4Vl0%p|wD2w&*G z|5>SkHWUWZ@Na-3y|GhhxJvF_YWp=m9KRenFYy_cG>V*RCHa2zh^#L%=m(wAh1^7a z3__PTnyc_QQ;@V^7Q zm-eoV+h{Xz)5x`kPsCPRo7__o)~z8xo+2GK+K`>8#Ptxs=Va#z9CAihX^5dT?nBI)>L;1zj=-1ni|VtzCP zmk4$-=mLQ5*p~tS4uQyS;>tA4$Bsi^MQcziN1w=3=uqMT^e%%ZTl?l=_rvoq#R>K~ zw2*uPH-3|Ro}7OGiF*M)L1I6H9>G@7O`Q-9LzfXZ2U8DqfWHXAY;YoT)b5pD?fVZs zeb7e4Us0d0k67@n$uE~a@S*$9qS%l?utNvE``KyB=Z~<&eva=GmhiE1G0=f-?DKxE?2`V3h z>kern?5o(KG6bGw$|Lzsa5SgC47nef^PC=VF1RxC{-4Gv+5&u@L?UF{0lY{~#GrAB zHVmPb09ggCNqs9lFJqHA#1`y&y^Y4& z5TWP4o@8@Cr2r*D{yD&^y6yYa&XU`T4j}(2+JWXLl;BNlWtO`RXLN~sWC6GuXd-?eUG#hr z;?CeU(YKF!9c)A{5U-){2Hf9cBj0}<^4qXlgl8c;La`-eC9zLqKcXg*$dX5i_oF{i zyR3u5Ret|ZE`b447&wC3gZS_2V_V3ukLX)PtvY@twQP6~$>0x39ERmu5yB^EoK7x4 zlgLOK-Xga(v^8%j@=NGFgEnRGEieyK>&}2&{0=&J7k$-;|3ELHN71`NZ{A*rj??JI z`e`Zw*%K_%1zTRP&PhHA-9hJKa3cSrxmDP8q*7a>`7;a@d5(H7c=y6lNWCKQJmMel zzX!7#i{v@Rk!*uLtc?x|*;K4ho$u=q1gSp&K}4$SVlBxxLZj)uqs5l=S0T3w+Yb9e zky{l=Td-;5hG8$u=l^91R&iR9Ycx#2K8;2(N8Tm2jb^1QUwgI~j zOk4bO_~)=qP?34M?0p(bt~4BH>763azZi{gkx11O&SGFX{!eHwr}$PnRDJ`yK#9tb z+f4j67?G~{>DbHky#ppy57nCmD#5u<`r=&wBbzpC?@`9u*vA-T-Ry0YwC49Q5;omB zI5yV$B+005)VEG28MTXNxidUzDVx%cXI4#cjUDOEc8&7}eXd+jhTChM`P!&(Zzkzr488MESwg_`WRWTUXE)yQYmvP$}mSfhv4&}US%3j9V@`-iT^s6=br zL?hYq4>BII{+?)bu?q(o{i2fG*#TG3@Amn_tE79gvPgNdN4UJYbGkP>Kq|#f8fF|# zu=4yywAJ2k1nl4aMuB0U3>pcsR-5H!wAFZ$alc(6&nO>lHJNTSj&u8dnEaaGHOf28 z9x~l{J|-?Z+np)5;d5L414a$|3LSwu}kZSuj@4BBP&^>$R3IHp*(hyy1s*_rSe&8GDMw zWCVR_0gpG^PWZwo9@BQD*Oi`@?ee?b|AThbb?3T$;}})nH7e*2NU^@l>tg}0-yNAz z&rUpG+;rMA4jF3Z^410G*NzT1`I4!vyc)VAh5#VdQV+&&isSq1q#7}u_~yO!O34O^+H zW?F;3J`X+qba!?Jx9vzR$WQlqa^2%~rmk1tl{U&747kU?I>Aga-Q%r>6UFdneSc+CS& zt4?{dgcs_GrJkHzp=>C05&K&4wXD@3UcMd%?5jt%{+?GtV-=jyL*QJ&u`` ztZGNiQYF*ffk5Pr9HBx@E2YqMMHRf4?Y0N5GRKs+wq7uktg9cJo#dU?#CqYPS=t`5 z-K<_LIxDAO4KGZ~+rxQZd402Sb>WM@`-~>-GFO$gMjbP^g=X4w3(Z*5-hIMcd{6kD z24ih|>LoL=SZK>vub9CotIjpE3J=!mbj_@5@qZbsY-e3FSH@Wf3e5-YdvBZjq8jr) z$nf~nJvo^kc~7JTp9w#C+?<>=U%(^J_9S*@QP#}a50)gNfBuH>~cXxMKC=Nx66n81by+Dh$xNFfOMT!@S zQ_B1O?M&b2f6tSCW@cx{XZG$0bj6pz@vj5j-;>9h5 zSO%jGJ5C4=3Xrf73*kM?hv|qor;oYq*K_zbLycTwf! zK4xr>Dt{rC#Pb**lO5M}mx2hW!rGV-$6!`mfzfyzi(oOE~*=i&?Op!BnjQvqLM z8Z3IwG@ur$1JhAGKZHT}54OS7=N)G-4#vdz1~Xu+3ygmf0wDx6B>7M+FOGp&3$-R% zU{V~4VK^C^;WktQlV5b4QMeA3p68O|G{-482A^RB_POjh!MGST68kSR{)q_OCm}Ar z!Yud^)qsq@Q8?zr*jNfvV+`tgQ&dknV=^3%nu2+#3OAuTbi-bMY4u+*<)*sA{OiVW z60%`248hi@kr`v1g=)x3)DZ4O6@0|TZ=f3V1QX&1Y=yC}ns^7SLA(#D++R=~zTnz~ z>!=}qV*LkIQQ$RG@K;!ncn;KJYKiG_1g66UsQZ6JP32Kcf#*>Tdw?3b*O&$qUN^c~ z2&gAfsFA3N>S=4#4gF9Be}idpAqL|POn|?k=JGD8qPRCq!&9N|3q|#~AjZNNR0Atx zU+w?81XSTMjE6VyE4+^?z<1MeMq>)p8kmFWa1j>5U8oBF!hGobZaR`5)v*}VNHj(@ zusdpshGJap|M3L0=%%46-i9jp9G1m+x6G=qiaCh)!D_e&+v8J=gLQ73hBQVsv@j<I{RR{syE8~39caNfqB zqRxwdF%ZKZnuZoYb*KWy#fBJ-Ein!*#m=}Il`n<+r^y(K>Pb!v!Qz+!TcB91=Xs?S*@&ivL0ljq}tj zk`$a?;v2BE_WuV0I@_b3nW655 zp~Pok6z;@ee2v*K)pIkHB~ZJi6YAt!jVk9lmcnE&%+%IGT_1=#*w&)%yNhl#fy{rI z8(X7VJ_ogEme~0BsD^IDZ!z~vGn5A~g7_&6#}AkkLtdGN=0}|?O{_C88SxXSDY^NI zVikBpg0@@W-==_2RK|ih1}k7hdVAEvtG|s; z#q`7%zouIW3H(GtARa-Dz$H{qZldP&Icm|pvvJ=W)ANLwob9xbIEA zRHz0;qNcDSszD8qj=4@J0_yQ_)KHH_6)@Fga2BE#;}+D7yHNZ61p4t$RQ{)^6Y- zPV9kNQwvbfkoD-T1=N)Nj=C@4AI3iyft&=?^Twzi_e3qauTcfg#4d6aI%-5V zqK5DcYQ%0~Fg`)8p+sMdsZdjs5tT0&YS$D+b+G&w*A&!*1hupaYAv{^8z-V}oQv6U zC2B;@U{?GGwKhVW0IxxLP$L2$Z z`vbgHdl%KCr>GXc!CIIgmbu>4+8&j!C#vCtPz@PxuP;I^&ef=q+hBF~5=cwJY1B4( zh%NCY=Ed5vO~Ip4*C(S2nvLrDLX3rLQA4}Qrtd*5;uEMTeqnXun0PYGp#2|0ARQT^ zQB%+a)q@_WH8325aUQCmpHLN_L=EvZd;KYD(FMj0@ZL@5MwQbG)#DL1KF!7#dvTY= zL_kBk7d3rF)^{riyA$3Nedb|kLp$*m_Q6sY7 zUO$7b3b;i;bN3oGv;hf>Nl^Pf1M0?B)}E*eT=e5qR7EpT4OoC$e7i9M&!V?m(0kS- zH2I1q3~;?08<3!PJS|ZT7=y)d2CCxIsAt4Y48r@U1LO;8BtjCIxsOD3q^7kQ>g4N; zn$lsI5x+$>cvB+2f6-j*B0(+t6?Md3M^*ec7C>L1S%igA1vW%g+yylf15gbbhnm7Q zsC>VmM&L5Wpf9oMU`5p8uJ001k9wn8_zkMUC72&Cp++Wt60`jxQ6p3Y)r0b=hSb0Y z*aWpkwxaU=idu~4QB!gSRq=CF2i*io&8iJT?e}0*4{BpB?1HLbE^3>uL=EwN)Y>_P zYWQ7LzPG4``I4E66Qa(IWT^7eqt1&;M%SrMKn2!8O+`!84P8(z?1!4O(Ws$bj@o8h zZG1N>-*MC$xr$}*j*W*VH|6F;O>tq=)Ktf;dj7W}pbExeCR~NX@i0bXOo{;S?etjG z5FW;kcmpTudddK&E1t!1SRz$`_l!7%4~f6RW_T^NnaUz*%t$rEINJZ66u_RSo)56` zk*FSxx9QVR4V;IX+uf-1;V5dzuc4;o57ZiXZ`0$aHRUHqZO+Mk;=#84 zUpI!NH!aGJS{#w6p)8Hsp7l`$_QZ17AJv1OP$RJ))u5B89$!XP@H=)!-&bY?x}ipN zFls~>xCB}gID|e7&tUdv1ggLasETT#R&RaOk=qR;uovo_Scuxb=dd*TGX{7cy<)Hi z@nP5qPvI5JmMOsdPS|yV1H6w|L$DSX0x}0Ub+8V$$M3N?CJr%2auw`Ad@L&eb8L*! zSl^`2Q%n?L7HKC``f}6|SIcS6frY3kO_0l!(+#yqH=%aHPpBjKC}z_Bzh@I- zMVgTaMlGT+48us&BCBU@g*tM(q0WPmHog?KX11g5--p3?1eNbkRL|q(HuYpgSKBI- zKyJ*1iZ??YFzrz-?~A(8#R)hIzsF2@%$y&=Q;O#`J%5H}iPy|$oQb7~UqLl2ZGN*h zg7dTgwaprlpo+U&2cTB@2vmi$!x^W_|B4c$hS z^8r=wzxmn!Dj-Dxv$)cu3Wz|Z=R?g|F;oQ=tTj<1(g<^64^%}9Pz_#-+OFGCi}oaH z3U8nm`=6K$pSuJ!#7;r8iW8zLj6^jc3RQ7g)EkqkHoYyXCtXnm_Cggn09Ek>)SK2N zs1e(P>hWpRn)(BE61oZaLpx=N!mL=;#(SflilZGM$59P=it2H!!p0P+j)b7@ z%Z2JlRV;&zP>XN@YHj_D)ayFO351ex9kmFZB4)1gU>2g4P)Bk%R6|FghVolf1q)FH zu0f5&PE-FL~RKS1SwiSf1nzu1KMMa|r&LG90ss3|Ch8tO8rf-Bf~ZPYew zfU2kqs^9^rkr{(p3o}t2ScIC&&8UX%)^+N4_7hM=$5D&#JZi44qDJI7s(_5eOu>0k zJ&(p*SPj*HA*jVR&cM8j%YUD1X=K2+?;^ZYvIhjx+m<^SluLS#F??_6KpaPrO4Bc&p zL8zXOMGf^_)X1zy4dp>p15cptzkn+E9_qfAsD{KUX(|pyrRPSCRGE_Of3>JK3F=uh zR8M=LreX*d!mlw0?!vry4|8JbQYO7D>S@;?%!QH%SGOF;Yd zZ&b^ZMwb!;@Mo@uCt zx(f+tNWQo3Mh)#L)D4$WH{3E1U8QqZ(WaHG=gkv;Q@;?QOzYoAEYkDE~zD^d)*z zW8?9v*q)-UhoA}$M~ze|R1d3Jo1#Xd3#y|dup5rA;+mmtb{4hg(srI(s!+G3sgA6gA|-t<&uFWj4OqC7_}B1=WBHsC|C}3*#r$`H;W5 zDX1oD5w=FH?tZ9UF%s3#ov8BmqRKms8j0Uf|WL7ond2`%y!E#l|0?hWKC9;!RQ0G$5@tGinNRpz4c48tOXLOu%V|T72D5Jse=; z6H$w3Cf3Ivu_z|4WqMQ*%Mfpe(YP9O<0I^jLA3*%NjTn`vX1%Kz6A5@`5#f&d{AhC z`XsXj3u0hB^KrQ><|5t-OX5__ho@0TZ$N#s8`5Ji@d{W3JE9u06m|bO)UNr0nzD!n zsQurXfQEc7Y87w9On4ZB@c~xGxDCz8R~xm>hN0$kGiq_3Mm5~u$UKINq7JBfsHy30 zW8m*#FT4t~E3JF@1B>vI(fgwgYw6UqSWQ-@;5uVf1>2YEXC7$W6j3 zxXh+MM@>P(mZl+5SdVxoY>E3?y5=oXa4Yl4r7~*qtw$}!{iq6#qxStn)KUE$wY@%| z8sckh;^|TOLXp+&M4)y_6sp`xsNK{QwF}z11hg&sTgRaao`bq!DQdfILoJ?@s0!Yr z&iXH?ic+*OQ888&yzaRL@(W zdO8U;0`pNP+cN8BR0H>0kD)3&k2+DGTLash5z2{)Rev-Ay$P*>I%v9~dNR#A5A_&c zfvRvbYKZrvrs$$ge~4NOZ&5>?q=RX2cGNB^in_lBYCASpy7qq`0-ECqs0J*x8Gc3e z_$q3MAEAcs6KV?LcQn^iq8c2E*)S5dYwBYZjzrzR2bJ#(s+_CnYG@u3P|MS?GUUX1GbYE%PuqISnI)UG*=%J&FW@GI1meL;03u)CdF z)YKHTy2T0T#nt~Ci_W{#T4LpP8@DHqj;l0iC zy(bnS{=JRg#u(yh`j~IUnqevJ|D`tJ4ywgj`QodtN13W;QLq{U)gx>p{Bvbu?FcesBJh43*daz6rV+P>^iF6dqdg(s_1VLGy-vk znHw{rDhfrlJTGdoRlq;7IsT~l@BpVJenI8a`w6X){;2ZCqS6=H^lhlc`>T!LbO~rx zK0}>Uz7b{>hoH7wejBfbDzG_fMEYYS&Oal zD`MU;s+avYn1FiXq87&#)YEA;>fl(88p{2sMRgC=)5q3V_WDQEh-DmWMl>g?oWiJb z%c9PUs;K%}qPPEh5C|nsy<+1SXKs64ijmSO^0qo1?S{>WpuL1MyodiwUNf z9#_Zu#5wb*Do2cCrf2w)+n+-LBuE&rW zW-892T7C~T=gv&?Ilm;T$1aBB0!+fg=@4coerc9zz!%gBnCCmQ8``4o8-|&*|K}0V z^L)4U18VyenQfj{EisJvF4Q)?jaf1F921W~4P{NNjy+LBzYl})CMy5G*ce0SnyGU! zE%iI|Y{FL5P@lGOXP!B^(xXPG8ETaeMfG4ds^V=}4=D z^#U`ZMbK4C>)M3gsQ45tjO$Qyeb1U^p*f%`qlR=kYGe+hrs$b9{vy-Btf&L43>L#G zs0NM2+IV6S`@a-{jEl`SYL4ZJcf``T5j8b0QHv?h5>rtt3?@DdH6n{pJ>P{n@D^&( zC0J?}T{+Ym>4kbfFc16SnWe7Tk7btyIEzTAh_Ue@>Lh%IIw8NH_Hm-+rlBdYGVu(k z5$K3&;8gUU6*hhkD+ch}l`G81HD75~|0=9V{#!1AngqgEnO_nagjyuOp@u%+_h#wA} z^>;^Q{0{YO*o`XiJeI|PwPy9lpssgD&FR;87BAsaT(!>pK0w9w=1~9U)G%y--=WsPb5uhLZVYfvV>6tLIX4A3LvS~0P77@|4Qhcoi7&@?cowzj3T+AS z{{B!e>`VMDYVNyi)d;fxZV}MxjkC=>OhQm+cOHy~QK)A@IUBEvI;iTQ*2*N*GvHer zpN~3Xm!d{yJ&wjhs5Me~yV(Upur&2M`w2v&Z--g+Wl`}lSOyQ<^!PuTUr4BeRY*UC z@mXBScAA4H{VwwXqce`<`X=0tMRuE$^f_wIeLtBI&wy?U5(*JWij}QRtX)w(9EKW^ zQ8s-FYBwyl*H@u-%R1CZ?M02;VbsW+!IXFvRo-*d{jYzr&;L&(s3CEFHdBxePZ1AC zt?IX^fb?)CHIQ|$`DD}*Rq+B;dCT{*{}otk6SktC z_)i#y`!E(hKpmk^P!%NHXNIy6szk|hRjE;l^v*xkDwZS8&&aR)Vc8jwH;F&G!2PH?V8%C z5gd;-_59yTKs|}|i!ltfKP%z@{2A5a0>7FHqEQWq!Ngb}RbV?*L#Cn1n}<5_enuT^ zf1{=_`5|+zSvI~2HFY~sLw^dhYyaONpzV|Jh#Be(sGj9OEvBM2y%MUz`ltdr+3Uk>d@}03 zrKpkEgqqUbs3|^#YQS|=zE|k|`Cq`%0B^A+L*0-M)zcEFp=*h{!9^{?DX7J?2DLVJ zqK5X6^*(C*#Xe@ti{7q4OV!EDzQU5kL#=IW`Z83- zYixWwY6SLRX*_PPCpu}?LK@Vr2u7`utf+%40##qMOF%gZgC>d`8jz5$05-;O$13Y<4RXoW+G&&Oey_JTQTzr#r4zoOFr#$5*f(mix`TcbkWmiC;kVJmVEJLS-?E_}8dKxEHJ8any;J z_NsZ4S{${jTH{yR|04IQOr!dA*yGCu>}5rnv#d8ijrP8 z2TuXi6x6^xI2cv&TAO|xUETPGKrm*!Vcsm3LVdt!hHAiIn?BE`??mkCi~*^MgT8ma+r zQ5{Hs%ltWCInaTd4Aa?wN*`xAu1l=wY)8OX5}3T1b1} z9Fa9p@%FeA7h-3u|G+fh0G1`5@uAr*tudH*XRMEtP$%qNOpSk`8W{Ia({MMGfDV=_ zs0$5I8T+Az@*C6}lgY}K*zAgo zNW)zIVz9X|7!ZqRhq|v9 zs-D59BY33JsoxoAGfYDb{ancks2iLZ-K+yq4H|_iU=pgpnWzTOvo6LQ z#8;q3@Qh8rhicd()O~MWu>V!yCla)X{C}CRU;J+W24euWAifWqV5TqTAQ^(qh%ZB(czn$CKF$}zTEwPfF}#OS zm?^-g@?EEi2{?06bMqS(!aq;5PzTjQ z48}{zeCGN8mIR$xDU+KaE{r+>o1uno2o}N3sE5&GRKc-Qn1X{*53gwS?nCYSA*hB< zL+!HfaUkwQeUi$X()D>CGRvj(c~7;UQ8%7NRdgR!z!y}7sZ*H|$cMUK4f|mS)cb>* zsDme2YBOTRQ4Q*ddM1p;V4P*+J6r-9+C%ojOVr#ZPh&Hw>ZI^r9mrnVz$1l+*{wCX3L7Ta{3g$qzO<_q$9Ct5UWHCI9n z{uCn z-q-JesGgR>(&(aYJb>CQCr}5_CrlZ@&}K3t)gsvRtQ)GlF{lG=3Th3^L%n0#iP`ZG zmZ5&<1pyV9FSF14t5qYhKk-Lc3tNVm25dpK{Abiq9z>1UIUB!g<1ekgEM_;QKyA~a zs1r2WrguX(4GA;sg|(>nc2`h~?kQ@O#|!m&|JGXw>UvkyNj3t5aW1NY-Ka%&0Ci5B zL+y&ESQ3M?n)9RuDu0Kp?0;3zodgZhcvOQ{VJ6&*+8w`RBqj(m6&FR_R~xk}x}q93 z36*cLjh{vxM0Zj7<76`p2u4kDcsBOGTGEk(p4bC5q_V#~J+BL0FyXie@sy?I2^Jh1vL`_{*)cplq0vgIF)FP{kI&hk!dfv~v6t#*^q4xJJ z)QR~Rbzfi(lb#0Epb%6AIj|n)MJ>j0sQYJNMRXSts6^l)s)D=`rhu}jIjn-Iu)TFC zYDA`^Dqe=Fa2=|GZKw+Nqqgk{R70PkI+ir2S(Mq3DdzWo3Fx5chHAhF)WI_yb*3*t zJ$Cn?=JF5JT8W#>RGbwxx4BT|RIoNit)*`0ZAa@A)LNO1N%R0;OF%vO2^-@fYjC7l zOhZspv<8dfFIXHuV;(G)+t>w*5nq4}@Hf=?kvoq$8GB(};%l%Re!(c}cgp28+hYV) zCcY1=VS;=<@Am;3qK0@0YEiAWZou)xx8YnYk>5ABL7(?=x-4q{cSWs%@z&+2e0y;QUO-JnheBpoj6t1nD^P1@GgieTsKuDF zuvrV~QBza0F#BJNq&^9%Xdr5iXP_3*kEntUq88T`)Ec>ms^~3hJNb*4cyiPfWI{Ex zF={RKKuzH=)Kq_mDtAc{_P-u7J4gt|SE!0p6g8_gBdUUes3|Cis<gk- zhNCL{7K`9w)b6^1!5C7^OhH-H$PID{sG!-%c5v3A=J+J)WIK=AJ}*%tlrqZnBsZ#I z6|odHK<$Frs5#$^>gjFkW7NpKMvX+A;%187Oayd7MWHIHiow_eHRRJ!bGHE1(B-Ix z?6m0@Z2TIAlKuu&ak>&_n}wpbUlCNtN~6lFfRxYQ|0kd!Y>aA1XVeio1l7Y4s3Dz- z>fu6E4}L^7=qze6-A66j&o&-Z(lj71s^S<7!zwo3+mrn_kbqh|997VGR0T^=L%9o8 z(Vv(TKVuHeQOdlXu7|pBD{3lEU~WtpZ9d3Ep|)LbR0me0M(QAXzyJG?KvohyV*$)k z+PqC}h`M1K>LgraJ%Z81?_m|pTE_IW7itlXvGF+=PJA7zoJ*+kU!WFWXj%5Z7Fihr zYH=&n_W2go!DDD1ntKfsG(_x>hVO>$b63~;1p_&TtQXv2-Sc$SQtafn|Nc?Y9EKnKNnU0 z8tZ=CK>Tuf*UaIV3O?rr34h>byik$PW;mvj&-;4LsqAxJ63>rX%~`7$BT;i-7+Yfv zRKvEQ*3@3q;ysGWcNx|5=coq8b*q|;L8!UQVl9N4qe`frcfb+Y8}(M|Z`3x*SIyjC z6qT1511FI>jqPD0J=#P3!_6@2&cfSo>KuyI1)Dip{bu?$LZuWawR1cb?uJ=bx z%{|a|CikhFt?~7DuJq~4yqwNP(A({ zwT)JxMryzHH`Jnijv9d!wapx7K{c#6=D`-I4oyQ%)mrqv|Jy-8+h!lCWv5X+xQpu1 zYgC1a>KLrEwCbvMy=vgsMVdev00quQ4Ow%T5K&)BiIr9 zVn0;F9-~I)BWh~mxlK$DQlf?~3WKp7s(`Vmmd-#e%G0PJeT*s~LsOHU9o2vs)QHtZ z9W;GWi+VEZKw6HmaXo6J-K_*v!B6(WTYKRj)KJH2W-_KhEy_%&q0Nh$!x;1`LLEqx zQTb+~7UwEdMSHP49=7qo=3ct%q#~dp$$;un1geLHF)wyTt&Ih^9FJjD?AF4pf!(N~ zjn~rW{U%ge+)I2J_QzJO_!P#2eZ8bkrJ|*OC3N2CO4N zPqlNH2a|R(4JwUlP-WCe)Ic4nolv{s8&pG9V|Cnss`xW%k;d+9$_YYERS0UAMPfH> z*qQyWAv#P#R=k9IxO_tG+q_+Tjt^I%w$%@)xjTmH=>^m~sB5Sr_XBFte#U6b-PL>s z?1|-xZ^0=1fNF3-x0}!VI(;-I4B)YeOS$k@cb~Hcr}yxAzs**nr}>t9Irb(!b}ygP z5(lChd==H;B)x5U*oF8#?20w}m@g{#phh}>Up|CVpWBGt({w_srn0ZV~T<1L@kT$h<8C6?mFiP)FC16 zAhWodpw5H-sKqxL=in{WkPRGcM(7A$Cf;d?&-+&`qKBG~)t~SJ>CwYXxhaSHyx$k> zh#H}LSQ{HL^$E5A*AdXR*@>FVL#Rc04>jlUN0{r`QFC7iwcn#ri>i~gAF9VAF$`B= zW;}tq?-^=wzC)G&1;eS|2_0#Muo^03ThyZLjumm3O+Spl0K#{;z%BKgSb} zXLKF=;gV54=Od;bZNB7AHpVQ%30O_}(5*xu<5<(Oj#!#_Pt=@lLCyIw>v`*SOiB7Z zRD(ZYD)f&t_XVMPng?~g2x<+LL2c(ssAo&{aqNHH*op-0;{m9GhoK6XjykdC+4ve% zzAZL=C#vA1sD_?Fjm#A+hJT?(GGe^hp2bjWt0XGD>Uic@Eonl63hs_ty?t$lF_@M3 zOjJX5qZ)P`^-MUAnv$C~{XMFO&ID6lY}C=65Osisqo%A3>VWFt5>ShWU;&(gIx3H% zwo|}FbD*R{O-WVM+200rQckhg_n|6yi8@*nPBJ5z0W}5rQ1=x_b+`kTLwB&fun*Ou z$Eb?_#a5W=8}p^~094CwVO@+h*{tqHsPrMIkz0Zqk^e(Ur8NH*4VbH;Z^RdfcmNdG`J>=CMmFHsHm&oB*4U=6pH z$Lw5hi&_IyPz~LMt_nI!z}q&c#qk&FdG4QSdX^0}6(vv=Hb6ZCI-yRyF{u2jQ6qU0 zRqiEw{U&PnII~PWNimpc_$>CnE>t2xL)!?|vH_?$o`RaQ`KUSGgsR|Y)KlybMq;e* z%u_HwY8Q3F{J01!;dxYpzM5@DFcdXnIcBr}V-d(pf-Hm@swh;?+M(ubJnG<>jk$3p zY9ub9M(iP~BOg&ClVFb7_hEQ|cv;j4$DV6ODg$bfmUaoKr%lmY9H?zH5Y_VusKvDi zm2VrWAqQ;w8Ppq(`>2t7gld>G&-64oYB8rpjX((M{v4=s-690^)T@rUup8>cn~y5! z0IJ{%s2d;K^!KQW6U;Y%+@2UU6}2%Rj>Mw44Rr!OM|B|K0yAQ1kps?kA_%AfP z4JzX>)S8%R(^sQT#Dl2aa2?m<3k=4E3r$6PQTJU(4e_rAwFatK8>8l|lfB+c=>dEu#BHR{T57(Aue{8BH}pFeBfZ6PpA(Jqunb;D z?Usxy%omi+Q0Krx^#1+7qXe>%a1OP4KVVl(wbJzPYg9w#pcc~-R8QBSdbY{N52B{# zsEyx1?T)*sj=e!mZLC#hEhSsU{#S-fHX$F*ARdjHii@Zl@1rVyZPWinEyg6@n?GvF zfXdeod*f&vfbUR?y2onM(1oan)kf6zzPQ>oi|QQ-S}aL_Fmn`vYFHUmi|e80tTi^m zk*IUxI;zL9*O)~Wgxa=+u>@8{jnqWcNKHc>V9QWzWUWgeGl8S1mOjQvOuN?fsDiaV zYSp$wwR{w+;8hro>rhj73AKw}qK@Q*>r4l8qo%N;wI*tW-G&5Ia3@p`$D!83D%5H{ zjq2fjREs~LdXjp*SybWJfp`b3h-Xk8O1r@YY=}R@0H;sH1uzYJ^T;(GHUL>U|Y<-!)&`LsD>XyjX=B~%?FSi zs0xQ;COm)|@jDo#{r|;Y2-<0m&Z1b4^scCb=^$!Ouc0b7t zCq4i*^xH5DKcd!1=6&X^T1iyAGiuJqp+@E(EQ}fVv;TDx)!%RS@kne#{3@!z5(j+V z?{2rnRK)M1w&Q!$6vRGgwo`7@`B22h%b(RrXmp4fNZF>Qww$fMAUuXT9=|mU^A-X)2NO;#wbkY{%S5% zL$$DzwHIm|4nnPgrKq!g7itJ!qw=RdWJVw(YGksZ_H_Z&wv9oJOe568s|~8*9Z~0u zJDq@5_W{(9+(s?7SEv>zI&7|oqY9{Ct%`Yx*FyDp6siF;P)F<%)RBD1reCz)LEZP< z=sLki%=5c8s^UJ@$(WV+_o(;%r%-eG0ab9^qh=&hqeiF*>i(Lj_X(X*NBSt#wq1nk z`4LpdUSb;U|G;DB#;m9zDP`?$U5J{qlc<9JMiuC40TVLr(RQ3#XV3JjY6%BWvFeq4Yh5Lqbh!bYDl8f zX4`#*8p&c<5j)xREvRzNqNeojY4*PYiO-mp7ek$770{bQR0X3@70g5RU=3ErZ5WJS zQ2B$;nhq32HM}Zn>bjuT%yd-8mSPp$ewO{OxeGXFwoQ7}D$a>2peSnpHpHCR&t6}K zn%j-2?e-I@;FGAw@@-T{9-xLk{&~}ZWT^a^QTg(@1WFPpf;vD3SchXg;$v)l3aY|c z=$!|sRlEze-7cYa%SRgzzF-;@gBpQGsE&?6l`{`>qq~ZL7S(0cNp}a;leefLO>ohy z_AJ(tsDc`y7HJ>Uwwi?zxDT~Eo}dn_IG0SkH0ljWQ&fXTAosb>N&@Q98PuwMh^qJv z>MdB}%VvZ!V?p9Au?l`?)9<40&-|PDQ?a6`iY8$UZp3c*2DN6|Trr;sH(&+r|Mvu% zb0PYw&-;z$#n^!OCsYA-u9@vO7t0erfZEUTuA46wi{VA$J1`ecx?%SBE-Xa+6V}Ci zH_eEQLv720xL4cnZvrZC%kMt#FO}Rw%}wcBW@vk%uFpq}&?(diUB`L>JPWLq@0i85 z1b37*P^!NDb$=_L7fi|P$TsW)qszvkxKE*=j_8=s404e@zM9(OkpC_<2xm4 zR|TQUadQ&T!=)%{ZdzG8qYjEbs1b2(`ZUxkpNm?gN3a~eL!EfVUzq*f0ySczQ3ucp zRL4%B@;}2`+W-0fGT(BI##UUokAAH1(o|dplM!!WnTFb>14xCk{ezoI&D0@d(~ zm;-O4)=I)x=KgG`4i!T0-~X>bKtov$;6iG$b#AE4&C%-?2cTc9fLgc{18 zs0I$h^7svEYA&D}`V7lriq~d@8sJu!grNjfaGp2jgsX;n%#K1Gm2+);FKQcJ#J>0n z^>pm;)-+@|1`{8H;kXJ_&KXq2_fZYb{?4qCJm@MRhJen2s;C<}phjXC>iRT{jk8hb z!9rBeR-%sHeW(%q4RzA}g=$#Ld(*L|Sd{o6)Cg@wZR>;Y+5eiW=Ok#genib-tPkcJ zjX+dIQ&113)u`(~qZ)DuyW}Py^*jR!+8#x$ zC2#@pGN>Nj!uBswFvK_?oaaB?1HkWwbjnG zfeEOdtVhlHPSm2giFMHbulaMm2B`i0BUZtaSPIjAF&{D;Vg=&!QBTW1umc9Mr?eeM zVtHJOm68AdsNdVq`2+mkiPZ{oa$zk7;}tA{AMg|w_W8a29NX{r_IpmONO}!aL+7A6 z@Dz1UB#XuU0lcfm0>p>K_Isb0wjlXk=LrF|tW+GocM!Ee6)+B~;yUXG)KHd>>-YY2 zs~3h5e~5a@C64F!dK`_as6R&HT5OEhQ1ujyZ|bRs5qka)BQTH)KcEhZkOY2jo0UX8 zG@7E$@F6z719i4v!fco+q2F6W6;M;w+BzP45Z_?q858;WTTr~+M-BaNn2q|KkU+op zIIWDq#QUO-(pl)O1L0X3&vQH$^+>Uzl}rbF#ei+rSwFF-v- zccQC(d6Ymt^dNY2Q&R@@G;E8icqTT-V^|o&)BC-DH?SpECtm3*zjx%%aS15H zcGQ9J40Ylq%U}wQuvSCu=N_nSwGxBz0%}*h#!i?iqv`1cOi6qzw#TD*19NBcdw*J< zDA@0PL+TzOFo_GLGMkp2Ky8zBA!hLuLv5e>*b6tKdYUDRpZ}X7?~ZX5)(SP{yhm^7 zvzj%t3)R8YVWz_BsDtY;&e8r)p3U$5-p*Pa$AyC7riXh_yWk1xVU#$#S&W%cYa_zO z^I|;WQK-dO4z*T>q1MD`RQ{=$7-ykIcm;0M{@+VLE$p7dES^=^kodo-)!rb&?|mJ& z5_Q6TLhXhcIZb>WE+g*b@_TNR6 zUb9W6qYjiGQ3uH_)V__K&#Z-D{EB!PRF7Jq-gvY_jZkk?&&Sy7-`Mo&sCPUoQBTDk z)}!dX|G!2+1-?NQ@Ch|^zWjdgxgLm$hv7}ki`w5w3Yhe0R0FDD3T%!wu{UZ2e?cwY zWCe{CP$N04Ap5^Afpa9N;;=%dA-OOX@%*R*s0jM8465St_WA(SNDW0*unct&UBS5c z7S*wTQ6mtmuqh`MrX?O!nEkJlE*}XsupO$P?WlsDpc)pxh-pYt)IpLCRdG4gcI<59 zbFet^y{MS=eyoFk|?@@CXx0sppAk-=j zL){;3ZH-z(qcITIp+<5y>fqXkrSV@(f^Kw_dCb;CJv)$k{%bHb@$rY<3> z;gP73DuEh_%BXr8S785Z`wg@i*P<5NZq)XAfGRLiMYG7#pte^QEQ&2rLpsl1Uyo|g zF4TPouoj*~JtHz!GG;^ViaeEEb3ha%K_d`_S~PV~1vf?=K;7^H4nP%DrLs8(>Y{o$ z9Aj`Ymct9E5lLIckFp~INRC!rznD>b7P$Rw$buzlQ2xu<1(b#IWY3z&fY~ z4M#O}HEQ?Vvgxr~n1<%I)<<=47`p25Y62?wB&xzUr~)&$G;>u2)qts36ZfFzI&mwr z9Sfn#>4Q4)W@9v-Ld|*N)~3SRsAs@1)b`!bn*Fbq{z*c9Wo%=5PzLq18id;KJ5dME z8*84ne($g2bU_u=tex2fvvCaZRP9ZN=HpP}zuI`|4u0>KTsxy4Lg5`2mrpL=r z6`n+8h~LTdpekx^r=fPsNi2bn@h=ST?Dzg(ut8n?-d8g#P$L!8)$Eqes1fUpt#Kae zv*u@)fEH0uH#29^sG)9;I?HFGuCKz>cnURD_fQ1{b~jJ6?5NdU4g;|f>S5FY)uFMd zhW~;$;@yb{an_wT@jA}sEUZ#hoQAcVe)EQqL z6Jm2z#hp>*j7J~N#USnf1q8I3cc2RV!}#~9R-55xR6&Pq{EYPq>e+AyL-7NuqKth^Ma57BRzg)+ z5A`^2hFbkD>OA-bHFc@_+LIMKY5$iapo%x3dbktg;9=BTs#7-p0M(Ocs2;vWRT#UU z$sdTCf|RK1L8uW5M@>OaR6{G<^!n&(+chSjvwjNdVKfu9ZI)sR%-G*t&xdMQ5mbXq zq1SU8uV>>eQ2Dx`%I%G6*g%ZJVW^Jn>d*dH0q03ji+@KI{LK0ebvx(nY}-XYvJ76lJvxchjZ^S ze%x~Z)nJXq#pVjbV1=0~q>qy>>b7vZ+#FWcy= z_TCV#-QgPFcRP`UxAFZm|F?UNQxZ~9Kp7JKWGF;fuWQ^`g+fl-f_yZplD($uI|$d| z{sOiFr5z(r9@JrWmh$x4g`wmPa{e1 zLq&S!w>K-i+ola8-*Cb&ZA11EKT5n9KX=K0gUXW={+*w(TpLS1{=p^l_kUk=aWRo) z_yg9rjajN1c|uLzt$d=l47(vTZm4<|m7d-N(!`VR7hnJE9P6I0~l z{5?!7vr^$XE>6esWSq;5{DXE5$AdH9R^Y=&+y1mj}y*A9=+bs$n{u+@^{-b?*jiB z5S#krk+~xm&+@aA!pD(mBVirnPcg<8I)r@R(x5{WsMlz&?I-UA!fQ$Yj_Z15!T$E1 zuLx(R%$1a-*BSI<$GS{<(O{5aNz9RoL(ys6m z#}>Swa2D?SsNV8(fINDYB|QUWlhFvH$5oW%5K)-~q1BAj3}X{b(~rkuNUs*~E*GXERQt(wnwn zlW1fCey*B^xXvX4_iUv@$n=q$!^rU8D?VwhX(WG=?yR%D>df_cHk_6U4{$BY_H3?g zbT0C2;@S!dnvV~-u6I|HxL%p~7Jj_>A4bN>_U6=FjK|M13gl1Fy^l#n{--f|*Rqi7 zXJ~M2uIsf~Bgp+_NE=CB{+(IpZ#tpZJ%0SepA*lH^NDY^oz->y|ACz2{OA?z{g-z; z6sA9yokzjL2p6WJ&r0Jue}?P?aqTJv*5i6}(q7Y(oOU#hlJ8&QT}bas+GA|R&o%DJ z!aWQ5(QB~P4dMp9wv)LD4LL{!(}*{;1-2u+mjY{W1OFzW!=E>LuVSQKBD9au7@{(` zwv;^6spvPZ-68D+$=iqzwsmy0WvYPtrU9-~h>KOZa7wAXa@m%Z!2MinO9gt}zyR{q zve#!2ZcKPKmFZO$kJ@YDScrx$eXI9> zn@G?rEI;eRUa$$fly_Fl{R?;7q&%#U7$=}a=h zmAGDjdtQ*1jkIU{crVi3_BQ-8mGJ4>DMZFqG~_DrVzw6*xM3dQgIxdD-rUhP`bW~@ z(I~wZ(C9^k7m)W`^4+!#X+gXb;r3k5Kz{zsO7FEbE^E3E7vhrm-|G_vpXO&64dGAC zot6K!mJFFFU>26N1?Zj&r0Mk&_tc`Sf;L_Q`*Htq?q6iGc>k?K+6B_mQbx4i|K;YU zId(`x$TE+g1GYg!F^U`XT1^Fu`O&L@O)F|u+5xT=rX0R~by8EodCF}}T0hb@QJFrD zAF=lz<=RZ{J)-@8*!D0siS@bpJQ+hsdram($W({;zZ8;>9wj1wIonviI&kvX0;h59 zYw|tg+9iAa4vr;H4a!=;eX%edX}?lWUcy@myScg0pPOHjaG1(c+M6lMdp#gMDL3eK zg6sRZ{+{qs?)mRkjY{-dMOs08NS@!hr#EHuwW8CS@F2=5L3jcUzD*uKX({;kXPs_b zC{H96ne{44hLfZU!* z);YsT8^BLP%4kUWe{27rCJ@4nd-=IUM!oh>f&YIh&q+8H1!Ur<2sfwU=fBrG!gsme zk^7?vU&9`@Gs?5k=50$ol_`HIW&HO#t~1^H)B$VBxQl|?65eTV`ksQ467Nf#&zRop zDgS*=cq$c5=lT%a)7E&4^s`jLFG)LXY$IauB9*7)+7--1Su6SBxAVMbiZhvlIuLop z#jO-xhXVGHp|dSGGuMW4O|NkBCLx~0UJE3ilY;rpI%hfet;Jl#H<7L{BcGD*HR>y# z|9!0^y@&R{pUirt;O72R`j*yirLrZ2^~ylHULVL;jl%Vgc{HBkXT9yA&o(BKJWI%X zn>-tBxw^L!dG*R?%UVSI68C21`-lI3<=}?)B+laI%T)dynVOOI9cc^66-|6O>G|=L zZQOr1ujd}U7IJL^jVWmx^egvYBb*$={^y?2q$O2c^-s2~T1h6ou5e)pm9{5+C_jm8 zVb{5)e{}ukF+>uXNi0=~ ztx{D>iEAtV_Nda@uC1t8sQRs?8IC>00#RU#Vtu8%JbtQy*+S1|&lUUc^)Ch4*MJr= z;Dik51xXkDeG+#ejuT&z55s>Svh^%GK~5C`$G61G!R}|s1vx+`@EQ06Wvf~>C3| zZy->wOsN-*>e6UJ(9*M^8@`RkUF4o(2V<|vuw1b_7&?HyFnE*{qJhLcz~+M~Doc#S z?}DF(Mk=em|9=J0hANpMK;^fic^eI_sf`!nSmLQ*BG7HJU~h0K@T@_VH21ke)xlh& z|Bw&wIq@e^%brYgQyLnOJc9o=gEBolmX^fHve-g=C9}ZE9QPlfRymWz5aozW!Hyue ziUC#N>y7^ytuG7T;SihfPpi*g*)2`U3>ZqG7jdWzyUJo;$O1W%Q}FYU27#SN?l=5m zEEP${wpmZpGoboEVByiXa;>oE*-n+UnEb*U_PWbyCh%w zQ+OgxuM21xWM27-6Xmf?eRBQ~JqJ4hzXQ}+>o|olM_4GMj6 zERsQ9iF&DbDfJA&sJ}n|uMCwTQvmnGugsQSxk+hSHG73EsKqy-ql^}24B2Ez9@6wFwi^TT1=yHaNeT2merbv0 z+*y7mkfpoR8^^Hw#Oh5)^{!Yacyw}A$#sw`Fje|h`#O5E2Lo_O@-MMPusvxw!^VT9 zaWf4=iCfQ*z=ZR9jwxh*`M82pqvzt!uOIP81m4lq;6JoWld1u6C=F#vz2 z5KhIeht!UJCKz`YU#2r4gzc4VMW;d770mpm)N(+@kSfhA6>>J?f|d=LMPj=z*q8u_zn#&;#q(fK=>!V6T6-ICh8mTyMj5# z(7N#a1a2$7lHRglHF9gnO_%&6?0xE|$!FhiLwUf+JsSjJ4vlZieGecm1!lTzzLk7s z;^#EK1b2gaRatl;nET|@WpE~g(%}sQ^A7nV=$F(!!YZkxp8s0_s0?r`wjM++0rwZe z66ACS#$(@1jvp9bzTl zitVkQ|DAH$0su*J>D2ewVF0tK6^C#annhhne{3!`p59&HuY--IexIRVfp{?)VJf z>@!f+j>@vi_sR@<-;(@ph|A$uhwC2s_HydR*k0&N>Lsy%Q*)o+P@9O%5gSfXNj!_3 zlgqVJmg0Yeam#iFETnfdv4)ld*PL8QS>!ZB-oyWnzAy2W%mdFG;g-3?3F_bfMo*s4 z`{0?7!t1h36m|xn0P;(~ypZAF5Pu5JKzpJ}j)6PEpuTdYHjwMZLVQMvrKHz&!x>W8f8Ri~w&!UPqS60P{6NI%Abg5>h_Y$Sro_IPmKQp9aq+@ca&g zn9JTsKkV5nD`;KUKj_{c4QgQ!xlVu73Vk(p5I}&fG=Qp9G)E#>=oZ z7|;M*J@gNnmoexx`IW?p`2F!0Fz^PoQsh3uSCUHKTk!S4e@Nad{@|SIzyES^p3*## ztv>|p2bq#XXeDYVi5Eezhqwr_lA?l9ejd3{;&b#WIVJW1b^*L!lMBbrfWI_6pGkc& ze#dMYv)pZ-FU{GoIhzM#Uj?`peUH*RfG0w-7W{V*?IO2NPIH;K4eFIYz+IznKRoZU zTwi)#lKaKy^ks-un7tjq8JepTTt}yo{e;GH_#1F$^SkNkI#DhVRKPW*!m)xdPd zZ|f;r#tUvac_j;3K3e?E_)*Lp=jrv_|7(C=Fti>;B_E)L_;VT3nqifQvmi*6y22>A zORg1lB?U5c0K^;UD}pW~HxS-@a98MELtGL3R>A(RUjMlQAQ6HE=tg`cV?D;Q4&XY7 zc0rJYEiH{3AsNUi_AsmsegO61^d2Ifi|>`v)Ru$W&hT+0JHj!MTxV<)6KP3JEoL6SzoJ0%BU8J`)!+w{8D9lTA75OgMYCd^Y z%U%m%KlBp@z7O&L$_ZH{5Q0qnkutcn0Gklcr+>0fZ&T^nKy5dR7ZMjTxIK%df@?$m zOZ0&E`KKbu{S=i{XV5(wu1TDZUyAxPhSa0>j|XOHLfph>=sOH}jd&DxuUu7uS}ua^ z>x2DF796VH|L+R8Ji~qv^e4poh;1}nXW;9A>roplO(XI9P+Kebo#1cEvMQysfReU8 zxr1N^v&1Si6rQE%EUti=Eub{4t7AG#C=9M$D;0E>cpOUu#)u-Vw%|Eh86YM~84_Hh| zZ*nEj-^h<(xi~b3T5saTM)m(_ zvO&^9P6W;^9mu~egeuV!jFRQ_IKWnc=mxes_H9{K)msuPd4#Qqz5@O#b_Ccrz(v9{ zO3lqC_?hHGz{LRUV5{G-kBK$%r|~m{cn3|hS!Or(7|jpBJfOY}+*0(S&n1qe{ynOs z1@#;fNSw@LAXzVcOaY&un+bELq8#3mO(jSiqSI$tE3)wI5ijk zr*K>bUk0n>j4ag_{5^0Eaz)^%>A79mmgfMkQwW0~faDxCRGJmRc;drC@+-J#h^~Tt z0ZA~pH7sT)enPBdEcJ%ub5Zr()rppqepPRXUsO5BB;VKn=K@sHhb88tVGt>4hXU<3dKk~^V#$; zL^UB&@)}mBwij(L3r&OQRWScR?jrYtls->4uP+GiCo-$QSoiOLdO>kC7C<(Q z;;S?S5-YjFpy}ieqR)umAl}G;R@jbU?r`$s^o^1ss%M1wwOMMe@HD2sGd+V)k!;Im z0J#*DbfK^pvSb=ApijyD4e?@W=!{=S{6R9{BDm7{-?LB+c%I_>%fN$hDS1!q0D4=v zGdzgh*7N*hxlG{_AcMvp5Z!?2f;2tH&K7?T%Oo z-vVpOLfQ9dm@TJ$i$XU5g~T%fG=ZoT^_QquB02RH@?9b94sM$aQ1w}|WP5UJ#lHa7 zD?4#o5%*(G4LG-{``-{?F2hbhe97l>@A2`=LD&j?Dx``qLHrgF-Xxw6#}G&xL+(Hm zrTz}SlD*&tf+-;j?Pd99>ixech;z{n9-RBDNmCRHg!wF?3YBP1f#m=Cl@9=Ii0 ztk+D$dF~Cc32+6|_lW)@#G^S#EjVJ)lgwCw9tX1-%s?<|zU6NMC0|fDO~Z8=S{6WO z;{TP)Qdjx)T#erJKZCeG`Ss`ydh)QXskt%4C&Vv8zAbZNJ*8|*JBCyyp`+qgI!iSHAN)*gbL;gBjLN2Ckszkq>61Pw!FnljQ>vkGLmF{A8ep z-S598b#FqMEnUvKifpNRsbBb(9nbRp@+N9;<~7xdMr1jX>}j@$8nv=q4p)l3wll)g z#_mkCrzSa4lWoql43`=Uj16mBl=tPKk_ zGDd6RMvZu_jS=~~9$KzhY&}OaTkMc#ogGU8CMo*Vdk4-w6G$< z|7A6YPt@uL21Gh-!_$Tsvvakk=1;j=c91z^j&|4Tmtl80=P%JJnn&`q3jW5+MOvDX zw^-|9{_&I zQw!Bbn&WqCH;S0KhqMBJv)?i8WuUp}toG1q)W5*4cVE?lwXt)*{<*3V9j(4jR9ai~x`Z|uCRg&O+`wE*MKLan^XXS_Eo z8}+VzNP^Slu&1_88)t80&$7ijy_vd+q*`RAIGo+sVH~-!14pTEpZtRTaxGI ztMhW-E0|k4=&mp=(ulI_5gehLU7w3?E zD#%YW{>jnnGc#tQduFeR`typ+?72igSY-+Sb3m`|Z$^BhuPAFY&)35Z|3W>=I9RCfHpb@bwf!8a_PR#*OL|Y^%}aW5)4Z(z zqFKk;QjFOl)+)x+LUN0*>I;e%8`8{&wZk8Jls~& z(lVX4^t8+@`#58NLu;Kf_!+iDdrE>WF~u<|lZ)%jG@duKRts?!pSYEv;vR%%G0ecELd{At^8YwvrhCg4)n8@H!AhDMg+)>8QjMjX&led zqpaL5BPLrfYrLML?==n&wU#p0_O_NV8}_r74Ki|vSeqHSL#>UCoJ4D|d3cDmvSt)Z bvR0j+WG!iYJJedv=$>fxGozENqr?6KAZ!|G diff --git a/pod/locale/fr/LC_MESSAGES/django.po b/pod/locale/fr/LC_MESSAGES/django.po index 0eca8bd999..7f0f2ef9cc 100644 --- a/pod/locale/fr/LC_MESSAGES/django.po +++ b/pod/locale/fr/LC_MESSAGES/django.po @@ -5,9 +5,9 @@ msgid "" msgstr "" "Project-Id-Version: Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-17 09:34+0000\n" +"POT-Creation-Date: 2024-07-18 12:12+0000\n" "PO-Revision-Date: \n" -"Last-Translator: SebastienCozeDev \n" +"Last-Translator: obado \n" "Language-Team: Pod Team cotech-esup-pod@esup-portail.org\n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -1188,13 +1188,14 @@ msgstr "" #: pod/bbb/templates/bbb/live_publish_meeting.html msgid "" -"Please note: shortly after clicking the \"Perform a BigBlueButton live\" " -"button, the live stream will be available to users on the Lives page." +"Please note: shortly after clicking the “Perform a BigBlueButton live” " +"button, the live stream will be available to users on the  Lives page." msgstr "" -"Remarque : peu de temps après avoir cliqué sur le bouton \"Réaliser un " -"direct BigBlueButton\", le direct sera disponible pour les utilisateurs sur " -"la page Directs." +"Remarque : peu de temps après avoir cliqué sur le bouton « Réaliser un " +"direct BigBlueButton » le direct sera disponible pour les utilisateurs sur " +"la page  Directs." #: pod/bbb/templates/bbb/live_record_list.html msgid "Sorry, no BigBlueButton session in progress found" @@ -1646,11 +1647,11 @@ msgid "Please enter a name." msgstr "Veuillez entrer un nom." #: pod/completion/models.py -msgid "Please enter a name from 2 to 200 caracters." +msgid "Please enter a name from 2 to 200 characters." msgstr "Veuillez entrer un nom entre 2 et 200 caractères." #: pod/completion/models.py -msgid "You cannot enter a weblink with more than 200 caracters." +msgid "You cannot enter a weblink with more than 200 characters." msgstr "Vous ne pouvez pas entrer un lien web avec plus de 200 caractères." #: pod/completion/models.py @@ -2193,7 +2194,7 @@ msgstr "Liste des intervenants relatifs à cette vidéo." #: pod/completion/templates/video_completion.html msgid "" "You can add speakers to this video by searching by their last name, first " -"name or job. If you can't find the speaker, contact a super admin." +"name or job. If you can’t find the speaker, contact a super admin." msgstr "" "Vous pouvez ajouter des intervenants à cette vidéo en effectuant une " "recherche par leur nom, prénom ou fonction. Si vous ne trouvez pas " @@ -3093,8 +3094,8 @@ msgid "" "a>." msgstr "" "L’accès à l’ajout d’enregistrements externes a été limité. Si vous souhaitez " -"ajouter des enregistrements externes sur la plateforme, veuillez nous contacter." +"ajouter des enregistrements externes sur la plateforme, veuillez nous contacter." #: pod/import_video/templates/import_video/add_or_edit.html msgid "" @@ -3460,8 +3461,8 @@ msgid "" "This video was uploaded to Pod; its origin is %(type)s: %(url)s" msgstr "" -"Cette vidéo a été téléversée sur Pod ; son origine est %(type)s : %(url)s" +"Cette vidéo a été téléversée sur Pod ; son origine est %(type)s : %(url)s" #: pod/import_video/views.py msgid "" @@ -3475,8 +3476,8 @@ msgstr "" #: pod/import_video/views.py #, python-format msgid "" -"This video “%(name)s” was uploaded to Pod; its origin is %(type)s: %(url)s

%(desc)s" +"This video “%(name)s” was uploaded to Pod; its origin is %(type)s: %(url)s

%(desc)s" msgstr "" "Cette vidéo « %(name)s » a été téléversée sur Pod ; son origine est " "%(type)s : %(url)s

%(desc)s" @@ -3484,8 +3485,8 @@ msgstr "" #: pod/import_video/views.py #, python-format msgid "" -"This video “%(name)s” was uploaded to Pod; its origin is Youtube: %(url)s" +"This video “%(name)s” was uploaded to Pod; its origin is Youtube: %(url)s" msgstr "" "Cette vidéo « %(name)s » a été téléversée sur Pod ; son origine est " "Youtube : %(url)s" @@ -3762,8 +3763,7 @@ msgstr "" msgid "Main language" msgstr "Langue principale" -#: pod/live/models.py pod/recorder/models.py pod/video/forms.py -#: pod/video/models.py +#: pod/live/models.py pod/video/forms.py msgid "Select the main language used in the content." msgstr "Sélectionner la langue principalement utilisée dans ce contenu." @@ -3775,7 +3775,7 @@ msgstr "Diffuseurs" msgid "Is recording?" msgstr "Enregistrement en cours ?" -#: pod/live/models.py pod/video/models.py +#: pod/live/models.py msgid "" "Please choose a title as short and accurate as possible, reflecting the main " "subject / context of the content. (max length: 250 characters)" @@ -6513,11 +6513,11 @@ msgstr "" msgid "" "Shortly after clicking the “Start the webinar” button, the live stream will " "be available to users on the Lives page." +"hidden='true'>
Lives page." msgstr "" "Peu de temps après avoir cliqué sur le bouton « Démarrer le webinaire », le " "direct sera disponible pour les utilisateurs sur la page Directs." +"broadcast mx-1' aria-hidden='true'>
Directs." #: pod/meeting/templates/meeting/filter_aside_meeting.html msgid "" @@ -6682,7 +6682,7 @@ msgstr "S’authentifier" #: pod/meeting/templates/meeting/link_meeting.html #: pod/video/templates/videos/link_video.html msgid "More options" -msgstr "Plus d'options" +msgstr "Plus d’options" #: pod/meeting/templates/meeting/link_meeting_dropdown_menu.html msgid "Copy the direct join link" @@ -6928,16 +6928,16 @@ msgid "" msgstr "" "\n" "

Bonjour,\n" -"

%(owner)s vous invite à une réunion récurrente " -"%(meeting_title)s.

\n" +"

%(owner)s vous invite à une réunion récurrente " +"%(meeting_title)s.

\n" "

Date de début : %(start_date_time)s

\n" "

Récurrent jusqu’à la date : %(end_date)s

\n" "

La réunion se tiendra tou(te)s les %(frequency)s %(recurrence)s \n" "

Voici le lien pour rejoindre la réunion :\n" " %(join_link)s

\n" -"

Vous avez besoin de ce mot de passe pour entrer : " -"%(password)s

\n" +"

Vous avez besoin de ce mot de passe pour entrer : " +"%(password)s

\n" "

Cordialement

\n" " " @@ -6946,8 +6946,8 @@ msgstr "" msgid "" "\n" "

Hello,

\n" -"

%(owner)s invites you to the meeting " -"%(meeting_title)s.

\n" +"

%(owner)s invites you to the meeting " +"%(meeting_title)s.

\n" "

here the link to join the meeting:\n" " %(join_link)s

\n" "

You need this password to enter: %(password)s.

\n" "

Voici le lien pour rejoindre la réunion :\n" " %(join_link)s

\n" -"

Vous avez besoin de ce mot de passe pour entrer : " -"%(password)s

\n" +"

Vous avez besoin de ce mot de passe pour entrer : " +"%(password)s

\n" "

Cordialement

\n" " " @@ -6971,8 +6971,8 @@ msgstr "" msgid "" "\n" "

Hello,

\n" -"

%(owner)s invites you to the meeting " -"%(meeting_title)s.

\n" +"

%(owner)s invites you to the meeting " +"%(meeting_title)s.

\n" "

Start date: %(start_date_time)s

\n" "

End date: %(end_date)s

\n" "

here the link to join the meeting:\n" @@ -6990,8 +6990,8 @@ msgstr "" "

Date de fin : %(end_date)s

\n" "

Voici le lien pour rejoindre la réunion :\n" " %(join_link)s

\n" -"

Vous avez besoin de ce mot de passe pour entrer : " -"%(password)s

\n" +"

Vous avez besoin de ce mot de passe pour entrer : " +"%(password)s

\n" "

Cordialement

\n" " " @@ -8148,7 +8148,7 @@ msgid "" "list of options. This is useful for questions with a clear, correct answer." msgstr "" "Les questions à choix unique demandent aux participants de sélectionner une " -"réponse parmi une liste d'options. Elles sont utiles pour les questions dont " +"réponse parmi une liste d’options. Elles sont utiles pour les questions dont " "la réponse est claire et correcte." #: pod/quiz/templates/quiz/question_help_aside.html @@ -8156,7 +8156,7 @@ msgid "" "For single choice questions, select only one answer from the provided " "options. Read each option carefully before making your selection." msgstr "" -"Pour les questions à choix unique, ne sélectionnez qu'une seule réponse " +"Pour les questions à choix unique, ne sélectionnez qu’une seule réponse " "parmi les options proposées. Lisez attentivement chaque option avant de " "faire votre choix." @@ -8175,7 +8175,7 @@ msgid "" "more than one correct answer." msgstr "" "Pour les questions à choix multiples, sélectionnez toutes les réponses qui " -"s'appliquent. Il peut y avoir plus d'une réponse correcte." +"s’appliquent. Il peut y avoir plus d’une réponse correcte." #: pod/quiz/templates/quiz/video_quiz.html msgid "This quiz is in draft." @@ -8399,7 +8399,7 @@ msgstr "" #: pod/recorder/models.py msgid "Automatic publishing:" -msgstr "Publication automatique :" +msgstr "Publication automatique :" #: pod/recorder/models.py msgid "" @@ -8407,7 +8407,7 @@ msgid "" "recorder manager." msgstr "" "Si vous cochez cette case les vidéos seront automatiquement attribuées au " -"gestionnaire de l'enregistreur." +"gestionnaire de l’enregistreur." #: pod/recorder/models.py msgid "Video type by default." @@ -8430,8 +8430,8 @@ msgstr "" "utilisateurs authentifiés." #: pod/recorder/models.py pod/video/models.py -msgid "Select one or more groups who can access to this video" -msgstr "Sélectionner un ou plusieurs groupes qui auront accès à cette vidéo" +msgid "One or more groups who can access to this video" +msgstr "Un ou plusieurs groupes qui auront accès à cette vidéo" #: pod/recorder/models.py pod/video/models.py msgid "Viewing this video will not be possible without this password." @@ -8448,6 +8448,10 @@ msgid "Select an university course as audience target of the content." msgstr "" "Sélectionner un cursus universitaire qui convient à l’audience de ce contenu." +#: pod/recorder/models.py pod/video/models.py +msgid "The main language used in the content." +msgstr "La langue principalement utilisée dans ce contenu." + #: pod/recorder/models.py pod/video/forms.py pod/video/models.py #: pod/video/templates/videos/add_video.html #: pod/video/templates/videos/dashboard.html @@ -8466,11 +8470,19 @@ msgstr "" "Séparer les mots clés par des espaces, écrire les mots clés en plusieurs " "mots entre guillemets." +#: pod/recorder/models.py pod/video/models.py +msgid "The disciplines to which your content belongs." +msgstr "Les disciplines auxquelles appartient votre contenu." + #: pod/recorder/models.py pod/video/forms.py pod/video/models.py #: pod/video/templates/videos/dashboard.html msgid "Licence" msgstr "Licence" +#: pod/recorder/models.py pod/video/models.py +msgid "Usage rights granted to your content." +msgstr "Droits d’utilisation de votre contenu." + #: pod/recorder/models.py pod/video/forms.py pod/video/models.py msgid "Themes" msgstr "Thèmes" @@ -8505,7 +8517,7 @@ msgstr "" msgid "Disable comment" msgstr "Désactiver les commentaires" -#: pod/recorder/models.py pod/video/models.py +#: pod/recorder/models.py msgid "Allows you to turn off all comments on this video." msgstr "Vous permet de désactiver les commentaires sur cette vidéo." @@ -8623,8 +8635,8 @@ msgstr "Prévisualisation d’enregistrement" #: pod/video/templates/videos/video-element.html msgid "" "To view this video please enable JavaScript, and consider upgrading to a web " -"browser that supports HTML5 video" +"browser that supports HTML5 video" msgstr "" "Pour visionner cette vidéo, veuillez activer JavaScript et envisager de " "passer à un navigateur Web qui Bonjour,
un nouvel enregistrement a été ajouté sur la plateforme " "%(title_site)s à partir de l’enregistreur « %(recorder)s ».
Pour " -"l’attribuer, cliquez sur le lien ci-dessous.

" -"%(link_url)s
Si le lien n’est pas actif, il faut le copier-coller " -"dans la barre d’adresse de votre navigateur.

Cordialement.

" +"l’attribuer, cliquez sur le lien ci-dessous.

%(link_url)s
Si le lien n’est pas actif, il " +"faut le copier-coller dans la barre d’adresse de votre navigateur.

Cordialement.

" #: pod/recorder/views.py msgid "New recording added." @@ -8740,7 +8753,7 @@ msgid "Speakers" msgstr "Intervenants" #: pod/speaker/models.py -msgid "Speaker's job" +msgid "Speaker’s job" msgstr "Fonction de l’intervenant" #: pod/speaker/templates/speaker/list_speaker.html @@ -8917,11 +8930,11 @@ msgstr "" msgid "" "In this field you can select and add additional owners to the video. These " "additional owners will have the same rights as you except that they can’t " -"delete this video." +"delete this media." msgstr "" "Dans ce champ, vous pouvez sélectionner et ajouter des propriétaires " "supplémentaires à la vidéo. Ces autres propriétaires auront les mêmes droits " -"que vous sauf qu’ils ne peuvent pas supprimer cette vidéo." +"que vous sauf qu’ils ne peuvent pas supprimer ce contenu." #: pod/video/forms.py pod/video/templates/videos/dashboard.html msgid "Date of the event field" @@ -9001,12 +9014,11 @@ msgstr "" #: pod/video/forms.py msgid "" -"If the channel or Themes you wish does not appear in the list, please select " +"If the channel or theme you wish does not appear in the list, please select " "nothing and contact us to explain your needs." msgstr "" -"Si une chaîne ou des thèmes que vous ne voulez pas voir apparaître dans la " -"liste, veuillez ne rien sélectionner et contactez nous pour expliquer vos " -"besoins." +"Si une chaîne ou des thèmes que vous voulez n’apparaît pas dans la liste, " +"veuillez ne rien sélectionner et contactez-nous pour expliquer vos besoins." #: pod/video/forms.py msgid "Visibility" @@ -9021,8 +9033,8 @@ msgid "" "In “Draft / Private” mode, the content shows nowhere and nobody else but you " "can see it." msgstr "" -"En mode “Brouillon / Privé“, le contenu n'apparaît nulle part et personne " -"d'autre que vous ne peut le voir. Vous pouvez ajouter des jetons pour " +"En mode “Brouillon / Privé“, le contenu n’apparaît nulle part et personne " +"d’autre que vous ne peut le voir. Vous pouvez ajouter des jetons pour " "permettre un accès direct par lien." #: pod/video/forms.py @@ -9117,6 +9129,12 @@ msgstr "Les utilisateurs peuvent uniquement ajouter des vidéos à cette chaîne msgid "Draft / Private" msgstr "Brouillon / Privé" +#: pod/video/forms.py +msgid "Who can see your content (everyone, just you, or those granted)." +msgstr "" +"Qui peut voir votre contenu (tout le monde, juste vous ou des personnes " +"autorisées)." + #: pod/video/forms.py msgid "Source file" msgstr "Fichier source" @@ -9214,8 +9232,8 @@ msgid "" "%(url)s

\n" msgstr "" "vous pouvez changer la date de suppression en éditant votre vidéo :

\n" -"

" -"%(scheme)s:%(url)s

\n" +"

%(scheme)s:%(url)s

\n" "\n" #: pod/video/management/commands/check_obsolete_videos.py @@ -9416,10 +9434,9 @@ msgstr "" "Si coché, la chaîne apparaîtra dans la liste des chaînes de la plateforme." #: pod/video/models.py -msgid "Select one or more groups who can upload video to this channel." +msgid "One or more groups who can upload video to this channel." msgstr "" -"Sélectionner un ou plusieurs groupes qui pourront ajouter des vidéos à cette " -"chaine." +"Un ou plusieurs groupes qui pourront ajouter des vidéos à cette chaîne." #: pod/video/models.py msgid "Additionals channels tab" @@ -9447,21 +9464,41 @@ msgid "Icon" msgstr "Icône" #: pod/video/models.py -msgid "Select the general type of the video." -msgstr "Sélectionnez le type général de la vidéo." +msgid "" +"A title as short and accurate as possible, reflecting the main subject / " +"context of the content. (max length: 250 characters)" +msgstr "" +"Un titre aussi court et précis que possible, reflétant le sujet principal / " +"le contexte de ce contenu. (taille maximale : 250 caractères)" + +#: pod/video/models.py +msgid "The general type of the video." +msgstr "Le type général de la vidéo." #: pod/video/models.py msgid "" -"You can add additional owners to the video. They will have the same rights " -"as you except that they can’t delete this video." +"Additional owners will have the same rights as you, except that they can’t " +"delete this media." msgstr "" -"Vous pouvez ajouter des propriétaires additionnels à la vidéo. Ils auront " -"les mêmes droits que vous sauf qu’ils ne peuvent pas supprimer cette vidéo." +"Les propriétaires additionnels auront les mêmes droits que vous, sauf qu’ils " +"ne peuvent pas supprimer ce contenu." + +#: pod/video/models.py +msgid "" +"Describe your content, add all needed related information, and format the " +"result using the toolbar." +msgstr "" +"Décrivez votre contenu, ajoutez toutes les informations nécessaires, et " +"mettez en forme le résultat en utilisant la barre d’outils." #: pod/video/models.py pod/video/templates/videos/video_sort_select.html msgid "Date of event" msgstr "Date de l’évènement" +#: pod/video/models.py +msgid "The channel where you want your content to appear." +msgstr "La chaîne où vous voulez que votre contenu apparaisse." + #: pod/video/models.py msgid "Overview" msgstr "Vue d’ensemble" @@ -9474,6 +9511,14 @@ msgstr "Est une vidéo" msgid "Date to delete" msgstr "Date de suppression" +#: pod/video/models.py +msgid "Date when your video will be automatically removed from Pod." +msgstr "Date à laquelle votre vidéo sera automatiquement retirée de Pod." + +#: pod/video/models.py +msgid "Prevent users from commenting on your content." +msgstr "Empêche les utilisateurs de commenter votre contenu." + #: pod/video/models.py msgid "Sum of view" msgstr "Somme des vues" @@ -9913,6 +9958,10 @@ msgstr "Contenu audio." msgid "Select video “%(video_title)s”" msgstr "Sélectionner la vidéo « %(video_title)s »" +#: pod/video/templates/videos/card_select.html +msgid "Video duration" +msgstr "Durée de la vidéo" + #: pod/video/templates/videos/category_modal.html msgid "Check the videos to add in the category" msgstr "Cocher les vidéos à ajouter dans la catégorie" @@ -9960,15 +10009,15 @@ msgstr "Actions multiples" #: pod/video/templates/videos/dashboard.html msgid "" -"To edit several videos at the same time, you can select the ones you want by " -"clicking on them then select an action to perform using the drop-down menu " -"below, finally apply the modification. You can also refine your video search " -"using the filters in the right menu." +"To edit several videos at the same time, you can check the ones you want " +"then select an action to perform using the drop-down menu below, finally " +"apply the modification. You can also refine your video search using the " +"filters in the right menu." msgstr "" -"Vous pouvez éditer plusieurs vidéos en même temps, pour cela cliquez sur " -"celles que vous voulez modifier, sélectionnez une action à effectuer dans le " -"formulaire ci-dessous puis appliquer. Vous pouvez également affiner le " -"résultat de la recherche grâce aux filtres dans le menu de droite." +"Pour éditer plusieurs vidéos en même temps, vous pouvez cocher celles que " +"vous voulez modifier, puis sélectionner une action à effectuer dans le " +"formulaire ci-dessous puis appliquer. Vous pouvez également affiner votre " +"recherche de vidéos en utilisant les filtres du menu de droite." #: pod/video/templates/videos/dashboard.html msgid "Choose an action" @@ -10034,10 +10083,10 @@ msgstr "Mode d’affichage par liste" #: pod/video/templates/videos/filter_aside.html msgid "" "The videos on the left are automatically sorted according to the filters " -"selected. Check options to adjust results." +"selected below. Check options to adjust results." msgstr "" "Les vidéos à gauche sont automatiquement triées en fonction des filtres " -"sélectionnés. Vérifiez les options pour ajuster les résultats." +"sélectionnés ci-dessous. Vérifiez les options pour ajuster les résultats." #: pod/video/templates/videos/filter_aside.html msgid "Filter by user" @@ -10130,8 +10179,8 @@ msgid "" "This video is chaptered. Click the chapter button on the video player to view them." msgstr "" -"Cette vidéo est chapitrée. Cliquez sur le bouton de chapitre sur le lecteur vidéo pour les voir." +"Cette vidéo est chapitrée. Cliquez sur le bouton de chapitre sur le lecteur vidéo pour les voir." #: pod/video/templates/videos/video-all-info.html msgid "Other versions" @@ -10254,7 +10303,7 @@ msgstr "Lien du contributeur" #: pod/video/templates/videos/video-info.html msgid "Speaker(s):" -msgstr "Intervenant(s) :" +msgstr "Intervenant(s) :" #: pod/video/templates/videos/video-info.html msgid "Updated on:" @@ -10803,21 +10852,21 @@ msgid "You cannot edit this video." msgstr "Vous ne pouvez pas éditer cette vidéo." #: pod/video/views.py -msgid "The video has been deleted." -msgstr "La vidéo a été supprimée." +msgid "The media has been deleted." +msgstr "Le contenu a été supprimé." #: pod/video/views.py #, python-format -msgid "Deleting the video \"%(vtitle)s\"" -msgstr "Supprimer la vidéo « %(vtitle)s »" +msgid "Deleting the media \"%(vtitle)s\"" +msgstr "Supprimer le média « %(vtitle)s »" #: pod/video/views.py -msgid "You cannot delete this video." -msgstr "Vous ne pouvez pas supprimer cette vidéo." +msgid "You cannot delete this media." +msgstr "Vous ne pouvez pas supprimer ce contenu." #: pod/video/views.py -msgid "You cannot delete a video that is being encoded." -msgstr "Vous ne pouvez pas supprimer une vidéo en cours d’encodage." +msgid "You cannot delete a media that is being encoded." +msgstr "Vous ne pouvez pas supprimer un contenu en cours d’encodage." #: pod/video/views.py #, python-format @@ -11182,6 +11231,12 @@ msgstr "Résultats de la recherche" msgid "Esup-Pod xAPI" msgstr "xAPI Esup-Pod" +#~ msgid "The video has been deleted." +#~ msgstr "La vidéo a été supprimée." + +#~ msgid "You cannot delete this video." +#~ msgstr "Vous ne pouvez pas supprimer cette vidéo." + #~ msgid "Long answer" #~ msgstr "Réponse longue" diff --git a/pod/locale/fr/LC_MESSAGES/djangojs.mo b/pod/locale/fr/LC_MESSAGES/djangojs.mo index 50aa0419ad3ad018e5913b613736a5571400ad00..d8994a80afaa56ef609f48ff9a430fd93eee5cec 100644 GIT binary patch delta 4702 zcmYk<3slzi9mnx6$sHlCa#MK}Q4qu{Xn8{fA$6!ArPku2G08j0)RH~cjA-V{k=d4F zQkuDD7BPitH607voLLK*Q@69@C0A{yc}~_k%e_C(|Ia!7&+~a+zu%wd`Tc+Y-{t@4 zj#j^et$yB%(f&J)qn8XM=L5~s{LFTT>#W(BXfuBti^DJ%J$N@};bt6%FJmR1#{oDs z#_R!Hh}N542TiWY(DQ!45LV=)zrQ5{%` z>9`l8up7tVIaEi(_)-Q=!X&K5K(22M6oNRh6-VI{n2VjLo_>MZm>O?35=&7HHlRL# z$h8+Es0SuE#^E69!;nF>d}MI!4jhX2=sedqFNH8{MBVYvkeBV{O?Pq(gYkV-Lmy!% zoGkNF0xv;sU%CtI*5n*g6X3_!y4B3#dB@V4T!}Sk#>k zM@_{-)Kt}?Mr0N0bI+n0K7_i%PSlNEKuygxREMLJ&2-(&WX7L$VKX?Po|U79x(KtIzz_^#Uew{JL5#nKGL;h( zF&j&<2KlUYpjLek^0IGu(-#w2vFbo3YNQHKi?a+h)KzZ14%N;U)S}*lYVQP&#!tNN z2NF`8p68(Ea4zajD^Me`12qzDsF65}YUsbX98)}W8klQ_ zQM<$YBn1uKyGUF132Lr`xr*jG7d0hwP#t&>b>}U}GO?qsXHXaT6t$az`LGsWBx=Os zQ6rOq8u8nasrOnT1+Cu2?guJRi(@UShmEMYJc_#TTd3XeG16DNh#CpKX_2L&?z{y3 zaXo5RZE|gNZAO3X|K};_g8NZ-{wC^Tx)Zfcdi)$&roY?&~T?-?%IeRu5U*vXlQzI5?;eP9Ll^rggcR)V^Q4RILyMySb@d(92Vjw z;MtEvkbUie0D% zKR|Wt3WnfK*AV7UHxPq5f4ge|X85rt(4X@gnLlRN8nPLG7Ob^$LLKPB8TbuW;#4*% zJJee6S$rGk;GIlt5w_w?{3kBPZ1${fs0pm^*|KTw`TH@NdL2gLqsTI_T^NJMQ620- z)|}V=P9cmFS5T|PS9n z%`8Ms@hVKz{(qH1KTe!PUUrH%ExJHfqB@X@YG@Mn$EB!MycV@~+R%eNsAu{O<_AP>kw%HL@P< z5oDuSJLcgf%)qqi&Tq;*RJ$9Hm$mT5`m~Fv4n^lN{%R;c&w2FLV?Fg3a2+Pja2ni( z41%?zo?u_#5R7Adc{ticr0-UN^uhL^_V;;I`+n?E-M|FY-%Bt7x6kxCLvnxWOym=J#qfvxf-D^=FXh6;FHdF^Xk?-1NybZI8S#Vf`n$u3yi2Vz-hLZ1ahCUm2 zQm?`eynz~#*Jk_L^V%5-oU?>EJXWz9@4^n`scKPkosq~#&EWX#`;R~Fp zNkTvBuMiy?6&**K_l3uJH&Qx9(ntl-F_dgk!9BEMy2wXvz0CCl{*L^TXbd%Rnwxb* zlcw=jPx=ncQ#sM?&LOwxfv(k|Ba`g%mH0VBo^sYi7+!mk940>`ONow&q*4Wrd&sL~ zAqgV2yg+ivpNNjL4%UKq67Nj+L zenI+(%%) zdCRTO#b1#RNSk{u4tZAij%B=uX;}`W&`rjZS!55<5l!a%O3uGf54vSBoiu!>ewuO& zIZmob2^m7xkap5Z9waA8Au&%;ezv8hFJ03%GP*3VUrp`Gw)F`E;v&~nS1nuPnWFc+ c`qi~d+g=~l6&!S*r>1u4^4hi)xd)Q|56G0~7ytkO delta 4698 zcmYk;3slzi9mnx6fq)>0Ttr0dp%5QJP$&hwBo|Eu$%*N-r2|cpi!v28FWaNb%Uq@v zb15n{bZX^XNs^k&dCLou&Pvaz%`V&NxUK0r$7l=n?ET^Yr?dZgKF{m-`#;bB_y7HW zmk0JX`n}NT=ergeu-Q1Sl0M|aK(l^+W*fqE*31)W7J!MEgvsc^A{>C#n2B4l6fa;; zOp7vGh@&tU54rvqGpG-ZHXCNcA7|#ZA})58)s@kLqYUrl6PJ^~MqmY)Z1LU^fF7J9*qpDWg>%PId~tA*Lm)5H5Bxui;KF>>O`h@C#JK*HI(Yj{1H?9Kl%B)OxWyjz$KU%3t4R1s}Sp$aRanzKwB7L$p)Q!8xGn&{hp7B@DayX$Oo`Q+E z1~s>PPz|=Ars4*wArBW##2i$|pG9WLnox`NJgNg1Q62jPyW&4l9sUM2l0gZKe-?#E zCaMGrkbU+R1YgrbGZ$5<5y6-;V{xiJAoRBzo8acS1Nk) zOw@H#QM+ooYo+TF4B-4~jM4sIPeD)qGU|z2F%@s4dhDfDdTI}%KF>idt~sb1)S`C7 zDx@#A5A^_-P;1LC*{SEaR-%XV+c1Lr+ffSH*oq4D)!^scG$Op|v;v{?+>rhj188t<>P)~dZhhoq}W{+S#s=gkF z;3-u5?XJEIYHIK))E9SS7=Di7coWt0yQnAYLn|?ugv^!=MV&9l9ykw~c3X*2_&Ta% z$53nS9ERdWWRd#p6AFQxXv1i{<9uL|>>XX0hH5AawYrN?9h;Bp*h(zJ2GotUmDG_` z)LI#Vn%XI--LM7y@c?FP|2I?6V!MgzKsQ#R8cM`&I3Bfnr=b?jcJ$ye)NlD`$jc%a zK7FqcJ@_2P;eOQGIE!QPI`VhSGMM+7+~0~RFuL{zsv}>bR;&MTXQ+ZPl6o|%gZ)tr z567N31*hU%T#oOdI+j1e>F@&dP~VLDelu#fw4zT9-=d%)3t}O}VjSuQ8K|BYA?whp zkPTuDn2W8Lg5e{bKPK6zhD(u`t>caLXlGCzYDcw`n(O@H&d6o_7ja?(C+6clOq3d| zMFzndP`_LsV9dVR`e18O`}#EM2LC`kKmvPIpJ!n&T#WbOCQQHs1wQ8q zFL8q34*NH1J0-9ewW^a*7pA+8L9PB$x4sy)NH@9lt#~i>1ITi+%c#{JI@)=FSk(7( zP>Z?1MYHHfBI|j3V{98i~~L&K#CvAL`3c9eWA&dvF3n z@d|dqFHqNA$5c!xcDC6#)c0oN5S)(#a4#ln|9?b5tNu1>h@&5Mo+t@*VHRo%3XryK zGHL`GF%7REJI(?oIDZrJ@F4Xy*cXTWz-i}k^iVIyWL$?`b>V&rA$SP2dQW0EY{M}0 zpU80G>qLiEwvOM|y%`qeTjEqYmeUNktToP)eSc`hoFbRqGbOGk@FaPSXbgWvm{0o& z(WGg-)sxPH3A4wDR#qXoN4L>B*P%iGbw`Q+5>cz>0@0Z5B)=ot>@$fDO~#KqN@hR8 z{X{D)h|D47q?zb=k!&FMtHRNnRFHLg%$IeBV++yJ>pV2bv&m|bL9~(IAny@PxQ?F@ zhS`3r3dai$_NJ>B1KqO7CFfOek5{?BttTr zr^p)e44F%GtR-4Gn@A%WOj?PKD-N~;Clg=3d*TpoBh$%;?zwdICmTtKd#=Xy5m&L7 zJnPn<#6OXD-MUt2=TS*Pd-a#(r)0jCz|^|Dh*;k$s;`i@N#_wwVL@jF50Y9^K(><3 zW29Rc;5rBgl4Il-M4RA`WCW=uSBZAuIpQH4g&pr7@ct3WB7Y!BjhloIFl+ z1dxYF6^S7I$q?NlbArve>Ps;5c%`t(RdPdB?36 z;XZPa9B|LY;G=GN7KUn9^`UTvWRlTjJJAtICUlheDa1W)Sv*Wu{9pZj%2DJvDJ8`u zk<24+k;7yuIZH+n^Nh()w|?GPHBCb!Cj~Zb?G+Z|&09Km_JWF8g=JNq;bl%ay|S#T hW@gQjg;f=~i{@1\n" +"Last-Translator: obado \n" "Language-Team: \n" "Language: fr\n" "MIME-Version: 1.0\n" @@ -561,8 +561,6 @@ msgid "Change image" msgstr "Changer d’image" #: pod/podfile/static/podfile/js/filewidget.js -#, fuzzy -#| msgid "Change" msgid "Change file" msgstr "Changer de fichier" diff --git a/pod/locale/nl/LC_MESSAGES/django.po b/pod/locale/nl/LC_MESSAGES/django.po index 0c9cb692b5..35fa43c697 100644 --- a/pod/locale/nl/LC_MESSAGES/django.po +++ b/pod/locale/nl/LC_MESSAGES/django.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-17 09:34+0000\n" +"POT-Creation-Date: 2024-07-18 12:12+0000\n" "PO-Revision-Date: 2024-07-04 17:54+0200\n" "Last-Translator: obado \n" "Language-Team: \n" @@ -1123,9 +1123,9 @@ msgstr "" #: pod/bbb/templates/bbb/live_publish_meeting.html msgid "" -"Please note: shortly after clicking the \"Perform a BigBlueButton live\" " -"button, the live stream will be available to users on the Lives page." +"Please note: shortly after clicking the “Perform a BigBlueButton live” " +"button, the live stream will be available to users on the  Lives page." msgstr "" #: pod/bbb/templates/bbb/live_record_list.html @@ -1561,11 +1561,11 @@ msgid "Please enter a name." msgstr "" #: pod/completion/models.py -msgid "Please enter a name from 2 to 200 caracters." +msgid "Please enter a name from 2 to 200 characters." msgstr "" #: pod/completion/models.py -msgid "You cannot enter a weblink with more than 200 caracters." +msgid "You cannot enter a weblink with more than 200 characters." msgstr "" #: pod/completion/models.py @@ -2099,7 +2099,7 @@ msgstr "" #: pod/completion/templates/video_completion.html msgid "" "You can add speakers to this video by searching by their last name, first " -"name or job. If you can't find the speaker, contact a super admin." +"name or job. If you can’t find the speaker, contact a super admin." msgstr "" #: pod/completion/templates/video_completion.html @@ -3256,15 +3256,15 @@ msgstr "" #: pod/import_video/views.py #, python-format msgid "" -"This video “%(name)s” was uploaded to Pod; its origin is %(type)s: %(url)s

%(desc)s" +"This video “%(name)s” was uploaded to Pod; its origin is %(type)s: %(url)s

%(desc)s" msgstr "" #: pod/import_video/views.py #, python-format msgid "" -"This video “%(name)s” was uploaded to Pod; its origin is Youtube: %(url)s" +"This video “%(name)s” was uploaded to Pod; its origin is Youtube: %(url)s" msgstr "" #: pod/import_video/views.py @@ -3517,8 +3517,7 @@ msgstr "" msgid "Main language" msgstr "" -#: pod/live/models.py pod/recorder/models.py pod/video/forms.py -#: pod/video/models.py +#: pod/live/models.py pod/video/forms.py msgid "Select the main language used in the content." msgstr "" @@ -3530,7 +3529,7 @@ msgstr "" msgid "Is recording?" msgstr "" -#: pod/live/models.py pod/video/models.py +#: pod/live/models.py msgid "" "Please choose a title as short and accurate as possible, reflecting the main " "subject / context of the content. (max length: 250 characters)" @@ -6143,7 +6142,7 @@ msgstr "" msgid "" "Shortly after clicking the “Start the webinar” button, the live stream will " "be available to users on the Lives page." +"hidden='true'> Lives page." msgstr "" #: pod/meeting/templates/meeting/filter_aside_meeting.html @@ -6522,8 +6521,8 @@ msgstr "" msgid "" "\n" "

Hello,

\n" -"

%(owner)s invites you to the meeting " -"%(meeting_title)s.

\n" +"

%(owner)s invites you to the meeting " +"%(meeting_title)s.

\n" "

here the link to join the meeting:\n" " %(join_link)s

\n" "

You need this password to enter: %(password)sHello,

\n" -"

%(owner)s invites you to the meeting " -"%(meeting_title)s.

\n" +"

%(owner)s invites you to the meeting " +"%(meeting_title)s.

\n" "

Start date: %(start_date_time)s

\n" "

End date: %(end_date)s

\n" "

here the link to join the meeting:\n" @@ -7880,7 +7879,7 @@ msgid "" msgstr "" #: pod/recorder/models.py pod/video/models.py -msgid "Select one or more groups who can access to this video" +msgid "One or more groups who can access to this video" msgstr "" #: pod/recorder/models.py pod/video/models.py @@ -7897,6 +7896,10 @@ msgstr "" msgid "Select an university course as audience target of the content." msgstr "" +#: pod/recorder/models.py pod/video/models.py +msgid "The main language used in the content." +msgstr "" + #: pod/recorder/models.py pod/video/forms.py pod/video/models.py #: pod/video/templates/videos/add_video.html #: pod/video/templates/videos/dashboard.html @@ -7913,11 +7916,19 @@ msgid "" "quotation marks." msgstr "" +#: pod/recorder/models.py pod/video/models.py +msgid "The disciplines to which your content belongs." +msgstr "" + #: pod/recorder/models.py pod/video/forms.py pod/video/models.py #: pod/video/templates/videos/dashboard.html msgid "Licence" msgstr "" +#: pod/recorder/models.py pod/video/models.py +msgid "Usage rights granted to your content." +msgstr "" + #: pod/recorder/models.py pod/video/forms.py pod/video/models.py msgid "Themes" msgstr "" @@ -7947,7 +7958,7 @@ msgstr "" msgid "Disable comment" msgstr "" -#: pod/recorder/models.py pod/video/models.py +#: pod/recorder/models.py msgid "Allows you to turn off all comments on this video." msgstr "" @@ -8062,8 +8073,8 @@ msgstr "" #: pod/video/templates/videos/video-element.html msgid "" "To view this video please enable JavaScript, and consider upgrading to a web " -"browser that supports HTML5 video" +"browser that supports HTML5 video" msgstr "" #: pod/recorder/templates/recorder/link_record.html @@ -8166,7 +8177,7 @@ msgid "Speakers" msgstr "" #: pod/speaker/models.py -msgid "Speaker's job" +msgid "Speaker’s job" msgstr "" #: pod/speaker/templates/speaker/list_speaker.html @@ -8335,7 +8346,7 @@ msgstr "" msgid "" "In this field you can select and add additional owners to the video. These " "additional owners will have the same rights as you except that they can’t " -"delete this video." +"delete this media." msgstr "" #: pod/video/forms.py pod/video/templates/videos/dashboard.html @@ -8400,7 +8411,7 @@ msgstr "" #: pod/video/forms.py msgid "" -"If the channel or Themes you wish does not appear in the list, please select " +"If the channel or theme you wish does not appear in the list, please select " "nothing and contact us to explain your needs." msgstr "" @@ -8491,6 +8502,10 @@ msgstr "" msgid "Draft / Private" msgstr "" +#: pod/video/forms.py +msgid "Who can see your content (everyone, just you, or those granted)." +msgstr "" + #: pod/video/forms.py msgid "Source file" msgstr "" @@ -8753,7 +8768,7 @@ msgid "" msgstr "" #: pod/video/models.py -msgid "Select one or more groups who can upload video to this channel." +msgid "One or more groups who can upload video to this channel." msgstr "" #: pod/video/models.py @@ -8781,19 +8796,35 @@ msgid "Icon" msgstr "" #: pod/video/models.py -msgid "Select the general type of the video." +msgid "" +"A title as short and accurate as possible, reflecting the main subject / " +"context of the content. (max length: 250 characters)" +msgstr "" + +#: pod/video/models.py +msgid "The general type of the video." +msgstr "" + +#: pod/video/models.py +msgid "" +"Additional owners will have the same rights as you, except that they can’t " +"delete this media." msgstr "" #: pod/video/models.py msgid "" -"You can add additional owners to the video. They will have the same rights " -"as you except that they can’t delete this video." +"Describe your content, add all needed related information, and format the " +"result using the toolbar." msgstr "" #: pod/video/models.py pod/video/templates/videos/video_sort_select.html msgid "Date of event" msgstr "" +#: pod/video/models.py +msgid "The channel where you want your content to appear." +msgstr "" + #: pod/video/models.py msgid "Overview" msgstr "" @@ -8806,6 +8837,14 @@ msgstr "" msgid "Date to delete" msgstr "" +#: pod/video/models.py +msgid "Date when your video will be automatically removed from Pod." +msgstr "" + +#: pod/video/models.py +msgid "Prevent users from commenting on your content." +msgstr "" + #: pod/video/models.py msgid "Sum of view" msgstr "" @@ -9228,6 +9267,10 @@ msgstr "" msgid "Select video “%(video_title)s”" msgstr "" +#: pod/video/templates/videos/card_select.html +msgid "Video duration" +msgstr "" + #: pod/video/templates/videos/category_modal.html msgid "Check the videos to add in the category" msgstr "" @@ -9275,10 +9318,10 @@ msgstr "" #: pod/video/templates/videos/dashboard.html msgid "" -"To edit several videos at the same time, you can select the ones you want by " -"clicking on them then select an action to perform using the drop-down menu " -"below, finally apply the modification. You can also refine your video search " -"using the filters in the right menu." +"To edit several videos at the same time, you can check the ones you want " +"then select an action to perform using the drop-down menu below, finally " +"apply the modification. You can also refine your video search using the " +"filters in the right menu." msgstr "" #: pod/video/templates/videos/dashboard.html @@ -9343,7 +9386,7 @@ msgstr "" #: pod/video/templates/videos/filter_aside.html msgid "" "The videos on the left are automatically sorted according to the filters " -"selected. Check options to adjust results." +"selected below. Check options to adjust results." msgstr "" #: pod/video/templates/videos/filter_aside.html @@ -10073,20 +10116,22 @@ msgid "You cannot edit this video." msgstr "" #: pod/video/views.py -msgid "The video has been deleted." +msgid "The media has been deleted." msgstr "" #: pod/video/views.py #, python-format -msgid "Deleting the video \"%(vtitle)s\"" +msgid "Deleting the media \"%(vtitle)s\"" msgstr "" #: pod/video/views.py -msgid "You cannot delete this video." -msgstr "" +#, fuzzy +#| msgid "You cannot use AI to improve this video." +msgid "You cannot delete this media." +msgstr "Vous ne pouvez pas utiliser l'IA pour améliorer cette vidéo." #: pod/video/views.py -msgid "You cannot delete a video that is being encoded." +msgid "You cannot delete a media that is being encoded." msgstr "" #: pod/video/views.py diff --git a/pod/locale/nl/LC_MESSAGES/djangojs.po b/pod/locale/nl/LC_MESSAGES/djangojs.po index 35f9464b00..0eca7fd03e 100644 --- a/pod/locale/nl/LC_MESSAGES/djangojs.po +++ b/pod/locale/nl/LC_MESSAGES/djangojs.po @@ -5,7 +5,7 @@ msgid "" msgstr "" "Project-Id-Version: Esup-Pod\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2024-07-17 09:34+0000\n" +"POT-Creation-Date: 2024-07-18 08:12+0000\n" "PO-Revision-Date: 2024-06-04 16:20+0200\n" "Last-Translator: obado \n" "Language-Team: \n" diff --git a/pod/main/configuration.json b/pod/main/configuration.json index 2252318f63..f73a0796fa 100644 --- a/pod/main/configuration.json +++ b/pod/main/configuration.json @@ -3051,7 +3051,7 @@ " _(", " \"In this field you can select and add additional owners to the \"", " \"video. These additional owners will have the same rights as \"", - " \"you except that they can’t delete this video.\"", + " \"you except that they can’t delete this media.\"", " )", " ],", " ),", diff --git a/pod/meeting/templates/meeting/filter_aside_meeting.html b/pod/meeting/templates/meeting/filter_aside_meeting.html index 2e93a2bd5e..fa1d731c43 100644 --- a/pod/meeting/templates/meeting/filter_aside_meeting.html +++ b/pod/meeting/templates/meeting/filter_aside_meeting.html @@ -17,7 +17,7 @@

{% trans "Information

{% trans "If you want to hold an online conference for a large audience (over 200 users), you can use the Webinar mode, accessible from this meetings module." %}

{% trans "This Webinar mode enables you to transmit information to a large audience via a live broadcast (accessible from the platform’s live page) and interaction - if you wish - via an integrated chat." %}

{% trans "Once you’ve saved the form, you can start the webinar by clicking on the “Start the webinar” button." %}

-

{% trans "Shortly after clicking the “Start the webinar” button, the live stream will be available to users on the Lives page." %}

+

{% trans "Shortly after clicking the “Start the webinar” button, the live stream will be available to users on the Lives page." %}

{% trans "You can invite other speakers/trainers to join you in BigBlueButton. Live should only be used by listeners." %}

diff --git a/pod/meeting/tests/test_models.py b/pod/meeting/tests/test_models.py index 983331e041..27081a96c1 100644 --- a/pod/meeting/tests/test_models.py +++ b/pod/meeting/tests/test_models.py @@ -37,7 +37,7 @@ def setUp(self): meeting2.additional_owners.add(user1) meeting2.additional_owners.add(user2) - def test_default_attributs(self): + def test_default_attributs(self) -> None: """Check all default attributs values when creating a meeting.""" meetings = Meeting.objects.all() self.assertGreaterEqual(meetings[0].start, meetings[1].start) diff --git a/pod/meeting/webinar.py b/pod/meeting/webinar.py index 3f0685389a..9f961f6722 100644 --- a/pod/meeting/webinar.py +++ b/pod/meeting/webinar.py @@ -202,9 +202,9 @@ def start_rtmp_gateway(pod_host: str, meet_id: int, livestream_id: int): meeting_base_url = slash_join( pod_host, "meeting", meeting.meeting_id, meeting.get_hashkey() ) - # Room used (last 10 caracters) + # Room used (last 10 characters) room = meeting.get_hashkey()[-10:] - # Domain (without last 10 caracters) + # Domain (without last 10 characters) domain = meeting_base_url[:-10] # RTMP stream URL rtmp_stream_url = livestream.live_gateway.rtmp_stream_url @@ -238,7 +238,7 @@ def stop_rtmp_gateway(meet_id: int): """Run the stop command for SIPMediaGW RTMP gateway.""" # Get the current meeting meeting = Meeting.objects.get(id=meet_id) - # Room used (last 10 caracters) + # Room used (last 10 characters) room = meeting.get_hashkey()[-10:] # Stop URL on SIPMediaGW server sipmediagw_url = slash_join(MEETING_WEBINAR_SIPMEDIAGW_URL, "stop") @@ -268,7 +268,7 @@ def toggle_rtmp_gateway(meet_id: int): """Run the toggle (to show chat or not) command for SIPMediaGW RTMP gateway.""" # Get the current meeting meeting = Meeting.objects.get(id=meet_id) - # Room used (last 10 caracters) + # Room used (last 10 characters) room = meeting.get_hashkey()[-10:] # Toogle URL on SIPMediaGW server sipmediagw_url = slash_join(MEETING_WEBINAR_SIPMEDIAGW_URL, "chat") @@ -296,7 +296,7 @@ def chat_rtmp_gateway(meet_id: int, msg: str): """Send message command to SIPMediaGW RTMP gateway.""" # Get the current meeting meeting = Meeting.objects.get(id=meet_id) - # Room used (last 10 caracters) + # Room used (last 10 characters) room = meeting.get_hashkey()[-10:] # Toogle URL on SIPMediaGW server sipmediagw_url = slash_join(MEETING_WEBINAR_SIPMEDIAGW_URL, "chat") diff --git a/pod/recorder/models.py b/pod/recorder/models.py index 5449ebbc6b..5606eaac34 100644 --- a/pod/recorder/models.py +++ b/pod/recorder/models.py @@ -182,7 +182,7 @@ class Recorder(models.Model): Group, blank=True, verbose_name=_("Groups"), - help_text=_("Select one or more groups who can access to this video"), + help_text=_("One or more groups who can access to this video"), ) password = models.CharField( _("password"), @@ -203,7 +203,7 @@ class Recorder(models.Model): max_length=2, choices=__LANG_CHOICES__, default=get_language(), - help_text=_("Select the main language used in the content."), + help_text=_("The main language used in the content."), ) transcript = models.CharField( _("Transcript"), @@ -220,10 +220,12 @@ class Recorder(models.Model): verbose_name=_("Tags"), ) discipline = models.ManyToManyField( - Discipline, blank=True, verbose_name=_("Disciplines") + Discipline, blank=True, verbose_name=_("Disciplines"), + help_text=_("The disciplines to which your content belongs.") ) licence = models.CharField( - _("Licence"), max_length=8, choices=__LICENCE_CHOICES__, blank=True, null=True + _("Licence"), max_length=8, choices=__LICENCE_CHOICES__, blank=True, null=True, + help_text=_("Usage rights granted to your content.") ) channel = models.ManyToManyField(Channel, verbose_name=_("Channels"), blank=True) theme = models.ManyToManyField( @@ -231,7 +233,7 @@ class Recorder(models.Model): verbose_name=_("Themes"), blank=True, help_text=_( - 'Hold down "Control", or "Command" ' "on a Mac, to select more than one." + 'Hold down "Control", or "Command" on a Mac, to select more than one.' ), ) allow_downloading = models.BooleanField( diff --git a/pod/speaker/models.py b/pod/speaker/models.py index c9c5e1859f..253b157227 100644 --- a/pod/speaker/models.py +++ b/pod/speaker/models.py @@ -52,7 +52,7 @@ class JobVideo(models.Model): """ job = models.ForeignKey( - Job, verbose_name=_("Speaker's job"), on_delete=models.CASCADE + Job, verbose_name=_("Speaker’s job"), on_delete=models.CASCADE ) video = models.ForeignKey(Video, on_delete=models.CASCADE) diff --git a/pod/video/forms.py b/pod/video/forms.py index 87ff7ccdb2..86aff3db71 100644 --- a/pod/video/forms.py +++ b/pod/video/forms.py @@ -132,7 +132,7 @@ _( "In this field you can select and add additional owners to the " "video. These additional owners will have the same rights as " - "you except that they can’t delete this video." + "you except that they can’t delete this media." ) ], ), @@ -268,7 +268,7 @@ "to select more than one." ), _( - "If the channel or Themes you wish does not appear " + "If the channel or theme you wish does not appear " "in the list, please select nothing and contact " "us to explain your needs." ), @@ -608,6 +608,9 @@ class VideoForm(forms.ModelForm): label=_("Visibility"), required=True, initial="public", + help_text=_( + "Who can see your content (everyone, just you, or those granted)." + ), ) required_css_class = "required" diff --git a/pod/video/models.py b/pod/video/models.py index cca4d1c694..b172538022 100644 --- a/pod/video/models.py +++ b/pod/video/models.py @@ -360,7 +360,7 @@ class Channel(models.Model): AccessGroup, blank=True, verbose_name=_("Groups"), - help_text=_("Select one or more groups who can upload video to this channel."), + help_text=_("One or more groups who can upload video to this channel."), ) add_channels_tab = models.ManyToManyField( AdditionalChannelTab, verbose_name=_("Additionals channels tab"), blank=True @@ -689,7 +689,7 @@ class Video(models.Model): _("Title"), max_length=250, help_text=_( - "Please choose a title as short and accurate as " + "A title as short and accurate as " "possible, reflecting the main subject / context " "of the content. (max length: 250 characters)" ), @@ -710,7 +710,7 @@ class Video(models.Model): Type, verbose_name=_("Type"), on_delete=models.CASCADE, - help_text=_("Select the general type of the video."), + help_text=_("The general type of the video."), ) owner = models.ForeignKey(User, verbose_name=_("Owner"), on_delete=models.CASCADE) additional_owners = models.ManyToManyField( @@ -719,9 +719,8 @@ class Video(models.Model): verbose_name=_("Additional owners"), related_name="owners_videos", help_text=_( - "You can add additional owners to the video. " - + "They will have the same rights as you except " - + "that they can’t delete this video." + "Additional owners will have the same rights as you, except " + + "that they can’t delete this media." ), ) description = RichTextField( @@ -729,8 +728,7 @@ class Video(models.Model): config_name="complete", blank=True, help_text=_( - "In this field you can describe your content, " - + "add all needed related information, " + "Describe your content, add all needed related information, " + "and format the result using the toolbar." ), ) @@ -750,7 +748,7 @@ class Video(models.Model): max_length=2, choices=LANG_CHOICES, default=get_language(), - help_text=_("Select the main language used in the content."), + help_text=_("The main language used in the content."), ) transcript = models.CharField( _("Transcript"), @@ -767,18 +765,23 @@ class Video(models.Model): verbose_name=_("Tags"), ) discipline = models.ManyToManyField( - Discipline, blank=True, verbose_name=_("Disciplines") + Discipline, blank=True, verbose_name=_("Disciplines"), + help_text=_("The disciplines to which your content belongs.") ) licence = models.CharField( - _("Licence"), max_length=8, choices=LICENCE_CHOICES, blank=True, null=True + _("Licence"), max_length=8, choices=LICENCE_CHOICES, blank=True, null=True, + help_text=_("Usage rights granted to your content.") + ) + channel = models.ManyToManyField( + Channel, verbose_name=_("Channels"), blank=True, + help_text=_("The channel where you want your content to appear.") ) - channel = models.ManyToManyField(Channel, verbose_name=_("Channels"), blank=True) theme = models.ManyToManyField( Theme, verbose_name=_("Themes"), blank=True, help_text=_( - 'Hold down "Control", or "Command" ' "on a Mac, to select more than one." + 'Hold down "Control", or "Command" on a Mac, to select more than one.' ), ) allow_downloading = models.BooleanField( @@ -813,7 +816,7 @@ class Video(models.Model): AccessGroup, blank=True, verbose_name=_("Groups"), - help_text=_("Select one or more groups who can access to this video"), + help_text=_("One or more groups who can access to this video"), ) password = models.CharField( _("password"), @@ -844,11 +847,14 @@ class Video(models.Model): ) is_video = models.BooleanField(_("Is Video"), default=True, editable=False) - date_delete = models.DateField(_("Date to delete"), default=default_date_delete) + date_delete = models.DateField( + _("Date to delete"), default=default_date_delete, + help_text=_("Date when your video will be automatically removed from Pod.") + ) disable_comment = models.BooleanField( _("Disable comment"), - help_text=_("Allows you to turn off all comments on this video."), + help_text=_("Prevent users from commenting on your content."), default=False, ) @@ -1836,7 +1842,7 @@ class Category(models.Model): verbose_name=_("Videos"), blank=True, help_text=_( - 'Hold down "Control", or "Command" ' "on a Mac, to select more than one." + 'Hold down "Control", or "Command" on a Mac, to select more than one.' ), ) slug = models.SlugField( diff --git a/pod/video/templates/videos/card_select.html b/pod/video/templates/videos/card_select.html index 61ecae9a26..05f184b3fd 100644 --- a/pod/video/templates/videos/card_select.html +++ b/pod/video/templates/videos/card_select.html @@ -14,24 +14,27 @@ {% if video.id in category_videos %}checked{% endif %} {% endif %} data-slug="{{video.slug}}"> - {{video.duration_in_time}} - - {% is_quiz_exists video as is_quiz_exists %} - {% if is_quiz_exists %} - - - - {% endif %} - - {% if video.password or video.is_restricted %} - - - - {% endif %} + + {{video.duration_in_time}} + {% if not category_modal %} + + {% is_quiz_exists video as is_quiz_exists %} + {% if is_quiz_exists %} + + + + {% endif %} + + {% if video.password or video.is_restricted %} + + + + {% endif %} + {% if video.password %} diff --git a/pod/video/templates/videos/dashboard.html b/pod/video/templates/videos/dashboard.html index 36797afad6..63e2f129c7 100644 --- a/pod/video/templates/videos/dashboard.html +++ b/pod/video/templates/videos/dashboard.html @@ -20,7 +20,7 @@

{% trans 'Multiple actions' %}

- {% trans "To edit several videos at the same time, you can select the ones you want by clicking on them then select an action to perform using the drop-down menu below, finally apply the modification. You can also refine your video search using the filters in the right menu." %} + {% trans "To edit several videos at the same time, you can check the ones you want then select an action to perform using the drop-down menu below, finally apply the modification. You can also refine your video search using the filters in the right menu." %}

`, + ``, "text/html", ).body.firstChild, // time editable timeBlockEditable: new DOMParser().parseFromString( - `"`, + `"`, "text/html", ).body.firstChild, startTimeLabel: new DOMParser().parseFromString( @@ -749,7 +765,7 @@ function createCaptionBlock(newCaption, spawnFunction) { // time links timeBlock: new DOMParser().parseFromString( - `
${gettext( + `
${gettext( "Time stamps", )}
`, "text/html", @@ -842,7 +858,7 @@ function createCaptionBlock(newCaption, spawnFunction) { let index = Array.from(this.div.parentNode.children).indexOf(this.div); captionsArray.splice(index, 1); captionsArray.push(newCaption); - let addSubtitle = document.getElementById("addSubtitle"); + let addSubtitle = document.getElementById("add-subtitle"); addSubtitle.parentNode.insertBefore(this.div, addSubtitle); } }, @@ -919,6 +935,7 @@ function createCaptionBlock(newCaption, spawnFunction) { this.timeBlockEditable.append( this.startTimeLabel, this.startTimeInput, + document.createElement('br'), this.endTimeLabel, this.endTimeInput, ); @@ -926,13 +943,33 @@ function createCaptionBlock(newCaption, spawnFunction) { this.captionDiv.append(this.captionTextLabel, this.captionTextInput); - this.div.append( - this.buttonsDiv, + // Append all elements to containerDiv + this.containerDiv.append( this.captionDiv, this.timeBlock, this.timeBlockEditable, ); + // Append containerDiv to form + this.div.append(this.containerDiv); + this.div.append(this.numberCharactersDiv); + this.div.append(this.buttonsDiv); + + // Update numberCharactersDiv content + const updateCharacterCount = () => { + let nbCharacters = this.captionTextInput.value.length; + this.numberCharactersDiv.textContent = nbCharacters + gettext("/80 characters"); + if (nbCharacters > 80) { + this.numberCharactersDiv.append(this.numberCharactersAlert) + } + }; + + // Initialize with the current length + updateCharacterCount(); + + // Add event listener to update the character count on input + this.captionTextInput.addEventListener("input", updateCharacterCount); + this.startTimeInput.addEventListener("keydown", (e) => { if (e.key === "ENTER") this.disableEdit(); }); @@ -960,7 +997,7 @@ function createCaptionBlock(newCaption, spawnFunction) { if (spawnFunction) { spawnFunction(Block.div); } else { - let addSubtitle = document.getElementById("addSubtitle"); + let addSubtitle = document.getElementById("add-subtitle"); addSubtitle.parentNode.insertBefore(Block.div, addSubtitle); } @@ -977,7 +1014,7 @@ function createCaptionBlock(newCaption, spawnFunction) { clearVideoRegion(); }, ); - document.getElementById("noCaptionsText")?.remove(); + document.getElementById("no-captions-text")?.remove(); return Block; } @@ -1049,7 +1086,7 @@ let editorShortcuts = { }, "?": function () { if (this.notFocused()) { - document.getElementById("showShortcutTips").click(); + document.getElementById("show-shortcut-tips").click(); return false; } }, @@ -1057,19 +1094,19 @@ let editorShortcuts = { if (lastEditedBlock) { lastEditedBlock.spawnNew(); } else { - document.getElementById("addSubtitle").click(); + document.getElementById("add-subtitle").click(); } return false; }, s: function (e) { if (e.ctrlKey) { - document.getElementById("justSaveCaption").click(); + document.getElementById("just-save-caption").click(); return false; } }, End: function () { - document.getElementById("saveCaptionAndPlay").click(); + document.getElementById("save-caption-and-play").click(); return false; }, @@ -1100,8 +1137,8 @@ editorShortcuts.init(); * @param {[type]} newCaption [description] */ function addCaptionListRow(ci, newCaption) { - let vtt = document.getElementById("captionContent"); - let vtt_entry = document.getElementById("textCaptionEntry").value.trim(); + let vtt = document.getElementById("caption-content"); + let vtt_entry = document.getElementById("text-caption-entry").value.trim(); let start = captionMemories.start_time; const pod = document.getElementById("podvideoplayer"); @@ -1312,12 +1349,12 @@ function processProxyVttResponse(obj) { fileLoaded = true; fileLoadedId = obj.id_file; current_folder = obj.id_folder; - document.querySelectorAll(".newEditorBlock").forEach((elt) => { + document.querySelectorAll(".new-editor-block").forEach((elt) => { elt.remove(); }); // strip file extension and set as title - document.getElementById("captionFilename").value = obj.file_name.replace( + document.getElementById("caption-file-name").value = obj.file_name.replace( /\.[^/.]+$/, "", ); @@ -1343,7 +1380,7 @@ function parseAndLoadWebVTT(vtt) { return; } - document.querySelectorAll(".newEditorBlock").forEach((elt) => { + document.querySelectorAll(".new-editor-block").forEach((elt) => { elt.remove(); }); @@ -1396,14 +1433,14 @@ function parseAndLoadWebVTT(vtt) { if (captionMatch && cueStart && cueEnd) { // captionMatch[1] is the optional voice (speaker) we're ignoring var capLine = captionMatch[2].replace(rxMarkup, ""); - if (cueText) cueText += " " + capLine; + if (cueText) cueText += "\n" + capLine; // Add a line break for new lines else { cueText = capLine; } } } appendCurrentCaption(); - document.getElementById("captionContent").value = vtt; + document.getElementById("caption-content").value = vtt; } // videojs region highlighting diff --git a/pod/completion/templates/video_caption_maker.html b/pod/completion/templates/video_caption_maker.html index 0de512d81b..c1de91e86b 100644 --- a/pod/completion/templates/video_caption_maker.html +++ b/pod/completion/templates/video_caption_maker.html @@ -1,4 +1,5 @@ {% extends 'base.html' %} + {% load i18n %} {% load static %} @@ -30,22 +31,27 @@
{% endif %} -
+
+
+ +
+
+ +
+
+ +
- -
- -
- -
- + + -
- -
- {% for lang_group in languages %} {% for lang in lang_group.1 %} @@ -53,10 +59,10 @@ {% endfor %} {% endfor %} -
-
+
+
@@ -70,53 +76,43 @@
{% endfor %} - {% endif %} -
-
+
+
{% include 'videos/video-element.html' %} - -
+ +
- - + +
- - - -
-
-