From be016ca40007677a2482f99291b980dbbbaf9e6f Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Fri, 27 Aug 2021 10:38:55 +0200 Subject: [PATCH 001/257] Update translations tutorial --- docs/tutorials/add-translations.md | 77 ++++++++++++++++++++++------- docs/tutorials/images/export.png | Bin 53376 -> 90059 bytes docs/tutorials/images/fork.png | Bin 0 -> 106240 bytes 3 files changed, 60 insertions(+), 17 deletions(-) create mode 100644 docs/tutorials/images/fork.png diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index 30570f6377..957933c6c8 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -6,16 +6,44 @@ This document is part of the Appwrite contributors' guide. Before you continue r ### Agenda -Appwrite's Locale API, Email Templates ( and soon our Dashboard ) has support for returning responses in your own locale based on the value of the `X-Appwrite-Locale` header. Behind the scenes, we use the value in this header to find the correct translation file for the locale. This guide will walk you through the process of adding a new Locale to Appwrite. +Appwrite's Locale API, Email Templates ( and soon our Dashboard ) has support for returning responses in your own locale based on the value of the `X-Appwrite-Locale` header. Behind the scenes, we use the value of this header to find the correct translation file for the locale. This guide will walk you through the process of adding a new Locale to Appwrite. -You can help in three distinct ways -* Adding support for new locales. -* Helping us with existing incomplete translations. -* Reviewing existing translations for correctness. +You can help in three distinct ways: +* Adding support for new locales +* Helping us with existing incomplete translations +* Reviewing existing translations for correctness -You can choose to contribute either directly on [**Github**](#contributing-with-github) or using [**POEditor**](#contributing-with-po-editor) if you prefer a GUI. -### Contributing with Github +## Prerequisites + +It's really easy to contribute to an open-sourced projects, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. + +> If you are experienced with GitHub or have made a pull request before, you can skip to `Generate the translations`. + +### Fork the Appwrite repository + +Before making any changes, you will need to fork Appwrite's repository to keep branches on the official repo clean. To do that, visit the [Appwrite Github repository](https://github.com/appwrite/appwrite) and click on the fork button. + +![Fork button](images/fork.png) + +This will redirect you from `github.com/appwrite/appwrite` to `github.com/YOUR_USERNAME/appwrite`, meaning all changes you do are only done inside your repository. Once you are there, click the highlighted `Code` button, copy the URL and clone the repository to your computer using `git clone` command: + +```bash +$ git clone COPIED_URL +``` + +> To fork a repository, you will need a basic understanding of CLI and git-cli binaries installed. If you are a beginner, we recommend you to use `Github Desktop`. It is a really clean and simple visual Git client. + +Finally, you will need to create a `feat-XXX-YYY-translation` branch based on the `locale` branch and switch to it. The `XXX` should represent issue ID and `YYY` the language name. + + +## Generate the translations + +You can choose to contribute either directly on [**GitHub**](#contributing-with-github) or using [**POEditor**](#contributing-with-po-editor) if you prefer a GUI. + +### Manually using GitHub + +> Skip this part and jump to PO Editor section if you want to use graphical interface. We maintain a [`locale branch`](https://github.com/appwrite/appwrite/tree/locale/) under the [appwrite/appwrite repo](https://github.com/appwrite/appwrite/) exclusively for translations related PRs. Here are a few files that you need to refer to help with your contribution. @@ -50,7 +78,7 @@ We maintain a [`locale branch`](https://github.com/appwrite/appwrite/tree/locale 3. **languages.php** - [languages.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/languages.php) contains all the languages listed in **[ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)**. You can use this file to find your language code when making a contribution for your language. + [languages.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/languages.php) contains all the languages listed in **[ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)**. You can use this link to find your language code when making a contribution for your language. Great, let's start. First, find the code of the language you want to add. For example, if you want to add support for **Spanish**, you can find the code for Spanish in [languages.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/languages.php#L202). @@ -67,16 +95,10 @@ Next, choose a reference language. If English is your reference language, copy t ... ... } ``` -Add your language code to [codes.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/codes.php#L14) in the following format -```php - ... - 'es', // Spanish - ... -``` -Finally, load your translation file in `init.php` by following a pattern similar to the [existing languages](https://github.com/appwrite/appwrite/blob/locale/app/init.php#L269). +### Visually using PO Editor -### Contributing with PO Editor +> Skip this part if you followed the GitHub approach We use [PO Editor](https://poeditor.com/) to manage all our translations in a convenient way. The first step is to join the Appwrite Project on PO Editor using [our invite link](https://poeditor.com/join/project?hash=BNrWbRXyk6). @@ -98,9 +120,30 @@ You're now ready to start contributing. On the left, you'll find the string to b ![Reference Language](images/reference-language.png) -Once you're happy with your translations, you can export them. Head over to the **Exports** tab and choose the **Key-Value JSON** option only. Download the file and you can then follow the steps similar to the Github approach. +Once you're happy with your translations, you can export them. Head over to the **Exports** tab and choose the **Key-Value JSON** option only. Download the file and you can then follow the steps similar to the Github approach. ![Exporting](images/export.png) +> **Attention! 🛑** There are two JSON exports. Please make sure to export the one saying `Key-value JSON`. Refer to the screenshot if you are not sure which one is correct. + +After exporting a JSON file, we need to rename it to follow the **[ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)** standards. You can use this link to find your language code when making a contribution for your language. For example, Spanish translation should have file called `es.json`. + +## Add the translations to the project + +Add your language code to [codes.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/codes.php#L14) in the following format. +```php + ... + 'es', // Spanish + ... +``` + +Finally, load your translation file in `init.php` by following a pattern similar to the [existing languages](https://github.com/appwrite/appwrite/blob/locale/app/init.php#L270). + +> Please make sure to keep both `codes.php` and `init.php` in the alphabetical order A-Z. + +## Raise a pull request + +First of all, commit the changes with the message `Added Slovak translations` and push it. This will publish a new branch to your forked version of Appwrite. If you visit it at `github.com/YOUR_USERNAME_appwrite`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. + ### 🤕 Stuck ? If you need any help with the contribution, feel free to head over to [our discord channel](https://appwrite.io/discord) and we'll be happy to help you out. diff --git a/docs/tutorials/images/export.png b/docs/tutorials/images/export.png index f0746322304542ea9d3d0e3cf8d2d248a315434e..362518f5d6fc1131060c6f4e4528aaff08e2a83e 100644 GIT binary patch literal 90059 zcmeEu^aIG~Ro|X41vv?11bl>d@7^JQkrY*W_YP|I-8;xxIGDFL`!MrV@7_UV zSg2??YskuQ8`;?~7#iCFO&Hv5?BD3`-th{!+Z!5LnK+XGP0TE8`N+U69b_aH#(ZSz zY_d$U_97nxVRXZm>HRw>EC+LJ9*eT8@kimI+6b|#6QOnHE}X>w6J%!u(Kuk zV@yM!or^Oc8QB}1g%z`(@#kM4gwaf{el+c_$~Da3@2 z4Di=$1q*i*YYkBg8xvcnx2fJ}%q$%Lg{=8EG6ypo8RH*vGX5#(o5mRbt+Ka=e=FU@ z_D$1{Zz^?as7ZKR4hSbD3E_9;V}!roy%T)*MN~+|9pZQu)z}HCSmg(G$xdeypW>(MrT0b#yiXpqGEB`WGD)8$kpn@-=-i<;)JtHv9-jtmp;p0 zj18K{vf9KVXbrfn_k6m|@H%bk@cOy;;`EKIRau_AQNbS)GwU5Rl^_Jde>NEqsdVKA zzy8le%q;&e{z7bOQ2*se|LWaH-I_ZFVNy|$l26CE-yM?I|E zWQF@VI53ms^}2ta(^Vb0e`-ySV)XR>DxgY{D?%j{ zQE+~R0B;m5!kMb&b9OI7g#xn8UbNnWpZ2r)t64cu3L`oz@amZ#!`-%CQ~h(a7KxsD zOpTV00AeuRGoJL(eryQaD2E8Gkj;_5$S$ev&20bfxBVj^hotByjTGE?7iviZOYU=j zX5xI$6En3$kIsk`-}wpBXnZV{UYE5q)q}?B0FDpd*~l2Fe1MOX1l7-H^b$P2rh54Y z4!JLvs>6_aZ}hmAiWq&JD^39~*=f{&kaqjr;(TJ4>SQXkit_j z>H?*e6=oKT@YNeh@B6+fh6*iwLCRtcj%S{AKP_x8v9s(X#gHUlKqJOO4hHjo=+`#D zUr8V08YZUuZogYmyLa*!o0u^Up)|nsLO&z}x7G}0?a_exX0=i}{&CB6FFv&>ma@;W z4RE3ABse-~T2K->`mjA39WT4A;wuDqBMbU{$?=`uGr>J`_3IZuBC!NJxFvzPkGjJt z9RswEN>zTp$)3``L)+xBL8b zH?J4WM~W*U8An5fo0-(`gwHnmb?u+G7Z(n`hvbh_Marh89>t^GAnoy&fyV7#0#||h zM>)s5=)_0+Kp9c)jX*QQ`K>Z}EfJ?7?`KwgWEG3aJEt{l!a-~aS~|O`QCEGdMV0<} z;NhYBf%TBpsw*Wgew)bT`Lklu1OP6NP<~(;XV)q?r|oY3G~3txB9YqtXxT^7F)xFs zh<5JS=kTU;8#N>c!Fga18-nkdtMt{1+EsTXpnD_8Kl(jWqb&5Dxy!)ClwfQtMuhKT z6b6hS!2~hJL%-2eqGG-kaArp64&yevpaX_WOYo#jDQYk~l=zk+ zL8m%FaAnF$+hCwSV1d(>OYZkkR{t-v$@4?aUrV(SipKp0gOQTQ=6sNT*Nnl+i7pD^ zM!2mk4irEN-!+Fd@5okbz8B3wq~fqbhZFu2h3yUNQjK`{bwj%>`F$mgCbsEq#)S^( ztSMEomiDg3T5J3qUAV$$?cFVhzqwYb4H-d0svt{7+0HZ}7bm+oC#7wN1AE>ri#*RprD65$8La`)t z6FJ%-_Gv9^(67vkKoT0=58SPHAG9i7h%iu7f((bM>6z|!%_iLDWE^taFa+e*ErtY* z4nlGIJPa3c2<(>(2V##cZ5;gi9CYkv3G3!|*H5)9Uei?`5ctkte&I}vt~>JD(8!&{ z2pxl*jXm$lsY(G$GdEZSZ3-tD9OqHyKW6;8BIM+o=bEzDdiyAu&|D;N-wNX@1ynT1Y2$)At9fLm% zm>ge?sg+M4FMfH~x^VcZJrz5Qg)9`t0oi96wQG4?r{ByeI=sHbBZ9e~_*w#~+vjo5 zU}{Wyud`r^7+K$)h|yRE6!*Nxz2~w@yeZPWIkAJB->IXA;xQh##A%&$Mb6II3N{Qw z&pW^;i!>y{v}A#?Fq^f<0T$5XkSsuO)h!6$t3=3&5ftfUeS zStqs(DNg0siTFV40}C7qA8UNt!F`%Dr_v*sfut{f5XqJXHNDqndTeRZNKL}=j9-<4 zrB8``#Nmxb!vXgUix3O$d%jS?(*NAP1>WB}ou6bFD+hn?kPG(XBGzBML%NM#GrbKs zN}q+Uup^9Om(GyL)P#4%8c=ZI^u23C{z-4tHOTDS{sdv%#)*D;7}I%_6N%hgL0Q26 zJECBoX7acOlvMPJtGl)uJWRh1x*6w5P4P`-e)grf38mB|5D<)UXmMO0U~XQ!UZiCD zB_c9|u8)LNP3^SER@xSY{M2dwk2HB!SYO zx0^cyeZBNO% zBZXMpx2V_+tbjzkfGulvpBs1g-iO_jzWx3J)>>{TGsEg{*8AcEVG_HUWC>r0_ai#i zPo__M{iHX!RU2XeeCwh|6q5X&Af?^TDup*<^7f?Dh<0@SwJh(=b~P`ZZ#0_wX_IC? zgZI`nQ?^Q5(B`mw%FDVa0b3|*7piOaKE!+Ub^-EW#6GFicRB(05d@D?x8F#7E_LXR zSfOrb^O7h4~Ajgbp=BYVxja-C$UhR((*hwu9h`=q1Ls4i|> z{HWIS+8YL{TI_1gqb69a058sVkrvu`v~&=`rDc-?p84=kZaZ~z!$qr*Wul#qKaT-a zg-9maTfQCd?=C|S+%5ej3EEoR=^s~`u)_&;B6wiMwu>ilJ|bjyur^DOMptAm;-jk7^0W06|D)yZ@wrnoNU09KxJC(C^Udy z`+OD!O`)bfgXI_5LxaGEy3mV(0ZQ@j3Y+dUa(X~*KbrT|?Y-a1;e@$NUsZAm+U;iB zLFJ2?s74I^@X@Ap*e^-&6h<4CSEX~r9iCveNcYrC@E#{m@yUS@K%_5V z-q}UW-(NW|zBM~2ZC@*H7y0VR3ZpjEA^-c-4!FldpS5(xw}yBBIm7!_yR;QMyq{98 zFRp%9mS>KR_aC1ooM)h94uS0nO@mf9Jt~TnL>0Ip z!I|Ml49DN(^}-f5UN_)g!>jr=>%V7PsefYNX$@dkpe>5FfNd=fu|-AQe9>`w6akfp5p z(fNziF+W3bqMU;W8u3w}^5cA~Kk&bBIlWgH{lg&j4hS>7srlwp2La!d6p{D_X9kDnr)8 zT|sgwy-g*vPpI_7tB?2=y_-W;$>_}Vt)V>RopcExXbY3fZ!x~&`XH*a_>7;j*_wOh z(o3H!fRA$8aky}1kHqIZb7Ah608xd>Agi0zdB#p*G&yq}&1tdfKx)3b=K7phd}D&; z#eA-s5B~d9fle62GWjd+QmM2^-}Jzd@qDIWzeGnLyP|saP2a}G zk01#+s;hiL{D$FKtFMT4e=&ZuO9 z?`~tUNW*8e{i(hpt{Lf9zGvhiRL2NeJ%Hs^m=Y@D!p)O4kk?*^s+xOPs4)Au|X)xLYz{mZKfk zZC4I|e4QFn2g<1^7W2W>%JpRA0qtdn*M)S8$dlTr(S%TMM&@Z`uyv?Ycx+#7%47vc zy}839Pm&&n6|+v-4oop**uv-RsA;hmpk_vX?-DOOE6|JJpU+>ez$(UvOrJ}hSTmL0JlIGS`2;+#S=zA-|(l49Uo)sl~Gl<-J?nQva zZm=nFS$77#Roatww2hJW@-xD(et5bE&vacuSyQXyS=8tFA9t2=dV=(~_K#xfE4f%8 z>q_L43+CgL7*QW+hhUYqen$;X` zov8PwR4g`J*zz|jX`-d?D2@9|{MJ>y^~|?o+gi)fjl-ks+qzBILp962NtP^t-Qnar z>nGgSwnpX$zImbm_Uon18Atu4Q`*~1=It@0!a)oMVg)w4q&y=aVO_Vk=*Wgf;HZXx zUOQFk4UVdM1lYGmeprgEGHs59-Bph-MF?%9?FP!f%1CNlFt9MN6( zIiD1~YM2YkCJ1Tv!KL3JZT_S*xSx(~*y`}jZ)|{VPG67Qj|oRKDWa{GDaNuwyH{c4 z)!X;--k3<#hbgUvj=ZPRP62r}h#8?BJWMZ5$?POL>B<;x8Uvsw%lZ9JWqXO6G|o!` z$*`?%jW>dCWEHL(F7vVFzcrssXWcCkh& ztPwlm-SMOw*qEN~bTX7*z}rQ7{+>*-o35L2omU2gH8K~%9EJ%h)t#y`q z;(oDJ#{unxFIAS1FsIl?M}w&9!>+2PWH}h3o~e#QwJ-qaaJd;SyC|e$tf?!7&wGFW zZb(C`sIzZBqRMBbnWOz0mh256YwxFd8rp#|#7tEFK?e?}tBQY%t!iQu_*nFOYicZX z72+(bEpv~X$|RjGbQf+EnuqAm3}o4! zh;Y9tCe(gYqM13ujqW`8!D*LzC*WJo7Yq6?ViGF#Nf zYx>$yGVX1)ZJaen+# zBV;Z6d{dOTiHW`mc70#Kh^gn=GYT?<6L9>Q#57kyQ#W5*K_plEiZJcI%);u**%DpKu`$XPFky`!7PezPEp zRJUP;8NMb0qgXMqmc{0+phlqXd6!-}X?{p3MhhxPI%M3MMRCi!3A$#H0DP-NwZ$EttU%`jf2X zTE)|t9<ds+;V_X1w$E){9Ww&nwQmZiR7G_4ove@+7s&X^&cMILRk_jWMC7SAXio)pqJ&<` ztCMr`G+St;0WX)WVQ|KkrBlppzV9`NKbECB%+Nw|cJe!; ze&W56XgRIsiVE2*vCW=H?_F?|rVH58{^plzQi_9tQ6A$~Hc?&m zrXWT&6^VH@m>#v2aE9rGRt)idZ_f7AeKZ>@|5g(x1O@@yy=BQH|%|ERk zu(t9X(%c&6)`*Ig#@6`F`DUZy+hl}5i+Q(W|Cs&QaBmvo^MdwWPKM52KNLn)#J4j8 z4cZuM1><8r5l!WK%eLMH4n$Lu7A==8-A3J*;r9T`AInvsBfQ!U?WjDS_h$wn2%Pl> znbg%M7%lI$E83#VM^!b@HL=~?3IpPvr!QQ@=rv0(OhKndu$cxb4xLOUD zKmMwbZ;W9n6oMk%W9Hb>vj}JSfs^f!b_o$m_8g2{B?obOdw`V4bHB|V0XZy}P@v7c zSGw5OgFbc3vk#G{Wg>F*F!&}kC=5?{!0a74lSA;KbqsO{}fqvhvD3Vn6cMPx4DQyn_|35i;F)rj(> z9IW&Ml;U>uApKWP%X#M6nCq z`O6y=rk}9Njy|7qGNSM9cA0T>(5s%yih-#43h7Uyb^UP)th=x%aimPF1BFJj`Lzst;QhdLt3G4o*izEs-_qfKy1pzLK$Cr@ zZE49JmM{?hyC-)Hl^OJzrWkcGGA4U1drM7@6JMvx6b#h2s7+MVf%3l ztm6)Xs%SAD->*erd2z2C7BX*DIz->8i{^9hvU^|ukTk|S6|IQu`B~*4cRO`@2LnF+ zo;qeUb##=Lf8U^fC>9jjnw9b>!Qsx+!NmzMBg^L+l=JbR=6{i~uAITcvtBuyOj`MJ zv%@fD5$EjK_}R5yJKrc$hAxrd2;qj1whzv&y3v~+VVEG8a6bE3F5JGqTnS$UU?3yF z%6e@(MRwkQuVG?gxaU6QSjw7sIMkJwm{t~ zczAFeyB#Z?#HAmOsA>UT1X||9Be8$VnOc?oFvU(tFDDL+aG6s;JK(OShOyYxooLnM z)cPH5AOf+S&LxoJWmR)a*i}R$dnULrYG<6ZT8QJR9@dxR@;ZuZ=*XTy?zR2H$xWU2 z`=eE?7k_Zx95IH=5aS4IY)OqX-bc`Jjy|6ehhjjDvyQ~y4(DD7ai=$*^Z9_b)ZYkN z&aX#YY4}NZ?si#GoJFx-zV2a4&9_TObq#CDv$wLm?N9Z-UbURSmTC`a^mZCrAW& zd9x{_tFh6dVzo5>Wtn5!4$Q>M%7n?5Lyo4Yfmq!N#Ced3K1rZ}d70vbd6lE&C>IxK@JA}*e#g$KuiYRWEL-0P>%3iR^G2a_uFxnk_BF#C%LBHOV zDS-CjHgy&@x<|dOEa3M2-D&Q+om9k>pAy}vb~Ut=j6&J92=H?#OIwLd<2AXzScK(>U+7HaWze_oz+U!z3VA76;KGmWWDOK^WY zs&e06vu8#79fV&GA~z~9P-}56O}*o*=Yr}RN?VD3{$glO>zaUZUa%f%}b0JaU zs`{aW@AG;U0(WBfTuFI)Z?>^tE$#~HN8zKb)9(oRg2`*NXaxLE*tA1eeKVTG1}cet z`IpED$Px`^{hRaSFj+w{`Df*^aww&0_5C7z)vuFD=yKIAezQ@dNvwt+$J~g6Jd`se z1RVIRW|4$f`_d<0gBYvMg6j*na6dSmQ%x~!O*btNKhd;fx#ZcEH0QU9XkYb}DCZmK zu6ja*n_7D3fPynAH%93lRXlES+%A9W4iXX1 z4$s8PL~qt#Uq0R9pC$%+y`i}{R0W}Cik&}(ROs8nahZ@hhb>%8icX7?aa?nb97khN z>BVMhcb=I`BX6~@=^0;IwfUkZfG0P9gmCBHRGV;;4*?Z^k-tm>?()u+aqp)zA`4GY zgW0igTp9b5Q2qLrhHsz~f;P=Wy#q=6n+<1j8I2AJW)-l1OJdgqJn?#dZePyy<0fb$ z!!9vmK2urHv*siBon(F%V&A9Lo;X=@hT`Ck>yw+-umU}ThU?=zO;~-?nxWh}ZZPwG z9_gGX*Egzg5>vDWipontUOnhl_hA9J4^J9bm$z84artCl;{1N|kiR9sE`=~{F5SE{ zeC<%Lq!yz&az$C_DOrrT^E=`z>RLK_C-#A79h487MU#BzmSTXr!X(hO!U(?i%?f(y zmls&s!7;kNBSwnNCerukJFsnlK2%A0+3vyBj?L?sgl=Y)wK875J=woJ%o!s>Vew7h z-Jr-sULZ%`?jt}*m?4*X51pT+fSC0k2D*rj-N~;(U5(5?*|h~LkglmUKe|3nd?jI*+5?U z68}HYhqwGLrCtf&CGx<6-v6i#vSQ}y;ttEi;)M%Ed^Xw$H#}&21DSL|)99+!rt{(0 zy&VGiYs|Z8g#KdO-VAQ%&aLYp*=}Rfa!)_XPE@9^vSEH(1CWA^N%>Y4R~SipEo=&2 znU%fUD3Y&Q8Z_si2}2xG>FGAzh6AgH8oMpoy;Il1|Gbc_wS z0eLZI8;=e9q*JDT9)iJZsM&Tt{`2MIJ)xQ*-;J(>1p6UySH!PM(P}JBJ;IX3W8Hw0 zj4ck`hVB{KiX|#b__$1VC~Jj`L8QMq&$@DP>+?3s=^Y0$)uwSaO0f5)dSy=|`qg$a zpKDCl(cEkECwFq;;e?|iYeMB&jEqIc`sXQ^fme@Z*A)XVwdh`6T=;HMI7H@>L2c-OlkMHmx-cf=c`x+X z<z$pV|+&6nkY(2MI7`ayC*v2nr0uRlec3wUY;jAGKN@}%a^o6 zu5?Szdej`!ci3>|v%N3d-E*`_dRs&DDfVZ?>2w_7%yu4ogCEYqs`RtLkJJ&>4zFKd zvuEQ!O+T*j4i}=Rb1-zL`6SA)1kvy;>&#E_oy}2txM+|cR?^Vp`;9FJl9MUeXrqo& zV0XZVURvL53PMF^hMCAByb`9o9ixr!zhyletxndJHmUv;Zk4!U)cx9lA<5z%8pC#+MNPXCeLA_6$ogf{9`%jfDIdPsXYWE7muhW0iHd&T=L|i68_y z*0&dCxHKc-SoDKfl;sdBp*|})#|QHFCPE^5-IewFhARwCaXXf-@0uIV#dg@GXL^4I zlppfBXRWaP(gRcs6brm#tmh5`=Zo#ZzQ_^nv3ZWQ^I5Bg|4|dT;>j zqbJrw$~V~sXB`B78$r|sqe5tkFP&x~8}aPxz-~DwgYM5B?FD1eU>6Tc-?aAWIJLjS zTJp;m*z;NM>bfpP@V9n2);A=iD@ef)WLX!7L5%=@#!%PQ0{9GfR%|1jomsJE$me+% zP(9t;el^c+WRV9%-B$+! zsak;Gp#^5UjA0+}S|XP3ACH8sdV0^R=fMk`8SbC!ortAM9PYVJi{+9vEZ12)C_vV& zs%tFoibVB;;wLgt4R0D@LOd0SK|AvDb?yv*k9VOo(p)ZfipiI5VqdmOaYNO^^RL-UK)8OOh=N? zOHEbsHa7wysFXWsSaYzVgnk5FwN**luH%!kN0sl$x?N|G4y+L-5=ah}Zo%&U-rn<1 z;gzTYM-8~#@stqKydcugMk3J5QU2OHoI@y5JosfpV}v|YWGiQjX|$rtYvC2xw1{~W zcIeHTBg&X%u*f`Ey<$FzpKUg`^|-2MK0UY6JkdOwHPAb_&Q5xi-DOT`6c8P8#-OVi zEUYUo}aL*Eq{>z1pY+bWr6 zdy7toa1gN{)Rw+OrbY4G?*gh)cw1|;94mL)*fwmlMA^>a_2zXpojmJ6-zfC+N1&6S zEK&a(mLPzlifWb)YOUHu9ZVCN(b0vez+$6rN@_Bjxu8)}0#~0Rt!C`QMCkx_6tn!hz%bL8s=BeMI< z?F>uBk(%A2rIl!51#DgB{+dnp-o>KDRdLGicKMIR>pY<*F?F%y^PuYsNrq8;zxCS9 zQ}F`96_>m`EHEhTht}e!A4=>;{jiRT$U)x6Y?x}z=VJQ2weq}Y$7wY$HG1M?ZwQ;K z?y@pHOT2%(18wImic@Ox#cgv9#)D%U0c_8!vyD5~`+L*mcefe?4dkORtdaYXCtT$x zHmcsJC&rdzE&e8j$Sn%AZ4=5WSWVdNGbHJdj{2U@c2k{k5F1qfo{;qBzARiW6g>DL0F1xoVsGtimjrTG`lG zC7v(y(w1A^KYp<&>DvF#rM00Y=|^Zk>VdzjuCsUp&7sd5tXQp+ zlD&S{6wBBa7?nn;sy-SASCtHqhY=+^%G8bNPAtsOD@J^ccVf!@4w%&$K!*V@9RM6T zQ#4Z*L)8@f6UX|il`q_V;qaJ{az(Qy3mHQEX*le!)B$oygpyx+lj3rMFTl)G8+UBEzl70^2BLCO$LH5=x zk-exVNj+dB2UkMc2~cMBTQY(8#xvz<9~zoM^~sDD`e8U-$y3dd^}R;s>xseAD#_uQy<*6&d!(axpWv#vcgsLK3O7$Q?NKY}Q86*$wMRWRAxMUi z@lJ#J+(rO57eA@rjSfQt``c*5*)?!-RWnWGOA$+OdPNTfJ)Oniim9Z2=zKGSbCZ3u zk_6N1;93&+f=EX4uW`wM6i&v13nvs{%vJ#+LxuTVHL72+yFtveMgo{nnR5S z%a%V1ZuvZT%Cal7N1!B22fq>KsG|HSnCx9I)Z96bev%}(gikg-nI*%L$GVM8XoV(4>Y=TK(ZKw^Js1{2po(z&=2@Z)SN4h9?` z1Fc)mZOTbsnmH+?p9WjB3GRq9f;gvj-SAQDTB7&4Lj;|+3gMJ@>8l@4?la$V{Rct^ zF3#+8dp67hEsl^pemJkaw6eQ>2j>eB?k>}AcVx|Hom$!bkw*Z;#$a zaLnagw>rtd+;oW@vEQ3xmQmMj`Rwn0ddR_~e;|a9C`GML=HX2=DlWU5;>}N)Y#%|eC^Z6t9UC;9_MXTurprHg`Huv=c617V5KR#DBw zlVRx^Fr}i`u^!#9Vb=5!{ra4RYNiPQU8XvI!El&RYxA(zZqH$(34QbkCtSUw+9BJ- z^bn?Z9 zrtAPGN#@+fPM0t8;l*K^VFI24)X{z)1awqF=X_lzXj>s$%WwJ%)knApW=#U{KTaq* zVG?`q#MVA*+lT{57Ynn*#m$OQGe=8k@LJ9<%@vtHcbNDOZD=D)n=< zM}#}3?z%a%<{q>Kt^?n%_~bw60)dCj)jA$RfZ%M_;zCfP*@aVQ`@sFsFM)Uj7fLkI zHP3fA(EQ=d}7Fr~>QS&oez)XW@_F{Q(D7p*X*~?o!=O=jNSRJ#=ATz1r zZz$D2nsKZU@oAG)Rw79}K11Jx+Y1-lh%;QPvS89W$EDRmvr-^ASQv3oU)L#ln$ZzG z1%h5k0ZF?PY>GbaEGSpL?-*erCND==6tobnF?E-eSW0rdz~4fX-B>wD%#ct-_)eg$ zIYQ%5AmEPLIUW^%RDH~Bf5wuM^(1O53ELA`YcHJ6kGR`+|HS1xXAH=gS11 z)y9pdh&Z0TZd8WGX~H2l3-)(aPXIpcCnRH;kfD7lyt*=Poq0oxr;n@@eF%D$x4TAP zvptQtip{xBJ;Y~-KMI8?Los@2r`_xPI*=uqa{mF^Weh`Uz>n=f44{@Z^ROF@) zPKR)jSU38WF0f$FJgwT6k(a<5j@EA&v2o#;>~Riwy4C0YdTwyncY+ph`r2M@?kGH2 z6MU^K9H*xI-Ub#$RJ$b*=Yp(>wf>bl(6U-@na)#$6`S}tJdvn8xKThpRf}Or(^TY< zHNbaY&A6lnt?miofp3=Rx;?ZPzNw=z+C(gItsIAatELqup1mo291!wg&@dT~LnfK0 zTMJLwe=Yo|D?mO)`u&Iw(MN$wD-@nLA@p0ArXqYJpp`P^R4e*@fref8jCxQms_{L~ev{0fKl%9Z%6up9YZ0I96JE zgsV~`b@l_2LZ`E26io&k8_Enc2vlmW)_Ae8dWr+0fFE5VLA|bfnS5jPmO)|XTM>&MC-n#KxX;vSarajx-c&{;aYlw8bhC6Dh zCPpD}-=+~Ua`}bR(~*(=xg9qG_0w~%Z6h?UoqFSv_c-bW1mOv?JJ z0d{_&94^!= z;WfC7xPZG!&d_v@)|HE!xlDaO^FPhTLx$_L&Tcj5)7=pX@ZZ4c`6?r)yA$IYH;k=z z08JwsJutv{vzzN@dFp;h9w%7;xVnPADmHG@b4(na0(;@Mb)Z2UuFToyKA)dLlnS^xff)} zG3W~oHf2C!-Z4UztMNnx_b_hU#%KeB?i>z0+mtmfM7i628_--IbU=@G`n};X_`pm% z8h&qT=wW_jp<3}6wKm3ge$YZA8>7L0CFuW^Bo0WW+7QldOLb>86@x&)l9pQJ|K_Rb5tm~o1(ullzg^MBq{VYEGr1Y#IT*Y0t!v}yQ~Xp z>XHgF&bgJ|6G!+t4&Jmx%6C68?JEPad0Tu_&hPa9JNvTOQ~)8iyhHsItNYLInRyT} z)jLnN_$~#|1Z;o0pxhVg5%hdcngviG_(L-z{@`*@h0XMk`Up^()+9z`u{SE}b~e zraFy9y{A#epS94+GQ%a_t9z!rP@?lv{kJvTxWV{?UtKx&9ZqE(sttI^J-}?WF8{1i zfpoT7kWA{8=hyk#%+}7r0rA(6*eVAh)nD#r*?MXwqTvj=c@=T}?AKT`&PzTspQZWp z-q_zTgcQ$36MMd7LeF6MYdU`dNQ(T&0>Vl@O3Kx!92RP5UI`MO9F+1%UVpviCBr=P z84Ec6poU?XjiYIV$*-fw_HBo%tYNJLv0|liMOWQeAU5TrS|8x&38r{PwYVg=mVF(L z3~Fd9g$pR-52NW~`RY`?X7qn^m&DqIZvXl(00;z5II3=*YiICso(PQh7YKwW9!Nc# zXamno(Ks}r8l~o`Hy`Zv6sL3+m7(9SA!F@^w@CKoVT&EtYb5*iphMZ3=nwl63`4Vj z1LH6fh5;v+1qZ}GGamnU%I$eTrq+mHj_7g}Y^>IS9ainO)HCI=}JgD)92_en$>57|^ z6#+j9ocF8Tt|8K>``TCjbjJ3S2pSTS(%AH~-Qk>F?*O#sggcBjd-@&5OwqAem;rsG z|IRpc20=-QE6Dm=vEm<8Gyh<~SHuHVyg?mM4I8R3OVe56;_-8o%Py$4^FkQTKaip7 ziRX8tLX3jNHMo#x5Rl_E%^VEo0cqu!(fp(c#_owB>$4&nEdm4qn}+5ZYV^KYV_i|x zRSQ^&2xaP6U&F51q$7+>jY*`Te{nb6NrB(7f^~3qL1(lNC6rZuuXs9Ti!g1F=;sY^ zNrTwdYli8Q(2rH0*+;*i1XnPt6-La-TIB>zz0*xWvD{XjMzMTVsBLUveo~P#Z*{ak zQNXOv9QIe-)@n-ssG5B%a^jVeEu{kGs>{*2#C&?N4lnrVYMwz9To+Oj}=Y5Pa-y&FZDKz;fKpavl-JNQA=bY0vlRBf5P`lOwTB z^*)>wF{xMtGL)q|9Y{mWH&}zpBb5r*>XB1s+rJ`*g>m9whc@f&+v^;~EJ0|cEhh_P znHH|VwRy1(m1&FXbpM!rv|p$eH>8UBZpxO;)%wwj0e{0soq%_Pw!MR3C`;=3VuE-n z`nrgVNyYZtBN#y#Bzm6ekz}>2W(hfY9AIf~%J%>=FI|bX^)b0MS1~1{ra>9J{hB>k zhk2(uF1o@FGjsg?F7O|rz$tEkaXegc7#J~_J|HI#|8L&mEg1N;!5glkaH!p=_rn*) ziz6er*_%S8L+Ps5s!M`;S0>LWBI0*noHabT8$e8abMpEO(EXY zJD1_R9B&IOOew&JWXXc|jKB!3_mO0rs-qpOQWp5Rv3bLJQh5ROGSCi$Xd}z1mX;Rz zl5)LxHt*eexFk#tHPgP!9$?~erX~d>1ng#WCx4Ai6qz8)!URrRW!dgQiw?NQ_f#wn zNyDbQz19-;A1I@#wpNe1{P|NDXS4=hLHbhdjZQzf-lJlQR6xm zMW0*z@IkM=`X*H&J;Zm*7ss0B|K4zd0jbmqWPz3lxdMSpp`q$CXrJ_?`!vtND`8G> zr*oKfv>iyX7TPOdItnZFz`}_VcrLC%J-&RXY zm%T^qRf^hs&z4dlcBs8-7j5m>6cKxb+O$QD*b$rBV(-l_-XGET@A3V|A2+XiUuQng zIrpB|73mhM;r76xCW5lr+SjP;4#2+fR0l1!av`a9?p>ImE zzZg>mpB3>W)tjU|?i@Y~C{Q=cdLmFG3=Af>-Kqt^VQHoO?=rPrHMZ*_K0;0TW8y=d zyuG8zc;x25aUH8W-`|?dv()jOcr+7){MK87oH5XM8?yx7ChBEkcq~)V{ESiD=}UnQ z7c8jC>4g0feC7#WgwT|P>J6QiF+BaxW={&M$}>G!Ld*6DRRD=1Rfgq0M>P4%l$8}y zgJ40Q=Na-@kJMQwpS8THaYnx=tN@0t#WmzafESMLe|8S#0#WxqGHtUd1h5n2CZ=;3+{uwsBSX zy>Z?sBIr76bwsqgpiSm<{)%ifM)q^6(XqkxTx*u!1W^!Fv#es;Mn&Mk8__n z)9DlPzNhv{8d`n*`}eQIpMah^-RpSP{C)=UA6y+ikhjLxsO5|E)?c8b3d}pe-$PoEB1M3xv4E@La3|LxY|d3&DNJ!If)M zoe9{dDeynVrr({-?0sV1z`J<=%flPSy>hk1S>CxHk~FNO#1$FOLhK$rw+gVgr}}HE z48H&Ls;xSc@`5s=pFP{6Q_lG?_9Dmt!kua))DF<$pQ%Tjx77AN~(0 z8SI1zu3I{`V!;m?SCG^)x1dAlM+; zWMcGb8l5&>NE<#myYah;u5(N|^e?Wcl;ZuGTr=y%=NVe6ophBV@@W~^?cZ!It0nc2 z{<~c~m5Up&@4BHumcoa9g-f)L=`z=$d%S!U+3$zqRoKMw-*O-XbGMU{%JO1~jV6u<+$lr~VldX=yy=DsQAx-Cqj+rKON1YvR$ z&})Y`H+s<0^83o_3gNy0;sP#V&=urOX<(-0uoz(S<$tF%K4vztfzs*0mO_P_#fy(E zzPwiWTT=;NJWX7;fnC7I;E;t_IDoj?Zs& z=A?XRQnowgi2aoTBVf!6&@l_HmlsnB>x%Qd{tE0c)vT zhG|XmqO)w$(kKVkgO6A@$4Kj9lG~i?#N{MniqGm~2CB2)zujxJM;bW1eTJo*Ve0>w ziV6K^qU&rm_jEdvaRzK`>;H4AzF~Gz%N(M&$1XWbVKG7DzkyIMjM>;iWh&yIVrM+?I|V>iaCU|EsG-{k5gTz zD=}|$V{GhrA+XaIi!q}*jWHp&XP59F@T{D>QW;y2|3&q&3pli?VA#H*j`#j&5;6um z&2*RCT3_k=8Z-a-)=3;E48wi?ZLEcSC~pLC9$QrZQ2FNjNL}$0l&;TS1^%q$zh>ow znL%y$#WfT=iS&sHq(Hp$8mx!x^AlTe+R9l%4M%aTd=owP36(}k3=i8qgx&p@K78So zZ$iJ#CD(sgQd2=N&@q`v!iD)nu~hruQnO($+zZmamLmE;9B%B#Hw$LfRo%IhrkUoe z_Nl3b7novX`r+*FOIXtQ^AJ-ml7ly}!V{Kje9t3Mgp$lbK4WGkJagoIwy{4hMfoUk zA2%AFCowaJA0vmK^|e8nJfsEhYNe^WWK(=iLOVaU%CUxJ_fp&mKW6+TIHtY&^Mjrj zh5>he>r#v^41zuWTe07{u<{wfZ5FJ3VS1ac1GCfgnz@uJ=8dyttIco2IOAg{1OHx{ z;gdsvF~Z2JN4{GGQMQ94m1}QFKR)Up%-`mg!j2 zD0VG%&*~5x#V&A^1V8j_Z!v^P*y2i<(v74BBslPub}y-vvN%O~fb%)a*DwOCh|(|) zih-)fp02JASW%MFVc2*05~+8dLC?HVopd*|>00m2@?z_%@GAmU8n0hqwoh26I#!g8 zMvasTQC5nqNHdiJH4HeC3b?&z%bAPFYZ(OY6?$NHPcL0d_~O<^IOg?~>WUFtE8;&KL< ze~68wDn35&zJC()+pF8C`#k@86Lc-O&`^7g<#93RSk?tE)&rc{ZF90`@WiJTQhhiR{xpUtwQ zsRjI}wqdz&pJlgg>%Z=U;eW~C4$Qt3mp<6wKYCZVNN#GTgblF_ZsB3{-cLEKR`At| z+sDnYwq-5V_0xZHJ7G1pHQZZI zF8;iLTuax>2xn;ZzZ`LYG4;`^$`ULwBI>H>{1UGBX9UmcX-UaHmlK|R=D__3B;byI zbn9~DBeRJ=PYu5>#IqAbIzrm>!qE^=b1xhJ!NK)^8OQvAI%DP_ZGH=wT#92T*@p$~w-KMur4 zAj|(GdLdS%@)O4U#KU!<67%rne3{s)^6mtbReLiirfbq=#tUkAILd>rY~Zo4DLT*@ zqoc5?jU)R79)B7#7X_gi5LZLKhw{^(n) zxko%R+xY`EWqeEDM1yjj|GYUK(>>bRHFjzgXa!DAZS#A_Og!BF99T4@{d4V6##zBe zp{T`e8A>AG3_19{^|Phn6z1-1&=v}+%0o0ju#nN~y%&PDiYF>?Tms$Pij~|F%8J6M zHA;_obOVpHHaqJ9Y5|t@&h`uW#;lpuTN}{$L}ARCyIm7Xs6c_`ONlIvjGG0rw(eU# zts7_niFR1ctUj+1emquE!&X1*5ROKvdkXPIFN{8{{sZf9+K6{4f06?+4RAfEuj*b* zp-<^wjKNQp7j+4o7jbI{RCLpz5Zy|MIZ(c(&ctH z((E)!YN%>{vt@oinY5Qgeb!mfU}#`WGtQ+$VaTCEyep!R+`V3CGufp+THlJkrys2Q z0BTrrW~TViJH~Agq1Gy6tG=E{{n={lwIPb>ds0D$$hIhk>F4)up%loR3KMYkex771 zO38mEKspdFK!9Wdo0#AKb?+yigK^VOxvlTeR4tFoIF0OxmDj0~0CF2tCq0f5L_0Vh zpV@q>Had*YUgwE-{0S$jZtyN7<>pKfxxB8vjzbl(_ z+!@((`0fT!2{pzV*`F3fgGw@0Bt!NPxN&y42DO&rZK)^b4*M!1OQj>U;*Eds0p4eI z9rF?>DDIc@%e#nhX`m|QCTLZJ@*-yU02)E*nSjjGw<7$9%phi~o3(-0aNSv_6voRV zt1Rb(*gw+JW=@&oJ8QxQB(9l~Ve#~dFWz*$8tbxhR2sZSE%MIFvj*EQBW8%+)|YW( z4lV8Dvn=EGV418cuALEL)cfBMgWS49d|suv&Tw7eS1lbcikw#Q$}oI`Lm~K>vE;GT zW^{S~J!ALxFmoDVg~@TdAvV<0v5hv;@bNRg@&2;!?PUxr!~8lFVjJm74^VZpfTmDl zPIPxIRcUn0gk9VW3>KlAm)Tvb%AF{jF(YF=2=2G-MZOgK;hSoaBLO<(q!e3aN}e-t zLOAu+Oi6_wHW{dcR7QifhqZPWLMCG}cbC-$`0LyZo)^MA^Uz63-%f|_Aqak9V1`$N zaMK*WEg>A zCi+fF(R*8Z&<+x1pmSn-vQ12C?d!;$gtSO$(E^u|xQ3!tnz4e2^`!iD1)q{`bR4)h zs{yuc;evK!t0Wa3c_*qoQLLwUK7^2Jq^#(JUH4P_#HAm65~g2@${oM$sF*ScDu;RL zVy?8>*VPJR+%_J#?)@nJILBp}_QS|QQ^SD87)o#LSb=>uVz8)A{)Sb~*pTt*QFl*_ zSSoaXG)Ccup^#{=;zH-ZR$I)uqsE~9FiK6Uq0sxzks^J)YuJ&DYlYn!XWZhSnk_Rn zMQsOrT==e~pj$^=_2%ltk^bcAbsW8kN)qte_3da*yCkjTzO-5AfXS?r-O?i?PQ%m` zUb%(|0}qmqT-tZtI1jeJG1)9mYZum2xre*09tUgfT0I+Gw-f!j6-Dv>WKtUFcj)qk zE3P94e}r|r?pEFV$Tw%fUV`gsvU*_IFb932JZf(-`fb#pySApl&i;vA}-WT!5Yr+M>OQMEGOxkzwfRXuH4`d1l42#^*1HR*v%BYWMteAFb+y=(!J;3$aTkI@9_n`_^gr+ zVdj%r27ZJ6fmH%#2O~ASclgICe&E*`%BhY^&v)GM_)0)zmi-6GtInKA8faPZHKSXx z0iE_!YZ1Y|4ekL&T1p?$Q*yqmFw%!)Ju36`m+T&huQ}>4I$u1#d9(zBSS%eNjV;ec z3iMRhZ;d-{s}Kou=*kWg?)<*4zPmz`(9UxVoLq7c@z^G)>3lU_HM`0+x?Y2pO$N;H zSuUuf9TY3hgns0N?2~K5Ku4SJ!ad$b80o$7vIN=rDAmnMi`YvO0ytXjx)5SZP#dA0 z-db=whbD+MqQOZ0hKmNXcOloAkdbynt;(czrzT=26C85bY&-iU-B3B3%iGAIGQS_E zMW_CUu|!k{v~Sb4_cMOO``}J?iCjy!&CgEB8olfJyOfri%W6ws1U}cU07krr%^9oe zv#BQ(#!Juoo^~J*_ke&ttJVJU-O6{>PU@j*`Y#wQk~zEhV&2W`d9GI!=13y;yjvIsLZv&tAEHjL$kZP=lJ6(NQl%GLHWxlI!>cIZA>}X9Lhq4_$xOJaio?Ze9 z_F|Htv82fmm*VK$?G+6X z)Eg2Jf1WO?B%~Wxc%E9%H9MIqB(a=AnV#6eA1?RkgQk}{lS*0YQ^8KW)68#q>)&6> ztXrqe`?uuQiX+zb(_ z#?W`8aKhTp?&RKY85$0)9QO=-ygfOpAeDKj?L%X$*7502yKr|BNkHlw)ZD^icV$Z7 zWA^U;94f_yeK95CF^__yN~S~N7ho#D9SU5lw2OqFTO*c|kudZRfX4kNZi-tox_k!p}41c%`4(vgM{`6u} z$Z=02p}{aEkyrW)r)gyRjxnRK$d+-(dZo~_)>0gWlV+{FIle-gKHuzo_S$U7WYWQZ z^JBRuZjJ~hUxDr2(az@Db<{2&Vvs&=99q*ih~9tKuq?B^yF4VAMrQ+XnNfw!ULx|a;iE@i>`1SE?lh=!>$mr2mY>*X=yGKHmse;#0=%2Mwn{&4Ql zU$(jfk1+*7vv@{7xU_McifR`q+mR|lxV>3nJ`xrT(0}<)pE8v~qo$A|JA6`^=23O( zgxI$)cL@c}Z3}ojZHy|{J%@I>WsCFREoJG7`l00=ci1TY7sM` z?@=zT;4aai@cp%nr>OLT*PyIvwo?BOdNwtbKsUOCtOd!Ef(YX&XcMm!+~oA!+Bg(k z5!+w>y1uQzU#ZYNDfp5&F*S?Nq5&qBvQpIVO<6=u;>C#W4m=!nLJwIUZ54W>dwVSw zbx`)zm@BAm4cv}wj4IQlIw89WbOxU<*jh=9_dChdWD6epNzS=hDZLhJ$P!bIXk$6& zelbwOyw1&1H~C)C%C>8}qf=w>We{0-oafhClTfzgx1wQz%KhzpIp}`LPDPG2*M2-W ztybOv)ucn+>9IYfn5*BsQEfwg0*~}h=e>S!^I900tx|vD&6C2QlmnH3oP?cicD(`H zXi<+n*HiwqltGb`B=h+01WLzLjRyQxo~U8bv&)uT7{+;HX`;-++_=a1PouQG*fIYd!gd}x34vmMeXFaYsP{UJCiG$urHBJC5Xwvpu(1kcYL{Dih^ zO_h_axTxdAG-V!@rItU{XGXBUWz3zAYs;c}KY#AklkrW7k{1*ko1(YHzP5G}I>PS$ zfY)O$cf!`ycRrr5E$7&JcZ{rh|C`zA&S2z-4X=Ho>G!oUKc>{N?4adefmFM_Zrg;e za*wkN$TxMc!LRV7qw5A&Na9}>yGuhq<2Rb)uZ$P18lUpvr;4D zvLi*=t|D!Dd}lm3$_|E#1!NKp4v13{KFCJLVS9V8NR_Di^8BD`LE`c=b%pG3s=01H z{|Z~~aM*p1t@!d1usV@^UQzl@9bB@aLo88bta}y`3rP>445P!=-j8+jBKq7?9(-@|J*`(f(((j3 z%9efq8aY_!&CYL8M-;)WuHXqdpQO>)&mrC!JNgM;|I8-%o0NeTAgWY(p6QSFwCQ@& zdI+7U&XAIX1I_m+!sK>I3y$$uM4#DkM)+w;45%Co}4Zev0iF|H#+AMrsiZ;c0)M|dPqq6s0ZFqW2)EU_{5Qd&7I_{NLwsjn#a zQz^L99^5dCXLT69BKGNH#f!x54?oI#@^uKWO8FPQizhdXW&QT_r06HP^yqJn*k%Z2 zQ|Acz?Z5Nl+{U+f-n6c{F}7Ned9>Rp7toMnbN1)mIQNO;sj<>yq*Yl%wKboH+`!k}3k`RRHu3!-P%g1SdC(@}FFjk{<< zf{K^Xe!rQ#Kw~srwM9B3H76sId`*1mT$oaGGgHxNB_7Ko`5LfPH;L1C*^2;uA5*3LmUd>fes&~|xW(#?6)+v_R$*MVz)Lf%&veQdVyLrN=_^0@n3)@nB0bx3sT zs|vsezFRGw_(BhJ@1Zgx(PB}sDolUrE7>#Jtc=)Pr#U!e(CJP6ntzlPyi98DI3Y*` zFFI9ay7NID^c$GtXM^ZN>nSS!);mebaV2?d4!aRYIbympu@}AstfC1&_aB0 zj*ad9pkli0l`eEH!mc7aZ>_C*?EAS(S75P3RehUKT+4hjnr?dn9Wy*n(G*C_#O%jQ zAiO(k7SHJ3x>VsUlFdGul*?`_q5#fT9*CdJ*eCRLZ*@L39yG55){BCXy{uqG<3WfC zXxABZ2OZ1o?fx>Y0$KY$8$B?jR*c9S9^KWJ`lDnS{A1m)DiN$F-K0UCP-dA_)iQ!k z^KAb#Lp6F^jau6)Wqv3PARt>H+$PxEGT=I&aUSp|ukMZXl;?KXQPay~A>l<=77SrD zX_@OInUuwWRKOVdw=v-u9M8on!l5PXJl~aaS;z2`Dzi_rc;z>0O(s1$Xu-ja+v=9-ZNHIzffT?#R;Hq~E$}aymVHlG`$N=yQX0gfiX% z`8_?sZ7wgbx`K=Sc9@k##hz}h+I1~Z50Uq9Q8;CyReKXK!OTkWWik0JCC|~_A=^A2 z`yki4Y*#TW(?3V%iDb;kLzJQ~EQ^aceFuQ-+(kwhgL3@mmXTsy(I9zB{q@XIAf$rN z0veVutzR2ozSgY?tP)f=^a3E6on`ZK*bd=NU=sHz9FkwB<#LAFg{oo3E63Rd^F&TM zDnq90wo@#Ovb-hSAak?D`IW`7j6S91Ww&`%*#72u0!%2!B3-Py!aH|~PS(0V)3j}= zDxFVt4^kDjGc;=pA4x**Ev%%o17YKnBfySyk%5{e-0&n0_Kh+#<^btB4&}reFpA*a zj+jbJf^GKBX@dGvy8G}=wF6+hFQo3;S&iu$>i25U;>SoDwRPRe8xg4CpvlVD?DbZK zLhrK))-1A#`4~@tJ$o#MP8)I}r$_&&r;li`BFYcuY`rs)bQ=hRgM7MEolm4Eu4)q& zuQ#G)EY54(FRW3T$g#diCkrmnoce}W!^+!S27cm{O;B3de)ha=y;})ML|8^P9iG&& z648n`nz(AyY4{Q({I)wr#^@OFaWcRXl%P*m8-M&WOmKbB(hV`|acJ)DzD=2$69Kt_ zzefhAS)r=Ud#!u3vTghKExemnRZo?06uYMGrhVzn`MYIWkM|Go$YO#s4tNB52y}i$ zxaz$=gMJ&zndFu^JEAz?#*PUyf*UT#yJ$6#c*H)`7)@+C)#e!SOHtZx69NuAbN zX9Gr?Qggy6=+>hm!oSD3E9m{zp|e6(COMBH$cZN%m5~8v2A-$grC&Os$VUHQE(7d_ zc!pMVD6eM{xV&51qqk8Xm7Skju0*z>#&Y&+5_;B(GLX)$rH-kNJHOL3tCzkoBl~WE z=L^$Y$GtLbN?o9zeta!Q7{qlNDtEiQ&sGoh-Y4EM^BklEb9CKwr^;O)Bywy1=xs`D zl^rIR+$Nidf(`e9ju6Ji@4Bc74b%%}n+l+s>K#@#15>Q?uX6ieopbY1zSp-3l0JWH zBYDuOr_won;Dp@0}^aFwrHYgeIh-0v3S4o|H+Uhq;x zjEjNXD5GKctJPUmy1s*n8=wwy1Pm!o9K>zR4o$A}M2qeIL*%t)Zpa6(aWfcqjFTw^7!UTDHW9$OUhP$3anqoHpMKWY~|1L&X zb+48t7`JPLxv^`Qo8hRjBYlK++_oabHajU&ta)rGvnSW9XQAz*fTZ*JL$xuFfbRC= zJNlNQ&xu8L`Qe@iM&J>Yw8lMH)CtO z=N(-7cKsv!epsC4#`Y^D?(UUApjg*`wAwrkg>5pB@t$67C>D{Qe14Bxs9B|-xiR`~_5q*LW9V}&!(7eh)gK3--O1^w8^)PW z>x}zgYqZ|?iE?qYU{1bfBuM~3<(zx{Okp}?{LoyT@k2Wr(aym~`@!^FT5x1mFR^01 zrzIL9*w~;hcKj7Q)TID8M-&mr@SzUx3;t9L4;4KGC9sW~6^1w;cpdTJu-nfb%{?^a zS$Tfy@$y>ytNAH2`s)<5-A;4a3A-TilcZN<&Md*{^&+3o0?S&i&ev4l!Xjmn4n>NOv zVszqw>4}A&hEn|8aJ3wbm{*iwf_TBI=ksTj(B?a@@r2Zhe%hn|oJ;f7Z_4+Q4us+Y zYTV;;k_!(lyvOZVL-2t29}z<&(pYeEBv?06at%5_8ZF~5+lM%4%S?`P7&Vz^42>?2 zxG}}RYYktusQKx2j=J5>=p@!EJzF+;GBy05szIHUDm+!algB{#@@52A_GV1L6qidg zmDA!&rg*7}2Camcue^zj-^>Y^Zr%3irXeF7!0c_5QCsERq)GZ#c6L^(B$gZ0wNlYA zg0g+jW)+u-7|z?7p)j`WqMt;EdAcq3wic;PYRxZv&NA>FBlp}H^LIsix7N*PlRa1D zIH@o6FiGLM5z&9b4T-J+6{xfIfcL81F*{%?09-niG8}!Q;B-B;uDey0i5>LuasZ)# z=o)V=1V;(Ql@dm9?Zr;H-|a3}Zv|Sqaf=P)CS~trI}?kDx(0WF9)P^|jI+hh$afE1 z!(;I#snR;hI$V3_i7gTEMW1Re6uHIlbsQnM;~XCiI%{7Hxgft1&RN0KYM@ZBp;$S0=Vyd)oB3Mc`iR#i^98yS7oR)_Fo!_#Ry- z84Dn48TxWLJ6#j5*+Xuto#Df7?7jAz&*jfp)T_=cN?F;FO7nkwm1*zZS6r_WHyT{m z`<@jdxK1@PP%1J>qW{cCoFBI-U2m-`d5hh!U{70&N{z((6Tfm5Jq`ISnwO zqFj8fzxEN#=lebN%(CgUjR@ZDJI}0fD$-^t0ZQC`_Iyf7ZFyv#nX91pHZCXa=dq1z z;A}PC?3RyRPwufy;k`X1k|eH=LYZ69qcjN3X9ch)Zl5=BI~89aJe|LGc?j`D1BYIv zEV6z8vNcGss@07-r3)*}F=w9mZ_!|kX&~5ajem~q=HS3jvSY1OP5xY=(8h2VDKX*` z^S8wKKkWvuZw);`uqmaP(>V4^B;rE8mN42yUDwZ&&eD4!?azyy={rR6L?i5!Gb8Bo z?Drl%4i#)JE9e1?OzHfS1m7?%mJ1(oOy>$R1Fzc#%f%j^U*3R18^nPMNt7EUn^@UV z_q=;dBsWbh90>nBq(gwMy@RbVT^Zl0MFk@-aW&={rprP+OD{MbvMRX+vCj6=YB%X& zz`p8UBBm>&M1XDQ_T>s03{x8U0fMLf&HzS7_1?$gtNR*xy7=T*hHsC53;B-i-l1mHq2FpC90Is^<=7 zS@!?BH^&f)ck;>d3%>HdQ>P`PielpgPcQDE=+1k=dVVDE=-DwOYqaBNomrW z_yZd1vh{+)NMHfq1^>40-1=35=~sG0Ol>H0xpw<~JJ`TVCi^cd*l@~s?oehVR4p&5 zBwh2$p0qIb@%G(|#haHV`77FoB>#{SMOe?ndieN~ zA79u%w-nB;b?9fuUAcJ40)QH@fXpn=DFftORRzwaB}1jqD%s^6XiWN zT2pN-w~$O_w&mehdB{Dg3zy)$yMudalW!HC@at^z!l=~Ng?07kIuL{!dBa3dEy9rS zD_rpXPKxpFjyIY8mv2_l#q~v(|7b}zL5wn#%K;8O9M-PMrD^Fte^qluob@dXaV`8k zgqOqxzx2&eVXZUzT}N1d9XcLt$7&|1b%{zic++wiy%h$AbzMqBT=U{cdpypQ+93;~ zJ6TtODJV31mG^xAvLb>}-QsYW1$KRV9D0LoKp~BTvVV@ZS{6AM)nC!t(~CpNT_mN0 zE3>aXeUde*zN^}HP%W}kGa4-I*Km99V>pfwa+kVPHUB+3KY({s4>MBu;jk1+ zHB*iC?u`VtE7iGU`noED?5r^jB>ygglzgI+JIL`1^DWvx$}QRAQ0X)+kuKthe=fxi zE5c}c_py7#qsxIyTf#KWY3E1_SWz_04aYw>Hu6%1>um}NUs^Nf+1D>HT)(1JjKIH~ z_>2wHG&iAAlsCWImaJ<~Al72HanEq*St<+(2yq<(bzU4{RpfGQ@|<6@O{gN)tWdN;XRlp zCw~pr_Ydx0^vbPZJ|+V;^^46cykBC(u6+^FKLY=}FJZeJ(Gc<#fobSBNO=`SGQoi^ z6?To6>#8JQfPDXZ$9${=V|_@V!!q8dBU|ngCwc1i+Du8fz#MNbd>$5Ott%*+mU!~3 z;bBX2NslZR57N}|lI##vU5ML$g?Z*eQpH+~l9HKM^bcGFM(OSdY+$6uvraRoI9>#4 z@XfN-pv>_7cz%?BZu<{2~s~TO6Osne{~nY|0FuC-bgU$5xyMc zajnp!$YA+)wvSrD|L^w~X3QrkC4-eIXla;-=x zlV2lKj@69!KPV@Gv46I}5GAbSc<^wMmH|S}egNACe9U%nkh6#3rY5OallZ?Okbq8w z6c(V0(E>xg>PtU+JAUl5;&4n3mbaI4?b_vtN{SCj_Aq#5+l~n-oY0(3*)P_iJ}-hb z#wTYOUZ-t47dbCo;ML1U0+h$nuEd199h7`aIzRX?)>2$3jZ?u1i(eUx|F%6+v;dF> zRfi6sAvLF)DllY*KqOudr%E|c_ORGuE*j8{XgECzPloR9+RoP^$K2mf+b%6!ipkc>gt$u z_^C@<@)yKT_h^@q%E*knSL-0la!HnS%WIc7yD0cUVY9=|%wy!A>4qo^Ng zJVBQt2%)_PRpJhsz3BC%!cgPSg#1T7F!Ks7VU-wOcd5N2s4uzyL5ji4H<+A=ix|f)xsii|iu{NNAj{(cu67cG$`>j#Bk6;0{_x}d2Tfb^CD|Zs#e~eAw zb?#&6HlA_AFbRLIT$o>=kr%-7pQOO!BJQ^G_sU<&Dj4S??ta4LC^j{N<}r(Plk4o8 zB9m81)~#Qum^Yk+KNP`c9SpaI#1U+JoJn%gK6Ez9rIk@C=a(juBjSD0koUGZr{9o4uA?YA2@X<`7+IRc*0aOon?) zL+sx|>FfwTr|i%Xvrb6xV*-b#n_{H;Dd4vp)`70!s$O_d{!@-WstXN|GoMGfjK5U# zvf2%%IQ-=5X5RG-Bv@M%NIhzY@+YYMn&CX&J?JADDhZEXX@;B(a~)FA7rX2|(M*LG}UEt+!GoT2NuYKS>nSW|P z+~uY(&*wA>g3hbKA{K=d)cqoD+GdWX``_seZFwj@>;oJ;PSMV|W~%zhin%YgmRqWl zbrE{sGfWZ?*Eeun!WUCVE48~!UewKvdEFDzi>jwtbe>O+NI=6eQ3Y`W*rm;I{Fjz% zzC+|w5MYUj=+0dnJSHh0@d7m+OHxdhVE2Q^J^0`F!~RLghwhyXor?U_w!b7cjG!4Y zfZS|vd_J#IyjG=0GZ0zJE{#rGo8QGLD{rh_Ln>4DuWMAXrNSx~6nn*P8s!IC zB<#Bz=l@)b&#El*<7M+e_v;}NMf4U7dbJC=-ER!8ZWQIZc}f|z#h@B8`jr8o@v~S_ zZ{T;q)P8la@^|C1L4=C-@ev|h4v|7jbNA~q&-Q6%n7mB`-z4Z*mOYZDFq3_e6{VXU z8Asfo#m>t1=8yY=R@Eofp9zkD)is=vbA|pOs|mvVZRGF%Ika1pbpC;o`g(&=5Tw4w zExrh6e{s)Mw=_nsp>{u*t@OrV9%>FPxF*8d$v$l9{yyb7Zlvf~?M;iGjKz+9Xkh;9-eq-^P5SzuG z)@piWY*kS~Lw9dDA6Xco6A{^piJ?KcJ zcB{&>8db7XZ#sVf)e776&34DSqIfVS-aM7iYyn!<*$i;sOnCS`Rk?4Hg5m~$ed^AX zX=?nFWpSeF)gNCeER03ey=#sMPn|W`MeN4Gl=d1hud^e@Q&8gr#E{XLWa^>jY1Y&0 zPAeqqR!UpGM+*XVPN%)OBS#Ghg8L(Hs!eqtzUe&)5qz`9RW;(G*^u&h0On;eF5m=B z5jnnBb&|b$-Q9BQbGqBnj(M}tNTNleXg`tm#5XTnRxRfmb)Ll}^&J5E0;=p z`Cva6*>?=fo`Vfhg=k&Jg8B~&Pr`y5WjQr&GZG zav(h1$z#8;+GCOwbiS!*DB|>WVwb$gdbDn1gurd5=Fv>Q=4qseie-aHUX)C{3P)*` zUXv1EU0#R6C=HcAv(hSzPz}*BN`aoRD$-6(m|RZOG6XLlQlJY-_F|TAnmX=+C=+$Z zCL7D5#dd$N{&eb+(FMBAGFF#v*Tc%(>a!ziWweW!j8N-kt9Sd~t+T4fK6W?ta?N~H zx9{Du0&Amv6k5sTLH;&%B!yciD$pn^k1}z!bC;;b5TKzvw&jwn(dD#~OxTj!3N{5y z=RL{-i%LqmIcr9qtncjndI|JEjTv4qz89(8(A^`DJ>EMx3sZFIw^=U~WIeY)#B(Ve zpXMDHjLqq|;^5%D)%rJo{8=;enHzsVfTOTz{`JOH*7Gap8cHK<`g;{p@6>jwXrU-E zo0ul40KeN9I$zde^~)^^k|d&$IU0>l%8Ox(--tE>YJb@GFLTd5k6tc6mtRMJwdg`M zqsXj3pSDX@FXn*yO7@o`k82=xq%6EV{JVpd0Cd-aQ(#r%v}_aN_%0HmE@NfgktW2v zBdT(AradlZ5fWP=Dv3%NXZsK);$_49Tl6uvbfm>M*o>$0Qld=&pZIr&fUZZv;&Bav zy3f1a)l5UzZJz*E3-;*^bEx6+tAll#u7)yJ&zY&?m!<24sBV((D94Y)weER$A03CUc{3 zRYACe3Us5G7&8{3@cL%I9fZD9R#?F0(T4fg47Gvi4;?Q&9nG6o8CRFr$6f2XP6W%t z-rih=Pv=a0Juao1^%mCeHbZKTp3T5#OQ)N@?=RL2Z27W-mzg`9$933>}74V^U^4ubDq8$V?Z57MfPj>wEabe$xQ)j=9 z&yb{0RQepKRxRU!$#6^9O#IILFW`S*OxdO}>zAH(KH93XgBz-F)ejXB5ktn7x8y*%9qib`j~q*(}OqDd{$mRIlDbOm+R- z)|g1Jn_ystuw}N~)Ty>x801}lwu;G<3m}G0HbU-%zu|htP4yZxk*TM8qR; zAkn4hWBA)H=9j(@k%~uiYh^_vL!vCk`lT5?8Xr$jkEX>D6tjyx z6v_rl=Irpp>Y60tsLrxb(i2(xcjfGjCgwO-L|6MHhS|T1dZ`nGIM!ZV>X>Rl%|{O2PRYAX=(5m|VAslM#55Ku z)R0ikb9=%vbgu#UUD{hzr?PGf=2bSDunbCmQ6Jvckm=XSnkSNZq8f|cEUd9S{6YlfL4-KZRa zC9Riv04^@GFlVl_@~55Dd+b>@FP~WYmHMIKeifi8t)KINLW8V$`O%?fR7Tzn8c}uQ zlY?MNV=-m_u9a-UNPcOh2_asElXPv^&%}dD5@fE2mP91N0 z+8)mprMEOSeeqwG(q~u_w z_^aZRvT-_oSN-UB{>g%tv`qhxueX4T;(gzT1wjcF0qK?yNr|OP>F(}^rMpu)1q7r^ zy1TnuTDrTWCH)T{UG)2V&w0;TJ?lC<`^??cRaiaKquAP|O=U#56wJ+QsKTsO_ z<~h!l$$PO?aC1+7;qL#Qw!gIDy^~D85V|F5k8t3-nk;jon6>3qy#ZeF`DL6w&wCY7 zw^z0cx*TAFP5X9mUbkg+R&!?OCSU)Nrgl#ul)WT(R7@bov?yw7zjD!`TK=;5a4xT9 zy>9?hz^-(vvHn1Vvk9Q^B+^OI+8XDg=e`xuxCna^?yQM;QDJi?IT1C6otFT=E8xbe z%KYVR(s9D+<&rGO`P&)xLQ~>sp~#Nx0s6_wQhxS^ooMFL2BsO>{GI)b)q+A{H7wcr z%`@HHk!`ZUB*#wz5+3rBO}_v(^Yz=_F)4rhy?nZAwVZMULvH^Ol6(M)dj= zR&9WtBfQSL6OnYceR7#2gD4#QcVhh?9_33%KXp}S;Ri$~+TDE35pFIH-r#!wtAum( zTWwKK*SC54`95lP6W_wX8ex-h{*lot29>xjielxA6v@tp&4r_#Fc{}jx0@0X+&|;h zO<$?8M9(JD!x>Gw@|~UM&f=Ta-(FrvbHa{mAngNN8M7$Rk_0LwK8W@0zy&Wj_gM{K$J|}3<(bVWsOgktQl05 zL6P#r0Nc^HP@#SSo3qb#-E4d`rFly5ura;#@Owf?!8e>S3;Dy*DFj=lHK60vkpRXe zh#X`tYi3G<$)Ra(8ZPwAu+X4`J1m=a5r0Vh@!~`w2O*n<&uC>dzAR}j@%YuFC*EV8 zlU2Q#H@jnK-0LIk40bUJt*Zu}@?u|Sc%ralith@VfzA53b8+eHBDl?D4f0r!DVO23 ztDL$Cnk@U3wzCdm|Fz*l9i~8la8Yl(fEyams#?BpDqB8o=A0_QZkC$GX`kfmGI-j> zym43+eom9$Jad_BfN)T1KLq|(#_2#yu^%Fdv0JXEKcX)3F}^50yY@=o_kFKLk(Ze$ zY(uT8h=wS22>$fRZM}m5cmUDn@zkRVS?jS`+sR9hX2C-wP6?Vt5ph==2Sfh#(_Z^# zyY9#0rM(Jnzb1;V&kOD}Y#0WSro8aRi9>Xs7wp`M7dNuVhBq`8v{12%KaFS4c+sHW zps}r;6{_!6bC zQi~Mcwc{^1q#PX89ljF|H}Cj)o9E08+>-O2hEagCZr*IX*7MTD7&xu*?%#@Sb|yc( z8k3xe_D`^`TW7F6$DtIhNNC={Q`d#|-xQtCCj4xFp_lYEB;2;UqIc(d?t-+DdDE!A zP$VxUeI5;YI^h|kv7Sg(m3#3fI)@pNnV#BM}z^{je9(pcli*#rm9+5Y3(iMyVnohHp7YxJRs z@_w;*+6U-YUF)4E>)5AwMN=EkWm6;%M%+E@$GF4I(*;b>ch`$Cc99Ofu$?a+CB53Q zn$62qDK=U5K4M#KCAO3D4?Y`E)|d2uRw;}laMpA!@VvpGAd7>GCpYCw0xa%lGLJ5u zM$qsnU1q|JzcqE8l!MZcv)vGW>YD}3ERzL-qAp4??iZr6qm$8BH|3Y{hZcFdG;Ena z+fFlQN})C~Z`q7HzFV9gf4kc;%}biuD4e+7@PozLn6V=>V~7^Q8Pv@cDVEv)e8;q; zJHviGW9)nxvpaE^2;A&?l60lpiW_?4D*t`zlw#gJXOX~KTQli)fw2*!@2PgemanPK z@Z5U&BHjX;EVdWrmJCMK0vpjH-6TljZj(p-orkxEyO!tquT#u3a14d!#)b36m_C{A zPJyuD-rWsCw&b~rks!X&j7p6h>Oqa-!sD6k3L=a=MXa~E{S*Ae2OOfm>UYgT>x!DW z*pD!iKF8;0E)Gt3D8$vK2rd?KduO-!1#FF^)g8sJp0zbMjTb7a7hOnj$Rs^eIv+kc z>(Ds~KD+xho^wvb)CGnkd?^dfpQeHdY`gGiZo>ff?(_+r9hL3FP5V4r!$9IbA1GWY zjHEw3tGC$REt?#eRcsvE&!-vY{(7yD;Bm&~l5;>kfIJ7zLiA6}&Yf!digf5Aa@fQu z$7w46NgbS=mwjlFQJg(EiD&~5RkN({XPkIiJBL1cL*tyEVzUct4kxCwFRG+&YV?Ap zT!qI*x?gYW7n*x%U=t*dv9FDrnmgG*zuYK;a8>c>n@GH8DbFgzK z;R%fb_gzA*^PGg2$v3e#iH?oQwHq8srUqT|y*lP7R%cO?xzpv6#-rUQAggnQ%P8zT zyZW&+%U@n~xxAMV(mPle33SOht-mf)HU?7iFVALkreH6O_uiV=9=0EDtJ*v-ECgqi zFtk0UnJnyw0-F|99d;Pde1`19-AI_nV*@d1g+_nrJk^?Mx)QcE9u{hu7HvANyVU%6)2uJYxd zUu~w|Id3J}*Q=#i#y+t>`Op|O$U6E1E%eJ-vc~0&x|DS6g0A`>Rt778)qKH0Ve|O|zm!tk!!JoT(4gxr@nQ@G2Xzm# zuPW43bbsMi9a#WYVe0nP_>*;caN%G+RKBB_*du~ngc^63tc;h}dRWzpByjXyR|q}? zw|jLD!kmAV8632mNM~{0gJ8}t0}_GMy+&mWVIk#30IRuTejkVa046*ff3TN1 z5s>5t*`;e!I=g3A`_ZT%M758+)B)(r9<+=G`6Ttj{k|&ifPGZ}WVT`$!A=<%ZT+s` z0^9&WekUMyhG>kA>_6O2v$^U{jK`z9|9uPTFJ`|5tSU{l zlnnC8%a;J$ut_(!og$HAKslZxv-o(-_5mBuZ-k!h2V{F z9UlR+;|M`LKfh__l^ULz^E`9?2V@v$Nx)cPwA^a&GHF#iM zUfp`(4bOLdCVnlkd(J%1RX_|5e=tC=9Dp*x?*_L8L3%s#c`Qpd#E}jSV9kNOl)Nh( z@tm$6=tDw2;6&I5JO2XBBxZyDMhWraMe0H7c8ZTl7}-Cy)xAiEl|~>j={NmnPNcFD z*ysobOvjRA3vsEJaQBcX42i;ndy3pgX194Rq-vSLsM=hkt2eDG#_CNE7^==atMR-$ z03U*(KD+0U&^Br)HJ-lGkPYRbregXhGzb7k8~AyLL7c1s{(j4-Q_u?rx!D@|ra9NV zi50VN+q4jakODXdUAYgmtUcd*)>iwoiM5m7q+Yv;bMItvh}gYy01g&^bV?G$%wEI6 zP)xKX-Wi9_symiLcYEfhhQa(5%N`)`&O6KzUWlbh|3@&$QwVa+1-0+wnusfCUA@s( zQ8F!nP}1N!d;nVzd-ga9La%ZB54v`qFL^=y(*PF6M0=$4!I)p#0WP0|1cmo-@GCgE z?6@%Y`zvNbpp~;J&Xl3X?@s1=K)V$P;r)6L1}?W}dzgew{^<8*IW(6|IaJD2{!N4H z`o@9W<{Aecu7CwI^)FF^+nXdA@YkNzqaL%S#1fhi10^(wb;BvAUZmmiYQ&=T186Gc z;+s7OR@Qbh-N(N#ctxQ_V)`^*ikg{Ok==ezY7{DNRFRUGE4fSc*lvSJFvsAY87}bx z#smO>PX38V@=#eG0{|4?2^31BhXVaR!(2k5c7= zc%*YCYup|8UEHko%_-_0lQUDog@;!@Xwv9jld>sp5KYb@vW$WDb!&hEaY@~TDJDk_ z$d1>t-Vb|mfnNiGPy9)IJH$u(P|1tr@-faO<^YmdG+5hW;0eTA0B{)|@;RGXW274+WD>1H|4lqSVI_Z5KmJ zd@;B_l*_vuZLcpa;I9Dh+f4ML=0ze&Rh3Lgk6RXMC};vO^TWcRy0yyI0v{8$d_cssjfa zv>!c?5dtZI-Pdx6`>i06I~swdHNIK+w&VimUij!t1UL@|OW#uf5!l%w6hJ;SAOM3h z4VQ1x`lF-)N^lMtE(RoG0DE06--gm6!?KV;E?$ckHj$#TMK@A#!OyM@OjjdAUGQ8P z3*sj{gkT_>NoN>#|53pwA?ViD`05BCLhD)qWy`oEKo5oL&VyJG&nqDBrw0rd{V`a= zyZgIOs3c0z5Ab+6;}UA6y*~B;o$v1pc=-l6yA{2ZEo2a>qj^uBE5=bURKL`yoy2%* z0`NvU|0!GKfNm$fZAb!g`iT2%j34EOZ=R{5Re#S`bw?>69mQ%Zg@n=9fWwfkZ_=cn_p| z+EYT!W23nA21xw_*O3L7m}wYdyAf<4MVyreon>?3D}hY+Pcx@TM3;NCOn8$;U=C)C(a*82M1 zB23mOzlTo5#D)H&Fp>&jT_2EWpF%1Cd1~Ntmlg7+-Rti9D6Gn%y({zZInN>g4d-+3 z!F6aRf5iC+x*iR1#`?Boxjfh^)dV!7ly}rEEf17d9mT_BF#l1O{S+tG z^zo%DP*1d*dp_t33MNksaQD8PX=F$QeR@wM;=GX>G^4m@I=?W4?}o@VkPz@JxQre; zh;4}du4AnvDFAv^d9F-wV8mAl1@(UGFk!UfHf)G#KY~sJp0SkY>u@1C>wX`4q^QS( zDy62%_u11@+=hTT`=29A9H8a$_LB%y9|9jg^u1_r&%pgDC=1P+&h*RxO`1P6=BVR| z@ldSWELZiEPPwK=vEsr$`?`9$cI!X^1z|M9a=cQ$2orW;GC(Z_tIg? z%l`_3bvUJR8H_BhtJ)NqR$aGH$slJ$gs~-KMAS&M9DtvM4sR}sxz5*IyR#0QTl__| zzR|nruDQ<5#&giNThD4XE%;9_*?4cN?A%p<;vp1_2pmv~%AipSh?(d`EY5@77S=kHN zQS;ays;d#-CrPj>26&7r z;ZMwqI%(`bRSuxImjF3G5r+NPx{}Q0@RyAGLR!{jL1vfTZfv#4hX#NBH9urgD&jXU zYhzewOXpCb-k4fL(>2#-#qACjXBM)r6-Q7_h(t7JITggo{FMLMpz!=e<7n5*Zjg=3 z#=_3!=}^l&%OGf?O&v_5Ml)RuM|FOXQM<2_V*oP~G%;&O9h5rRTj;HqlytCIy?QD;oC4Pu?j6QY>+UQe z+P1gdT7P}d$wnA|;+?iy61MQMuhLP~COhz~MLhpK;^uA1?V!5j>Yzb~ORVrgt2D*m zKPzVlgiK6=+vwdXSm;UvvOVxZ$uV^C;+;w+X}%&1BML~Vo!*gcZXEk=kjj zKhEd_xI8+v45MQ2bSY1u8 zYoJG1XxsOR0Yu`rPfgsHNR3Wv`w_qj&1)VOhtl5z&sUV0$3dI)HsX8)ej+k5vZB0u zxz9}5$zeV$QDK^TeNtj1M&bDy^Dnn%9jB$p7ZQ$2=jaV85j^tAv1n($kWGLInSjzk zM;BM84&#QD-n#uGX-ouafSPDx>~BMpKXX!MlM@w@P?#j0f9=2{KPMxAg9=wSfX6*g zb9uu>eWQytB@)_#DR<_C(s-s~Rnt7Wa&z}W{L$xS$6#Vw2?K+b+&3Fz;TDb3!W z{c+I$J^Q*7@Bl5KEV+($n+}X%|3YDEJpVpaJUTvCj=?MbwhXaVW$j5S#c+SmS$qs+ zgfR-}F#=uu$N5iDy|pKpf9*dck!MXMFX&_xJ|%HCZ#oDB+#Y8K&e-2qN3 zGa=7*;;bD!m2}}Clcz+O%xfz{ctJ;I@1_5@^&`v!&M&NZzSn-Sx~TPcbFb~FI(V+mnq!pGx-P-=Dy&9o11bLwd6yeef3AuC!vH8RL7Oa6sgitRr2n{wk zN0+K>hB-G`9atO|E`zKdi!+*3PU`c&&JsqKwfZIZ-pnz(qM3Le%2lgNa$LM%u3o9m1MKrK>ey9Zh8j|8B#!EX0ehf1=jFc#dSE zPE=Ds4zW<(=PtCed=F?l7i1L4ZxweLu>?b+RZNjK;`R3`Bi)jyqTKvgxljn9?q4-b zP#2X*M?w_HIh4hG?{MQsJ|QJ?f3zta%qbR5q{U{yUV5%T){g_j+-t1I3jY~rjz5MO z&OCCg#~Ov4xyB@|jByfNDvVf%zvwk^i{UA>_C%1~BYS^0wD6S-GrGe&VO}__zpp!u)=bz2UhS?ya??{ZGt*qO~o@ne2G??B? zM;hMwK%+9%pP|9LRA1k)U~E7M-8Org^^dUc50`>|HGyKg^4$#bnO7~TR>4FFVh)W9 zm*dmd=2LSTj_8F?&DC)$<;Lz3rl{iAa{q|xKY>jVwtN9kJ&MYyXRmjm!-Z3tKP159 zGZ0{N#YZ}}DKBOx@gRgNEao4c+Am9ocI3=;3I4QhXAy^mN79eAT$k2&mAoH$;o;(d z#HN>fxXIzPXrWQR;x{9@9@Rr1ZRlaTM7CR2qX*f`D7afV?f($R*YkbA#NIpU9Sg$TFdzZU64>dEG(^ZUETP11feqy?qs zHFR9bsDDb(g$KvRt4Nb;mdNYjXjU{GOxaY14i#zW>1PqEo}Y=X=fcz;?UP{*m6F9JiaUxAN826>ad6YqIQ95 z?ZAvfp-t2y&AFF7^e?&#n0l-gey&KkpLAeVRN1K<+UQDSD=uT>09%!^*skn>!ov1x z-u6{5To&&4P7sQk zIT$O~f`aT4@Sp^(vWoC^Tc6V2B6M`o%AyjFGG43eA$$%$hh{sMxhB1N!hXG^=~}#4 zE2z+N1s7XHYY*p_LrrP5jX!NwF_5VVg%L(Og8GzlGl8eC+m@E%L%in^{D2=I!s&0S zgqz?2M!Q2QYMK&fJs8lul$BWF_wl~Y05D|?P1{I02K6#Pqb1@tpe@V|u|bmWXRK73 zC7lF=k76i%fh8K>FEO<0b8@m@rd@CrM`N}b-|P0P?x`)q0~sLusJk-gJ3IR@+r; zck-mcVxQh5`0?SK&m6&lf4z&=ImQ=#L|&8bmE4gJW-;%a*#3%8ED8{zvA2j1I6hiT zooymi78Zoo7m^x7icTqjD;vy&YWVzhTjeYJ)XYZI;sfrG`sxDzs*FkV83C_~=%9P) z*#XicRekN{%g4jbyisOU(CjOtQ+OX(X7~LlDe=?~XT8&D8!gA`udaDo9vhwueMXAXY|3-@8VfGTML`p$*!=`2NX2X9QI$#b;wymt5pC z$`}=$xUPDck;1x$SCp~TUG{;US+m6iY+mALlm%BRhDtslGg000Oc5f{YlC>IeO;%< zm@;enG|eB^&ezDFFACnm!a6B=TnE7B9n3nqG_rQAgWx``gIX*d#wmuC3btJ&JQy)u zjflM^_dj0m4BBLbvEUhLR+0~$MNNVmjD;W8s&#OmD_y!ytbO@khv9MCNTVQDs06}> zB{yo-I>xU(24WClNC4@lT-f-o`aT*FjOuU5R^q@$(rO^i^S0#2IT7bH!jaz5C?4Yc zb#fGd{!OC*{p+gEoW~4Wx~MyD$IVY3Ts_Y(Tra}7=u+U7v>%d%UJQywJWr6SH>sTGfuL{Nj*>GA7y4?DSYdazR&u6MJB zjNCG)rR#s(oEs+b#0E=4p9bEjN)oL}fku^N(&)LPtWHiYrU49K663GMQC}E+cw8yO zP?S1DYj?&Nhb^y!x<3fc&T4?62+CRd$CrM_&;+C92`*HxM`un_a*jQnXKu=wi0^_P zi;ZbIXxgeeK!lMMeMc}XSlw$)Pci2}4c&ER(on+WXu)}d#yqTkW-ZT^xN?=Nld`>9 z+0}CUZyq{FPR)!5Ttr2bB1pL{wnLC|RznM3$BrT_6rHoEbka7rlS*D`EEd6xq9IO~ zVknm|oxhWfcu1K&@&*YA@2&UY{fHW*ZrmDKhyD38nu@<1$C%q{a2@?*ASnKAzan)g z>S&n_rb!^x;Jo&t3_~V*U*q<9O=_HeXwGiTaB5kej7hVGc=$TnhRVf3DoJM`^+aX# zk099ZAE+tRa^;oAbp|*2H+3CSPmAw%vurO#?6`1aqT^A+;HW3e`$&GIKU~jSVb2(_ zF#SG77#5LOY-x-UHmZ0h-F!B>DLB-?2ZVPAp3d&BNRCleq$-~THdAIw$gz6|d-o~R zElMoryfnm2n7^Wb6Gxh)&9}*xlPM-Xmz|L%BsiN!m3DsW`!|&N$y?sX?OEVHn%>cc z+^K7;S0PtV17s@A(UEPt*8mzsolZO+tK-y(3CdMsIiSrYGp^@#nb(jUx2-)EVl})+3)~Z(CD_ z;jtNm*6dvPbO*i}NS7Ef!=1zZN1zs2iA=rRxnK*`=2XQsYMbQdZ3MTlJ zc3oZB`?xOWo%UBI=mWFK6ufrsa&N7CFtRXNHKo+rmW~7u63*8@PmAqJ)>|o%{8zNz z*HO+u9TjOBG%+})RFKP)H49E+YQp7op#w)`Y4?K`;sf(zf+meuFSnSKB?Q*H&Lh@C zt?Cz)Dfph9BefI5BZAQt`T0Y>+icxoiLTD<>N%M)F|ejzBy?S{TNw?YO$V4biv`ya z6L33H%$Ta$)ayrQbzeIRL>d_tw8R8c_q>V#r=jb@qEqG>Gkt3vw8K=B_BurkJ()bq z>N7 z1WZFd+lsa7>%OpXsQ z9u1en7~eqSpnWLdd7wYsJC8k1j#3uVS>wuraR)sE-@HP#B--dWwm9m`jylIYPz3V) z0Bddo36Kg>0Mp8)o)C$IrpDIORNs-4%P&-AY*i754YtXqRk1UPoeEIZ5KX)`G}j*b zs*`B<0Wit_%Y-d5WUq-^rPWO1g36O@8s&@Z17@1kPEy~kojrbw#ej*Kn=|tbMSAF% zAaH5h%u-z^=JygztZUkVh7qh}(uS4w<^_g=Ls?z>Ol?ZYUP2aArV#S>@uc6a!#`Jc&7#0dKJ57g4W25bii&v zN-Je0z6#Y<=Lr^=t@6vCVsm?cpa?}d`Fy-g!Nv6{{fmH9yubnD6r4U%*=kijPP<#6 z#z`zQSpCPtv4ABTzxz%PQ&s_+F#)GMl$;raa(#{)WMVWG?6O*=%gi{YV~W*`=R!3x2?QxDMGQ&t zur#_6Ir4gqkq%guas3M3Az2LI34b}l2t!G@r9}-3mx$|M5Wql7ro#`igMB_H6WCPP z|Eco&G|?VN9rlc2@ue~eV~Ax|kY)!ExEBlHxhs|=!+t7Ha;36F#pP08$0JYJeg-_Z zTX2%HAhXURteU*+#n+z%Wfg}{2t}`zB(h1-LbvW%@nmGDi28G}j6*a0CA8)J?4-3WKcGihnS;ML>jca>4+`x&06@01khDE z`p)YV##CNVy+jBvHlMZEv`dcu>Zt&(BGTvmN4&(qLJfQvW_O$>PdLF%J`-GD~(`_lwf*Bn{d1U<7Q2YxnHcvSUztIDy!R1b&G@= z8(YcsV>T_Pfo0NQU8XJt#SoK>GLpyn-TOHCjqj$qRP*_LD`#X*=W3x@X>k*x!u(0c zz=K!NYFn7SKaG7j)ywXO0+81L5}^8%_RB1_OsP3eagNIPV-%Cy?br()n_H27u=qvX zErtD@&^Go~ebLQc2xKpSh%uA{Tp$ee^^9`G$X0&+@J&WoODo7gBhgqm`r@aYT8}lw zhZ7f9qJ>xrgHVUZ`@$NAU0Dimwmc4wXc1X7ZB&G)Sm?V(e%N`Yrudb~=J@oR5p$;9_2s@c)- zrz6*gi5KpqE3mzzP0Gamais;CrLU+J*$Y?#+~}q`v%#dQR7&Qmq~?yYpK&VXlG3MP zoxV_EtW}VRXUlyLs#K8G-v9YAU%GJN=m+gVg$~mYNDtx( zlSRTKZ6?CkE5AI6)?e@ywtHC3^V0fmfUYRI6Yji1K98aHk4_j?$72x-j#f)U4&Ur`*V{jS1zl3kQP zq4M7Rg6E*=>1i^c<*s$nuVhglQ_vuEl`5Lid^4Q zqTogg2oYkepA;C9n7Ck3p0TMY?AY$oKzVMDkeJ|w6teaAyD%_wrDm-{IYBp zoN+WR_o_}>+l;6@@p(=hf+jGdP+p9TUf0uIhYY?5z38BCYRy7mrwoKz_S4DOdG)3W zBx0uc7*-$avFhqgad=S`2O4xe?Xm9aDRTPox+Dac5d|X75NIIT%~oWqqvI2|8(xm;XnhG(4DME21ztR^w0uxqnQX`n!x;xNP;vq z|I~5@kC`SKD}gpO zN8`w+hU5B^DTkaXfxe=MOhPI_T$LmCuNewy+24OZj9~a-9fV%O@JfJh zXbdqUO7?7gNRvfimQxX5O!YXEFZqq3dan`jzT5Jf#q%Lv;UQo18N-X*)3esI<;0y- zkuav!t1O(d6q(g#rFpKj+xqEdl%~5gxRXNTQs>i``;M5o45&8XzE7bXiUPf{CmwZZ zjVJV`s_L2zvrk$YQN@A-qWN`SG8XfqW}+|fOdFwQM!4{)r?Ksb)y%I`wy)G$hOM|z z2Y<$_z&~6@ImxG-z8)(7B&Fd>6s@GNe4XLY!$Q6L=5#t0~cKoibW_OM~45EqZ@VY+S9kUAw#D> zm(ab$H8}~IP`6XA7D8xHW=ddSr>Bp3m9ZOM=NT6;5zoc>Wu1g*?U1cR9v<-}g3cjJ ziH!B+N+@~AXTX~QC@5lQV;Ly4R>q?ErW@5*-L04)EcKCQbGp^s!2ryEjeia$HHWF% zb^4zPiW1C2y?S!AKSs8yDF-8{T@`&f24^?M6^HhBSl|h>;RBd5Yipmt-w(BXJds<0 zX(HO>c#=(OlYzdHc z;C+S;I~7yr{M(6H#nJ5zF|-a}Z?$+4aE2D+?Pz#5>c*nPc_L_21a#JU*$bOiZhxM) zT>iipg)II$=ec?d1NU6u=4{p&%I?21`Ofc|9$4^ zT_(=6lqwi)VjPySp$x$-Ay$JR6u~%QM`{VL)RrN}B1^pHL`qdTjGtJzt#}bVJn|uY zJc9o&;5p50##<|egRs=sKfDS&=j@fQ^9X)#*Gec(X~y_RsZG{~ibD?UC!Pb|DyH*w zFzXG(WJx_Ox#~Y>a^H!J`i(3c@(uN!Id&g&)cDVq{5s2EnOyc~XoNAb(ENxN>hfbx zzU5=a&q;GyE>{=$0MHYYO=OO<59|%=_@~w9#8OhBcC6|w_GuWrwZT@yNp|E8FVd|R z-|v}kb)~XnM4#JZ0IeP$x%@r9aq}9tfTuP zKVz?3f`(jZVKuEF$fAdiM`!tDPf{|&WuK{ma{pEG+}Ov+>LP&!qfodfR!)add*B29 zmZZ=!&{@rt6ZYc5Z1`w>wbs0^x?>(4!R&%UIGZ(I8q;_0sSDip+#y1>OSGE(^9iLV z)736|1Z6=b;9VKL{rS*X`l)4N)!>n)3;vt0`A;mGn_uYbmPdUy5qQZk38pBp^VpKm zYqY|L^M8YPVyTZVp}x-#&~Xo)VQB?Lq;U2G#w?!%F`KvDUKX-AEYrV^?l1k^HbdSX zv6*7%x6aVP9njOoUfS*f!yaCdK6uEly^lR7uNiQ9^h>~euxtGnn|GDCMJMrg_tCiM ztY{m(P@s$LXu>D<2jeCqGu=SvrXy>wzaD}=wQF)nVC7OsTXN_gvaicaraW?1%AhJvRHw7^M@wJDxF`+ zqFc%;;p_-rTIVPYx^6_UmAyG^H<-r?x~nMgb@TSf{!jZ$+~v7O*=d(8Md6lD{Et>T zwbueYtz25)Ve{2+&~qsB<~9xcHpq)g;Tg3;Ayb8&>!%yo!P37bR(l=xUX8;QUp%h= zXlY(ln&X@2$5>--EQhJD^15TMX|E*kyH2`QmuYj`&1!WCLc?Mh9QT9ZcB&V{uKT=( zP%*4Z!EY7TpRbH2JpD1l&s`QvotcX6i_HVvGIZ=d$a@=;Nsd$FJ>ShX;&IFvc7~xd z)`(Ne)QFfJ_B=I*3iaTei7^%9`Rf*^ei4}uQnGTTli>Io!m_Wg8rjVQWpJD69Ywto zSIg!ES>=Hrt2&1H-@NR&ny+I__|DP5ISza zY3#=Tv{*}cZcIM(^oq@SWNJLnyq25R;aPgd6q2AhR8Ts#%|E!rT5Z@%nU6f=jhMlR zBGQ^sh>9M}Y}ag-m5ZS(sykAO^8RQ1=FjZx1ID|osiBb_UQmc2O4X*rz%IKp+9%L@ z+bJokhYt4pm`%xFdVdLf=48mvvE3tLqn=+ozCdvF+E5q-HWB@VVMSbRPZ!e{+vhFx z@{R}7OtF4>xUjWQw6D}u93=93-e^n6Om7O;%^8*{fP9>Gz)v(rE5j8l1bsbmA9jXD zcafF5kJ-F))?_T*ANYB`FKVSQpgZ%50G^_BJq4;S1Ey=i>w5jACoC!DuPkZ}LFmL! z^A*rqXD0&DC0WhYld)U`M2ZFZJdKQz+7z2$OekZP&e=QYRa{ZrE{%mwG&@Um#RI4` z!k<=uCTdQHyW~|jGKwC~;G*rLu$J{pA`J=cx(Dy-31-6rT#mcTmeC?F$KLkE!GWF4 z39}LM*KIaqaG4XKE+by+_YAtGdUd7u8aF5HQ%2maryE46F*312xU;#kB7m{2-p^9#?#V%7W^`o6cfIKwA(U3ORmBS2VXgU90H?lW32TeWiq|V&Mq_Zj2BWDTxHpvw3P=j3T7a`*| zJ|8hRxZ$mY_}_%1OA0WFl+9Zz7I(L^$LN-p6Kr1Ww<00gzW$`?9aQnY0^h7lKIP^I zF?v(3l-#Sa^nN7_DM5K;=Y={0XlS$<=>ATbK{{;7=frLC$prn*ZGm&hl7v)qZE;E! zcI*pIhxQHEckEW0p%$Ya#3w;EpC;YlyX(qIUG1Res4=W+Y4P}vACvr(AUlA(j4nzX zH|c^?;xNprhJWk6bzssF=-2PKsz&=Eu9keLkJrlJWuf8F%4zf%%QtiZ6|Q;g6>~33 zq@iXjOu;(AW)6QgtL+b{L%1gI{TXo3YU6VH?AjMyu`Lj0IWg*x`zQr`F|+yABInIY z@G#h)uEvYahd!E-#On}^UCX}94brQoq#E=su7@f{JRIw$&5(DD&FsNA$o-+z4Lkzp zthA}0MH^a|ef;DnFe9`4+$ut9d8OBMgbGF| zHZ+AWq6jxe9JZtjIv1ljKf8i4MpUJPL)W)0PcJgwjQjF-&(O&!_=yN2zQ8*K^~l;| z8L@dKJyrdN9aTxBgsS!gu z5ke@Sl%ZBW{P^BV)yS-UqNV3iyLofRFE+0zFH@@N8qAfJ06UyrDNakQdQA%+2Y0*$ znH07n=CSy5&l<<7ie;HYAhD2PudDC$Bmz~iz<=fBR^%V=;h4y9vWXvOsX`o>VEyE4hgT#M3FP6 z!Hjw`5QDg%9O~rmMINCo{-AO6_X=$g)7sM!%RK~V0c7@eCnYBnQtMfyRY7*iRFDI5 z)%b`!-MM?nX?Q^7rCq*NcOSi;Fmx>QnxLOiu1XknrhB5h9kct)qtA;JbbB-@ZAY!9 z1uFGVRM8D}e%|zc4!>mnPIP#G9K{l=o9S1d~%Vycz;( zUsHPXB+D#Ft|!JKDjoNR5WZuH_nz(_OjJu)&-+&QpI!(kfzOAFQ+nEB1b3|VrAC># z492SEw47EyXE~55ON5Wvf+N;#$;FFb{Qd_iV!x2y+7Ts{HkSAMz&G0$x{i+DomnM7 zZ8o*fy+9yKg;%essh@MDSnxTP7fkFSPeuB!+a4s;7DX9RZN@*H{WE6ux+MJe67x%V zzuE$ZFECv2aG<)~py)m2RcH5f!s0 zgTN`G2LtxnMNQ4IcjFSa9RHYyXVLB<>K!pRK;#%>(e59+IDr3S=69U#6>5Rgr${s& zF;iFc8thOjSK}3=9*>NG>gM~4um_5GrmLh6;a)>}cal%vVB~lhR^ndpbut2jY|`;p z#0A@t=wLsD*oSVAq~zT_c?I*NMdP7t|4Qfua3`kZIT*}SgLp6EVy7kEi{aA$y;3S6 zpb0}?t0<9uI8W|}7B~|D4jkG%tQXFS{}cg2TFWm}bE+&iyg45(Tu2&P;GOLI!2+CD ztJQ<vF9c@w(w5Vm#& zR9Q&+motR_pZ7#Kz*zkEt0e9bKPbU#W?oI%9g3#1I=wc(-FbTc&U7}Pf;`y_^~9b_ zdB#7Us&|wN`nBr2W)NL$*{qx)4PFkWImfg_wqeScb$4#U0-%Qz%H) z{y~SR>ZOQ+3fpm6nN(s@{mVLreXdXI71H9$5mecHjQa?BtY&hu3MBn+k;Utwl_hW{ zKBM(oi|~yV@x+V?bOu4v@+k~9^kZhXkXIAtSFcJQKS=riykQ_JdC3Q=^BB_WQu=pV z0!R_s>w7^-lzK8eHCaZR+n?|K;b3T1N&GdNw~|ZF-Y+{-b1jhCEpB9n<=n66yL)WF z$p!EK9AuB2nqz<=T*dqMOC&D^Ti`hB80^)nLw{ym57r$RViCXWr^0;^{?2sU`-HaX zdG`?|9Cro$vZhDR%BC$_x5OGY#DH2F0E=Lv{o?e`AVx?Wn&O#qaWWLkuQROFe1hff z!zVG(yuO6G`uy6|cX#i+_2z^q56pnWU{`iPYxcHHWay z)BvYqn(~?Eg8bei_-WHFaO3rAV5n`C_ z9lxrX?02E*@dU2_I|@FoAMd41YDj0B-5)FZf&pEDnu0OV0Qb+i@x7ENDZ4K>$RBmL zyyIxT9ELk&dx91s#z{=ZPnoq8q@DWVYZ<)Vc^h>>!>`v0?yE4B%k>KF9=kfnqOI3H zyuU|UN|?Zei#o(fi}vrllkhD(rj^lF+U!c#CMH75HTy5WAEJWf1@Li7+R|~##l#p( zm){JRXWZz+@YE!1J$?dzR;2k>!YzXz3>F{$+pP`0_TpBiAGAB8o!#8l_81#2B{g2> zbnRGPLQga>@}DODZ@lD2ebn@O-ZZ+N%;mbjWqggD_%#zm3hQXOoh}?UH>cjUBNEGt zWX4yLkHMo4tCaQiIzk^X=uUOmq(Dz{AuE&1a^%FN9@-=zU6-i;8&y&k9Xe3P-Sx%sxTuP2DG1z_K^*6+u>~6#@g-T_ z;Z1TkBZ`Z})kJ&tXcpxpYLLfl zZ@Sp1Nvt*-bZR#_W*OT^H!P+;R;TaA9(eU{dQI(CYLup{h{+c{j86to?|}`ND*@Uu zW=5l=JZ}{Zfyq!NhIJ?Nsh+}518vyK5>7Z`|KAt|(&sNrL>Z}|+yltcJ9(-0f_9e` z!wJTn)+rco*1r0Z6<{HP(8lD*W$A=EzurAHN7Eh*j2z}>M|b6Z<##x?*abYn5_Yki zdI(x{SUBr?6b@WB9vfY-Y-rJTk!#UP6ay|LP26am(DcB0;!sdRHTF3z$aq7)U_69h zbFWtI0r32y3N0r0uG$r~%nogG;G@Zh7g|tu0OX(W?ElXCa!c%g?gV@>)XZnF=ndeg zV@!`ncu#?F>B{wNK`}fgycrJ}zK(zzC3W#4cF}hghgSJRl!|31f)wzy&$^N*#QzU}}-|c)*yUb7N{+2|UG50yCNvCjJM|l_(Tf-0HcRX+%9G#z@ z!iOM#_qcoJTS0RBj2=u3N`R~FJvm;byh5v{2vYPb1r6_%*L zI9u)qT^oQWhLkY5USL<;41Ej;m{6$*SdY0Vmux+X-o)@JF_>~QE*P~|AMRV_mUtWl z%ty$9%noN64jKE^1U_%xoYZ;8C+CmVgfn*wzcboTPe%6(aMo&DXh(LB{7Z-_` z^COb~4Nu=kq0uMBTtR44a!QD%>R}s_4T#8r1n8;_zkbTH+$}ews3_sk=D>b@zr>yV z@o?%FeAxNI_vP10pF_JOf8jnMiThXZbyLMofH8rc?oqfc~#W&_9(J@DZu!3B95$$gM#y(DcdTcB5^J zYhrnnY|#Mt%gkFg0Pqt;r&Q>aPh1V%ZtAY|*wA13e{8*FR9wr}HGF~u5AGU5AVCw{ z2@u@fY1|zecXxt^#@!*fySux)yK8@)drr>1-!tA{-Sp@|?_Im9)><{^Tr)pFMlr@nK#c$3HJC-lLgU})KwL5^+r zLot{aBn8!EvH}#8u7?Bbjwjf|wuFsF#-SCaUoHzUUn3THwq*Z(2spHmA4PIB z!!hc+-|202dH?^PgTEn}Csld_T}$^%-~LKF=GTQM^x?5^=pPr)==I=r8u)h)xZyn@ z+neb~f}`s3T;+PNi?j9DS99B!xro!JxvT>QUU(6q4*z>otZB;i&3FH#7^=U1=K=GD zYW2ihiG+}LJ^wd&G&7v&H=qTujF=RbMOJiz8U?ayv823S-_Xz)(Z0Du3fg!DfCJap z$E9#*Z&SG9|IdpVhtSIwoPV>e>2ymQ;UmaPZg6`wN*Vwh z@9wN$XnbG%#)m-_Wr?gYjaCY-QY{Qhsz>+)^J@?ku_ld)~*kskbY4lQA zoyR~0Ky`I>P>mG~i(!TU2&XFC+@J8@)E6n#+l~JwFtx!H=5UY(Juav-DGqvXY+ciw z>CoKF*iL3URSarsR1d1cTCG9_js&exGm*N zr*6}E0*@*~9(2 zuu^`5K>5y?`4=VC*Mx^9uZ+VOGTyXXF2hD)w8nxAubP$Ndta03DpOEe?(GK{)A}rG zXK`>>#}7`Jur{ss$)~snf^~&82^eStLMtz-z^&M4_m`eIS_k2^hrBlLBEjJFb#My2 zd4pON&TL*ILqtZNgvUXZ>}?@V$?N8j4KN(RbFm|MDCD-UF8gjJnfA>{uxX>garHiy z-Jco`BjMZgm=6LMvSZ4h;06J7$tDo+-b)3rcocq2w1vKLZiW|U9k24bmPVe#=|hc=M-JOw&ABePJ?Kw+xp8gMP2D5AgE}r#L|XaQ@?P4{G$+=3@;tDBz!g;FUAXzG4y3g zsB$gS-YVR(b!Rs=?W0p+w=e!D4GZ(?+Wu15A62zfy$_E|k{5b78fp=xsf`MM=#OVdzR#Li1I1)igbiQM?0H1O&}T|$v-w=0TgTktB0KK8(R`2@7WrQP z3ap*(;5w`=dYQr9$`{HHqWNc~|4@XvAK^pDQ-H0c@;pDT7P-9ta5qx$sxJ=+s8?i= z&W9HC6Re+}@VRW}h9Sm~5F)8vxg0-pWS^Lx3DF^gr_wBp4Bevg$)T_*6#IUY8x~_{ zK{VY-aXzA-f8pl#ZbM*=Y&~I2w+<=b(j|pqDD2W@+Oq;-3}D(}X&9iYl@i4@C@z?@@tE`3*hf_hHJg=~L#5Tf?x z{z4cY5rMD7J;#py(q}Q4luLZx{k!bK8e+PW)P8iNdLs1MBE&1XpV6i@kfPHtll3@A zL6fIt&6CBIxN1@@Is&?_8AXDPzK-^Q_QIOEEC0Z$L6J#!3zmbA$&nZ9o*=$ z8zn`}FxDiz0e;X_U&#O_&zIgOH!jf-6~c9iLkXZ|8Dn9$P@)+bBFW-L-#u_5~+ zqq1cvpZcxNz1DplZfqkzq7*_lgQ+1x_qqJ8DjsW?2QPR){>#PCrKk#SC8npUkF-5) zSGl>|>a%+#pIRvTtiwUvMe$5xsIq!EJ5b5Lh8%sC5x_@CTw7JqRjIo4FvMlEK$BqA zIrMQaWGeS#0mpV9WByb?bS|Z^jm|fiVQ(Ac{-+kX!?I5dRV7nhQp7gk)wV96!!Y@% zX2IU6lJjn>8T$4mt&@yY$rs+H{EFJJlPZpMiGSiGnNRn}Z&%sfsa&`2X$Z`BcUw0v zedDwMyT(RWT7Idfj864B3%0PD_SF}Waqe-xF`lg*NS?O~YF`!XlT*PYZ89w@AGlSB zZQm$9DR?|o_}~kI=gqnfS1X7>G*hb_#>1Xg)R9O$;YX0OX=p-CbbUHscnKO`=KG=e zSA=t(M9nkf0FtDUtP=>;vJFgsZK*-RW@T*7R{MNX)o*%$11tTCTg+4=tHAXYyOB0i zI*}fG-oNIV^qtT+!?Wv-z1LWX0-o~)Su^S5F$_Q5CUEPpd?hL}str1_8vVUgEV@bH z*adz1;^&qGd=X8mhJTafAHN{9=!9PieUW2SK0Y>RZrXeXA;$6Xh9)K^X*LgbA-S{D z<9ahq)_s%@on3WvFrt;xd;pDN06 zx~0>`5Rz&moc4+rUTzO;cs?tjUE!Y7EYtB0HBBVF`$=9!=0kzjkiZDM883Rsw4SA` z09ww_B!lkz*Nt}c=UK~}PiWCpkjatbP}m8=!Jg5RSUTek@89zbKThq-Zen^2ytoC= zhwXXl(zq5Qy*GvXu4*3zZ`LVIH$6?PxTMq}CGiQbT9X&o!?ki(KYuK> zFCpTnLQGqolas5$c+FEnajDW)Q1d0Qmy*Nr+hPN;xk?ngsXE{eGH87>QoAUX%^X!n zxIUXnD!1eSsLr)UJ$z<4etQkLqM?uYAwi_+Y{tqlPeo3iPgEu<{FW&JAoaXL?>q@e z#DQUnI#%HyVKZyU^9Au?38zyq-QRu4r`4rPD(DGSq%P^PI${Sly?8Z4M`&r)@8~Ev z?3=!H)!z*@Ra_<3W;WH%i*v76vPVHUZFn<+xs z>n^m-u95o1l%i-AM1(QhZKz1Mx_@eFVk`Df+!>JaUPFv=^W@+pghv(@(DRw4ZZj{I z5XHll2BeG^@%jVU?FSaiZy<^U0M%E^>39mEA!mN604BOKmwRH{?}(RIbQix_#+Z;| zB!gAWW4n(f`kK&y1FTT;b=s5K7eq-Z%WrwMftm0l?}(P^Lx#Y1CZ=&kb)JB>LuLyO zkCeDgfflW^5E-UWuQ~xz4N5?Rb4D%V$E1T<<7h-{hJigvSs3OI1-Sz*R_OB%3sk=6 zzlgX#mF0|S)`vggssN5E5gPcEMHMc@wfLnb^l`gE&o@mtx}vSQE5D*34)c`R0rJe<8l`m%P*mI3`>esOae9G(mm@RY+7e#bD@Ri%6WE zBI|p3-v(()ZK_ZIm?&ylG?d?}2U~UVQm!FyJ~QE}4iUuMRdi#L4LOt8SLEWDRroF< zl@ot+6mI-jHqvtw(;|gEbKPU-0Y&P3fPy~N3&S#UsYa6^)7G?s!(Hq6xpHz^3%$Or z5rb5%3d*a}GTY#BI7Gcb%@?F<<+9BkQNc=)VAgdhIIi-&M50#@hDM7(cO+P|ZwyfT zy*%+$D-@cLW;5^%A6aK7zYTS*<4RTWN7N4awN<_0XU2erg5?&8!+SHE| z?f10lVErxeZHd2LH@t~32lmSBLe@U|CM6sm(>})pn*+F=vEEel%OkOr2XmS=>|%sb z1EGmySfO9PXk!kQmSUhXFN7khLYf26lxUf@QZIG#>kXJ{R?nTP1qRofTRThPMd8fJ z{w48x-Gn#VFKn|UZV;T|C?SXNoc>Hr?U>3klQlF8a&JE0S4ZB>$*%T7Q!-qTlVGWd zsp@7%G?UZT{09y3Q6z_;nDIu*`l&cR8TDSw%(d$&@OtW2OO-e(^eoax%k$#7hOq3w z=aibE6UQtQCD!gyvRZNZa`5)T-bK5|ovOa1j7*aiITWxA!fQRAMYAPiDHPL);!g#7v3bLfhyg_)S_=6)Hq_L-qg8xh^8w)gbJ89 zq`Qf#bRSB%Nsu_1VmK2Dt6%F$fC|xf>IH?*pkK$gRPcS-_$6e$)8Mz#Il75q8Er#FG2~)1pyKm0AkW|Qo7-| zv!EUA%V1HQ=!zgA9Yx)fmY>I;2+euLiAiB5CTUYW8i zW?PcrHcfNmVOGf6IE*n=(q53kO6I%VlXgF^6U!Rc&ZRUwnKks@c5T*en5GjHYOW0+ zxZFu=JYVM|^0+Hi=AjWTdiKVNu_#^zzohp+=6d}kD}bHic792;>Z`aDgCgEIur(cK zuInyBQd2e)Rt#&YonZ(6n@#3my-_d9op!MQMPXwPuQ)=ckYAxVl~z=<=tkl>Zig^q z2}F&+UU2{vVOOT4#%#XQfpgk@Wx{W!`Gw~XKW2#e+WlOI2O&sNKs01 zoF*&BSka-l=u<>*jzY!daluV_S@C|JfI2gRKVH4Z&XY{OB2g_Hg?V*_>{LmbM(9Vv zuxE^H9J8*?PJApMTDO#VP*TWbc(_R=RJv-tsRauVOoRnFUY>q5bjhGw#TZXXmXyG* zyN0XK7Ta9Mkdvw65dTLom#dT~BRmZ3YzO1jdgQQHMj@c&R? z=loa(`V`xbmLOg6<;s;JG+!NhT8iX-_v8q} z#hhm6^dJ^>JT#-qBatB_uODXpFFITZVQ;Eq3_FQ>hInqmjY+#vP#1Ur-`RSJeq>Ror%2 ziX5>;DaddvEW{qc@aKz<#rvsh(rc*vKDB9Hr$Sv(JG3PzQUj8FA#%F8(%o?zx~pq` zujvl8G6ED*gowr4g~10ylh2ya);K&g-vockshFM?u!M}*=*@k3m;hhqjDXY%ACI2L z47pkymiIPlh!ek2yg(r=37m8)UcBbUuSP~WYEMcA8tMwB zAyx$8;QJ(`ijkb@M#N}!MIr?!89D-*QW==kTo!EQm^YZer;Dp*7$y0*9_}z^*948S zNw2_2_N-bKgxRwXVYbzHA4OlCVI!?6es;051_s*{3$1X?*fDSuOgjuriP#L?y=#B3 z>|G&*iNylMu?0^LHAmh+i0v>d5dIWM`GkVRjesXELJ=xXMSQqMz%t$qIA~|BqY&( zu3zpa>%SB(kn)JEU{$D-#vaX6P$U~nl*}wt4>!+Ozie^Yl*IC*q?xBp;?v*CP4W{C zW`f+sfFKX{v3lp4SPb zAG_{%f$T8a1I#arxj35fSHC9-i`<^o|m*O;SEQ(hq5+sEe0=?yd<^BiKP?t##ylhSt50~I;3;gU%27V zS-vQlA-v>Svf$wQ`Zuv}o(liwJj4MR0uUcC$SXs%4W8T|X zq*bX@bQ7npb-;@qe2R8Kr4$wtl&8iuW2vmgtq&^}rTV5NR_4*4NHCMEQ%T%d=ry9rQ*YeS#*3zn{eT1E{}%QvI`#bCTpUCb$8Z!Ld&Ey9 zWuofc8#BZZ3EZA8PV7;>K)zSNKicLc7SHjqFcDOcAzAWDu(${*!TFq+7-}PNIO#<;p^Kx01^%HFyL^SDoKzd;F5x6!XDQP z3l%o=$<2yZuPXG8J52h<)g+8(dR#rw{l$(L7vGQUaU+@V};nAnEji2o3d;|u*Vu;{cRSPs%DOTNvUSO4hLFEdN7$ z@rnD*kTc9rgKi`7(R|oU{O~od+Xbd2(>wlvro@VQiWY=VtL00Ci+h1<=_kqLTvP+1 z#Gi*0yVD~ITD*77wtp#+*Y+6QOuGsS3aU1l<(fi)ax%0I%{2-kLc3EV04$S7Pw&;_ zN!i4`uIrAfc}c^Om|nFeb%H`Hg4xtbOIrG&FG%-h0~_ePxs5*rJ8kzwR3lpzgB{+h z%thC^aMscche}%}9P2e+*?UNExiymD*gQG;wL<^};};lgRmheox|oYT?NFFLBM}<5 z{&JKrTXl5p|FuqOM|baOE|WnfCYrf6L;jRMLIt-qm&nZv2zPovX(b`b#OGJK0DMP} zPIcF+kF89nK?ISMsbkGjuJ8Q8T0}V@j01VAL5}qU3|W3DiM*+ZnIkLyt{o$Y#9B|* z*VJ5W=)8kUt(RGQXng%w4TF|{Ju><>wb|g0_op8UH52GcQ@^-l`_ZCHl}uJ6i+{7P z;hcKeqMJTUm=-9V^t?R28n1QGy6Zu-#-#s|!_{x+Nu|u>+Uj}#eOYMcvbr&gLfRs% z_=hjy7E{(JmJg--IPMU<&r_nJzICxdT>Kb*`STYhX0t*gwUWYi%B43Is!e3{Xm zUx#8Wzuop3JurWT1VBibd)iKWX;1>r2`v{vTG&_PeU)k|*8|-&x?@Yct{>T?5rs_| z2RgY9kso{5V3T*w(S4mGM~9;aI=rWC_SGAi1#JoMxy@~6o)HNz{;GG6Oo(@5P!*#X zB&qLf41Bf8^Cbvi5e)v5T#IV`9yq5{OMI8PZ|QU=wA;edCUt5+W*&;Ssob`!1f83U;?oSp0WzCQ!_^do64>pOG>5J1S`th^Y?jlkIWy}@ z^B+6ksSP-yLrxo}r$dLN=n8Ofg)z^DDCmAZhgY;5QgUL_6dN=#^ob6G)hjEXb6IH4 zd;CPu(P%!^!LxxDrYLA2XAH8mkk$d`)O`{jL|~^EPm!#%XSAvk|ern`IguU5=JIT&$Z}MD#mjND?a%zlI@w zE4bCQ`D);UC}|u8Y_{Qr`5xMRZ29|p5mJ8*+6gMm*_fMFX5{++qU)mGS&QE(mj$6> zG0x3y%YSBR5R9|e7FaIbdsOr_KsZ>xe!&-H%#tUV_V!GDs3=0D8rbKc#s5o6$D>q# zGvJ_gp`MSPmf(0~gisAlLp4O{!C-|Kh zJGLH?Y(F-$xry4_z5EA&7TC->dESiLco{@e4sVzbyTviqzhkiAR}sTWiGiK|{Pjpv z&xa(MbeKr5kTN54Vt%<2Spp;YS8&3Kq1yducJcYXQ`CEX9ZA)zX9GSWA2i=|cVsJF zLYk5u?bxG#QMp1vNTzr=%pzh2?eptqpJ(yME8{5|E}`0Q(Juw14;O2=;hBX=gPB@I zcgvVaP_BS_jX@c5f8w3?0LCKM7jJEZ>T>=^HPLoyD8nTD`_h{m=fh=KW(Yf3WtoZa zqvxUn-SjFwefk<2QjG!Dbhr}eGP2RF_NM(M1nhql!GxKYd3MWL{rdP~6Qbl%8*B|J z{0+7fzQgF{<}Gm7pacb5L8IqrEETk=i&EQZ@^VDe zqYhp-=0$b_F-WWGhu0t|v=jer!=O6K03B=4a zR1%t^SxUbTB!7H^p_T}vGiTP1&l{T0!sipAoxZGK&L+P_n-gnShT^S5Is>#~<#RU4 zCe1{)M3l}`S%K!NWT$A;L2)`ocxJVZ4kU!hI;nZ5Y1V0ecV1vBqS6&xo{(VK+1Cx? zeUClM^N^ag#TbEWWRz?{3=D^xYrS70%Yr+1U$8qm$ul@+ZWJor0#jpd6mAW}dUUi# z?Ba0uvJYmJK7qTeJ61Ro(C1$!<<{%k!q)*WZq>b&W_-Re5F0y&IX}UtrS&7 zRg;+y3=oxkH-(NShcN~X-B*!8Z7L|Aod=ikxfLaB_RmmDNVo(x^`%HMb-*lD|2nsi z!aLMrx0OOAQ>(Q(l<0vDf*#Cz@rH$zvxX4Z(D_p6{&hnH4YReL)elz9HY$ra4BjfSd-2WpkC|lb%bHDoDF!F@ywt-u3bAcGa?v`v4S(4oWRLc+XJi;r!`k z*1WzFEdm0TOQ>Ek1BJ?WJWnXjFTD8At4ITAm_{(Be>Rha{uhE`{Qb-a6vq_rL8dPQ zUko26$Jw}J5bP_r2I?7BPC7y>E9*0Na`FWMRi6v{?O2=3oaoiGqeh1#qj!d#waQul z{v(%sNbezhV$M-)RnNFVgHfr?rf^}D($bnnS+;7K1uii9s&CETX|DodjzCi*Vs_0F zKC;uIf|?k8N>SE6>}MXsi`-X@1P%=QvRYA3imH002bfI(pm}*JWcY(8JK<;3RsRajHld;qmLNhX|ci90B?(kLa1^f?6VJP zQYNoccO7bR(CK4A)z!@Ag$ZVllO^fYMTPT*+7(-D#DI7|+mdQQQAFUp|0P4kQ{s?|AE!>F5NYo@enme8JNuNYCg7UNb6tUc%YjB8OkccP<(@H$?q|_Qu3O;NP4S z<#(a~g?}-kzWoQy<`?_2ejj$${v-nMGylZv(tjR8dD6{Gr5@i@F5gb|gMMVwca2FEF96Y12r{q-(d$87H%NCE-_|$DCfTeT(@e-oMLl z^LHIpZ{L^pU&Zt{d9*Lerkr?Nr}$;9kI2CByuoXZ^1><8PuzNoepzpGpt9;4x#s+r)xd0_ zK%(sf^J$u}>=dRF856mhrl5kwPkRVZZplZzY-pUZ6SWrR^LSrUJQ`Md{#pcYj$(;5 zo2N6}^=E%YhQTxCeQ)&DcPat}BW1zxhLy;XoZS46vUs++o{@We2nYpVZxVXZ#BKCHn;JPWedLLx4RG1vG;_ zPLTlb+LPGY^!VDfs;swrT&}hmHJGGYZA4=!rtP__p2eu~Rm19*xXB2<>auAnuREsq zt!kjJS=tngSWBF- z?~8mM?+{^$Cy8C8Lt(x!Q;dmr@Vm4kuFo@Ab?14ZWZa7?RF{tiI-<|=qJsDM-qI3; zwB>E4)Eag-ni!V-dm>1|?DJho7=z$Zl8b>ci90r)oQkfClLd`P?B>+A3GGLaWe|5k zgO)V%li#?9w98MDbGRQHH>x*qLC~UiJ>@|=9rS4M9ecnJ6sV<{vZ^GaEB~s*r7n#( z_T$5thzF(0WfE?s-uz!)+jinF8B498r9p`j;TULmHX?oZArw8E@mBR-=0iA2uxH6EbP_iP|f3?T$GtvH~$}Au9P1 zg8w@h-`~&-h>8HE6CxrgtrUbMr*d0q`A^PaojuR^)-4V~Nq@qtpO7vGrrlY+0hP7m zo`0a>f#yh3%Z6;n`dR%k*?f;lhOWa*qYi0Nc~6o#FEh8y9}3sbf&jBYJYDSP6Qy{s zm-MurOuc$1W~lC@Pvn8%R~0lhUJS2@PW9(&yFXNNj8tz=u+G04j^8Dw4+j+*O+nJV zX|#1K@>;pOr*8(%;L!IiQohjDJIe^8_3K9p%smqUC`_&qcvB+|T)!`tNAl&x<@F^Q zljUqRmL87c;_NNMZbh;^DcxIYu`w|bRw^r&+-K5abRcnRFEyC9m|8vM(I z3z31Ox0_?{MZQ5HrMJt%NfUDfg+XIB5m>N$pFPjBnwXXny-+IXBu zQujM2jMKVeMO=4MbeT!#1J0h;P2FF&6;*pMVvox?ybKbydtO^x;jIH_-^cN5_UykStRN) z-VCXR;3vvpH-^u%WM*>A>z3t8ocJM{Qx_E0=VhhSb9tRu?t7XDF3%9R_?^G>@_lGN zlT=g<+rdyt`m^tUgF^V7z;{YwbAe1?1orMWi)Bu`bPsX7+pzOxw7MY-8WtyI1RN#Y z_vz>)md!m=a@7UM5@D0xvNVzDXF@r4D5t8F7b%PMo99XyHY)@c{iFk*EVcp`un;5# zbntKio&*5bT>R-#st%@sGMl5%&kslW6$*^HX`WYVB~MRY0b5mozS(rvcEo@+FIe#1 z(OR4b_+4LHTQCCueM&w zZsv+uiXZGS0w?+B&#hr5hfd@z1q8`;ds!}fLe*jZXU?X$j+R3`Gg_rKI4n{w)eSEd?8__C&_Osf=b$isgY|A;4=gU}F=k=4z zrvQDlvBtxT?4{Aoj=9K9ridHo%ER4=BCG6>wvGl+}5NXW#lnBqM|1$ga`mSb!nW4tFb!>qwTfD@h{o5FL4QbK}ZnP}2vF zO~l4|%!Q~`Hl)s~=vx)MY1-0Z1;+`w=k|H_oSH97O@Js;$bzDz?VyMHFGpB+s;G_b z1EcHRclvh&+U!Nj>$jV%L>~4zcHn_2_E|vi(phQec!wXm=QFjk#pf{7&n_y&{T)S0 zAK5GKn6>8#g_HBKxDFY;c`o!F1FL@NnbU#N`Jy&vmd+Cvnd?(ioiBCJSe#1x@)W)7 z`?f&0$}pDm;4XWcHcO`28S4%~QIxMvoZe9RjvMCrou43Xq)qTg95i!V#6wf13aNsL z=a*xVS-Sl}cId-vAV&h37MmH2`6sTRo|!Y8<*FJ)p{WMh&}oFGstRtE)AE<{Ee2(} zj&v^re3E{vKCtOE^bqSh+fgVw9%q=$iwdSTg5i6q)vLBj7ueMer1j{PC!0nYsoXvA zE3+O*I#xYjtvo^cH;vkcxH+R~OZ-fWX5x13%#VwPhq@plD%EJ2=cXG!L`Exu-K{rb z7}BR(o83Q^N__(Vn!MbIW;gXShpN00Q?ZTfbv_~1iryW_Bi~yo(9C4%`*6x zZWJQ&I~|BqZC)H2{jyuF!!NhCcO{F zzjVs)FQ>>gFdDLctt{7R6tA_Ih=gL|yy(1^aHVj{tyPRGDn6)|c6vv6B@KkRsUpVLRl}U?d|r^8Z1I@gOE$|;5~QXkn$m3Cj*1fJqc zq?I(h4I8Ky@y250Qg{mrDP#Mg>SDHR9PS7~iusRy=s z4&0m$(jGBgPrpY*CVQnTlew@D!0aBydv5wm&oZ0aBsQ3MyotcEn(`>7KggYvIr!#L zNTNPaPC5E9hFiS^@HGBm(XL(??0%R*vg)PnbqlZ}@Ny$>x`>!h%-)qDm`W@;V6dL2 zp^~kNx;1xjQ0#!tkAJ*RG(7XiZ-sdoFnelfnz=it&y|#XJiC^zYH20Ek=9VmU_H?( z<+N}+EL+JJxuQSp`LL%{l_!eLV!dzTl;(I^G%G6=p}hvkSIRWER}~bSX*9HqeV5W$ z5Su7ffU{9x@`o zwSuRmxds3F+e@b$Vfa2dd9FyrBMTevbIEk62DM_LBMZpea(j@Y#lW?gahDZf0pFh*sQx`$u$P7M-*J(RSJK5$_VJ*?9-CQ0&KT+=b~d8tQK zyhSil-ilh8MMZi$a4&#qJi%J%oO^nn%%@6wfk9HRuxk2-i7Msw_9+wL(fF;I&rXBc{j=MQ zHRW|3|Kjk<lp!@T?mCUB@=^jv-}X(?#4nAeLF5mRk)~oe0XVQ`Yn(a8XV-k47~) ze|vPujM0ALp_ftd*XVP2IqO`-Ljx}};}Z-}`Y$6=%T!A|6StCuhnW~S~cG7NJb2s0Azw*}N$5-a3 zvl(09Xc%V_$&|)f_Yd(qoT4o_qkg#woRzB2f?X$6)5{zb*z?c48LhoIz;gJfZx!Bt z_m@{n>%}awK!Cg_f3jpBZPG#6%BYf-+W(}{L@Nvq$ZtxWn`>@~4-QH2O?GrI9K z;*Wy`Jf-@1dozRB`bBLzyCNEOQUOTkk_A$dsQ6O|bk)fB!*I_7u`=?rL|*cj5s_YN zaR*y_<%@+ugF!POgOrhNhpLl3CLfL0Q;5cTKL54)D^pMg0?aTey>=0s;Cl%b84`}n zG`v31q2YFS_vHR1;YB{}IoPJ;>v$%Q!6vt+Tj`W-(OXWB!&%pt>o9O$QM6>~nrqmr zic96}_FDFs$C1#>VjXDYZZ7_DNrcV(q@6}We9Qma?ZmA#;nAT&B|`W!AFr)a%cGOZ z;iZ>{XzQ~@Zqm1r2DdzvNr+Kgpu*^;zw+pj2}x}4WzET|hN8`D3_WYgEYe)^B~%O?YNVa&$e+HJZpeX1 zj1HXTR> zOVjfyB`93-4v!8&inS6>$3!z7`BD4*h14r8pB9|g=9g_RclFPw@*qL+H!U) z1T2^0vwUK=_R{3!a#u1t8L9=J@2z|Z*uTo8%B`9$6V%t^U0Bd_<3y7%c$8- zp0CG+38^#VY>SzVVN&8&R$t#cN7jz9JkB6zpS8|sG}cniyh|o&>)C}<_N8wvVmlc2 ziWhDKU6)qn^=Vfo*)wvCEc@^9x7ZFL$CboCZjU`z^Kw|;5Ep^zjC)u;cG&7T7|M?H zoqrmo2kpvmxrlvkd$KSDd%^*>oGIt}2bePL$=Lf+?Af}$M{>q?lv0+o zNMm-E8~d4#tFPf?vi9iBd0SUJA_=UZ8!OKqF?OiW{4R*w#0+XvHWX_y`gXU8o8Nl- zl^e@Jyz&U{bj`}OC0XYL%x(BuDhXpwsUz{^M)N4B^BsSJ57^Z2mX?f-Di>^*-U83~^4Z>1e{RT7Y?2&T1}dHFTIqv(VOjDM zkLa3;nWta$Tb#4BQ$H39+Hd${C*jG646k5nEKVyCOgG+6adP~~9;vgQp|t>cC;xsRTE`3fyMZSi64cTMx(-fUGBLH)Ws#EYZf$RE}Zp&Ex zu^oDm$9A%gPoDMS*z@JMyUI6+bi8c*ihBjDy3?(G^~#49mX&@#LBr&k$D75dKz zKOWrc%iK2~aus5m$7&^-%g=Z{zMXOKu?DYloE-Ln}^rV}Wc5ZX~MGukXVr}iKG#bul)ha^Nl`17VBi@D> z2G2Q38g}#&{I+QZPd9GWr}36dMugeCiOYYy^<*ISmoAlRSp|yD1-iZ=>8K3kb@EQD z0Q}Zo7z}jZsN__%E(_PO7dyMi11`$`;%df~*I$^5%O&ZyUust~Q7wtt=Gh-i^VLzg zm3iJMWV(^qdj_B)g<<%gxTfS0AL7G19Nu@RqfiD1m?6iZ~a{8yp~>a3_1-vi(b;jxZ$*MzjMxy^X6(fttq~X zb-#9B7z^u_l~|ss-37xLy2tY(m)Z?Wm}M*zo(vW~^*nt(CCk>ShN^I)7u4L_wY+sY zms2cuna`}M_O68w=^XAevs%_Gg^^Lq+1u6A1CY>U2JxvrJw3SIw-cx-Mhvm*@oosa zrlHdxR8zrj6ts)$`ChYR(V_0F+x0YCe1I8MbbJSvYV9aY^CtF+c3xtdxxCjGi8GJARM#jCgw^lykgTk6X|Go4 zvdxvXn)PRN(JY`*2HMFQVI{b|0pDkeYXo6Bg>1wn#WP{yWcPHT`Fg`m-N64NYdUff=1W6{(AbLbQavf zR(Lc=B7f&*t*`|K>!PeQNtv3OW|m)HUyo;F7ID0fF6|u77|1nq$-<)&wI{LsxepT_ zDW&sd#^QCWMKC0uth^WJ^%5Q92|n6#Qea_Y`ZelkOOkInjP#Essw&1C*CILuF1UXz zf8W65BoujY#yP1!EwUYY8KzD6bV#;TIVYWdqMhE@L%hDjv=_}&Ih#pLIp9Lk{N>!j zI}a2G)Hg{&=SLkhwIUnBJRhPOnhg}OI-R{jCc@lc$JZA95l)Yc%z@>Inr~4F_2s89 z!eW$P2s{nSli--ho>Z2wt`^^2RlkpUv2)Gm=;E=I+T@T$N_@vBbM(a?f3;Fvs_n`u z-t+ND{FFGwooib~)}mIvwiFCvUwZ zt(JYzJ>q?Qg&c+~dzf_*6W-4MH9|j{jRFxX-9MX3qiu6HYG7I?;&_fqLwZqg90jq( z6(2aQWmk^<)G4joWYS(<6 zjmfS~)kjlbD;bgQ76k>XHZ}UWXBnmw%=aqi)3GuB3>-z1-LqZnZT@47PDuGpriM_M zc*O^?vT|l&tvE08b|0}`+AShHvdGwGoipCkBeZ9dM}@Y+L8iSWrk?)q*HwAByuBmP zjSSVOGqvO)0m0-I-P~n%?Wp$rEe+l+H)}vb*;A{E0My?}Nu=YGy|4cW(aw)XwXHNcV?9PrV`t z%jbeJd^#@TyVuywhzQ7$$Vcr91Q8&JfVsYeRd?2(ZOd~QR32b z!4{jQ`4tX2Eh4UH4y8E6PHc3mIV4Ss>pVTi1M1G{_N_IWhIxY1JmeCIRu!n98|c1p zGb4JDoIp$_8y%XDQx!x;NNG+q9lE-@GRxm%y1peWD>zmFFtKIqgM@MFJz|By`yXQM zr`0sr-1CY3asS>LyS=}4^-nt>NGNFu)a1qhx@}JwqDS)b)$0!Mjl2#nJ7ZGQGM|qv z=*9-F1b{f2aJ0CREN6kLqY~BYD8Dqn%rq0~aWG8yvbEcFC|+5a_|-6wa+S`}117MU z+{ciHMtX!A?Uj;9w5t~5582;L40kTSbNhY8%bk8T(b4D&vLkOTIuhQ+^IG}V1Rk^? z!hz4clqb__rhIFXZkzx1-6dOvSZQ~v|4cK}#pC{Wv7?E?`<&~H1e&udBB9Rq(mNGi zE69ARIUURqIpce6lxJ1;w}RS0ZcBBKrTY73DT2Lm1z2_!C4PiOO#S0Q4mtKXPxC$* zG4^9I=H+zjg3Av|_aLGlRT#*{^sI`)>|YQuCOu1i&+@k+ zHJK+Y-Yb5ae96!CG$!Lj&$qt9+8Qj$H{;AOl5z+wg)& zdMlQJleOXX_Z=_dwH(^qAMotaWMG(ixOEs3| z<_Z2jY=S8hf?SXKwbgj5--j-AIq@%2wgXt$&%Mr}6cBO_sV6VKMqo@-$x98xKy{r}qg%CM-qe^Eg| zkx~&55WyD(r6r|NKsuDJp_`$*K|!Tdq`P|<8W|iwDW!9Op`;mx5Me<2Zha-r(R1&I z`#k5s)Kqe}mDQ=M(#9dwth5LZ$e7-Eq(ZuIKKYQi_hF9sqIwu^g;9 zyQ)213^MRs&lGov{hL6)CNv=!)>G4BT@sw_70Vf;31j>UlF^L?u3|F(BLA2E>i_~> z-um81+g`y3mj&vG2EKEZLv{4_zs$rw61rfm33J;qc$Mviy&B!*^79(?{1;CCMa(|7 z%!b`3@>dK7&v+IZEi;m9M;Ah~y)yo%`8Fj0XP_2U4igou0YUWDq8gL%Y`Hf%*UxG^ z|HxA=GLrFEW{uHC;~@rtBX3DUR{f1p5t*#GaxCMd_R!nKKd))GPskgfd6iBzG#df? z=rZ>#!wWd>_!Mow&<8V@IRpEU20*>t-4<_@_j?B@erZ#mFxIy0H0=25+#PvlF2$(; zsxjr^iIF?@GawbCvq<@g98}7kGnCP#1=;$!)9+OPf}(;fp( z0C(!07$$jd2`0KD`Bbl#^P};#7Sj$T_#q~YR z*JQpzI(EkCy`odK3q0}1HQ?)d{ZVNq8<^f z?gXdPz_P;!LXkq@JfdH!^99bu0dmCkTsGZ4>sBRJn;EStWL=%MARjbwPEY*|j9-O; zJi%HeK2Hc%04zsck5j)ByuzfXo~LHoT)?5v5=znFxNcUy5-?}O*$ZJ*4($qupGwkY z>1zPCB`htwHWF|JV4luZ#kV$jI5~MbP)S1|7FAzIt(B zzVFpOXt0fQg#Gjgdn}x*Kb1g>_NZ^%Dw>vXP+)S*l5KD^BB6#b(LT3-v!F~)-3+#D zP5omyMb)*m+kAA0*jzr6y&_e(%Vsp_QpmW0e3Qd%-|IVyVnC2%f`RxI zIJc3~9@4)U=pD~|L|Oo!i%87HwdNJ`ns2=@U@OvaZFb(m2UwcrH)Ha- zeXF1>bVZBIa`GF=yHUR4-nR)(Is5Q*{>Ddw48upBd&R5qoi#-BHuN} z_XHHn!k&atUAeH_Y0V_QHY&B}S!G)6Xg10?f#^2%pPSaEZg2Krbw=0JUAUUZs_Nh^ z=+zizC$terd=r9ykd#nUeXwKf^&JVe`F18~^A{@u;_qgIcF9YKW&6ev&%9385XF+M zcSEm(=7|!)f(U)q5-UlEyca<()hmYjD3@PK{!}P7JSq$EACY`19`~o;D2--z5|_r;413fq8$IL6 z&GjEg_?CtNr^U{7$(B0JAbY%&juyohdp&3@U-X%lZ@Y(9_y`p@_QBNwPh3vtYCwWl zit7Y7bz~4bS$1=}C635u#08W3n>7nnJw&>ns!N5DHfy|R+0{q^U{{1TOHm!bS8kKV zUwC*g6QqiF)>Vm1uDEhh2s+e}7L9DrBVFg~UVRscOcZw8yVX0<+aLUP3lDdzx2_7U z^$&po<;b0cO3lZaJR@XUQ=fj{V8Dt ze@^w}^y@_jt#G>+lECf{|@Dp32Jwof6YLC*t9s3%KS&<3ewl7u3_{qi&+aVH*>L zX3~mQvLPFsn-*TC9fRi$kuCQR{}H4Y=5Ffe5AP&}4-{!-c?>M?O*vf}InZjsEpc9x zZRn$sVG-dDZh92~oFDR6U5^>tZS&TMJjN8sTZnM@tTB~>XzC0`9>KEgH z#WG%dwZyr*4_CaHtz%bJnjqE{_73 zH^>Jdj)CEldwB0*&4TAwEvMRp3)H6Ap`Ny0s*+1;E`z~lLGaRm@{Vey@%8qu9EZKQ znOn-0O$~R2pHHWb z7#_m0Qopr(2Wj8YRrp_&0SmtUcDJS#>yl?9Zc>Vw>x2Gzp6K+MR3WeXM#73og+!3* z(UFyv>1A5aw_lH(SV}%@5n#1j^Cf8o8q22fs+bu<8;|@A8cTz4OsaS1XX!xE0 zJv+5a-twr4ekFoqWdXYFDU?Z z<8CR_H3Pdi%s;TKCrol9zc+gx;qiKkkN|R*7124$*QdfNPuR{8X6+p^$AjHfy4N|% zo1hFf(H6T_2kaUql6GM&F2Rd+A1>irS5WkTdo622>VhDSZzVo5iGRrqIeasKk9qB(2`xARC&Kzp@Py%>GlOlZ^?$u$=T}7un^eqK&6StAisXSC0wltY}_#8|4ZeOf#%!L%gx$=nm zZAku!*}*MInzTsQF{n|_Zw9-;11p;c|Ea2~f)65!wC|6!cjLXe@EY;FZrR0(BA3t3 zCYiGGG%^;WD+2&Dp+Nk@QRq+9wH&)*=}=b%oXOd}Gf$jQS%TwtUT&N19LspQv+O^b zPPfSqEjph*eX7c3Y+;_o0iok#RJE6K>;6R25OW4=?$UslEgt?*%}A~R&+@tDY6WG? z>I3A{pK=rn;QtA5L2HaG0cZJ5E528l{Q%^nY4QQtI7d~TYzP$txAVn2u z^-G}LRs0RW>nm5OVr+uFi4$+7t>}%Hxk*)pCKL2fUb4~`H3%LkKP&o$KSdwucr(w< zRT~CuDK4!1ZWxLkvs!uUr{~Y17DH1dS&8N zxoa{7WMvC*w1)d&`EkY<=|Em)>qK5X8$Fy2^*~qXR5xVhlu1t2@5!ftIAAa|J|`pN z48BgL{QvV!gB%ZNMN<;y;*z}avv_}D{))k2&B(xcEyupNKx4CHJ9!a(W#a&ooygYI z*AYLWqd1vTM>sEkYhNSzOtER{%q=5x_yo6e<7?AK>HS)@$a{9GRW`M^+(<)$0DzWTLJ2G-GVD zqlcG1ptr|3L{y8Oo`FS9mNP&nGC25r89Fl3dx`cYuos@JMQuR(71JyQKM``m1RtsB zn5Ch`;W+%!mZ*g3p(4}7ndfaO(u0xm$q_?CUE1c*x`1pi)@T1i6mt&S3CJ^auFSl0 z15cI?nAG>FJQc^t&~~>nq`ZcfvnOp+?CPr22Ded7+I>eA%_)Gdcy*UJLpx7^`U%{b zU`ouu7He3IS0RfH2|)e1I-Ds&oV%XG@#-n1Dp5e zGbxA{Q|s3gA|fUUZcQi+1#M8Pp_wO#CWXBoCRbIghVD-FcQ2*Zxro^j)+&1kQryoW zUpeaP-$mws#EI1$L%9v6A_8EFxZD}Lw89W}`0!mE3iIm@=m_K8t#|B;BM~px${ayh zb^2X$O?ansxPM11k6fiw(iG0t3VNeE z_cn80O&`R92H#aSez(-jCFUz|Hm& zp)EucJrvabG$aCD2)&K=b;`P3KEBa?Lqms7D%xvnu`9Af=VGnOyJ2?IJOwDNP%&5R z1)eCaELJZ!OAW(BV&8?5B}am&zUVBB+Xw-BT5+Z*qTZG8UcSk*)$!`5?M6q-dZN!h zAI!?W zJt<2!?o?NaUknuEd0;h}x^iK9#L7*PEYZ%QV$- zcFWf{M$N%yR(Y6Gy+HQvQiA zr?+SjS(cOl7E6Q7MF@W;bqO=_j1?F|Jf6a?8&alq;+%QjV!1=IV6YGLQ`}>yH#? zm}wzHs#yl6)v;A3*x|DDQz!s(%*{>vVv4l0dGbZg}GsXxn<048-%- z1$VxIe&3YVDYbozU03S=Se%dUx{85;$y+bRt@(}7&ZCu=X`G*UxCJtlZ>~}ge!C7= zpufm!p|(&;>Y2%|&nN6&eN(rlgc&#qOjmgwzovKpXr44O=-nCDi#}jSw7I4COUqGy z*kT)sZ__B5rXs2+qwSF?aomK+j%h(##8G*@t@&_&+WEb1bR^{*kG7X~E1pw@qhw4l zTarp=kBgv{?lqx4)l7;B3w)x?+BVxOZc;Q>u)O~81?LK|d_I2-zKDk2k9sGr4|@`j zguYNUy$3}t^q6#z_s7}WcSv-ffLnhEiypwk3oI>q-on_pobM|&8w#_`Og{?Uy4?bE znHtO#K=2gwJ^|{XI8o1H6J3y-63H(2#TUK0`0}%SaZ_p}yPKPCNk5 zZ!qZ;3c42eQdKT~zGsfew&oYxUlr`JEpDB+B`uIFDb#weXBJW;)AUihGAr6@Ehg{> zu1-UI(2*d?mR?_ai~l7AxOXK{HhSCv1O=KVcB9SQw+#wGJVWL^9R<8G{5dgvii_?_ zF^J_nRTOr_yUU4ToB5^L3NFGA$wsEe4qf3}RuIppE8k|)zf86EvvgecJo<{e;+Lr) z&dj?wkGo}+sQy@}{_CEpP&L~^@UJBD&tDwk4H}|j3$I38+Ej8FI8vUpKKJ!l{G{cw z1qkY(_MACeM(qfY(Pl?1W{W@5K5U?YIbEq`yEc|TDy-wm<{W!xyeoe#gVjz9k_Eo_lasa0qM1J_e${C9Z~ zc(AlCmaXd7^(ywyZR+NJ&;$Xbuv-7y-X|DBV)p{Y4K=*>o#*6-A~6Kj33hTU3#8gV zfc?YAtm;@xlayX=pPA+xASCuBiz2^Puqs=aAUG?^{2bW~4}tPhyW z_+mDW)vjepet;Jf%8=-CfyF#~is%?qz=Roay)lhGAHQhG{m2r!Nr+w5{G-diRk)XPA0!AS&b8yJbk^RA*|^H;ejX^> zH3y&S9XYxlj=p*vsbpX2N0q3XAI`*nC#d@N{%5u9Cq_b_FP*8GoK$w)m4JA_3;Zbj zZ&VOs1CpBScp09jFFpM<0VLHoK#9uqXTUvq$ZNo}^Y{>uck@rC@b}-wxj6V?h+*L3 zUmUfD86YmWX-8LZ+=O`g!i#h#>EFMD3dAF=)Gz-7=6|U9AEy1^lTAdzQ_6GaXi{Y) z9;*Hp*8j*U(2(%{zp5jkV%d0}X7@9SYKQn{%o^DS28qAZrH|P7m_Ks^Zm(O{7%m`G zxfCo)P@rGGw|h&awSRYWasLI0m9oB&O;>KQ-(k2gthsO@Y>ygJkXq<#EWQhB#4R6x zva>~<`fPrE7T2fDN%_3f3Iz%-R$qr06L$D;>!A6{j9VRFU(9Ldsu-vb*M>YN`%SCM z)!6hjNVolrI_{`qB?t&&XO}lH8Eq~{gMn>_KZY--lWt=wQ0s>EQGL)!OKoS}*>o<4 zQl?Dd-Q{%^&-V_>On3WZ`5?U{1?`((X0Z-H3gMh+PZ!fGF9bbNffM~m>uI^#+i1kJ z>8^xf+dr}fD!&bevn5^Bz{iYEC3XA>L@8V0 z0Q{pa*ZeOQ=g&VFCer`6!>A~Z>-d^y0u zip0-^vu9%tzubySzg5CWjTu@{?6l(O8_%gu;V^xGXU>j}{vsY>;dkJ{^#L(FVp#P; z(RyPp|9iIogavow1AVTwAaCl;m0r}!bduttLxo)Z7(YvNaU6MGxZS%f7v?rhO~sY) zLATf2>ehUwv=4GgbUDGm?klu{@)bD`^-02LXO^2ukrPI3XuICvSS8dr z>xT@WduRwTj|b+rX`8U?n&B}fbB!3+W7YOEnWn<0sehuMICCvGnVtQ&v(T^sSo{>b zf0&NjUu^Mjv$OZFnGmD)UI3-BDNnzCGM{q0&p0yokeY8Y!BaFzc+ka}XYrnn8=mm0 zI%!UT}6OLvAXen1L+?fx3M8*Mt?QsZ1hI5X!THPGM;|CGH(qUUZQc z$cEDk4BY4TWy*wmeqh&P>I!kUg6Bw$s~DqTx!mISYJzt8k6sQ8T;Z*_pJuL@+TZQG zyD5r*43$EdH!mDOcDKGtWJH(B`=#&{q{mErc_VMOi0;P38OO}tqaV)PPA={z)h?!x zKcIFi>VJp(Fg&?FODREIflUvxYvGvRwLFslF_{boW$!S^Qz*1v!bJJi+#fF5NR+LB z)Pky0P~4as{cn+6$RVK|slp-Pw199=56KY46v4s{W(F4S_PLl)q?WlZQ-Oi z;u_U_ZIxptF`E((981pm2f}67$bEG5V8LQ$A?f?GMgfp$-nQLv-d9!~7n6988C|&V zWH7Yl$AS_cO5U~xGy?WfU+n#;4sU&)5K5V`bR*K3c z>aU3x_0db4!@Z<~*ssi$>^u8o)AT+Ax91Z^0r02#eqJm)V1D}ycVk@eEu z#rnk;IQuI3-Qo|y;`!X}TH7uWRyqOkx!^R7$r4J95)J(-L-iDVB&>B||B|zF!9)Jt z*yV324qY;@7p)lxRUQ}DS#Z+E3miG7d-RRuh`M^V#e;O}hiyTsYD?SSxhn6_>mT{3 z1l>$xVN+NG*<#l+YizE(GJ;mP#tAH-v;;r6aLc?Vi$>R?W6;GF+|i~csAMwUD^z_H zdyKUS@x}{ieWr~H#C}U$jCz`AN&4XPhj7YBq)FJ}9g{aX1!G1BS&l(B@5gH-!Zryy zb0~(FWPJ+h;RW&-!wZpGo1#_saEy?WC5V;7zy(H~!9l~pT0RELlGy;~xijdr%ue3;epCoR^*MM*Lw506^y zr?$^Zya5Uv1`L%Xi;MpFVP#Iv*28-rD_DG3nxEerpND_&hPT_TPFOyJ9@=uvvdig% z3?CJz*!r|@PJ7lgJ~zYN@#MBS`jRW2BNb0%dWnE>ep|LrL6U!dr7oYEd~+L>(YM)a z>GZ-BC2ZKJ5lcp46$HZ^+EUXIp=j9>L5A(I;oa@?-F+9-=a^<3Lw&dQaUl;3gIRCp z^W8$4u(qUTWm_2!7pT_n4Bj{4$ax2!7vgeq_8Z>g54y8k9pVjMME3{WcN*KskxHW> zr`#3DNVHL^_~=W+d9YAtC%7_aVp%Y$6|&kL9KX4eTt zPWXX*42tC;sqI0o>L^3bsuLT5#Z1p39*gjD3*J2uwcU;%ih@mC{7OnuIdT+AmhqG+ zXhF5YN#0ISbTqkZmy>!R-|tBDk8sEqKWs6dz$}8jpC0Te^SzK0DxJzD{PIw!|2b=H zZEmm}D4JsgZbstF&|abBJ+d35yI~!J-`(XL_iCWb31eVe+%{M!dOx6l5}DSHW2zF+ zH!y*Ltjw@eS$F7~nAP#_sd4qb=$a@ouBRQ{@F>S3!vqOUQX!gf*I zB0W!EJ|AsCFPv4_llP8VJxDi$qT@0``8s#zz@mNv2yCV~JEE8Psg4)D+~o-OiFw2o z=(KN@keUhq0^}nV9$YuXPk6r}>M3s#`wlXiw5{--hd*4;LQfga`_0jkGWnqhT(f>l z9X#;0xYE-UeB*d$1Oe?WDYu3EJir8~+yY+6AhOxzDg7dnK@?YQ+2lO*O#1VL2`!2bVu;(m5sQKsZ*QCFLu(iIhb_Ncgv zw(pJigK^`v3b^6jhXsN*#GFnufonw1U-M=$oIf_UAocDD5&B`;od&90Q} zCN@XE1`d>cXAtLhh z{=7-Wg%v~joWGQCvCxn*$u6yREUy7tQRCSZw52OeE!Y}2=TM@e|6nqMHfwHi+>{wp zfPY;IF-u*}=5x<`0;c6^e%vYG{eU0)s6q_^ zjD%chP3Qu@ux((mKGW+lFPr%(JMGf3FbQrar{ub#+zY|ZrRWe5_W~_ho{b{1@E4|E zBt5jj!Hy#1b3+F^yq#r@)SdPXyrlMXv#9e|uvt=TG8bpW=flgc3db4F%eE)&!mQ^U zqZ#5;w6}tBzu@j_m*T&X@2=HfSsL2;c=Moh#M5W|15MqJ&=`~+U`bRnDOW9meT!4w zxkQ_ntrN<(MEW+>V!qWQN(Kye&p@IG;UgbTbayGc!S38?u@(QHH&2Sv!S{B@Vd_4``Jgpw9^u-^PN=w<`~1-a zsQ9%x%eS@goTM&=KJiM3XHS=;*}SF7A*WBb{D2=+JU*#VDe>F5<>74| z1#{Lg7NDEg1}0EoJNLz<`5dD9QkQ40 z)!gU_1Oq&CVl$Xa+&wxOqGVGv!1%pCmn5Ia%xa{}@StyN zSVvtuZF~Mo8Sse-*A62O&bxU0_4Ed8^O^8Qu7#+RG~n6P;Qu3Q`>3)B?A3MSFDXGf zS)c%WcWRjEZ(|NXBhS_96@I6)uR30Bau*oPcy7%1x3MNNy8r#u^nZZ-4<-M@uK(*Y z*+4tzyX^W5S7c%!L)6MDI`}-_kIy$nbb(Bpc9rf?ZqYzvbe7d`Wp`2}a~ z3V<~w#WI)hjMJ+4Nb!6FYf4aELarIsyl6RZ6&%l<4&QR;knZb+%(K_T;wrKO4)d?#}(Kc+&(2I>g5K z?lT^zPR@exwF*$$qZv_uE2LcB1|V~oY)Yd0<9)!|icw(DHuUL9Htb|BbpB#vKw+oZ zhtw(X?5mD%umuKdSYz(W_KaA`3=us9pOw zCB1^bVnG%1jkxe{mS!GEa3;zz+D=gS#agi~($jM(TG+d{gi!zBjLTuI- ziu2~{Y!4*$p84ilXE2T}bzUMTLfhdz-PE)#h~Rb2EBYXfhUj`$wuJ0rO2ufZgY^CX770FuFBqSqHiJ0}R|Ar{&jU%R77-sO^Tk!dkR*&?+- zUMeptXji6KNoh!LV674(=K~k;gQ=5*XD!9bZsc5|MD?t0Xk@XKcfP#W8Z~&mZLB3# z3H+JsPlMmEhfR32=}TRs+<5Dt6BW7}l&&1Y3z~?-?@x*_Y1G)9*ub?aWK&jCde)cF z`9OXFE-kf2qa5z&qLibguhibBNQBaWVXNru25&a5`a3$7b-=n_%_zV-|MD_A1mJiW z!Eq^6{rZ`08a6K{q95ZPzPiTxMfa)`uGN;ij0|Ua9;-n*{VevIVVpnw8Y5-@0eU>@ zP7G5n1zNC>)1@k1aJ9PiEg)=36p)cf_^n00gcVj%J@TJO||@10{QE)Dd1Hc znD$YENKrkf+fI_pI+nzqr7v)v-%Sivm{GH^>9HfpMpqZM=M-=Yr9C?|6(|Rn2U-)T8Li?Z zc-a~ib9-ezBVCB@o$G&rfT-B-QSq1(qhAC0TIlBU&M96sWE0oB&x6&d=&(n)d{6{5 z3si}9yv*^WNDiQ>`_j*Kzw@#pwwlfDDrSWI9}K0o4g!-4WZsImST#D z2_BTe%kP~OEsizc#oNJRjW6Q`eP2-k%h?^y+q?hCg69H;fs%PBoHw)OPkfximSg#< zKRx5*4kZ{!c>_hDqqBVfysaUeEG-uqj+wXkbLORFx@|9&qNXhZYJ zzB8ZK3XNh*oY9-uwU@ba@lWhD5Rs*Yb`#A-tQz>iGUVwWqM+KytSK?)pr#p6&V@-S z*%%bGy?uIp`2ph}wEI@#5A}WD-NYkTAC+su=5r?x>u-j0;b%il?1u=#Bi-)|X@9u` zSct>`kjR?#vCnbPb{3u(U0@;XmqhHGV>ea@V{&&>Jv%59O0A+`qazF8y z4~{Ms@AZ-!oZHJH(m^SkN2iHqIG=tFGj5e~SuUl-R8ZhCkzmanSb=hCREJ7@@+eKQN=Pu7%~G;zf>?Xo~3bZQS< z4nrAqP|A@d2tM;^8BS-5)l_;r3*Pp0nSNh$QenlDpv(S2Afl1_Uk5pU9YA!QJmNzQ zThuQmHocXkd7PS5E5iXcq@hhgz}&e%RbfXutg}6w#Gv@lKVK~L zO2bqfI}L)D&}gDA^q*==S5rj-OjB2~oGUj}0vx!1tekIS z>d|G7!|n*XuGExh@oH&IRNPY!@R#hYSUf?cbe@wi2ei zP#iNpjdiAv94`zfWp*~PcQ)BUN-Myi*Jr5YOHbHRTrnxvWv)!`(0XyUI8iS2J1t4% zsLP?6?If-^UO2&eO|=wKY+|MxS_+jgSdWO%8ac|B3S{EaG@5lqIqX#6B$h>~o2lTc z>%9a9AGfQEetJY&&TE2^>O|xg%LWx~K|Xj~GO};GSipIw=UFosLVvqM;^4+|rKCRl z$Aa+}t97^_`)nX_IRLDCwe~0za&-KA@eAEc=ht&D;6bCl&l(T7 zw=5coRyZS?T}t;LPQGJjN$F=W)#@_FQ0FoE5-#d>F^v?8_b!N7VtE>hvPKWg{d{xd zAQ{t(ABxUDdcODaHKzI2@lS=!^vr-;wfHE?Vr4_lYaEfNHZv)I_=97X*{BI z&PN(f^DDE9#&1~4mpo4yM;w2SCKCy}TMlYR>gub5XqQKda2_FLJC^bzIF>y|CDOCG zFSqQe6NgLCDVXXBggNqMY{Y`fi^7svnzoRUNb-E?gOG@b4M{aq4)KfIS%+Lp$*6tT zKwH@{m)Qd379jp0cA#L8kDJ{$m6Rk=n=(N5rI=P8cjA(mMEfj1YmzQPAgJ+;jCZ+a zAPuf!mE+4Q*jXo@sGl`fu)WAqZUV;ma-x5x*B}q_vA}JjWHHZqIwE3?(8N1!U_hIl zJxr2_f`ZS!oT7igY`FnuGC+!JRj8p8N<)1yy|&vBcWkxshB0`?^3hi}2%ph<2DW`P z`sr~Hd3F&X@r$eVjvdmjFJZ>x{3raUCUc7{Pp711A{h_}7}$#DbCNNGSQ^lhBrcWQ zuDA!m57my#{P*7OoBT4H=r7erzV@uPnDuvCH=p*H0;s zv8#=mciwb=ieSmqp076x(>EjBPz96N?#`wL)$E7<><0qN{fJ)Nihhis9+)~gn1Bev zS{Im$ug0;h=ee@16=`zIUPSXNfdiHCf#sOJ)w%r}J*XsE)n3G`y@WJ281|!N!!FL- zqdrN1%Lo-lC)on;AkPMQeYlH#0p5DGa)s>dp#rX^2#t&4ROQTPM}C2qHPwE}krA_o zZEg!##qp>-FKK)bIl<`)ia&6+La=zFUmJoeL< zFsoi}fH<+D=Jv|t!L3MZW71nU?TFPOGz5G0HVChYLh{c_##;ITK^AJUw0eJ5pzyGd zI3Lo&BTG|$d&V{6ayzy_(q%kfX{)e5Q}m~^)X!BsfV)eHh8k8BI^mJ5(Bx=t;#8E< z|HyO+yf$&5T#L@T+cOxs1-sppU!q&nK@j%i9an#o_EBAk&I zE1GVgK#}V)Kb};NOLv0~z2_lmyo2>;A7Y{*k4hYCov%iNf;2mMuzg2|-3@e$4?Sk{ zkf#To8a~f%m2!rnt_zGtHVC69qd{K3u1~!2MVYhKd zNQ0f=kcT6j*vnDbdo{qdBKJgzsQ{dPKfpRm*?s4$v=4o{KBo+KVBDjFsjB?uH6422kdrBknn9{?wYz9I z5%nlKhc|*{j+s5w&*O9|V@g(*RWo5=v_!#fcX9^h7QepWtcVIU$$nc?OhbnjQpjeY z@rk?K!uR2=Jl4&SO`VmDc?rHAgp;Qt`%W4@gei{lumJG@Q#Pi{G*h0YmkIq;q~^_* zM#M?^F5-+GW%jq+pnwpbvw{8FkYCWCbK9dlaH47q*ZyWT$2@~{C2s!+i{VTz*v48G zvzG5XFp(o;JsUaL5|ZwcBU#{-I2O}620JZ`-rYZ9ES`lbjSZ z-7>80m++eTz$~0@Tin=epar&axfZy}l?t%}I5m{0_b*w>g{;;Pg|VcV#hVdu@xiC4 z6$+uJhO(Z&e}!&nK6EB^*T8~zz9l}G-;B4=Q-zkoEyN+p`>C;KY%zHn+B9fY zsAQ{Bzph95Ns|vA*n9sv8#8nIn9U4i-tjGP{aRKZdwiBJDnJ7$uuDd|Wr-N>bp^rB zHQC3q{n)zZGKxXtp8WIejLbE2?y$7-kS&Jn?J>;hau?QhQa4r+l5gy!vsv)m8w z-TMPkENa*nn}fzhM36IZm%95WGDSvE70Xv!+=RvZ`e*lbLrmz$vX2ZUtS@P%&3Gd? zxcNoSgjewm235{DR9Y{;iAf1Hmc$yJ;J?ZxoQXrzvcR4y1#M>Pt#-*6Akz^4I4=YQ z+v5Y)IZuYysn(Js9*Rg}j(;+`mynRCHg`Pr;OD9Kj~N*K9xa3nG(76+iSczqIspJL zwqWu=#(muEm1_FUnWP2e!2CYUigG|Tz>ldz)#+WnU05M5#wvekmd#L|R z{DkJZ6u0Zvdq2#)^MrkheyCoHTH4t0uxYrikw7L7c2KFP!AWLkInnW!O0pTHd##n1d+_|_*1ZF@tVkD41DyksoZUu+IlVy`@4Pc|gw zbnV27)wnKf*V<9$d~1t%atYY%OjFC7T1QQxUX9mP%Q$v;O{G7gAU(apkR`)!p^Cyw zAkiyXLC3rLy2shFe@sHc1K6iCdMz80w6MPSx|cP8{zP?JA$2J(c2P&my~Uc-_P3!> zj$}O~ z-j|^}4JGF;{x5_~d!ubHrG?R^74(-%B+j(w&5>Q9ujGJ$V)c06pJ*RWTHJserBI(r zUzF7s36nHEEwK7m<>_2dV z!~=U3$DW;8KO$3ATH%GLh>E!u;hp@nLuRu%Ts&CIUclK?s7$sHuxdPb)8{7emmnd3 z`^UjFwmCn9v zd#LoaA)S`40+VD-|I+!vWSs+pWx!%}Sh_crq-BG9we)eu()por0_u@MYT)*7k6aTE z+82A6rIC+myidd5);Rim?(?BzdMx6Zx!a{`gFf=jjzxess5jIGe&GR>p$ zWK(cBv!X-0W;aR*Neh>OjZ-ZL#Wlm;~#T=(m?9Kq7tgQj*^p}w<# z$g_1XKX+4}8${F2r@1epYeM9{-WyvSxwkxT@?XmtA!L0YQ(Tk6R&JBvnD(CqWR=}{^Z@(hB^N{= zsRvirDBPS)RFPFF>Y-R_=7LiBIJb3>KCkQKq5x8%EQ-mTESPttB{}+sGvwxgSnP>` zBz$*q^jl|foQyEuX=kb&u+N~yS+6oBoHMM(ZAww*yA>(WC|*kNz^`FmL?a3TjrQ}c zsQ%t$_X7Dn4+8`iHMy^{Zop!N00k>S_i0=uglc-aZalf7V$W6@LPz!qP4sy(MR)w0 zU#~VbzPJTaxq$+J zMK~{a{6OVcv|221DBTa*gm&>yq&JeE+4?zb0V$oiduvtXH|+UlUK1f6asdo!D4$JK~@v~JK z9ysflB#9%}}Tw{)%Gb)1?$*0!&meCy)*OzVMFSs)Io>QhP8agk zt1Hlr2L~%4J&Df^J|eP+!Js1n{09o0EHW>gPuZR89Wevtkuv>jyKa}23Vz>d=KK2HJcg8{Mm)~)Pa;PbGb53m@)UQ z+q8N3;E%#a8OG(&%has1{;bEYygH2Xf`N>p*EPF*ps1727*RsBy&c78T zOU5;cEp%%+{uc-A0iz@C(pyqN%@+oS%}pwLan0DZ;Vs4}>3%vT4scZaILH3_BWnvF znpV49jGISZo`tg^R!owUtrNV!^RgfD7ZH6`-WEfw8J~cX9d6qda^C+&zmrMjed+cC zy*dxmqUy~y#J=<}Bm`(HAQtKbKL#Y@I>d(6=F&-7f#qgO20a0!F*ynsg6GTn+naI) zH8r#2E?GLi@9Pyc?X`IWpQs{wYh_9|4oJ!?<^{JRl%5w$Ri0N;y=I9Y1^}#n-6@T$ zmH2d^9SL79$u(^#d8cjk+VrBbU8h-aRbZbyp4_pO!Hn?11S?rR3){T8Zz70yL1$sm z5H5s?uX$=}`1X1}fTD^cHZ}~OHSfy*F;NoR3PQy{fbOooj5vQSI5RHu<~&j0eP?znIzZ@aAb4f-)&-+j8s3mwwQyM3mXd!s&I zCd@GD8LmW}ZK6u3+bBQoN14N|EWr1=E;nYl$34x;vjM^H(iIUUuB zT|k=)PNB+~q43r#)1gw}X^{ho))&M8hs;$s&E48E@++)(t{ey6l|lvclR;aneV|$T zMZ0AE%X$ES3AHM(Xl_Xxt?kI-VVu~66b2`t)5 zgjONfU*xUec>fJD_F)=9{*Ba?mG(jONRz9r%Q9sw&iIjDcN@vO<3CHWOh;z@uhYFP z>UV>Pq}O_NzZFn_B%>L|@nyuLNcT+mTUV&OxOq;}Z($5N$G$^PcphIo(R{xa5i!+; zZ8riRi1pH?`Fz^vm25|%K4_7#UywwQh}FM#L&@IqZ4+rT+`WY-*;yw!!CYqrY%gM)3TD|!vtn0-fo}XsTR&z=k*Kn0a#*!%Wj(t9yLGjOlCH@3PEP`7ufc)cdr!VH6sTx48$uJ$i z46UOvwORvDKQ+Qdl9LkmSS{Or+cP-p8ylcQ`AM7Anod<6oyc#tlHH#9)(EN*8%|v# zKwr2*3I@a(&eib8!S0iqtDQEXbMhT*3uY&9*Y-PY;;SGdN!-D#GFEW=*K2*JXB`_r zt=u(qGnRwt2+$tRch<~@*lVx%i3h@3zGZ{szZ+j4J%dD<|T z)Pe70z1El1_tt1BxSV*pY5)SCfhy<^D}~$0XN*!;q$++qaTqGgGnBU0*vkonyF zC7SQfh9zGUX&(6-T2X1~&orZ*Ybijcr-!>gWlt+riIW)7jT>4+I9sOX-7QMbes#A7 z3`+y}6U9zZ6ZjM93xyTF56rL=_C+kx!dsqM+ZL^j|45%9a*rc^*8#A3pUova2fyh- zTDEP8V%PxFC9#L({2${jbRi|4C$65ZxyD%|ZyubTm4>T!fP`C|lI@VLre*-Jy8}D7 zl`hjfPNON*M69z#`->^B^-zgHK^q;Z<6>3o2Hhh?`DvLD-Uo5!p$68>ca1?GpDDD+ z3n5C^TN^-1;+OPN^JDBu=Kyg12w|3JL@iU9=!XCZs zbNJ_dU{Npzk>;Z*lgFv~2l8RoZ~^<$FHKqzNZ#Q7qx>ozejo8MZ~aY{$>mYn531U9 z(wc`N%h)&XN}S_0xhQ0`p|%;(sT$90`*w0%nK0u2tcEw6l&D#kJ21~PF*M6%_i`~y(X|c3ROF}M^yPefu?9_qoE1Q*)Lwac) zTRE}#-H5%V(Yb*Vt!yTIeRp?m2-u~yR0Ad$+2$iVRG+)iNGEE(f_)qLpyo=|q`8>@ zLSZ;pWwb?X3w+3`YNkNwgm_yU+4bf7D_Z5lS$UI*jB~Tj5DbrBX?Tl>$kQ4#i22oJ zlqH<7JqqO;z37YXW?Q(_?6NQJLn{I5U5j+(;YOin zl&rea5FPHK)(2U*4@_n&%|-@(6eD70E2;Fm8Uw0#oM+hY0={lS2PUHU;IV|)o!21e zrxrz3j8MnTem0N3PBz{MB@t^ziq4a_f5W-@jhkb;^M$TdxZycK?=ZH1#Fy<4a_EVQ z=7#Lo*3CDfFs@2ago4-Qx!G(2CU-wafuEKp~9m1^zzpED9!aUdi1*3^3%iebgu4x&|IFwUAO3C0?~iug7F?6;vk8fdV!XbLEhLi52zcyRB{?F zvr%3PWe4SSvwwSYU^^7#i%1T1Zh>?x6g9Z#o{oomtUe6AUi`+ljm*%J2PmuK;ep%M zv&pEEEsEC!wy*qjlDlan*Uzp)b}|!9)5tw`{`f^}!UECFKkiKThZU$Fl3qo7;PwVM z9CM~R;2vc7W4W7RN$U^KK!{|29&)(9X$5^t4_6!Ds;!~I@I3>mt@PonpSp47U2RP7kn>iW7st^^p|$gilcQKs?VRH62ZsfRn?8zps_0g0Khx#c_(Oo~4eUavGa zKcP6{h8!g@uyaQ^#sH4{*j96JA*1D4w8@oL595ScF+;@<6dBp;&R1+thb9+0cMdP+ zB7N?Vx3#a=f`XSCFoq&Z0%vb(k>RnQZ_9_1-GKj z0lfrWUC|YLlUfT?R?jis^nQup@Sg3_oFLD{w#@Ym^*ZCm^mqunxHKwthw}aREWpOk zMqOYEybELv%x;G?Z3A>D2ymYnDD$3)2kr(3zqZA*8Y=Z_HOa~B7_u1Ol(iCcJJI~v z&FCweMpeY=)>Fl3HP72#Ye_v4p8u3aH&>@zH|KK$Y69L)%FA9qmO=ACdft_%J=kG# zgS)aLmJx2M_ncI(zFd{_dpTZs1d&YZ-oQrOG-&oPYloE`(4zm9@3HtiF&Rl@!zVse zNWZ2A@ULM`WarRhx*ep6h?TFh=A6@5ja}0vAIG2JvJjy|=Gs8a7E6T* zdaCg7r}V}aMf&fp9;B{ZuH=j2r)fCyA2-&_+2N2RN=$7WM}DL3278@kzbu>4#OxPF znX5uvQqx#;9POv|ii4g(1NiQkpyl#!;jx|AV-t+xrwuVJ{hs1UjgFWh7*pG{4zx&bLZ@=Yg1LYL5|j{c&3J+&kCr8JpfQ5DM0Rub4R1 zf+h;fX_oFEmE@C|4e&5}!s0mSbH~<@Xypx}j_^b9`Oayug_Y>Yhz9z>DzEl-PYVn! zgH^={mt1YlikF@rg;rvlME1q`E}N^Gm5`l?b!nXY+29)sagt(gCvPvo3uFqFTTR3M zRHtV+PizE7?SFG+b0s*_zScW2L#Fj-@?8FMcRW0k0f`4eW|ponE0^sJsXlMDwZdP{ zHxOi@7@R(*mlIW>spXNuusKo^gWKO0zH>_$=CK5q-;vE~LU##=f^w53{_; zTh(i8r@N)vHquYdUUv91KQ@PEFbs}MP(eek1a^L*W+%DA4V!0f4(eAsT+Q~A4d!mS ze1nI){vX8U&qwljCfxyot+>{7@-8qiyOBEZF=6<4-Xx#Ba_IJ`kPCA0_|K!SQG9c! zHJWev_iva*s>g`(wVqIFh*M@>PL%|`HnrVcsL$F^)&DX=V|C}v$ph;DGJtQU{bz`d zaBs0+l>A8DI=w-uKM_`}6CylV{Xb;>(qllPf$Q^D{ZN{!oOxOIZ^PSp$ zVfAZIbY2O-{W=%&cO>8*_=W!aUCiLh5b_xbCj%l!ddKFGyOyBNs_jT z%;L4KWv)bo&7a=HJ2@LyrC4n^nFhbh5eYrEGU}tLwSTNP640(4Zy^)*0$yn$?ce?` zC2f5uQk_KoMrdrJyh4&aZjM^)N6pnR9^&TV9;wlVS-q1Bw+=viAlF#J)%lA=arA;+ zSk?f>OUl%|&U-kF?1#cQ^08C7m&M2jw1FHs5QvkV9(a_Y2p>Nh0B+?(<7vwWDrU_z zP^Pxu|Cd9nF!HFCIhXhk$tQ_Vd4Ek10hg}!K=;*LeWz}|(NF@XrV7{2PwNt#{>|t; zU!$5GyPSTIDv|*TjzORtk4^LO5#NAVdf`Yvj5v7bRVEfA6)gQS`mVPQ7){++dU9zI z8)S0EhL@COCZS4pv|Y+6*S=a_G$2j4ZBZ`xxF*as-;`k1;fb~W|4LU8+(7ri#GBj|W*|Enl5_?W{C%-0ch0>e^!#CR}@Tg33al6wWd80KfPRBLh-fx~kcM_5XDn%+~dRq<^>0NTQQ6>%- zxIt5XJx2OH@7l9qiQU8VjzI*9a>KoU}HS4RI{T{4p-QDFaYT)j9J z%k#wjZRzc~^7xWV&!&uYJ64w^(qHh_a>ITr;dzZ|ufWd9>aA!vM+B2T@fll%eQ5zV zk&gi3S-POj?~*UYmp_PG*tZy;A1_Sx-5i;&qN&GjSyUlXn=amv>yq}5emnzt&G4ROXov8oQKHp-2tukQb z4li<(9jCwDXn@9_c|Ev8(&AB$%Isu!BPEAcdA&IM ztup(3a{MhniLLbMD5@k`nhM$Wk_oq<>T^hX!A{)ang1Xww72-nHHvIou20WvAG4Q2 zGv9({cpLbT7k#yrX8O)6fYsiH=k0bhJmuM7Srm(C^UimOaZKhW`9-z{Dqx;Hg5p^R zn*Xx$@iP+JRWsS!^r*OqalS?sd0mySULUnMm3cS=IrQIjAlgQ~v}o`0$!NH=IS+0L zeaS>wTEg4mMavDTvq2Ck%~Cw-DBG8Y4yZL>Upl-z#`0>;~#ZMDhBcJW~_f@s=r`=Kzqf| znWq5k)=w5W#P+QsUaMvG7#T`-cFa!3 zVRcIKRyvL%Z!Q!XJwDpUpQD2fW50sf1pZ&pYO)}Ind2VWIQ)T@AW~Hzi}sROe0g&H zJh!eIut)`0%IDjWd*LDLeInIv{mel=2u-$@Vjq8@Q?{1X58&HRZI)qN4c}Ox)&BK| zLp299vQObYx^jWyuK~rbm80y6za|%hb!M~CT++8^JD^qP1MAeJbRwna0X>>CfQvU<;7t^uP_zaNn zEfR&~gb>~0TOF7qFhRPHH#P5e(FdYvCEn`k_QXddB>XnUmCN61hoO0;br6l5lVMx) zputwHebM8q!|&bJ;Y&~4=J&|CLcP(iS7FmG9Piw{*YuiSIT_XHwRXqiT*}Oa>-`tv znzvj1)XciUoj3pN>*O$QNTuqpo~D}YATv?uPO37Men{(@`J?oAyvocPNZDtyyVG-X zl?b4S!>R~;GfDV5_8m(^WvH-UMRd91Q&A8B=Upi7sG#qy(EX~TjIH&~b1 zU~VXlt37R?0TFwIj^z3KdXB5!mazyD*Wp#B#jCmcAT0@I5#ivTldrj@PiyD{d5p)2 zE7K$h97;~w%Za&Bnx%v{1!m~gu3mq@Yt!-|?D&L~e#)*;WzY+*&syB^=Fx@=rMUyNl2E#UV|wg^lU*3G5>qu9n7!u_U15fAr!+t zi{dNV-3ij=+SI(lvU%Ve$v&S0zE-GEDQ#_mr4JJ)8h!m^>zYrdh0` zuVUDtX6~tND}Q zXskr%UjL{3j;mWmzqau#cH+I0hg~uXxq%Lsd759=b+w`q>p`4hO;Q;b`|yM;l)@WNH2teoh4h> zxD$7PKnU^I&Z^a1E`YxJaI)^eS*GVAe-h%_r#a6zfaz~cTI-L7p}^sqcB=1;XIAzuh22z)TRxm zDe?ZpISA+q>(FjeJ`zPw#bKF4Oq^5hxWv1H^k8!OO0(W@G?LJWWc`IMdF`6szEpEZ zPWhscUVo8p_m!kbc5;RT_4g^nU?ut{%z*LB5FD+}9QatHbJBllWUlSs&f$Zfy5@B< z8Qt^XpWK%6Jc^IEwlx6&`4jOze?Zdb1q`i~DiE)62O^#YH+9op0{o3Wcf->Lfy4P# zyJ1=9co677Qil7m?cYMwl*9B+d#fC7TKUxYFcgw$uy+FY-$!8h(#^`JwBDf4 z2FQl^*xmLl773lDrL3})MLvMD9Xcal_+qYaM~y!5u(=&B3Nmm+%lr4HH059 zDXLtX+n*473crVUOlw}Op8^?6b|_pT^uotXwao?c((p#2Tl)x0k5}8_IL&x|;u54U2R0kcQ4tnV5M*Hj z3^%E`Z$oWTKN;#L4cG|jPD>}7DkkpHNQZ3xYyEFx1I^a)mu8PY%(MT`-OaTzZL$nk z<+V+vXngu(WJ$*0C5!A)%b&=i&By<-+LK>@2YK(VZ$ySQX$sbR1 zn%uk;2f0c}^$XQh15Y_P0AXrbzWWJ&J8uk;*^K!l6%yxl_U^E!T!wXWj$0B7FRlyx zVk%Ou9iqrwRvt^L`shbY7D=}S%1>JvLhbF{2A%QZdgw&=SJH6X$&*ZdUHFVhVZUmu zFT>NgWUyjtu*PLk#IHJ9!hiKaweGTl@LX6GOW9Clwb2s-0g?5&UZrWs(~~5|CTUd(JjN8x+X!p!}sE|od;;r~nn~a3S zq*-flX`78SmP_QA|4JkvG=ry}mpipW%!%6rA>Gq_RQRiYYguPy0za+w3Tihh5A5;q_|N1ZCT)iZ($Z zf8})l;?(MhX!3kZxlA{)JbbAo;no6Ag-XB|f`6Z7`P3e&3%PUGx*cy@n}ISHBD$DFpq0|CMR*@S}%n(+J>seuXRJ4B~BaMo$g$E;&{5ZXnOrJRzR zl~BN>pPQIyFujn#G88Z6$?Lo*T4itLX;aYVoE#^mpeBy~3 z1J*hWln9V25ctWGLN)AsfrXVnh3drAZtNcy-%p4z@VSZXs$1Sz>Fc$zAB1{;FS z=C^$+!k>`xtH6b%u9Ht*3Y&I{+9mapYLg{t6Bb?E@!E3Wmd2W%vb-n$(9m(R#9uv1 zDfVwG?gPV|Tk93I3b$X{+Vx1PYjW-p(f)ySV_LK>+SpEW=D^hhRx#VuySrWSiv=_l!%+Kwhm4}6@kR8C{i2N!i z>saa@>p2-Jlkc^&vVEX1)KT@)vfAzab+xNj=tK!fRJt5G-1JtTy%FXTWKnVwfv+?K zPz0=dwK&mpvJ)E_8i;a*O2NQc&G-4iiPg=P#@Zd>Odd`yMV8QQy@rB(PHsbAHa=k^ zOE;6=h=*yFu12x!udU3XLW09sWt%Fs7peMIk+y;(e9Dnw6=y<^?MfcAM8rBPbK?Vn zVEICQkyGM{KSi|aIhF6sp8fj^t`>F+(K_$El2NGMEKw)e*reg}FMx|oY#6b4Ci!yQ znjnCA%0w8UuU>sOfkP8OD#$z>bW(+~eD`XE4c@WrEEMc!_#3Xh4 zIQOExp5@y{JvzzPEH={ZjH#*wxG4f>nXR&31P+LnMdjz>Zo}%kkb? zs21gz$))$Eo>3G*cm}wL-9x0tOk%0RpG}ZY&&FZ+8286kT9M5cDfK${rIz?EE_QyM z0a9iqx|Xu7sCGj`a!f}`UeyyB)+T9Rl9uUXlqpMdXR>wH7)L3^HEJp!*r|un_uo7&!Og* z{_A+$A9RnD=zqNQ8`1xjLH>{Qf47EOj=*h5`hSdfPbSm>dp9rr_X>H1`9ISCR~ryR z5IEq6*<_v$v)j#UF+R1N%d)P9dj6}AZgyYp=h%M7rSrN*L5$KWjGin}t74b+a_RjL z+phV7A3c;E9dSRESGN~eCoi)fxk0N~5ST*O%eEZB>TnVwplKe zZrR3*DpP*;k~zP#5|HCb>-b$N@nF#RA9&M+YJYukcV?v@W8TvS=%CY4z)}GQqC!vNV~bt8R}DuYDbTy4Q7*hv?q6IL-NS`dA62W^-7Mdp}oY= z)}!2~8U}t>`-q|ZwybW1cDJ=te!nZF-NjOUV10E@qjEQ-Hpf#0cAU)F2|@ghVAmcr z%foJD%(URsJ>mhISs!Hu=(x0Bn%VqysVmvzAI+dsm!;%sMGT(W{J?rqDW`6sxlT6N z#Cz?ug+h=g;%+o0GUVXn#?rh{XstY2>?JKgVPv|U?ugM)WnkVA4a77`P-9$Up zj1E~1mxG#rp4d5Bo)1As8W~5gf)250QoFH&p%(0{B;{XK-&!)RTxo8vFCE<$cvc!3 z>!(3G_x3V@=kIJgJ?M~}y5ySyLeDd+t&FNYv*xp|!@@Ez%?z)~-gBmxPAvQN`kaKN z%BjHZN0yp0J8t52+$_)Rs$>&NusHi+OHF|nH~J!vPc!KCc*^3F02{w9*`ZL2Y1VivL z&@aPdKNeo;c{_?_fz(UOdJL6>bZk0(6*hC;>l)Kc&PvmtU565WwhO>dHy0!_u5s;r z>2=z@NQNgfnWi0$I;L6lgx1ssQJqWwzM?n0e)~p;u3Opuv)>7ng!=l7T)DXdt2s7v zMR*rmKE%WBP&0h~s_BRT4Q3S?CSr@Gwdt2mCbg0FN0iRPdb2KFKFiCrd==X`^G{6? z^$wSh2B(NJg0|8rsa6=P_MGTJHZ%5`CIREw1%cePD5iDojp~BUe#Yjy*vd-{37~y( zsaRi;j%#PzFru#A-1D+0iKBEC**q8P+rSNZYU;(Fbcs@JM>%4tNSe+@`M!d#FWdga zrPG_+Sg|1nE+0Hqa0_+L@6g7h0j-~vf2Y@+z?{$byoLJ6K`d-g& zOLL>B$wkmdOQ#b1^B&&mY=!j;F8gKC#4Jws*-q(H9L_Gjn*m>ARH}w-(Cod{z8zpv;XL?dH28UvD8!Zy(vV-Hs=enP7U*VXSgs30}yRH}PhEL%yJ zr);{Ft6tfvsp>$UDX*XxC#ljX*DE`ckTFL-qSK%}rcE&t-OMe_Myf=Xlrh81nw^59 zOz>;z)RBUjd7ba`myl$)S7|uX21)Hq#hj55Ki|0WI1et;c1JJ$>0iUdQ-|$c;4w~y zYn}x}8^E#_)nx)#`#LR9r+`laERJ&(Oz_~{iI(@<(TwWMPZ!04Ltf1Xip!7?c{Q-A z54yW=wQj$A>z}2)A#*m>L^*e&_!x9sW*PLw-LOSK6F~pc)&kNo05m;?>(L?I2-VV} zdFeaj7GGBTFy|fdJiAigI@0i~HBasUAyFOiukMFYmK++2Rr*J7Na}cxvJ2BRy3?p% z?U_)035YE({;K)$Qu2MOYvX3NM}s>=A{jONUX^Py^3O@dB$QxhB+!%(b@U7>Qe^(_ zq&DWq2v=jp+hK!-twqMcN0pqrLD@y(Lt%1F7DGc$0q2?Yvh*iioXi!=c0*Ol9mz_W zdi5`vry|D20s!U3#VONi0qEbk@e;;TT{kRM(*=DKHz1<{Oh!+KMX)nFzw%*>GJ ztFJ_0E!J!qV{|GCG-3K^Mr(U36EmdG<@%&1Q?_VY68qzCF7lU@X}kW4$C`gte;u=0 z5)3*Vpb`Y7u_=63eE3CCN}XpC-e}6T*hQw-E!hs*>+t0_30-c5jIH06V${W&-f0g+ zp0KaqbzIk@e7)%OYS@!j)4R+9zS#B(e{<<(&PngJw+o5vWD6l}aje^kM$*KJ6>WNW z(rSoZl}ig>4fq`pv#Vp$)_2(LP@X>uS5KeVKYcXjIO=xm@f+#_NRlF2agkY@ftfMU zh0k<0?CmJVaGVXho9JX=T4a$k-%Zd0SYw}=12bXP?qd$&c_3@;^xy4m7z;xp;#=|XGcO4>c;Lf z>o&SMWP9i*qQ7cjw|m`~cMRj; zHC0zlRh$(e_I)FJiU!$Dkj>+o%=^nDPpYDavs+QRlBxi}$I2P2eG5p_dnnR6%z1Cg z6*yZ>J2K5Ye1&sT(5A}t0^iRyq#-n=aenx9UJbY3(dnv01+-k6&Waj9YWw)8;TaY& zKq#tDk}{rmMU%lNwGrFiM$HGv32TrAY&zEQ z?Cj){O6G2rSSB6lbbh=3|uMW4Pq zIK42V+mKAOS$WObBXn7IId95)yk=oq(p>~ETNK*_k`KjR{qiDlopUuupdFz>+4`ZS z)S*|PyT2?6CilS%o=mu?iez`-au&V%=lf^a>!>Mm{Dt3*E0KOtkF>NVe0LVd%|SWq zxn=eSbaHks+8iL_S(#q_Lz1+}avLZUyu#X90tib=ct4sGazBe2t&?kNW;vWjqiKTJzstIt9wtKx__LiTeS;z&F@3Zn(Tx&1((e^+f1rcGx+= zkT`e$Ddwa{Fh8VV-n}Y+Z}R=%YDinIo*Cr4)1%({;7+Nvg0V2VaVunuPm;c&r}h=x zB|3Gotu{+Ng|S87_3ca%4wrP##1o07^u?_@H%BryIu@|T^e0Gj$bL60`aVB^BKi_f z)4Z)zqsH#MyW7}2gW#d&oROU1U~Bl2(Pj4!x_IKdWVMYSV{;+~a~3FA&D80IiyokouD{@;V!GmT#&f~PszdMa6rI9QtwRxs+I zWnl}ovyoY}iJ!UYN(kDu>fml+M~9dZtB8b%flHA{uf{_!IWXAwyOr#bp53W}3CMT# z(-psiy+l`&)&kfxY|saB$bX7|T2R!NFgWRin+IQ^f(uFD+O~+n7aMJk7GT`Ilff z9T_j>u(n(Qr`7AOhy?{bt4EMyl!Hh#RIAsAjcu{2Pob~xrK;@uSBDWN`Vi^$LHi!V zUtEK7wDIAR(q!Yg>TBpq`Nrq_i7&^TX8o+O7Xc>zUsp%DvR;K*yLBbL*D6v6cQCqm z0t?+v$#>@ue)b^*ntb2ocThC`KK6pKIxh{lv|aYL=cdZj^A~DI7+|8^evM-$9&y)X z$UH1|*ZTSOv&jtp!f_h!bkFx3d2F?l7~|Py=yiH8R|IX_u$D$SXHZ4_%#{XzgI#Sc zbx*OEL1J7K?LR3MWqV=Iil4N;Fg0sS3gtC0?2#Qvz!A=C$4va|&eI4vP-A~fb;h|V zZLQ7I(&`N%yD^teH|Q6(&TCi6nB&gLc^tc9BmxAcX+neowDtTfi_eSNoXa}jy>Zr6 z<;w?FwI;2e=+f{gq@89U+1Wy;t0x|2ptEhU)b4EjtIF}g!8wEV6A$lZ?CKDyuNq`e z#|=05+*YaFHmNLK237dX?lgqU%Bj0&8E9!WbaApRQm_7$F68LE|4OhYBAOX1SCE$R z%fVStCXzW_Yco)e?*_scj>Vl(LXPAY1VKr-PIMn>KW=@jm3Xi*5A(wA8m2Wa6*-uk zS}_L&kL=u|+7GGh_4jmyw)^C+*Y@}DI4l?%QpwR(8Y@%G*Nm-B?oZCQm>k-bP_K+T zd0_>@=43D*nGsFNmA`vdkzFE{WwmwbMQ9y?$DWyM7<6mmo5q!%TF@B6T!s%Xwxsv% zHt<#M04m?+4fcTEmFRgK*rx8(D!$yb9z<-k*)L6kO+V9f;Ew+q{{C~Ywj+$V%V^u- z)h6-Li&a(zAFz8;2WDiXE~dLFmg*)mcc)pKcB_gh@hiQQfA8q0NGo40YrPbj>3LuC z#KP%s1l2*yF; z@X&iSw;#KW1_z_}Yh|tppn2{V&=fA$eEyS$PXM;G)0={U`d|)0C#=$$L&ha_AgR}y z3uB74B_{zqnmSK=f9?G>&sBeoJ0LsLBR(`ZfnA{-hvGNf;;g|tmHdw?D^yZN<9WvVY3Bx>iK#Hu|#uknxgd~ji7m|l(5BF z5Nfv?cW=6-*0|NdOuiC5CL32XsK0#gX5>w3XI2Az+p158d)vrxs^NU=Qks}-ZK#wq z=iJtzt?JE|n4;VOVql6}5b!BiS#3iJ#daM|^Yx`1&Tn1LArR zx0^m^m{nO1JaelT+Ugf4C2?eFN9CAii5nkjqPb5WIFNeMQCX_m>h^KK>KA$aDSkSL z!9wM5vxmudC40Boztf$j6d(!1l%O;6hpc6DfHUhYP^O~2Tj}V1)acA9F#&dPhY0w- zbNmSrFp4*IR(6XNJehaa^ELECj*f|gsn2$PcZ9${sU}ui@3nj~PMb(PK2UF>LLI9& zRSfS2loW^y=2}JyY)q_&4lfkZUJfBtQ5UWgn& zE0rC2d9rHVQ)TG9;%G=%ufgMjW}Y1WPDb(L2(4FrtSl439c9OxP?`2L2~77tS;*uk zXDP-xdbBX_+1U}NwCaOpIt9o^bU(L%+7_W%56n?OXcmI)Z>u(0sO9w3nz#IFozD_% zM)+8Jp2^g^QVQfVik`I33)F4?oNs>P@U@>C1#(~CNAo)dX3+ch70ZdXoCSRoyL~s- zfBDOBCP8PfQsuf>_51EgSI`_`(NE0C#V+-E1BK6Ck3MFm1v^k;<%ak7-07>NY`v#S zU<81@p(yTagQE3kbKI3p{_Q_LZQf#G8S8&)tlG0$JLiTAkG#cMD8gJ`Ib;}i_uv~e zh$R*zpH(pRw7jeU%(^e{z4ZjHEosXaIKZnd)S7M?311;P6I;$KA>$f9ZgVCj|jc(t~4pdMguIlM4^c4QS%TAQ@ zS-H*mcvQ0tk^W?{5o)5_N~Y%a^8v!DiwN;KIm|zC^mg$zM3ewZ^uyqH{9tQ95*vFz zNh?>wiuy?7P@MzlT?t=Ofx!{ZtE^<-D%tcJce8oIt|+xomdK z=Ley@QlOTVkI?*H{0=kVwD&hl&kkAn7iu^)_GEO75r45#jSk z{_ipdF>@kA4==N4eiq*eYnQqpD_jeW;s|A%q$-u4zm#G&~n@?YrM z|NBD!w`=|XXYjw#^^kP38yuxuUiezExi=ZY`$i7q%|x&De8n+4+rJQRWE;FzXe3l) zw^!8?Dt>?7t(5N`HN)AN0>=1Ty5%F9RjV_CC zwigr%dihMlq<-JFe+Lxvqx2c!UX)`zsu@!<^i0n=d=ZiM=Ez;`tPXRS%eHXUYOcO) z0hcOJY|sKV>&+%}Vl8wG*@om!YRHyvUsx{qfhhevR~9bvgT0XREk${vVEMlr#DR>{ zJH?6AYw0&G*+y$`yAcE2IF~fbUh`!E-o6c1=VEUT*8_8l;|zqnbOk=KkBb}KLcmT1 z!0HwX5)L_eg-SMvx$-84kp>}pp=kf}(STM&eu|W8qVw4A))vC9v|grzugh^(PcPmC ze>Bz1E|5YiNGO*NlD#iwQ*qE$>MG1OkJ8Ce(fb-?I(b2OqtIk@AzBfLCA|L%~mn?N&l!qX zU%I%}KJN)dvv1N<3xkd#oF!4)WwZcT8;Lt&CU;0XyoeG_e!n=thdZ21%8!R66i1b* zQmP}0!kahG4E94D_P42H%b_wFlb*G{huv~wM~&~3T;{5R^-mxtol)_P0U|yp{;ov4 z*pWCCC?d&aJ5>+XBylq8!3*^C(7gjI*Zz@RPa!QX5Z~zl1>iwJanvxwxXg8llNR0x zBhj3__CsQYE$ZufBr5T6@9W-{dub{Nmq^JJgg8>(QK&_+;3IcwH+={TZR@qS$!dwG z3!P%~XSvM^Tvb?sNTOS5w8-&+&1bF5mjti5rds~B%u}$p8f^L4izqF%uU$}T1&MsjYDY}FjX!Piv(cx@}n=`oJqa&IP) zZf1P`^?6^e*qqyH=9wzp@+|SEJR0PS3pE`{cim~(h@STDImi}>sCOQ&K$49;ZeGsm za^#JWF*}&B8@V0fU@|A}^s_dN-L7tN<&0R{qdN@UDjJp<@R^g`TzJT+F7xsHWULk~ z-Lw>x@Us;md|dIKstXz9*s`2KDdwce?1ReIlYSzrI(fbh7n?h=x5;D`Txx-yq|)(M zbKXw!ob49YS~y3udhH=UwX2^uF|szC4cf(RRUfB{Lszb$kyCLOC!K=m)?Y)N8cDN8 zyJSv~C%fmHjlp%)NC;?`6-r#`&shmY<1a40NuXq#kd`c7gWDrWHD{;u)jroo>9T`7 zl1cl4irvp-tJ1j9>sH7mS4V`PM}ZXXa{$zXxOrZI5xe9crraGQ+DE)>7-;YrZ*-kI zC4{KM{7*u&ygm2ba#N_q@QIc3 z8%)}ENx3?6gAX_*IQX#qvL?M=yUA6qtF3tKKQY0I+o4{1GSbA{Qdwwtg2TOR`}Hu8 zwqm4Vg-J_?$r=Wrx*txGQ#MxXq%)a=8Fy~)%zJPTGd%h zTssppH{%P+%}vf1zbE66A*UTKovc=>({)E@*uz13K4WfzHDTJM-ZXHo`E7gsO}53@ z#fPw#0&xAnwT?#R-X)tF`|Dj&8jay-** z=GgBvdB=5SDCTkZK z>jQTxOOmpK9}^d>s7klamgc28rB3%7DTCChZqoa2l36iiA0>BHFczEtI118=Xt}bx zu2B$A@biObnP4aD&im-re_7%^zGR@hJajU-1*v`_C*=}pb3Tr6mTZ_nmNh_~}b zyRXlaj)^f#ZY;JKL@grvYiFVK9G=ch|jAg|LX7$k{D^~voPSB=?RGRh#7 zq*dxb;uP<5;qhg8xFw$*vf0nf1V$d3(52dar<36N9Rd~}CYW0d8WeYbXvy`M?x&XY2Wi{;o{T|_XUfbntNnAT zbipIm<5dD#DvFuQd4PWixU&RmNhm%C3t7WT%Mw z7VbdMG^iTonUTuzav}N`xepUiBEC=~JkL z_f6G0C93_{>4>Etx_S-*R8cdmX%Z_}o`x#w*v&oFWS=eZBvfaq)5;RYdgE7#rxn2+ zsu%h}u~7e1;JzY9z2SI^RJT7F)G89doJ^y8Z~PHol(zgp4dA^y#y zHzT_GJ-(MZH^sHxCsQ-Jo%~#Ge&&1$%4paUn5R_QLM5~_22C@aY+v45|8kG4XW)TI?%v7zLH}!8W2>i02~1 z$RkF{!^Fl?@!eC#p-V?A_shlPm1@t!L*lxbc8+VM+8 zlND~mqzL@snc-Z%{{Zx?T_RKOVM28I~O^WVprW~d&qCd8#`CE zC|}yFeU~3*um@?kgCsDo+8tX((8(-8Pbkh(#ruvO4UP}R1YmpHeuoug1j4vVSMxu) zt@Uer?}sNSbeOT}>h?H0@Qb4dd@bTJ<-6gzX({{P`l4f+z1E}E)9@?RhgPe8`-3t< zZEA!{K>i;}&V*H^(~g?60KFBx4vrZZ%1>iF^^mS<#oEzJ6&ry7z9D7i{9v)HUHY4{ zleL7+DP)*9x^#fbsei)QLG+ZHZ5^NE0~WQH9h0i9(q5kGRQEq!&+TMmqq-@RtJb^# zZyiWnaPFbojGV6mHWFfeucC-tdx@@e7KaUZ+IzQZutcSvIe2O4u9h^JI&;kqH4d{f zq>S-N(`bQxO{b3rf>2Gh2Ub*6az@B*71-f#=ppja+(mq=w0~*J&I&kddMGW_biQdN zFV>Dstn{%?*6MF=KK%eI)aowmv<>aE&6Xi{!X&&O2v8u*mA}1#dB5)~<-T-;#RU&m zl^z)y_1YQL}j)Zo3MB{rMyo|Z6%Ulw1jK@JG zOuOTC`3~NPc(%CP0&>yFZm>-b4n8}5z8hyhc*pe4@MO`Ls?#tOdE~1uXpsdb zcT+;pJU3_kQFnD|(!#K0t?$_s1l4??jF++WU94(ISrl>$vHyv>bPV}^To_XI;MbPv z$Rb+Ki;$_}8x6byku!v$L*is!PZN$n))3-}O2Wa2#<1mIbST9B)Knn#^XfPg7DTLw z_14nP^=V|R({{D;=#fB)jC9Xa@0DgmY4c%*1*Hdy`6TGwe!0AqtZ^;oL+)x*Yrm{k zQtX`5xBYoWnE!qX*L4eumW_eKq^6Xuo7|>p`|(nab?cJ>0s|B#qQ~Q}Dof3~^z5Ka zPs00b$LyFB`4jMwfI+g}=+n3aZ?10Dw?YwZI?u5!U#RrdfIVHTv!@uklH= zmM@IGbMf@e7P18?;$;mtJ4FcawEgNJn&~pEx3y#^RSd=ihmh+1{KH?tO|{#h?B_ zs}Ckto3;fDwWmrX>k%hIudm-S%E{Nu3JP)8N!<0PX)=QngNpV#4l>MAGuO{A>!+lm`n(dvhp$1nhWrCF_&W@sEM<&pY)Jo?K+D8&B;O=2!=hJ zMu^J@uDr{%YCXlN2q;TU&g#D4lsV{fpCt1)YB62zO`vy5dtm~}X+D41R;M@b<=oyI zUlR=Gia@;YOBRE;=#KWlj`W6(8u!Q0cjvtweo}6l5Jq=KI^8yXj$JDq>+If-2=ZN| zbdC4)0a~c5b5pM*vNyqhG83it*n6%1VQbxEj~;6c;T`9(jMgAf+1p`5MC)m}SWaJh zxs#0S_6W|{WF}Pgp$T@_w>_0i*09QKS)t*}yLL;MmmT60&csW>YMS#`^a5BZai0J( zLpGnE85;U~+GMM=-3?St!1t)e8%-^xY|`5E??X>o%6H2*Yl{5pUmzw&Eu7^7=drDN z=Q77rR=Y*S<6OzlS(f;BJ4LwyTa4(A3e_;_&2o1^gmja24;RP}2TE4-o$3^FJnc)V zOk&NwoRtmKxZkHu{f#o=(x1O6@OCk38)f3Z*(@?bz>dkplQ#T021J}Wpd_hg?(fzA zDoptA2SDrt$dY78|9?5I_)j18j>Gmhu`e`uSU+ya8#oI^M)EaLkD~$)` zm(g6d%8z_*x3MZLX9Dcf=qLHlvDN>B+u*;4hyOnlVdz@J2a2Nc<;MkORlNmma&QP+ zhJl3+Px}6d0*3ht93jiFd*@S)Gs%bZZbWY0__9%aWgiAxHGT`nk^4|S+0f3xAqZ(` z7a%-0IP7Ux{1rJ}pYFg!a_7zxO6!}6M>ht`@iIBa)L`LJBIq@P~^@!N0c!laW^;!Bf`KLjig4KevB+iuJ6r{l=7;D4ew6PW7;7 zI++IJpWAB=0GEPl_*w%=aIiV&!^Y;c82%b(*kH@A#g8`YJm0b?7@Sz(g|DL}t(&}r zOI|2#+_;pV4@|J914ag)(Jzd|nRD~i@B1+s`-2~m>Y+%fpg-;RqQCVI67iq$4In@x zH{QD;8LtA~5~0va5CoS-hJ;$XDCPD!lsX41ruHqn)l*~oulteu+gM9aFo4oVmP_)A z_)Ci_v~{QLn1(f|*h!CWx@p(~l^NFeYMNW28?qJV)6c>3Tp@9@Pu*a5!o4dls?pY! zfb2AT1#m0vA2S3=@I2+@VJpoO7UgNX=P|lWf4oAI)E2H5Kdq^6QJhC1M$g_B?h!>T zAAcN<{9L?$z0-o$N3}S+qSrtlVywUHQqKt5JUqLi^TrSu1XQ=BjdyWjt#X9BH3ey)yU@dK_HlJsW-My)&eQlFmCmgPk}{UOz!-8;Dr5zM{H~%&X!sU z!v^{eLz{Oo{c7>JTyjHF?6%F&W`s$dOy>SuJKvGPlwVKn+~Mt@xar%;nI3(E&0OB1 zvizKagELcO)!#2$ndG-{6vz;fU7-vviq)~Y&G*&WOb>?wfGXgWB^<5zIv3etZ zU??zHjsu-_&iQVlZn7M!GlGO4nG{+Af_GZPmCKO^E4Cl0Bxlx`sdnCDplm@J z4w~kl5sN>QT9xB(Jl}gTsFZtLi~Yof!YyC;eOyFi5wt7Ggp%Z0@;|Veo4|O0c|}Xc z_Zefld-z@{g(AdlgM+sQq{PeA1Bp|)KpTu^eQA+tjARr|uj>c4MjxcQiVF_Tt|%B> zu0f06X6B0-0#xT*)}CUFT5hGz^emR{vq*AgP&oZ>qW46?$B(?l4!{Thd_b$kp|BdY zcRwNrAYc5g&@Vd7$Nf%0&Cy@O2AtrGo4fj_j?w{@*m>3z zOw~AJb*bo|TK*{6@)L>mAYx=Hy}@Ajt>>4+m^|g0l<2X98Q3#@6M%KtfBPF1qnK#) zS6#5%lMYVC3puG0enJgrnZYB=YO2cJy=!TD+6G3JHsX`0bo7}(dQw!}W7)}My@a@X z^L*S7GBQ)i6)&q}c2*zY-OSG|@qk<6r}eEK6rcS?(e!f78=l8;x2Vc>rY=kjAJgzd zNh4jKUbeWLA%BV;7NDx6Yc$gZigkAEQ%k_HMRAh_u1b+k|gr6W)pbwbDm^! z_b2FSZ?tLzJulsyu1uET(FAW8l_W%n(!^Y94`k>qWpDGGPA+6<@bof2&m)@)d(SLx zp~4{Irm;Rf`8qFKMSCPY&>#LU&8+QBi_}Vsc?u7@>{E^76Qa{c>;U#b5s##3L0)>t zLY~8E)aa49oOSn2^u%-Ksp^uZzN|M6f10b=?4nXNp)H*7`dvh*{e5f&T71KZUn`;9 z>1Azr)lwj%`%&MTds(kaX#7W=3-83M!F~HCYFv$$U&yUfyccY!#s4u4qVcL`#qBT+|_4>w|cKYfUw^- zD+b}vnT~#lOvKa6Z8&ugdw$ApM!qY}hew1y37|h&qTvJ{iG?1SkXJt_bQ2feA&Po3 zIK9^JKV4zVe%R$taiT7Vg*g;fiOd9MxxSJkpF;Xzdmi-)49r!ifNx9s*?Q~wWY1dP zhSZq4%TcJSs;jB)CdD+Phz>@kMeQ1fXlwDR%)>wq_$!ykgC)n>OGUhjvZa_=om>e6 z_)4u%j%aImjzwRUu?ES9h~jqGk^`zJc8nlczW6k(x}w1esZslVzC{cTI<}ze>0R3a zJt)hh{B(9{!R*8*&5gY)9bv4pnbo>T%zD0>7RZnS4^l`9&-t2aNP!YN7Gq(txf|7A z#3CiSdkiwxHJalsRPfB|(Y2t9%3AsoJ##n4m^Hn?5V1INUkG!)iYjzHMAFj5G4a%JWFr~j-{A;sopkK74sfw)LL3fZ z5Pjoik4E*f77BK2MzOV|8wNEzKF2w;5Usl}BN%N(6~cmnri9q2zf!tGm1;~!Wx>P8 zt=BkSlaml+-WhlbHjJtDM#u~S$8-*r2ofd(pN>Rhz5Rfh4Iy?xd9Hp@sjUl)0kaG? z22NuG-on%p3S!h~BrrUksgzK!sG~AI-OUsf<`$8asWikyJqyb8m`^jJQreBx{bus( z3AqT5=t07d@rAz~FkG72Z-7}~D|XDRJK--Jbai_=#!&msBI48ZL)n@(1Bk=smz%1| zQ-$+s)velIg~v2{HsJkh4gUaWI4=@3JtX*`16F|`+ELlmT`35juww$WuA0z4FEMw` z;ke9E!mJmCLUE_&LK&J_=&rSJpvP|Pc(YzoFh@4$Y3t4$@4)@>a-lavqWo-XwJKoY zK+clWjrXIDb6=aKd`!GctM(MN^quR6?=!I2gsO-0@k(cTXWPE!sDKf{G3wx^k0sYg zK6t?QQKGAe(8T*zbLC=U;L?+MGj_qjCb7~XSV?+z#gs8-Xw#iPzL47JOU_?#QgsZ4 z!ggS_AwvrUi)p~b51)SHY~2|G>^?xnP0sQ|HCM}qrvYn$QKHQ0l{VNwvxyiLhai2UVP-d?X-IeZt#AR_%+j2tg;5p#?MvLn4LE7? z@w{jM*AVn=n^QH!Q$mVe1OyDMY+V#-XOMZTnChuydkBy!;k8khw%RAAGc9s>u0EjC zifMFw4sPMiOaZHkU(c$J+Aqf1=u^=?b$&sOgHbaUjPjNmcK;Abb?GpW2!~wcM+ZKO zzHi0PUwQwiK~>6CxvywUBtiw1c4uO0>K+`rh$KDkc_d+8juy9%m|BSsf5H%CWs$Zv zNdaa4{XY!Ft8d>U(tHkYL6?~JV4jeJk@L!zV0!)ZQ8%;R8#%fXKV0>ezBn-K%2g7IO?%c) zQnx-E$4AAbM8#bc`twM0jOs$8&-}NU;KTyNMjag2g;(=h1M~qoyw;E}BqH~Yz%&d) z@!69`wRaB8^{Opfo2RMGom%{!(GOLV8e!HC>Gd&))sb*Wm+WN8?z|pH?p^G~A z5a?o^Dr5P5FC$6#TxKw8dwku^u`}0GngKqDIpmg&e3^OZ*&M1aYyj`t919M9iNSgc zX8`})eX0!L3L0SW?S|t+(_wM=$e#=P3GkL|G56nZG-bG{C2UZW@qzG9bb0g zWq_*{=DRjvC5vBXj*3IxU2hHs=5FLyb`wuO+4w$c(;=@WA$`SY8<9{p zHU^Cvx~1zC3*N%~fG2!;&FurmbYA3z*M>0L^7X~oQ}`ip7_4FxNGSgfGU+J0e$&#FuJrezj3oqIgEnR zjhkezaIFo~n62EuPpS!V^RCdMru`5NxB#o&hyrJtqBjkrR5Yvk{3r5mtfKb5pXSVF zYkk`ZZ482mBMOl_QKRd|WetqfZfMb3K4iu8{ zGB@Ncef-Rseg7)NZu3Cf{&YQTF=2nz1A5_v6?k`*UpXI^;d=t`ise1vg8c4B3C8)U zE1e}Wd$VFbJftbk8f!c1Xx&cr9XdWXHd*JT(&@T_x~c3i#VyeLP)k(T=GINXjgTzc z2>UE(l_K<{(sk=Eg`V^3$;M(whgawYvvcgXXl!96)NuALOT36AyYKAAa?bP0mr!n# z6AX;^S59hb;{7#m!}u=EI$j0Fr~eGL9CT&xOzfy_{xmR)f5$!;!95H8XFh(0H!}wO zTJL9Qw#r6EbSlMs*-cF9besb(pDTmu2o53fWPIYZSVoeKSmWZ&#FgmuKD3gu};oka_2|iewmD~=vdrlV&vTkW?3Z<*=9l@BVVUf2adjz zVH38fH)IZxt1t~8Zz_JsvP&oit&Gc`u!U^H4V?ulf6~L`ZAi3hm3kwPPK`@ z&fUomLxNB5DeR2n<#UWz)%({pwdy2VMTgvL(uPK(3pArE zbAB*_Ec-_}%6Iw)RC~HZJ(e7%>NwH#!$O%cU(}tMXPO)gAxA$n=tD%V6;>7>LwqW> z%h_`P2fAn?6+#_v{VO(}M%n%Qn1f>Y?#xXv=8mf_!Y!uxt-5pd-8I{(4}&WrZkv;+ zudTLni9!$Uetl4c4%Ud!C^T1#(FA&gP$g$i>6#aR+wcu**WA|5=y(3e&q6Zf{}rUO zEaVojBMEjThA_@w- zzP8=yPScnQl?yPvJrb<$benSQdc&{r6(R63V1P$P9p>n-6?kUlJD4d z6}eF6&44p{AdepGQ&ndt>lPVk4%Pcl%JAp1Wq78{y+rHZ+Ld)b`0>s%f2w*pIol^x zzKK6F_>nOb!sRV?x&e#DzN6Zwl7wu0UB~#iqbE+B-r$yB7V>ho*yUxq`RsrH%0Fv% z)gaHnH}$-kj}4ebO7o}Joaxl)q5G56IXMALhvN}Dcj*lh;~`YTg$RAU=wv4$WT*Ri z>J^exnr?(cX~X;3DZeuoDyr1&--B%zh!Y*3R~nGE%*KS7Yzd!}ds~xlR>fN0Qr_F1j4~+*QQQ({?ZvmQI#L-Dke_$*Mkl)EaQ^%f zDP2uTp#v)Z=Y-ehr7g2}u{#@~YEQQ77OFjB%~xpykS9;1C>^=QpN2iyU6lu|=t5Ol z>eZs^KzAkOQ1yJ*siR?~sE<6XBttAwz|z`wm$Is@uPWeot=@j`EMBeXUzHkO5{}2eRnj-ERtNhsI5SVw*MNuP^kn`!7oh*@ z`H|2XCg_OuzHYPM>>v|#rfk8+Ib-{mjBG=VTl?UK+MfO(*G@rO#pi5yHm-}JVkOom zHOV!NJx|!+xY(3b9Uj zR7GmG#_UTAkJFoZv)5Jn#NmH*T)t-E3Oh*KfmkGfc&~IgdPVTnS_~ zlzsyAz^JO+X5|ioGY2^Piu|L4#uz;(Bv}-2LVh`; zpBFp*7^7}TJIHq;z}2?IPPO%hZu#qAN@fdXXXs^Zkw4~&%ZDjOJvSY{A+LTy+89;C ze*rQ3RN(9e0K2*Wug#6}zH6z5*v=nuV^H<{L-KjA<~PIbystIfxCC~#uVVhS*WiE6 zuHU3g&A6}SDGx91w$*S5)CqV@%;GtCAkrG*#P$TLtDUD}QR0x0gA4e|=` zm6YAn%Y*jQM%{Cz6A^<-GvqqE4|%2!iNg!oe*;$el^5Lar*tM>Rmi>yD9*b?OKJ=X zY?)ai6#@nVf*3N}+Z%ynvdfBB08_A*n?diL;XtM{gOk>Ft~1FG!GDqS|Bd9pFM6;+ zm(q~@uhaD1KJuquEp(R%<9S?MQLy*gjI@DT>|Y3t^~I5U5%RFmp4EPSgr{(W)kzkV zX;@gKeC;_d^eV}y0zq27nt!z+1;SFATdh06CBer%HDh3BCnY>*z?-%25pjv(FlX;y z@EA@RB2-c)K_7)zQ(A|$tL7_SCW{lM#}oPqTx{D! z03H$cm$XhnP8VNetWiom3?w9?kDLOAJn@uvB?RyK;40z`hN@C=l7IdIkfd(i%{x(9 z_g&rIoUWIu=8lCZ28mk&W;B9=fsVncbUZdLtXl*x)Rn`TN|=g%aa&4W68ty$l-^~> z8Nu@WCiN3miI48s1AZwG2faCkEG2lKjms^6EMX)0bWB4^A{==!xpPqg;u62aW-ikK zA%m-+3rTTy>!FrKk`I<&LDRsYxYQ~CGwcJvK}H)XKk1);J^}JbxqntEbL&4KDTYI$ zYJZcvJpdfaPZyJF*Zu z2GOS%N|}YWsaz2InT%3a2)3__PEF@Khx^~#ya34d;J~W!4vVe*LNp7iCvubd1{?u+ zs}#cinm}y+FNmpOow*m8sV(W<%R!JH@L$5UDa1)mX=A5DGHa2fxW^;jG}ppMFg@IS z+sWUunDBMz)jodd30{ex>3b@{gZ;*sCjr$*;o@$O?QVs(O1&=2Y;sYxu&AFF;^#4S z)0_z|*~gm>W3(d)E+wiCt$sl+8 z_-wkDmuEY9m~TiYJr>XFgYvVhWh#>Z=TfDL>Sl%v+qg1UFW1YfkSPapA&)oj3W*9n z5aN^^imj<=_9Cs_ncU4Q9QHg8)705LM zEsNB{(9U_7Ynis20qit<)Hb7f>UA+PYlK0B;j>!fw1JNPW|2$7IBmRfTq0G*=53g@ zYr{<6xPzp5@#}l?nPaw>e;!@djpy=@wXiaLV8Nq)))5-j!p2)~$8}20Ly|t`Z2xSU zr)C;WjE4A@Rb^!K>aX6TvP!M2$S9~wH=h-l4z=6*$bZLLZnI{q`;`iX8;!MyA!TfC z(@Ccosfv6ijViu7SC_G1?2BFXI|lgkT=Fs7aD(D@OiyXmvd*;esf9{;Gv`nMg5S;p zs|PCKuRd+heL1q%$^c&^nrtr+vEIHSA{347<^CvRLkEX+GE$N%sc={Z`IzUd9oi|s zC{I~U?eXKsju+ZMm`vkc&lJ`$CxVqKXWhOv2#BlIY%wp7-=YeEhwLE6(AKwQ{L71{ zq4#KM!W3Q59e?Tjjg?f818PLo;H+=_3%{irVM~~2GliN?pnB343>Eif0UfMUA|4n3 zb$73ud6_!Cj%{gjo=$BiO_EFY6mYu%fPX>m$+nvt!b#K-zAOY-@k@<+rRYr$AFw$< zIcw8=ui_ZTx!lriyVWNyQ(he`ks}!iF~z`8TXXt z!CCXlkk8nZ~Nt#UIT?_q0>D2C8`+?rd=TYum9ke53PqPVGXPhRBU!$1D>C|}`6 zLE@;Zp^Ik=ekh-b4}^mb(7vnqJ$5SMHy zkUWr+NlM94yRW7uQd^TMd-e>oyQJ-`@tx2)9~tg&QFAxrXsVvpD$WlEaTmXv znsyRPOMCzC3!mgU7T*OfGL@(?c0^5V6l!ci>-U?hD0=>pHSCFiyqUpilk7oH5zCpmF2Vf%wh~*kg}%fNkHIh#VYdo?-R66Zo?y)S16pM_jMTy z`LtB=<>>(#W4ZPLy$nL9n}A!ncIi~6-x zS=}u)cQNQYQ*X7nWuQT_(=?y|R?^Tn<#BPTrg7Y+b(Qnd$L-yqvRR0E6Nj0o%g75& zy3@IStyRjZOVu5St@?brxS6cPHYOz@BrL234vG*}3!feCn!DzxH(&jLZP81#_UE8h zQY!g*40_&sqdX|2+g`M|aV7$3FKY8wQC(hHeYL98Ur&oI>@ke*EhMV01y%Kx0K;yk zzC@d@I&(Ly?AfNOm%kU0o(b)^lEk2Y<qq`u3 zXX7Y^@^bmBFkk^BE9vN9&xNO?;8Fd(aRt3uSPmnElQV`q`oZ?v&m1S;)lOz1mV|Qn z{HrjX1;x?S&5A_TU6YoijZo3a7yp34*CYm;-P0u1>wg@guPcytH7zJ=fBSFky>(cW zZQC!(^Pr-jAR$OgH;8m23?Vhr9ny`&&@d|9(hUOA-7&x@&Co3^EiKK!FsvJ&_xs+p z_VMk#*V=3Ux$a|*gP1$6`-(Gu=kGi(`t;el#^Kt=VY=U_)7BA^hvN#IQ&e1i&R2iu zC}xVWIIeMe(Zz1Wg0pI!_rB-01{Tp1@zJnNMVIlB9}YuE1*iL5=d$@fl2|a%^yABr zKH<#&iuNH6W6}vWG}=#EqnLG9(~wbpqiU$Nn-=9tah@0pjC@!ffVaDd{0;uS3 zfK1@@f_3-ZCPr6nXVsOH5%GxyZ)B$HmWSl?fge3Hkj)<-(cE14loCIRIQ-Lr_lYNF zDIJIaqzAQ4S!pFFQ|?>(l8y1W+)p=a z)(MvZRI8d?=D6H4D%7NovaIFQv)7uzL^7HdGO7vPlFZLGFabdlh-^%cF`EU8U;OBq zukvUZ+I)6@K6=)ETqVrju`OfG?O;#0xOD%r=gHs8KZ{3$B{Ok-T+j|u2_RLai-C_z zJM>_V6bb5L(RU_IW z%%Ur$h&j9g+tDBvQUNe!8aUQRhM3q80{*|RdggtPn|sk`?(@E@&Ao!4(YjaMLXbuq z1st=vM4kx`haZs+qW#nlqf~~PTn&M}Gi|xa?=8Lf4NN5RgNe{wL4H0Fu`R`2nXoz@ zp?E7N+$is`qSmS}`DGG7Z4?Ijb`GD%IfR>H}Sh|B1871s98j{NkZSiwa@U6n{vi%8SZ0J{>_ zmRrK!OE6HyP9DQhx38(W@f^hogs?2`=9FaspC|v)7iW(fMG2JiRZkVr`r@0pZ))_c z;c==>;^aI;VR{^lc`u&dTT<7uuTR+(+n9MEtERnqbBrYgGOte&@qQ3y?Y-1U6y=2o z&(L+>zZ)dm2|GhwcRf-rKmmu)RllVd7TkPxc?x^66Kk-Qe;=M|@kG>WRp^bDSxv^< zgg|;O#?{$i@&}mGk5tK#M9-5nS~hWd%q>)s0>Y1rc!s8b_7B%wf1*jU&`nwq(o!W- z)7&3PVNMGq-=ykg2wT%JCC%C(QtOQUb$nS^CYZThw?G7FXO?yF4|@b6O2kOv*OhyC zoTcLOQs36HH7Qm0GW@j)8>d2{CihI=kDmBCnxQ~u(!eORD$rn|3FI;T9R2)z`ne^Z zFJfw2EE3~7$)f%0K5rw6=Ux=@8v$=KmE|J5$ArgUut>j-4J#j@e)&5i%uL#OjPbYL zrBWZFO5%sc=SJ_fk0z4jNZ#Lj-PNhhO-;=GuVrZ7a5m_uO?9+Yrzu4!z6&SNG{jHmU#i;Kd$t>rZVN@~^O3uuR>DQS;s zEsz>_f(pi3Eqx?9a+JZ|Pn;g~W(&jnY8~@1Lj-!Yegw((+gb=Jr1HDeGWMBgFmJ4l zbO4Cx^jCnSp4wmlBs4#E$rDV@d!GP_kg0pV?UgO@RM@$Sdn$1W7L=H1zu3&FokU04 zaR0R@YJFw>hm-ERcAf#p#+3ROJ8nPl4$FD4rMwMYE$ZX*4`!GOl_~5t1!?&zg1|Ci z{l|)!bPyqx6NIVgN}%A=$Jp#v>rMS{FN0_*`H$bkDTN<dJ$|wxX_Sp1BrvY>OwNhP58wX9U8M3cG%fBPlO0qCosr$_`P*YNr zd>xECsdYpF$eX^7R;jKUC0>e5vTUtHK*7jpvCEo;k>9DiBpPT3<3LRcB{8A2l030) zk|vSG+P-cQA9-Nwf`K1m-WITp_ePh{yxD$Wx&wywGb@w;WXi5_B+1pFCa8O%nWCNTE?$5;AOSqgyP0N}-GMgjDI-Tmz} z<50~Cd|WZ{j*9~UhHbbzTAaDGdvvI4?Xj>e<(j&kdurMY?CrS;+M3L!&@-(kvNXl9 zBM|b;sG0r6u*6+o+tNiwIq^5K)NF{`)ZjFTu@`?knzm&glqv%CcIGAkKjrR^1?#G6 z=q73kWqhuPjx4SzL4==!jx&IPC6XC}SO5}KZ4s!(Zco>jZDYw@ldwZ@Ks4}DdBXx? z(XD+QQVGE$P}P+=%GwF9K(8!iy`wEDVqXIIGv1t5L(KglN~7O_Xv z)Cl`lkRsjm*ttY6`pS(O?0O2VNG`tQw3hjKf?(xQzMQwkWmi1N%aT}dZNKMc9|x4S z;nw3$TmF5_WY5uAGSFTP>L`H?MtS@-K6W`dIG6!Ww`F_iI~+AI-y@@{A0YSCbD#bV z^hHAZz;E*=+VnH%JbcS;u`RrW@gB|d80!@tce6_ap5yI0ou!+;PTlQRjIts7Ib%&{ zh+D>UH6j^>z8cojaNtu?R8q#g8|9m(+`}VxewdQF1;|O=-w}T`WW=?83ok)Lx@^r@ z{PhE^LZM?cGA+W>>zpAafI1_-*IxJ1m?-}(Jy|$N%53Slh~i`HW>}oJgvE$6 z?l%%X_c~as&l0~it#-(O>g${`|wYsLwX($M$`)r=HOy6JL_acF(wgEjwtPbDQC@l-uFd4OWRutecaLp&WT zWV1?+JnYAD1_fhgWy9Z9!Ti?s-({-!Bn_$kbXiqn1NxnNeT2iA zY3ztkwWm*lqx68*yK2zEBvnARKwM3K^9iS6+WE~mI;}Cd zKsG=T?q@%;+<49&HogVkzg_j&mrc4^z>G5XzEy~wLgmcW+>TAdxJGp2)6W*|=E~t^^VyK_y~Z z0*2Jkds&1sVefRa%+?;g`6-lSLHlUT^l2zF8Oc!3t^kqdGnrZIpB6H)7Tqs?@3w|A zKN9VI^%%dp%S}15pl0Qnb;jtQm#TJF+m7fxr(_*uqD=%mJ`KNe#8bt{l9I=r8Jz62 zw5Ho|F>fi@(Fj;9q4oPymdCCg`_t{`v*9lLJxui^#d`j+>IWOU_3znF`l;LUJYshH z7Y>0EEWdD(Crj0!2hjqL9?-seG=OL8arpZ|ISRUQq~G4x@TuofRGu?$J0Uq!@G-}x zS_sD!r5mY_LXUrB=cRoA;>(Z_b#Lzk_Wqmc298_CI= z!aNrmcCL=i^YM1HUgvY~KTEm=jy=n75_^{=IyXg7o<>wTCp?EUQcWwrEix3)JiS+rOkO3Bm3B)4?o zd!0v2Eoe=fOQfU%GK^p!s>eHDCt1(0v%d)v9){bAoaV5Wb;m7fKu+Q9+|x%tUE8Kh zsiD`$&}8kn(GHVTqcO%y-jtCYkY~T_bIN?Aa8_zr<*H=5gxXk>4}yK;%fpK)@skaDk1NA6@oJm>T;#Wm@|0;)mWnE zY+FWI?pfX?v{yYr14%tGS?mhHcCS-m4J3LU_pPE2$c1i?zn*+IGw6k#1WVC~k`o)| zUsFUZ(&gxAb$8-T6Mb!&1TxUw>Rde$dKZKE^|fA2u3s->J7p%etb(L{Vp3$GUG!4+ z=qv<9yl66tfM21aN7&5C1AObo%;ujX(3LPL_E}(gN(Dr8uz!fVCHmX?%^o7rZf0{Q zxO(cT!FfBeiIY*mb9j3W`}KK8&RY< zcvSvflefq7uJ#pA&wFP-8RAj1^(#Y$(q&fm>vbs%+fPZJXhP9AQ{Y(=bawweP3p_? zG*NE;%Wi14Fw?wJ_`&slK@YsAYjU}He7*XRWoRGev1F|d8G zd*(iMqj$8x=#ND7MKEPZD==`0M>TkS8i~;tb%vpRiqkcnHq=1%Yz5ILenSrX4r7uX zMu)}bAtEWD!MBhq#Qdw5b1ZwpliwPRDR(o96(&&qpTEBo813@hed~|>ZkA=hLrvsq zdOspcTT@N>KFs6LHBQv`MiC^}f1u`JQc~%}jsJxGYO1W~CV%R035b__Qr|D$)CXHF zux3Pfft5myaJ`=b(L>htke8G}c^ujm~0ii|e96sVSRtmIm%7 zD0JH>ezSLQo(0`+J5@RvgM-TiTRv1uegZzJ1Qi zp_!@rm5q;mF{2k2su7S^QdjdzLVu%{l}%LhKBuMveTs&*_ej%1KyS7KqOsRxVZ*A?U(BJvWBUvToCY_z-LlX8Ug^M;?k+l7fXw|+JrR?Z61lw|o{r)CB z+iqtRt6_$&UJD_?!pii4UVW!M*y(%O8#=sG2u@1xmGkzN^NSoCRODF-ZP*Bav9ey4 z1uqIw#3HULA@_;$X20H(C6U76miE{5%Ir+pIX?(Oh=gMsbVHDw45Ib&btoD|oAP+8 z?k)o9uVj1O&CSm?x@B#~NK_zg7w>Wo@owAJd`*#5)a_S1(2LDv<$9=F-PhNTT2}_V zzVu1Xa6;?hhcO~sEbw*u%7VIu@?4iqb{z7IJ%I@vcL9O z3kae1ZUIgCgB43s+`q4B5velL%EqpW>^-Dkci4`G;lWT&b>~}q;_6N+mo0@PYwPA= zUw^MFRsA~8N$VeWf0cK$zcxGUMXkuna#C(({OFmu=a*@+b~jF0OK8&n3nTUn3GeC?l3V@ayQq6T&Lql^TYmV3Y^=7Uwqhp^1g@$ghT}T*aq*x?| z9YGq*HO$UG1{6-d?b*4N)HIxJiL5Mc@$$Fo z*63wujF)cZQteR5j zD)M!dHdIy|@o|cZd#hfbwhztl|ngf8^)q&uTB+Y}|foD<|i)u?;-KYc-FA z^9kQUziDnQ$uO9$qKA>jJ1Vr#KySNw^r%C3xW&q;c)XMS{N}fzYMEon0QZRB`;{Q0 zyxsTvh{A`{2HKZ5(>9H%&%1RSt#&dmhTFSfWHH1cSiyxFueOB7H$>V|hx6ZA1@P&v zdu0onwn?e&mSG2{?-=nZj-rRaQH+;mz7b3Lj#LH5Ip|xEsmabY=DSrFr3~kbF{Vli z!}_55^^@#Nau!KM;^6|8rk-3PD*t0V8O?)u8y5qBGWwI6VYNrru&^JPWQ04 zySBg=^`BBd>YJSk+EeogXM2G0!QlxoLe@wS`;f8MhnzjXUXT0fSe12yt|}h!{hD6V zZrpca;q7wCJ@G-6aB6_28eH7T%--9gF#ID>_W*5#H6e=KK9l#L5|^_5E5K6eAUT(SUSRa}(^yMBQ1 zP4Dx6zSxY?)Ozy7_<2mt!J^#aCv>-Cg^BS%Z%D%4#B~<@ra`0|(WpO=UDJH|s{+Vz z9+LR{IQsZ1KuD^=VPpws(U8NxW`jypEr|h=-(-S;@nh+;M5FAhY+!?;AnhFW8Asl{zjIj}5t$?lr z$V%1UNWvF<&tE0;QeGDq%sV}r|4VunE2&r1DQE8&SHiaDlV6q%-6uu|Q!$#0^Qb4) zCrrV8&S$^&nbw_L$BNq{c*5HXYFPb9A_0qg|BsV-5cJjuH9=k}zP50(a++Oa8#;2c zFHq^8^#gu!GhEBQK~-kH9EIw|l2(>J+ld!2_}X|8b$FwO>^JsUqDjB6aae4Cr0W-Fe`-QF+7uk?q{9wVDu2UuRx!EJdB|p_ zi{`of@Z})}+E<#C=-wErTQ4S{LcQ^I@du|%$#-?oRk@Fz8gX=w@trmAFW@b=qxMr) ze^2_VJ-#B^%Dd0v061+gATMu$eb;^xAIC(BfkBWwklUA}Pz^oQQN+g(FxAmQ9f$NR z{P!&Q=5PEd|I=|q04x5ODy;(ktQx-snd}Uc5 z@ma5%Bc@YS_s@3pA+iu6ir8s@>AzlU*~gD6Bqp12h?)O-)T@ZIOqGsKKJX77vx%CK z6h)s$`X8Q@oA2ErS8AV9G&P^#g@xMLES%f-orVNW1a+uw@sqc9zpU>_XzJM;lQc_aR zuRm26u@4CE4O_mlnz#2lpEQ=kjmkUX2;UTt`VsiQ|fYBj29UmCP^RyN6|J|(9{P}R%E8sA_rI21L7oyL|z? zkb+m|%>VrF&xMVVcS-UX50S1S13&V3|J)|HN8K=V>7NEjq8FzBt1Dh~(m)+ONPQCi zIeFBx1ZPaY2PhkX@wxxA#Drwef6*`i!5TUJ{9iRJ^%0WC!F*4Zj0_B+@s?gI<^(yB z0@W!nBp9>7r@GINRoI;_WT4l(o4qKt6}M9ipTpw08@tOIzx1iRKzIc)>5ZE)ffZ85wj_W zh;|rP^}=?L3Vdnu#k<^_004I0&JB;h9KZmTmeX2jB&iW4aK&0Ks`)o1anjL8(NZ@ct zYJEuhJKj17K*4)yfY%>YD(=&bL(U@G^m7PZOI z8$E2f8Nb$&R-NnGJgeWsaMq|VM||$SYo!+Umr9{={M~aT4;iT4EM^C=adt#Ewy%Zm zDnr@d=byU2ckjVR=;|bXVdnu(ppnQ-+*5`YnM(tQvz|sWaRv4JUc2;GAGgRwpMfTS z7C*g&;J%r;DLMVrqdgGV6aR|eH(Gh9{c;YLEbOBd0;WB_FSRd*$<=;-@H0g~vmO|n zZ~TF%W}#`&=zIDW=gUcJayS&Zqk^5?sHTn%u{F*w3O4FMD|SeQ~3` zmTeprIe8&GstHSQ-!owJvNZ4Rp(5o^)RauiW#)ugu%`pX?mKnOcc;RRr@cXj*J1{Bz()>z}gsn#hrKh(oVjpP*^Kb z<(9)HFJ8|*B7#5A=QWsxR>JKQ~sQY=8=b_?#@U@L69 z-6USV*7Z>gU>7k+ynSyu3#PCZbv6OJ1OQwU?-?xMne*egk3{D|QVC0rj(H*vv&kHe zz{{rAOhI5hC*HF5mWg=q=%hGXNGB6^r2jH|cKFO}kuxs}6 zE-5TyUJQ}F`S{sgmy(thvgLyacUtOE*Af*woLI_zPcO{Rr?1t7DG>lX^aHHM^%WRV z4*NOkfW;3qN-1<47$Ua`>y(Li9$PI0xf-9h#*;GMgvN=?Y`Fcn`950S&Pti%tQ^eS zE^KUb@Y46-L+S8orJklW^hP+oG&#GZRHa>FO`YeDV*0$)3!U$63jzqs;H+BaL+jStBRm23?ZE28Uw7yB8FFXCGf5%pNS#!$w(^e-!?5Wr((`jJ)Kl|f^ zXH1~&%*}==@(l60br!aE7YE7tL0j&^g3+Pi9-eY%4sbNEH;l@q!4L!%*3}QijHd?n zi^7m(ltwQAOXGGlb*&!;V;z`Yw1*m=wUmBf6m#B@cNu^PJl{=&&5)g0)~3}@be13@ z!mQs9!WgCSqP+kjh2};#F!FQfEXA%9IY&x%8KJQPaepJz41AfPp|X_eG+60=u6&z<)UP`_lx z`|@U)%;5sY2^)#79N;X`xPuu3-SV=R63wd`aw8^Q@4gQ$A~AF90`iKB?i5l3*ZK%= z?Q>lP$RiJgEqAuiG_Tkp%*DZEQOFaJ%YJ85{dUt%kE5KRr1O`yrP^J}1Tx#hbk;4r z{?<-@E@8#m!}WWWr4<(mOxbPxf&f#a>cIMU`B%j|b^c!Bv&1{QW>>=lb-4$oh)6g4e(jAi9@hHAO$q*FUjcMHuUTb2lk4fartR z;yE_2$TPALN#MK~-s!|=o5tkN4PBQiznz>-Z2)8oW4}s<{}g?XFsc|{(SK?I+H0UK zmEimFi#rE#X?KR`fPj~-*+2JG;^NPqX|beIVYP0FpC0uc$EJ!KWzS=O~HSM&J@KL@am!C1FjVKEZC(4 z&Skl*6x`UIMd4lC89=m*{kZG}&sPP4krRTvS2cq*tz{*VtU$Dk4Lgrupt>fv3Iqhm zXluKk4zR`zI+qQ;1c4s-U;Ebn2`E|n%H7#Q82UKyv%^d&C9l^XJI!fmRpY|se+sE4 zJWtvX;?MegFUw4qG43hHgO8!P&SUni{?e+NstHjKjI@Y!wE!6~91$A#&6U0LDZZl8 zOqVq)xzWe}3>e+@L3uFB>rjUlvp4-7CVpz*239@H!!tk&4L`o*Fg6Fgg220&-E!ES z#rRFD6Zuaj(Enf=|GPVouH>;H`slOnX%(R^F=qI|v)~ijpFMLCR zc1mVjB`0+gK=GuU*r$T*o4#hlU-m!x+M z)t5pCCLH16#)O~GN!M@agqrup(dBh!(kZ4s7x_!#&txVngTkiPyQgcpz+0KVmf-I9 z1C3m4J}Pq|%h>`%*ekPDzgQQyboQtob=R;``BxRZn5uWYpZIC9(y+fLopC(FGbb67(lwJ#?N zaO9f(_ll61#Px!fA47?%|GakgOLX&8)84p&zVEvZuHnIZrWGBmbolY1qzZUiv$M#t z;UZY^cboGV$nf5vSL0(LGP2_*wKqrA_T$s;#Vh!R=LSS2#G#n@Ghez<%c54sqa* zHFo{-ZaIu1ZclTBS4fvu>lM+|%v8E`fVOOby5aU_+@|Fx-|rtMLeeAA(WUB&AP`Yh zbr4J;;yHkzmT!cR*EAI`B|T#4u6JyRy!tch*MPZmc8om`RXxjcc$s0!#adO&TKqsx z)5gNWzX4&TspVOMZBUXR|FW3VZ6INCZ#bIcl3w4?VM-yH)ye%~83LO)-B~WGV|lX7 zoNZ21Ph-RUnd|qgxYb~LOghF65XhXptcaz!c*KG*=clPc>5`~{yP>8o?MuSCq=@MruQaV%8>l@@R5Nbg015>@rxT@zd#lj65K{ z8>5>>JvR1!5a1`Puhf7DSN1v-^h+Yf)%)hhMR_@6Mdv*DEV)=}dP1;#R*Nfa?LyVX z4vkWEbIH@&7SpniieuaRzYlwLn|ORh&N}zQ_g9rJekHKL5s4{#DLV9OLP-&vkymD* zE-vMB&o)Z4zh=`C;XFOpi9dg1Wol#Au(L(7_iPqi`|c`NS`g&W9R3>prIRt@t_!Jj z889Co0X#4ad+ha*^4vJ0(_!#%4+AY?fXkv!?K8Y{nzA{n$jQaspK}E^zE#+<6Mrp6 zmA3uMPywQ=PrH+zoq@|a7BzIfP@o&}bg!LP*vyT3X@9bCm?I7~UlH6p&&XgkbU=9K zm=66FK#C~s8;KtBABBA-DAh?wWm`0)DYY^V5}D$2!sQkf;*lU$bKS8m^)%ka%A*PR zh`(l6_@m^3IRApLg}71OZeK9wR~yE7|399*`b)w`Vk)w%#O%U*GGK>J%!t_h0>qB} zz%PE0aoA3;YP|P-x|T2(Q#`mhc$6v^*q=D!d1f99s5y>+gi-2kl7v zGfrTIo+UBPi~Ox*akCPc<_pjhf#ZE1B`=}`*-f%V*+hO%c^Af ziA~3+3yVX5u9?9i11J9D#Jhb{qVEviE6}O>RYj87-PKjMOcE($p*#J~gFjwq-g2PU zYP+g33P2v(^8v^CdQRsbjk(flYF_H`uU(b^y1_cQOacHA?~Z?{2Y0{yPh&0rokqDc ztAOKw3%dC~xBDMhAb0)wzdaP&07P-CV2tNloZ0+ixXztN+SRFa01UzP;NFkl*KhVn zq&03`=rP#4mi7v8Fg3Puvg)DL*X>(Gnp8zJzY?iFa8*F{F1_1SV446<+cB?r0`=!6 zZi^>Lq~%h=VhRmih0cr(Kjv^S{SKJ*CwDNNWDEXHZ;LFN+wm&k_&C`^)3^MGEIKTt zQpsr4?pDbfjq@lgurFI_QB`*SV11O@<4l}~l+J2JU`NbJpyV_|Qz;%+=A zB#t_o&3}lGeGQi=XGNM{{Dr^!I9sa6PoA@f7v*WQjz7`rfnR{_lo) zbjS+fS@)0-Y?Qx8Kf0U^n9=U{BJW-&jr-_v@v6Qv12Xipre}FYO=sHU?D6?L%)xy3 zg64qjOwS%npFQ#SEZqY)fI6b zC@eoHdwbg`Rc2ve2voN+IlRKTIk$dGvDemopIh)&!{fpQ2h)`#*;vy)>$$0(NJ_-M zlD=`Lfw_f_R?91)!8%*6RX^Q!bhIH8mcJkO>w{eLOTbEKC@8uFN9Df4H+Vt2{Bq*e zW&hD%1@-aGll`Zja5feY@5}Kv560KAsfHxp5=@IPZ_hUy(?UauU#cf6~OHpdruB>)dH%9cNb)AVr8^+%4{}q@0z%!R$vf^Odh= zf}xJKD?Tfp34y|eZQMd{N%Sub29MRG9qb%%?^|Y(;>v_E3#UUIR^@_G+UL_AQzYW# znb3lXYyMR6J>GHCs?1P%FS_Rpvi2vvVWI2!T!BJ}#){eN@dXrH_;%zxyP!e#icH#Z zrIK2r(Jncvi}nOMGikJ_ewrLRn{394A1id>RPN$yX(L1!jvfgVWbJ!Znv=axevP}) z25a(Ih3iZEdPa|F&l(H1gpFU$FDK~a5Jj18!Fi4gmxk4Q%&tjLj=#~{4X~j(<;lT7z_`~ z{S|!_l--oO{2jG3z1_faoMS(`jQc>gzml&Dt|+@n@OU3jk@yMnUmvx1&#T-3HPqY! z?+An2!PWjb)#xDw?PiLb#_H-V5g12#+k(=%x9PjuTN~{$x$-2;;Z?j0(V)CF5Vg`U ze)fr_!xEvTdH~%87Hoki-N#(j(QS^oDM#k z6kXcdHMR$|Jy*M&m>k1UP4b0!O!#Jean0&T4F_y!7Oro6wSJsT1{EGrz`@}n#2@P@ z%f2iVsC^zcyX6`V)ri0NGNxnQ;9tj^%#2R#L%d{(zbOwdvrUSW-7=m_)=x>v%r>os zYo=cW&gyLULE*W-ba{rv&e27K>U_G=s;X%eIKo>dB@)y%PJ$k6Uo?T2{qYpp0d7q@;cw- zQ%wytJjQp7NuB=klj)6YY@*cn!+4kPaM17`UgfOQ!fh%;qCv$C2(*_&A)@N(^(

sh=7?#aR+*OMnCkc(H8gmuE0 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 W^;#fXz((LsyuFc80aZwueEM&7+k?&k diff --git a/docs/tutorials/images/fork.png b/docs/tutorials/images/fork.png new file mode 100644 index 0000000000000000000000000000000000000000..53c794acfc249c0dfe834f72a3a71f15afcb1e74 GIT binary patch literal 106240 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∨}-Js zbIO5Pg6qX!fR9qSQi;)A8=Krc7?UDSr>%Kvj_UnIMVs_?{P+f7vvL)%Rws|68JoM13^;;<`~#O)jEWWOmP4)ZBS z(q)BgqM)W^cyIq(T$rO&5Z_}}bUBtPS$VY9g0xB2k8s2Z=$tZ&y6952p5R(U&M*NivfP+W)_|q$RN3i<$|8@a3O~Cy~^`iViVvdS)F(Zq~ z)T%Qq7Wv2j{{YAawTtT;V7vn=ZDlHkt!v+#U&(+2C@0d zOwj0PX{9eV{PuTV7lYDv?M=Jp#U8_AM7BXvR=EE<;6oc2jHZSk>*uw&D%pZ+@60l__cwN} zTI)%zgUKwlMu+`JCJ|k2OO-!)+GXAf>m9xtnF7AY^*o@LfpOa;z+V%;*MGJ@e)ya{ z`DY58##)5tK*0?pNdL@)Urzl0#l&Ggush2=pO$fhGcJt z{ome%DuRg;L`|^n{lBo5<~6|oCMC@mx0Io{s+1IdyTEIFa%q&PaXd z|NIP({Sg3?8)gtrC&ncy4;9M(1XC6OokkGw|0}PcFuxW2wD#AR*%R+@hX;Rcet=jZ zOtP}=_0iK`lT|9|@hYklD(?&a;#?Cu5C%WLuu!7^CmrFvA>j=G2Fq?aASXf`*0RGpYL3WS%-uqHvfuY$ zd;jt_)Gid45N~JkcVbmZ`2~no)l>K1?~5$S?GW4B=qwr;k$2OT!jUBt5wntQ*I_kL zPfOGLVsxjcZdl+_X*9pO`i6{-uA_%dCzrWg(q3+~-r?SB-1oxA&Y-81#i4bz@k_lw zG;jSRJ=n98R8DC2?sT9G> z>-gdNOKs$$4p7C`8oO328jvd$8d^gB)&Y83`nF%T{6+byGE>M`y;BAIGlta#xVbz_ zkmW?XvU8_;!E{#PlGb@B#gN^u05?a*)U=ogLI5uc(OS z*!uaq%s*ihz`r9)vW1c4a^1hScE(MUhzm-YS@|=wbh3v-0AJ$@lXubMMZa z;e=}SYn-m)3S%rT0{N1cmUOk$^m5PF+e=FdgiHJT`by+ngo^$al|HucyFbi)`kj=N zH#1OFifl7kvcFGjM0|j{2&P6k!?F1i+1PUBWG!QOPzs~{@c zFKGY%eP_N;F3~NfyQDqLZ<4k$a>8iBwBnVO)i##!Dul@nbdlF`By3g@ zi)D@}6K(xGw9_Xw){(IhZQW#U7A2`DC$q8iDg<`KTPZ22G;>On7(BJYm6zoA6WaH+&6QmZX+uZ9RlvDn!} z-U9hwM<=c0k=z97za5WauycPI+0){ammL4Lb-S?ASg%?nRUbDuas8*#kI!YP9sL^q ztowm03`%l#M%n`|WHyjWisq4W^Tqg6VbY$LBIaZOJ%>->UDC6C4neflpFp`i>+F~r zB>qNrKC*{8p->yL-N*NF16}x87cL*zC>nj8&gmN_+&Mp=MVa{zfzr`VA<7UTYJJht z#kOQ5jZc9@=&IIR_fixObvT zVo?(iUny77UfKD)#(b`n#&5)I(maBrwnQf>%)H-{;_bgv(9Wpc@t1a#FSt2m4TrfV zo6k#pZ*Lu9%%1YT8@6e~P@dkFE8N)$5uU&Aq5roN+<(683hq(?LBCCw+FxAY#1kO~Q5>(gf@F+%{gwNFIyFMtp>w*JkWF?QNpejbT$22EN6XUo<2aS^ z^zw}+wJ2{cF0SK);3q8$jr`A}WiXfx!9W-_^jqThUQY;?H!Z2N>)hG{^4!9ifSc|h zV+yOC8TxiGWURL#u}HZ;>a+D`{q029Fa1<_`iY@dhGw6)t{Hdg#Hw0 zf6gFA@58pZw0(Y<`gnGWz*=tN`%J{VM7;Kv_^#1v_wH=ZA+!o(sSHQjF8xb%P+_eV zlGJ*B`A>E%eEWIzJv~!Aghy z{gQYpnG#PP`vr625L&t?r;D*WYjNqq3IrJNyZ$=5l43hOW2LWY&;86V)R@rbXqu>n)^8d3bw@*&KCA6BP2ZTubuQ?rFiVIKwZR#o6JTh(TpWa`Ke>u zpwD0&xEV*61w>6CnzBtx!>%u0WLfoTeahYr)XnFRGz=?Vq+Yy2@4?QBzufJsZvh^u zGoOn6SfyM*h zkKp$0TWj&KEF3W=DM`dL2rX<^RR#fzO8W~XSW`Aa48N^-AeyL12%3w3SW1f9ve<$G_K`+%&6Q}AhUZi8>Z!qr2Bf2%v&958Z zRo-xke(9yV|EIC@j)pVd`aL3yATx*-j7}1X8WCdj7B!-`(Fr1Y52E)LiC#hwy+rTK z=tOVPdmCl+&V8J7-h1y__niB_v#eSEVLi{x@A>V$zn|}K?*a~?k-1<9!k|XoToyF) zfvDaPbcpApJ1@r?xoP^^1~TD&+9?cl0|=%-hx$v??-HrZw|WY1*}v`XcGvMQlRUp1 zhWmH=(;uO3XuSuqGT{r$!oVt_i@X3v?967E+cg1W@<>8o2-Vn^d1I|zI5VIVf8SWG zXhRI1D8h07V}8yl0x~d|*LjVQO2$>zf5oRDW`dym)>yrB{i*(UU|L&GCo}VGk0v=m ztnJqfhEJnoV}KY{-c*w-6Or(jw1>M)rA70%W9`#S{fN?-xVYi~*ow9vIn6M}2 zlw?Lm#znbjGsUA0FEKH_G*2|0UujUO59CCiLebT(b>SQ&t|;oErx|(W>r5pyG%&pF--=IMPj_>LUCADt=R`)Dmly9 zVK1;n>a`L(-Uh1~!%H-X#^@TPLNu5QGY;KfPA`yN@-6*vs&(7TYJ3s~N$C=OP0uKf z9|fUZ=g`c8Y20&LOY+?RjxF=U2JhV@N~ftX^*?NyU$8Htzpx4G%%ETI7w6gT;X?Uf zy#6QR#ia;o@K_8I*F!tPqaMgEuc2-i+c;&dmV{qN*rfbhyg%RMy`j!0}bK9JLI2; zGrs1BLCYJjNq1`PH#2Yi*2xZf{v&o^DBk)I!|pp+zJEH6=IuwUxP@9xFNJI+p8hd9Lck zDOEJJXMw%fSRDK$WaIFXI3pxE+0$8^^_laRHTi+hyg{?MU zBGa9OL>f4VqEv&8ES87SL)Ne3e+nSK8fDa;*y`Ob@1@uE{+(A9Dj1z`lC{ithwH7v z2{9?1E=br?E67PR2|J^pLr$Gtus6WSbY3lNN9s#!JZt>2ctCj_Y{oWuAg^IReq;UM zRPjHqdnO2h&pN}W*552<^?c&5yH)oCe<$rTg+@57-f*KDUU<(?0#YtESE&s_#xtTM zhdv*_%{zwCpFjP`>KjOECq__dLS=FC!#6M=D74Y8T zO_y%Mc9fk_9fa4Ex8I!ull`9<9)~~Xd8IJHV|7C9qIK9Y*3UBA{~T}8;yE|Ndj%rH zd+P63C_9GPor^S&mR5{NdFDNj%I~P zVm+u~!K^>6Ksf&Uw;E&sj-`iWZ7-Yc@l^G!)8Zc>$ITbMz4XrS>kHXkHGs1k9fCcY zMlvZIBu1DA=$;F)!<*+CJ*Qu6Wy`X6gZ7Deaatcb5s*hU98u2KAldDp94^jxu#t`oQCJ{C=)NPYbo>{-`U_3f-0_VQo1ipF_K?qG($9oy*>g`YBU-Ldhz+FOmIt_hMs$;p_Jg zc36HlkkFoVp)&QIjqA+L}~%`Kvkc6cI^t#njPW`sZ1Z&===N zJ!)TFokVSYe+`z0vX`{sE08_g$t8@{Br*<(^;{6L6 zHUano*&>tbHmpAwKXn3M>#~)#Yo#7j_*vd5ko(#`%HYCiS?|gs@PZ-1@-#+ ze)bHHWmOtdBl~MVmw26^QDN25rzMcCcYJ91JuWUsa*~`QUrl+DF?Fy1?X;butvm>` z?hqMO`2{aZ)OA0@6HL37tXHR>E?n}SHIi1vrU?FX&TCz-@)E_NW}y|5^wJ`9s>Ur$ z>=O|A7+ijg4W{iiUrU7rvTQ#YH|C!r>~{sfc{-Q9_i-|JylDPMS`SS9GE-_QA!kp^ z^`{tJ8?TVd+-FiYLu28a9ok3s?1)3~TwV@TFERc$rGi|H>ELXU!}D{XJ4;&hrhPi% z9t8ufJ;fb-xJU;S&X>e=cc&_a7p>t&f584#WrY7`DRGX18jgs^ON67!tlrJ>cI_3s z&|B4IP80GhEQZ%+t@Wjr;GS}|L^are6ke+f`V~4K_n6Xja6RSMQUE7s1i%VUtFBT& zDvO4T&)DARM5J?yYWM*Ry0t{^(c!#0s)-i%{9QbU-n;Vl!-u{!1Y)h%9&W!sLcc}! zn-W@l`emp9rFYs4SR%AS4Q|%1l#8uFh9xh%{BQ zcUusp=6721mp+qMp@lDQ;$oVY`D?v|M}g$DbX9X7($3ht$e&Lau+t3->mVWObOgFj zRbvbfE*!Zwl+RqwRxicWNa81VBo_ly8`dYRz8mkGl5?b}pypBj=i*E2=XY+>{g9<`X z7Ok1>pX>-x3)wC*#hw(JJLk^T!Nt=@RV3{yNXE9M(4#nJC6h6dpgKpzAx?ScST`gy7Ry+P_|QGF=mxp zE|nykerEo6D)$Bz7TVQ~9?mJ=y|gSX(_czfox8F#2~h;ogXwLx0yy=1m8Iq7!%r~$ zYsRSpA+b9QarX~yMCVG0_VMzoilwHePh{(HsQm8*_Rp<301+( zh5l_i{Ju|)vOg>O)U?E25cGy$EHWeKBw&8V@5FPNLO>#+_59&Donk;>fTi--d=+dK zxA>lGzx%S)Jgu0?tI!V@*})b`Kf`}6-c-VoRsBdbYvZ5?LbXFoofHXp;@kXg)5rAbM7@B&4mo&vy^maF!{$ovSUkl z!v@P%1{BnGBVqKd)yrep*?UK_u>%cT+^I(tuCw7qi`)`{cAE7Z2L8<^@qbevPDi}$ zON$b*U^&+b`jn>#=ZCTHTDp{L)~CG*XYZ}Y+{H0U%)q5>o{GW*Y+uHfcPXv=Mi&3( zGjS!w66bofUVvVxY9$Jej8r#VT*O4G;%KnRT{2)qRXgK#PEAg36m)&jj~tBa?tV&K zT(0mvUUVr2Y>t&3ErWO`< z-miQvSulwy7_b5O8k`~n#rglzr++H$ErTp{h`HVjPk%vye{)CwFAbu=!j_oCr^E_s z1v(=95B|a@LjizAK_};{L;np9`^NjYB0|$O;Vv}wj9e;|J{xGw2FU$ zdibsDmSr<7B#5Y=FoBi9RDnU#xpte&WB%dKJCBddTh$6Ca)Egu=hg^c$*?hCz{ph` zUIjPT)3-%l9(sImpQ>edAfoZbx0L2S;k6q!Atj}m<$$1RgzZ(0nz!Ffrb>0TS*pjx zAbn@QtpZ%{?#2yTh(Uzy?_`4~PR@1Ko&3Du!RBp4#vLaPY&DmBJ|eEJHFrrWGYbo0 z7cwFwWXN+n8nSnK^5x@^)u%@t-#e7L-WBiFPBa`sciEpk)6V_{%v)3fpWE@=1y?x{ z!IKZb^CBLBA;8{50RB{Fhx9B`w=S~Yva<-uFDlyC$|=$KflQA{%w8~cz3w4xtWQZS zS2Y&*d)DQ>Fn7&FscG}+lX~q$Np1Z7OO~fkwITr2vN~H^v}I}KH=A;I8*?I9$_(4t zkv-0oC7u>}~$Jmwn^c1*uSc@s7uwCP-vH>?kDaLnsG=;&Zk(>;=50K-%x z9$wBuNwN10{{aK#(=HDVl`cQ)i@vlHA)T!_hkgI{m0{l7Wh{@R6GwHrf!A!rV|sLB z$oMFKDU-qJY(dDTz2+a{Fb*^30}sE0in5_Qeo0I$bzX#lFxai^_3AxZ?WwAI<+Rb_ zH8wiRYjBqxscC4e({CS}QfcztJ-L*!-2;#7Gf@{51=NoVG-0@|;ag zTl;av;PF|vF|TYU^tA<|KLO2aTV@?GD9Rxtd@vX(_2KYX*ibRVnqj z6GciuK}~vT8k+xvLjzES>rvsMk;7207@`<=miaJpj-xt5WTpu%iK@lh5X;;Wm-zJP zm^?{w*J#Zb{Jd%&d$5AsXf2a~nu7h;6) zl@lfM~zQP}T8edQvNDYxGX@*{|cLex_rIpRZHUTZ0(nnf822sIu{oEvS z^x3Y^hQ-vhMj@hYnra;*<2?#xdCbpwxdH^Ye{7Zw4}4_Y9{S{J=w0i=o&t~3uK`<) zb(_@s=+%f#Z=fpJnxAmqj8#?thHC0YFWNnWd-Wzg-a2mD9$+j!#uKQM)l-NFYBAgj z;Cs{%$*D!`2@QVga{>AQ&CFrya$X$%<@05DX4J%@^8KXCOfXR${74$hZK*R%#?N{% zEs1<=ifvGv-m6+VLiWAkuzo?|XO>IC3C|+gO>fOV^IST;`<{D5BJ<$u$|r6+gyO

J-@BtE& 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 literal 0 HcmV?d00001 From ce87c9d1cad01570bffb66137a72e60800d40157 Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Fri, 27 Aug 2021 10:56:44 +0200 Subject: [PATCH 002/257] Updated titles, anchor links --- docs/tutorials/add-translations.md | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index 957933c6c8..65ee843cf1 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -4,8 +4,6 @@ This document is part of the Appwrite contributors' guide. Before you continue r ## Getting Started -### Agenda - Appwrite's Locale API, Email Templates ( and soon our Dashboard ) has support for returning responses in your own locale based on the value of the `X-Appwrite-Locale` header. Behind the scenes, we use the value of this header to find the correct translation file for the locale. This guide will walk you through the process of adding a new Locale to Appwrite. You can help in three distinct ways: @@ -14,13 +12,13 @@ You can help in three distinct ways: * Reviewing existing translations for correctness -## Prerequisites +## 1. Prerequisites It's really easy to contribute to an open-sourced projects, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. > If you are experienced with GitHub or have made a pull request before, you can skip to `Generate the translations`. -### Fork the Appwrite repository +### 1.1 Fork the Appwrite repository Before making any changes, you will need to fork Appwrite's repository to keep branches on the official repo clean. To do that, visit the [Appwrite Github repository](https://github.com/appwrite/appwrite) and click on the fork button. @@ -37,11 +35,11 @@ $ git clone COPIED_URL Finally, you will need to create a `feat-XXX-YYY-translation` branch based on the `locale` branch and switch to it. The `XXX` should represent issue ID and `YYY` the language name. -## Generate the translations +## 2. Generate the translations -You can choose to contribute either directly on [**GitHub**](#contributing-with-github) or using [**POEditor**](#contributing-with-po-editor) if you prefer a GUI. +You can choose to contribute either directly on [**GitHub**](#2.1-manually-using-github) or using [**POEditor**](#2.2-visually-using-po-editor) if you prefer a GUI. -### Manually using GitHub +### 2.1 Manually using GitHub > Skip this part and jump to PO Editor section if you want to use graphical interface. @@ -78,7 +76,7 @@ We maintain a [`locale branch`](https://github.com/appwrite/appwrite/tree/locale 3. **languages.php** - [languages.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/languages.php) contains all the languages listed in **[ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)**. You can use this link to find your language code when making a contribution for your language. + [languages.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/languages.php) contains all the languages listed in **[ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)**. You can use this file to find your language code when making a contribution for your language. Great, let's start. First, find the code of the language you want to add. For example, if you want to add support for **Spanish**, you can find the code for Spanish in [languages.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/languages.php#L202). @@ -96,7 +94,7 @@ Next, choose a reference language. If English is your reference language, copy t } ``` -### Visually using PO Editor +### 2.2 Visually using PO Editor > Skip this part if you followed the GitHub approach @@ -126,9 +124,10 @@ Once you're happy with your translations, you can export them. Head over to the > **Attention! 🛑** There are two JSON exports. Please make sure to export the one saying `Key-value JSON`. Refer to the screenshot if you are not sure which one is correct. -After exporting a JSON file, we need to rename it to follow the **[ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)** standards. You can use this link to find your language code when making a contribution for your language. For example, Spanish translation should have file called `es.json`. +After exporting a JSON file, we need to rename it to follow the **[ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes)** standards. You can use [languages.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/languages.php) file to find your language code when making a contribution for your language. For example, Spanish translation should have file called `es.json`. -## Add the translations to the project + +## 3. Add the translations to the project Add your language code to [codes.php](https://github.com/appwrite/appwrite/blob/locale/app/config/locale/codes.php#L14) in the following format. ```php @@ -141,9 +140,9 @@ Finally, load your translation file in `init.php` by following a pattern similar > Please make sure to keep both `codes.php` and `init.php` in the alphabetical order A-Z. -## Raise a pull request +## 4. Raise a pull request First of all, commit the changes with the message `Added Slovak translations` and push it. This will publish a new branch to your forked version of Appwrite. If you visit it at `github.com/YOUR_USERNAME_appwrite`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. -### 🤕 Stuck ? +## 🤕 Stuck ? If you need any help with the contribution, feel free to head over to [our discord channel](https://appwrite.io/discord) and we'll be happy to help you out. From a8568e47d2ed5619cde5446d7b20466298b44207 Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Fri, 27 Aug 2021 10:58:48 +0200 Subject: [PATCH 003/257] Link bug fixing --- docs/tutorials/add-translations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index 65ee843cf1..66453f3956 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -16,7 +16,7 @@ You can help in three distinct ways: It's really easy to contribute to an open-sourced projects, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. -> If you are experienced with GitHub or have made a pull request before, you can skip to `Generate the translations`. +> If you are experienced with GitHub or have made a pull request before, you can skip to [Generate the translations](#2-generate-the-translations). ### 1.1 Fork the Appwrite repository @@ -37,7 +37,7 @@ Finally, you will need to create a `feat-XXX-YYY-translation` branch based on th ## 2. Generate the translations -You can choose to contribute either directly on [**GitHub**](#2.1-manually-using-github) or using [**POEditor**](#2.2-visually-using-po-editor) if you prefer a GUI. +You can choose to contribute either directly on [**GitHub**](#21-manually-using-github) or using [**POEditor**](#22-visually-using-po-editor) if you prefer a GUI. ### 2.1 Manually using GitHub From 40d909d10e4ae268c6659fc6d0cd49515ee37621 Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Fri, 27 Aug 2021 11:01:48 +0200 Subject: [PATCH 004/257] Link changes --- docs/tutorials/add-translations.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index 66453f3956..2d34228a9c 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -40,8 +40,9 @@ Finally, you will need to create a `feat-XXX-YYY-translation` branch based on th You can choose to contribute either directly on [**GitHub**](#21-manually-using-github) or using [**POEditor**](#22-visually-using-po-editor) if you prefer a GUI. ### 2.1 Manually using GitHub + +> Proceed to [Visually using PO Editor](#22-visually-using-po-editor) if you want to use graphical interface instead. -> Skip this part and jump to PO Editor section if you want to use graphical interface. We maintain a [`locale branch`](https://github.com/appwrite/appwrite/tree/locale/) under the [appwrite/appwrite repo](https://github.com/appwrite/appwrite/) exclusively for translations related PRs. Here are a few files that you need to refer to help with your contribution. @@ -96,7 +97,7 @@ Next, choose a reference language. If English is your reference language, copy t ### 2.2 Visually using PO Editor -> Skip this part if you followed the GitHub approach +> Proceed to [Add the translations to the project](#3-add-the-translations-to-the-project) if you already followed the GitHub approach. We use [PO Editor](https://poeditor.com/) to manage all our translations in a convenient way. The first step is to join the Appwrite Project on PO Editor using [our invite link](https://poeditor.com/join/project?hash=BNrWbRXyk6). From d51cb684f91a29526a69252433b05b3246fe570f Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Fri, 27 Aug 2021 13:23:51 +0200 Subject: [PATCH 005/257] Added test section to translations tutorial --- docs/tutorials/add-translations.md | 37 +++++++++++++++++++++++++++-- docs/tutorials/images/test-cs.png | Bin 0 -> 57990 bytes docs/tutorials/images/test-en.png | Bin 0 -> 57673 bytes 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 docs/tutorials/images/test-cs.png create mode 100644 docs/tutorials/images/test-en.png diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index 2d34228a9c..57058dddf9 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -26,7 +26,7 @@ Before making any changes, you will need to fork Appwrite's repository to keep b This will redirect you from `github.com/appwrite/appwrite` to `github.com/YOUR_USERNAME/appwrite`, meaning all changes you do are only done inside your repository. Once you are there, click the highlighted `Code` button, copy the URL and clone the repository to your computer using `git clone` command: -```bash +```shell $ git clone COPIED_URL ``` @@ -141,7 +141,40 @@ Finally, load your translation file in `init.php` by following a pattern similar > Please make sure to keep both `codes.php` and `init.php` in the alphabetical order A-Z. -## 4. Raise a pull request +## 4. Test the translations + +To test if the translation is properly loaded, we will send a GET request to get a list of EU countries. + +First of all, we need to start a local instance of Appwrite. Thanks to Docker, this can be done using one command. + +```shell +$ docker-compose up -d +``` + +If this is your first time running Appwrite, it may take up to few minutes to download all images and start all containers. Once everything is started, you should see Appwrite running on `http://localhost:80`. When you visit this URL, it will ask you to sign up. After that, it will show you your empty dashboard where you need to create a new project - give it any name you want. Then you need to go to `Settings` of the project and copy `Project-ID`. + +If you are lost in the Appwrite dashboard, check out our [Article about Appwrite's dashboard](https://dev.to/appwrite/30daysofappwrite-appwrite-dashboard-15cc). + + +Now, let's send the request. We will be editing headers of the request, so you will need a tool to do that, such as Postman or Insomnia. + +First, let's see English translations. Let's set request type to `GET`, URL to `https://localhost/v1/locale/countries/eu` and add `X-Appwrite-Project` header. + +![English test](images/test-en.png) + +> Make sure to use your own project ID for the header. + +After firing the request, we can see countries named `Austria, Belgium, Bulgaria...` So far, we are getting English translations of the country names. + +Once we add `X-Appwrite-Locale` header and send the request again, we will get the names in a specific language. + +![Czech test](images/test-cs.png) + +> Make sure to replace the locale code with the language code you are writing translations for. + +If you can see countries names translated, everything works, and you are ready for the last step. 😊 + +## 5. Raise a pull request First of all, commit the changes with the message `Added Slovak translations` and push it. This will publish a new branch to your forked version of Appwrite. If you visit it at `github.com/YOUR_USERNAME_appwrite`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. diff --git a/docs/tutorials/images/test-cs.png b/docs/tutorials/images/test-cs.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e79de299257d5eda394bb6016c5d804db7c046 GIT binary patch literal 57990 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 YIW_Uht&2?CE-(Orr>mdKI;Vst0A4U082|tP literal 0 HcmV?d00001 diff --git a/docs/tutorials/images/test-en.png b/docs/tutorials/images/test-en.png new file mode 100644 index 0000000000000000000000000000000000000000..28e5278c0b5c0d7d56e741d8791b01a29a5a8b58 GIT binary patch literal 57673 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 N@O1TaS?83{1OST- Date: Mon, 30 Aug 2021 08:33:41 +0200 Subject: [PATCH 006/257] Update OAuth tutorial --- docs/tutorials/add-oauth2-provider.md | 164 ++++++++++++++++++++++---- docs/tutorials/add-translations.md | 2 +- 2 files changed, 144 insertions(+), 22 deletions(-) diff --git a/docs/tutorials/add-oauth2-provider.md b/docs/tutorials/add-oauth2-provider.md index 6f36a6b716..6225b6ffa0 100644 --- a/docs/tutorials/add-oauth2-provider.md +++ b/docs/tutorials/add-oauth2-provider.md @@ -1,56 +1,178 @@ -# Adding a New OAuth2 Provider +# Adding a New OAuth2 Provider 🛡 This document is part of the Appwrite contributors' guide. Before you continue reading this document make sure you have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/master/CODE_OF_CONDUCT.md) and the [Contributing Guide](https://github.com/appwrite/appwrite/blob/master/CONTRIBUTING.md). ## Getting Started -### Agenda - OAuth2 providers help users to log in to the apps and websites without the need to provide passwords or any other type of credentials. Appwrite's goal is to have support from as many **major** OAuth2 providers as possible. As of the writing of these lines, we do not accept any minor OAuth2 providers. For us to accept some smaller and potentially unlimited number of OAuth2 providers, some product design and software architecture changes must be applied first. -### List Your new Provider +## 1. Prerequisites + +It's really easy to contribute to an open-sourced projects, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. + +> If you are experienced with GitHub or have made a pull request before, you can skip to [Implement new provider](#2-implement-new-provider). + +### 1.1 Fork the Appwrite repository + +Before making any changes, you will need to fork Appwrite's repository to keep branches on the official repo clean. To do that, visit the [Appwrite Github repository](https://github.com/appwrite/appwrite) and click on the fork button. + +![Fork button](images/fork.png) + +This will redirect you from `github.com/appwrite/appwrite` to `github.com/YOUR_USERNAME/appwrite`, meaning all changes you do are only done inside your repository. Once you are there, click the highlighted `Code` button, copy the URL and clone the repository to your computer using `git clone` command: + +"`shell +$ git clone COPIED_URL +``` + +> To fork a repository, you will need a basic understanding of CLI and git-cli binaries installed. If you are a beginner, we recommend you to use `Github Desktop`. It is a really clean and simple visual Git client. + +Finally, you will need to create a `feat-XXX-YYY-oauth` branch based on the `master` branch and switch to it. The `XXX` should represent the issue ID and `YYY` the OAuth provider name. + +## 2. Implement new provider + +### 2.1 List your new provider The first step in adding a new OAuth2 provider is to add it to the list in providers config file array, located at: ``` -./app/config/providers.php +app/config/providers.php ``` -Make sure to fill all data needed and that your provider array key name: +Make sure to fill in all data needed and that your provider array key name: -- is in camelCase format -- has no spaces or special characters. +- is in [camelCase](https://en.wikipedia.org/wiki/Camel_case) format +- has no spaces or special characters -### Add Provider Logo +> Please make sure to keep the list of providers in `providers.php` in the alphabetical order A-Z. -Add a logo image to your new provider in this path: `./public/images/users`. Your logo should be a png 100×100px file with the name of your provider (all lowercase). Please make sure to leave about 30px padding around the logo to be consistent with other logos. +### 2.2 Add Provider Logo -### Add Provider Class +Add a logo image to your new provider in this path: `public/images/users`. Your logo should be a png 100×100px file with the name of your provider (all lowercase). Please make sure to leave about 30px padding around the logo to be consistent with other logos. + +### 2.3 Add Provider Class Once you have finished setting up all the metadata for the new provider, you need to start coding. -Create a new class that extends the basic OAuth2 provider abstract class in this location: - -```bash -./src/Auth/OAuth/ProviderName +Create a new file `XXX.php` where `XXX` is the name of the OAuth provider in `CamelCase` with the first letter in upper case in this location +"`bash +src/Appwrite/Auth/OAuth ``` -Note that the class name should start with a capital letter as PHP FIG standards suggest. +Inside this file, create a new class that extends the basic OAuth2 provider abstract class. Note that the class name should start with a capital letter, as PHP FIG standards suggest. -Once a new class is created, you can start to implement your new provider's login flow. The best way to do this correctly is to have a look at another provider's implementation and try to follow the same standards. +Once a new class is created, you can start to implement your new provider's login flow. We have prepared a starting point for Oauth provider class below, but you should also consider looking at other provider's implementation and try to follow the same standards. + +```injectablephp +endpoint . '[LOGIN_URL_STUFF]'; + return $url; + } + + /** + * @param string $code + * + * @return string + */ + public function getAccessToken(string $code): string + { + // TODO: Fire request to oauth API to generate access_token + $accessToken = "[FETCHED ACCESS TOKEN]"; + + return $accessToken; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserID(string $accessToken): string + { + // TODO: Fetch user from oauth API and select the user ID + $userId = "[FETCHED USER ID]"; + + return $userId; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserEmail(string $accessToken): string + { + // TODO: Fetch user from oauth API and select the user's email + $userEmail = "[FETCHED USER EMAIL]"; + + return $userEmail; + } + + /** + * @param string $accessToken + * + * @return string + */ + public function getUserName(string $accessToken): string + { + // TODO: Fetch user from oauth API and select the username + $username = "[FETCHED USERNAME]"; + + return $username; + } +} +``` + +> If you copy this template, make sure to replace all placeholders wrapped like `[THIS]` and to implement everything marked as `TODO:`. Please mention in your documentation what resources or API docs you used to implement the provider's OAuth2 protocol. -### Test Your Provider +## 3. Test Your Provider -After you finished adding your new provider to Appwrite you should be able to see it in your Appwrite console. Navigate to 'Project > Users > Providers' and check your new provider's settings form. +After you finished adding your new provider to Appwrite, you should be able to see it in your Appwrite console. Navigate to 'Project > Users > Providers' and check your new provider's settings form. -Add credentials and check both a successful and a failed login (where the user denies integration on provider page). +> To start Appwrite console from the source code, you can simply run `docker-compose up -d'. + +Add credentials and check both a successful and a failed login (where the user denies integration on the provider page). You can test your OAuth2 provider by trying to login using the [OAuth2 method](https://appwrite.io/docs/client/account#accountCreateOAuth2Session) when integrating the Appwrite Web SDK in a demo app. Pass your new adapter name as the provider parameter. If login is successful, you will be redirected to your success URL parameter. Otherwise, you will be redirected to your failure URL. -If everything goes well, submit a pull request and be ready to respond to any feedback which can arise during our code review. +If everything goes well, raise a pull request and be ready to respond to any feedback which can arise during our code review. + +## 4. Raise a pull request + +First of all, commit the changes with the message `Added Slovak translations` and push it. This will publish a new branch to your forked version of Appwrite. If you visit it at `github.com/YOUR_USERNAME_appwrite`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. + +## 🤕 Stuck ? +If you need any help with the contribution, feel free to head over to [our discord channel](https://appwrite.io/discord) and we'll be happy to help you out. diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index 57058dddf9..4d160384f5 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -176,7 +176,7 @@ If you can see countries names translated, everything works, and you are ready f ## 5. Raise a pull request -First of all, commit the changes with the message `Added Slovak translations` and push it. This will publish a new branch to your forked version of Appwrite. If you visit it at `github.com/YOUR_USERNAME_appwrite`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. +First of all, commit the changes with the message `Added YYY translations` where `YYY` is the translated language and push it. This will publish a new branch to your forked version of Appwrite. If you visit it at `github.com/YOUR_USERNAME_appwrite`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. ## 🤕 Stuck ? If you need any help with the contribution, feel free to head over to [our discord channel](https://appwrite.io/discord) and we'll be happy to help you out. From 17effaff5127a90ae13d001fd7c48afd9398703a Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Mon, 30 Aug 2021 08:42:33 +0200 Subject: [PATCH 007/257] Fixed title case --- docs/tutorials/add-oauth2-provider.md | 6 +++--- docs/tutorials/add-translations.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/tutorials/add-oauth2-provider.md b/docs/tutorials/add-oauth2-provider.md index 6225b6ffa0..7774ddb812 100644 --- a/docs/tutorials/add-oauth2-provider.md +++ b/docs/tutorials/add-oauth2-provider.md @@ -1,8 +1,8 @@ -# Adding a New OAuth2 Provider 🛡 +# Adding a new OAuth2 provider 🛡 This document is part of the Appwrite contributors' guide. Before you continue reading this document make sure you have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/master/CODE_OF_CONDUCT.md) and the [Contributing Guide](https://github.com/appwrite/appwrite/blob/master/CONTRIBUTING.md). -## Getting Started +## Getting started OAuth2 providers help users to log in to the apps and websites without the need to provide passwords or any other type of credentials. Appwrite's goal is to have support from as many **major** OAuth2 providers as possible. @@ -156,7 +156,7 @@ class [PROVIDER NAME] extends OAuth2 Please mention in your documentation what resources or API docs you used to implement the provider's OAuth2 protocol. -## 3. Test Your Provider +## 3. Test your provider After you finished adding your new provider to Appwrite, you should be able to see it in your Appwrite console. Navigate to 'Project > Users > Providers' and check your new provider's settings form. diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index 4d160384f5..b0d80bba1c 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -2,7 +2,7 @@ This document is part of the Appwrite contributors' guide. Before you continue reading this document make sure you have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/master/CODE_OF_CONDUCT.md) and the [Contributing Guide](https://github.com/appwrite/appwrite/blob/master/CONTRIBUTING.md). -## Getting Started +## Getting started Appwrite's Locale API, Email Templates ( and soon our Dashboard ) has support for returning responses in your own locale based on the value of the `X-Appwrite-Locale` header. Behind the scenes, we use the value of this header to find the correct translation file for the locale. This guide will walk you through the process of adding a new Locale to Appwrite. From b822cb810e606c9410eff763d8fed5a3c3d97816 Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Mon, 30 Aug 2021 09:34:22 +0200 Subject: [PATCH 008/257] Fixed markdown typo --- docs/tutorials/add-oauth2-provider.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/add-oauth2-provider.md b/docs/tutorials/add-oauth2-provider.md index 7774ddb812..30bed9214c 100644 --- a/docs/tutorials/add-oauth2-provider.md +++ b/docs/tutorials/add-oauth2-provider.md @@ -22,7 +22,7 @@ Before making any changes, you will need to fork Appwrite's repository to keep b This will redirect you from `github.com/appwrite/appwrite` to `github.com/YOUR_USERNAME/appwrite`, meaning all changes you do are only done inside your repository. Once you are there, click the highlighted `Code` button, copy the URL and clone the repository to your computer using `git clone` command: -"`shell +```shell $ git clone COPIED_URL ``` From c4b81297910a745de496e76850a537fe3b2aa6d7 Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Mon, 30 Aug 2021 09:34:54 +0200 Subject: [PATCH 009/257] Plural removed --- docs/tutorials/add-oauth2-provider.md | 2 +- docs/tutorials/add-translations.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/add-oauth2-provider.md b/docs/tutorials/add-oauth2-provider.md index 30bed9214c..bbfd551e03 100644 --- a/docs/tutorials/add-oauth2-provider.md +++ b/docs/tutorials/add-oauth2-provider.md @@ -10,7 +10,7 @@ As of the writing of these lines, we do not accept any minor OAuth2 providers. F ## 1. Prerequisites -It's really easy to contribute to an open-sourced projects, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. +It's really easy to contribute to an open-sourced project, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. > If you are experienced with GitHub or have made a pull request before, you can skip to [Implement new provider](#2-implement-new-provider). diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index b0d80bba1c..b740f1d9dd 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -14,7 +14,7 @@ You can help in three distinct ways: ## 1. Prerequisites -It's really easy to contribute to an open-sourced projects, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. +It's really easy to contribute to an open-sourced project, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. > If you are experienced with GitHub or have made a pull request before, you can skip to [Generate the translations](#2-generate-the-translations). From 5d7d1fc0061d978a96b729e1f94fb0f1147dec20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Ba=C4=8Do?= Date: Mon, 30 Aug 2021 10:12:34 +0200 Subject: [PATCH 010/257] Apply suggestions from code review Co-authored-by: Christy Jacob --- docs/tutorials/add-oauth2-provider.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/tutorials/add-oauth2-provider.md b/docs/tutorials/add-oauth2-provider.md index bbfd551e03..3b6695fbf5 100644 --- a/docs/tutorials/add-oauth2-provider.md +++ b/docs/tutorials/add-oauth2-provider.md @@ -10,7 +10,7 @@ As of the writing of these lines, we do not accept any minor OAuth2 providers. F ## 1. Prerequisites -It's really easy to contribute to an open-sourced project, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. +It's really easy to contribute to an open source project, but when using GitHub, there are a few steps we need to follow. This section will take you step-by-step through the process of preparing your own local version of Appwrite, where you can make any changes without affecting Appwrite right away. > If you are experienced with GitHub or have made a pull request before, you can skip to [Implement new provider](#2-implement-new-provider). @@ -34,7 +34,7 @@ Finally, you will need to create a `feat-XXX-YYY-oauth` branch based on the `mas ### 2.1 List your new provider -The first step in adding a new OAuth2 provider is to add it to the list in providers config file array, located at: +The first step in adding a new OAuth2 provider is to add it to the list of providers located at: ``` app/config/providers.php @@ -55,9 +55,9 @@ Add a logo image to your new provider in this path: `public/images/users`. Your Once you have finished setting up all the metadata for the new provider, you need to start coding. -Create a new file `XXX.php` where `XXX` is the name of the OAuth provider in `CamelCase` with the first letter in upper case in this location +Create a new file `XXX.php` where `XXX` is the name of the OAuth provider in [`PascalCase`](https://stackoverflow.com/a/41769355/7659504) in this location "`bash -src/Appwrite/Auth/OAuth +src/Appwrite/Auth/OAuth2/XXX.php ``` Inside this file, create a new class that extends the basic OAuth2 provider abstract class. Note that the class name should start with a capital letter, as PHP FIG standards suggest. @@ -172,7 +172,7 @@ If everything goes well, raise a pull request and be ready to respond to any fee ## 4. Raise a pull request -First of all, commit the changes with the message `Added Slovak translations` and push it. This will publish a new branch to your forked version of Appwrite. If you visit it at `github.com/YOUR_USERNAME_appwrite`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. +First of all, commit the changes with the message `Added XXX OAuth2 Provider` and push it. This will publish a new branch to your forked version of Appwrite. If you visit it at `github.com/YOUR_USERNAME/appwrite`, you will see a new alert saying you are ready to submit a pull request. Follow the steps GitHub provides, and at the end, you will have your pull request submitted. ## 🤕 Stuck ? If you need any help with the contribution, feel free to head over to [our discord channel](https://appwrite.io/discord) and we'll be happy to help you out. From 70a906c3b64888cb3687c331689077670567595b Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Mon, 30 Aug 2021 10:14:53 +0200 Subject: [PATCH 011/257] Markdown syntax fix, Extend suggestions from code review --- docs/tutorials/add-oauth2-provider.md | 6 +++--- docs/tutorials/add-translations.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/tutorials/add-oauth2-provider.md b/docs/tutorials/add-oauth2-provider.md index 3b6695fbf5..bbd3b3011e 100644 --- a/docs/tutorials/add-oauth2-provider.md +++ b/docs/tutorials/add-oauth2-provider.md @@ -42,7 +42,7 @@ app/config/providers.php Make sure to fill in all data needed and that your provider array key name: -- is in [camelCase](https://en.wikipedia.org/wiki/Camel_case) format +- is in [`camelCase`](https://en.wikipedia.org/wiki/Camel_case) format - has no spaces or special characters > Please make sure to keep the list of providers in `providers.php` in the alphabetical order A-Z. @@ -56,7 +56,7 @@ Add a logo image to your new provider in this path: `public/images/users`. Your Once you have finished setting up all the metadata for the new provider, you need to start coding. Create a new file `XXX.php` where `XXX` is the name of the OAuth provider in [`PascalCase`](https://stackoverflow.com/a/41769355/7659504) in this location -"`bash +```bash src/Appwrite/Auth/OAuth2/XXX.php ``` @@ -64,7 +64,7 @@ Inside this file, create a new class that extends the basic OAuth2 provider abst Once a new class is created, you can start to implement your new provider's login flow. We have prepared a starting point for Oauth provider class below, but you should also consider looking at other provider's implementation and try to follow the same standards. -```injectablephp +```php Date: Fri, 3 Sep 2021 08:54:55 +0200 Subject: [PATCH 012/257] Updated bug issue template to GitHub forms --- .github/ISSUE_TEMPLATE/bug.md | 44 ------------------ .github/ISSUE_TEMPLATE/bug.yaml | 80 +++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 44 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug.md create mode 100644 .github/ISSUE_TEMPLATE/bug.yaml diff --git a/.github/ISSUE_TEMPLATE/bug.md b/.github/ISSUE_TEMPLATE/bug.md deleted file mode 100644 index 63e0e64f94..0000000000 --- a/.github/ISSUE_TEMPLATE/bug.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -name: 🐛 Bug Report -about: Submit a bug report to help us improve -labels: "bug" ---- - -## 🐛 Bug Report - -(A clear and concise description of what the bug is) - -## Have you spent some time to check if this issue has been raised before? - -(Have you googled for a similar issue or checked our older issues for a similar bug) - -## To Reproduce - -(Write your steps here:) - -## Expected behavior - - - -(Write what you thought would happen.) - -## Actual Behavior - - - -(Write what happened. Add screenshots, if applicable.) - -## Your Environment - - - -(Write Environment, Operating system and version etc.) diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml new file mode 100644 index 0000000000..70a8704e82 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -0,0 +1,80 @@ +name: "🐛 Bug Report" +description: "Submit a bug report to help us improve" +title: "🐛 Bug Report: " +labels: [bug] +body: + - type: markdown + attributes: + value: | + Thanks for taking the time to fill out our bug report form 🙏 + - type: textarea + id: steps-to-reproduce + validations: + required: true + attributes: + label: "👟 Reproduction steps" + description: "How do you trigger this bug? Please walk us through it step by step." + placeholder: "When I ..." + - type: textarea + id: expected-behavior + validations: + required: true + attributes: + label: "👍 Expected behavior" + description: "What did you think would happen?" + placeholder: "Appwrite should ..." + - type: textarea + id: actual-behavior + validations: + required: true + attributes: + label: "👎 Actual Behavior" + description: "What did actually happen? Add screenshots, if applicable." + placeholder: "Appwrite ..." + - type: dropdown + id: appwrite-version + attributes: + label: "🎲 Appwrite version" + description: "What version of Appwrite are you running?" + options: + - Version 0.9.4 + - Version 0.9.3 + - Version 0.9.2 + - Version 0.9.1 + - Version 0.9.0 + - Version 0.8.0 + - Version 0.7.2 + - Version 0.7.1 + - Version 0.7.0 + - Version 0.6.2 + - Different version + validations: + required: true + - type: dropdown + id: operating-system + attributes: + label: "💻 Operating system" + description: "What OS is your server / device running on?" + options: + - Linux + - MacOS + - Windows + - Something else + validations: + required: true + - type: textarea + id: enviromnemt + validations: + required: false + attributes: + label: "🧱 Your Environment" + description: "Is your environment special in any way?" + placeholder: "I use Cloudflare for ..." + - type: checkboxes + id: no-duplicate-issues + attributes: + label: "👀 Have you spent some time to check if this issue has been raised before?" + description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" + options: + - label: "I checked and didn't find similar issue" + required: true \ No newline at end of file From 1a760ffb958fc2a386eb382aa0c1320dd0ec3548 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Mon, 20 Sep 2021 18:37:24 +0200 Subject: [PATCH 013/257] feat(sdk): release web 4.0.1 --- app/config/platforms.php | 2 +- composer.json | 2 +- composer.lock | 100 ++++++------- public/dist/scripts/app-all.js | 24 +-- public/dist/scripts/app-dep.js | 24 +-- public/scripts/dependencies/appwrite.js | 188 +++++++++++++++--------- 6 files changed, 194 insertions(+), 146 deletions(-) diff --git a/app/config/platforms.php b/app/config/platforms.php index 348aa18cb4..b593184317 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -15,7 +15,7 @@ return [ [ 'key' => 'web', 'name' => 'Web', - 'version' => '4.0.1', + 'version' => '4.0.2', 'url' => 'https://github.com/appwrite/sdk-for-web', 'package' => 'https://www.npmjs.com/package/appwrite', 'enabled' => true, diff --git a/composer.json b/composer.json index 3ca194945f..f5c9af5768 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "slickdeals/statsd": "3.1.0" }, "require-dev": { - "appwrite/sdk-generator": "0.14.4", + "appwrite/sdk-generator": "0.14.5", "phpunit/phpunit": "9.5.6", "swoole/ide-helper": "4.6.7", "textalk/websocket": "1.5.2", diff --git a/composer.lock b/composer.lock index f991ded4f1..418b7120e5 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "82b47392837605b4fb552e5c9374c4cc", + "content-hash": "3acb593da6b69af88e3b527b81929ed4", "packages": [ { "name": "adhocore/jwt", @@ -2516,16 +2516,16 @@ }, { "name": "appwrite/sdk-generator", - "version": "0.14.4", + "version": "0.14.5", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "b89a51170f99e6977df72c46522c7d931257bc28" + "reference": "6dfed83fb3aa85304ba86aeb2f1f282b9d8f80e5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/b89a51170f99e6977df72c46522c7d931257bc28", - "reference": "b89a51170f99e6977df72c46522c7d931257bc28", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/6dfed83fb3aa85304ba86aeb2f1f282b9d8f80e5", + "reference": "6dfed83fb3aa85304ba86aeb2f1f282b9d8f80e5", "shasum": "" }, "require": { @@ -2559,22 +2559,22 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.14.4" + "source": "https://github.com/appwrite/sdk-generator/tree/0.14.5" }, - "time": "2021-09-07T13:23:19+00:00" + "time": "2021-09-20T16:32:51+00:00" }, { "name": "composer/package-versions-deprecated", - "version": "1.11.99.3", + "version": "1.11.99.4", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "fff576ac850c045158a250e7e27666e146e78d18" + "reference": "b174585d1fe49ceed21928a945138948cb394600" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/fff576ac850c045158a250e7e27666e146e78d18", - "reference": "fff576ac850c045158a250e7e27666e146e78d18", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", + "reference": "b174585d1fe49ceed21928a945138948cb394600", "shasum": "" }, "require": { @@ -2618,7 +2618,7 @@ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.3" + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" }, "funding": [ { @@ -2634,7 +2634,7 @@ "type": "tidelift" } ], - "time": "2021-08-17T13:49:14+00:00" + "time": "2021-09-13T08:41:34+00:00" }, { "name": "composer/semver", @@ -3230,16 +3230,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.12.0", + "version": "v4.13.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143" + "reference": "50953a2691a922aa1769461637869a0a2faa3f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6608f01670c3cc5079e18c1dab1104e002579143", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", + "reference": "50953a2691a922aa1769461637869a0a2faa3f53", "shasum": "" }, "require": { @@ -3280,9 +3280,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.12.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" }, - "time": "2021-07-21T10:44:31+00:00" + "time": "2021-09-20T12:20:58+00:00" }, { "name": "openlss/lib-array2xml", @@ -3559,16 +3559,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/30f38bffc6f24293dadd1823936372dfa9e86e2f", + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f", "shasum": "" }, "require": { @@ -3576,7 +3576,8 @@ "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "*" + "ext-tokenizer": "*", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -3602,39 +3603,39 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.0" }, - "time": "2020-09-17T18:55:26+00:00" + "time": "2021-09-17T15:28:14+00:00" }, { "name": "phpspec/prophecy", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", + "php": "^7.2 || ~8.0, <8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^6.0", + "phpspec/phpspec": "^6.0 || ^7.0", "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -3669,29 +3670,29 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + "source": "https://github.com/phpspec/prophecy/tree/1.14.0" }, - "time": "2021-03-17T13:42:18+00:00" + "time": "2021-09-10T09:02:12+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.6", + "version": "9.2.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f6293e1b30a2354e8428e004689671b83871edde" + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", - "reference": "f6293e1b30a2354e8428e004689671b83871edde", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218", + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", + "nikic/php-parser": "^4.12.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -3740,7 +3741,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7" }, "funding": [ { @@ -3748,7 +3749,7 @@ "type": "github" } ], - "time": "2021-03-28T07:26:59+00:00" + "time": "2021-09-17T05:39:03+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4995,7 +4996,6 @@ "type": "github" } ], - "abandoned": true, "time": "2020-09-28T06:45:17+00:00" }, { @@ -5995,16 +5995,16 @@ }, { "name": "twig/twig", - "version": "v2.14.6", + "version": "v2.14.7", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "27e5cf2b05e3744accf39d4c68a3235d9966d260" + "reference": "8e202327ee1ed863629de9b18a5ec70ac614d88f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/27e5cf2b05e3744accf39d4c68a3235d9966d260", - "reference": "27e5cf2b05e3744accf39d4c68a3235d9966d260", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/8e202327ee1ed863629de9b18a5ec70ac614d88f", + "reference": "8e202327ee1ed863629de9b18a5ec70ac614d88f", "shasum": "" }, "require": { @@ -6014,7 +6014,7 @@ }, "require-dev": { "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" }, "type": "library", "extra": { @@ -6058,7 +6058,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.14.6" + "source": "https://github.com/twigphp/Twig/tree/v2.14.7" }, "funding": [ { @@ -6070,7 +6070,7 @@ "type": "tidelift" } ], - "time": "2021-05-16T12:12:47+00:00" + "time": "2021-09-17T08:39:54+00:00" }, { "name": "vimeo/psalm", diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index 4a4daa72fa..4ba22d8e66 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -5,13 +5,14 @@ function rejected(value){try{step(generator["throw"](value));}catch(e){reject(e) function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected);} step((generator=generator.apply(thisArg,_arguments||[])).next());});} class AppwriteException extends Error{constructor(message,code=0,response=''){super(message);this.name='AppwriteException';this.message=message;this.code=code;this.response=response;}} -class Appwrite{constructor(){this.config={endpoint:'https://appwrite.io/v1',endpointRealtime:'',project:'',key:'',jwt:'',locale:'',mode:'',};this.headers={'x-sdk-version':'appwrite:web:4.0.1','X-Appwrite-Response-Format':'0.10.0',};this.realtime={socket:undefined,timeout:undefined,channels:{},lastMessage:undefined,createSocket:()=>{var _a,_b;const channels=new URLSearchParams();channels.set('project',this.config.project);for(const property in this.realtime.channels){channels.append('channels[]',property);} -if(((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)===WebSocket.OPEN){this.realtime.socket.close();} -this.realtime.socket=new WebSocket(this.config.endpointRealtime+'/realtime?'+channels.toString());(_b=this.realtime.socket)===null||_b===void 0?void 0:_b.addEventListener('message',this.realtime.authenticate);for(const channel in this.realtime.channels){this.realtime.channels[channel].forEach(callback=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.addEventListener('message',callback);});} -this.realtime.socket.addEventListener('close',event=>{var _a,_b,_c;if(((_b=(_a=this.realtime)===null||_a===void 0?void 0:_a.lastMessage)===null||_b===void 0?void 0:_b.type)==='error'&&((_c=this.realtime)===null||_c===void 0?void 0:_c.lastMessage.data).code===1008){return;} -console.error('Realtime got disconnected. Reconnect will be attempted in 1 second.',event.reason);setTimeout(()=>{this.realtime.createSocket();},1000);});},authenticate:(event)=>{var _a,_b,_c;const message=JSON.parse(event.data);if(message.type==='connected'&&((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)===WebSocket.OPEN){const cookie=JSON.parse((_b=window.localStorage.getItem('cookieFallback'))!==null&&_b!==void 0?_b:"{}");const session=cookie===null||cookie===void 0?void 0:cookie[`a_session_${this.config.project}`];const data=message.data;if(session&&!data.user){(_c=this.realtime.socket)===null||_c===void 0?void 0:_c.send(JSON.stringify({type:"authentication",data:{session}}));}}},onMessage:(channel,callback)=>(event)=>{try{const message=JSON.parse(event.data);this.realtime.lastMessage=message;if(message.type==='event'){let data=message.data;if(data.channels&&data.channels.includes(channel)){callback(data);}} -else if(message.type==='error'){throw message.data;}} -catch(e){console.error(e);}}};this.account={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} +class Appwrite{constructor(){this.config={endpoint:'https://appwrite.io/v1',endpointRealtime:'',project:'',key:'',jwt:'',locale:'',mode:'',};this.headers={'x-sdk-version':'appwrite:web:4.0.1','X-Appwrite-Response-Format':'0.10.0',};this.realtime={socket:undefined,timeout:undefined,url:'',channels:new Set(),subscriptions:new Map(),subscriptionsCounter:0,reconnect:true,reconnectAttempts:0,lastMessage:undefined,connect:()=>{clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},50);},getTimeout:()=>{switch(true){case this.realtime.reconnectAttempts<5:return 1000;case this.realtime.reconnectAttempts<15:return 5000;case this.realtime.reconnectAttempts<100:return 10000;default:return 60000;}},createSocket:()=>{var _a,_b;if(this.realtime.channels.size<1) +return;const channels=new URLSearchParams();channels.set('project',this.config.project);this.realtime.channels.forEach(channel=>{channels.append('channels[]',channel);});const url=this.config.endpointRealtime+'/realtime?'+channels.toString();if(url!==this.realtime.url||!this.realtime.socket||((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)>WebSocket.OPEN){if(this.realtime.socket&&((_b=this.realtime.socket)===null||_b===void 0?void 0:_b.readyState){this.realtime.reconnectAttempts=0;});this.realtime.socket.addEventListener('close',event=>{var _a,_b,_c;if(!this.realtime.reconnect||(((_b=(_a=this.realtime)===null||_a===void 0?void 0:_a.lastMessage)===null||_b===void 0?void 0:_b.type)==='error'&&((_c=this.realtime)===null||_c===void 0?void 0:_c.lastMessage.data).code===1008)){this.realtime.reconnect=true;return;} +const timeout=this.realtime.getTimeout();console.error(`Realtime got disconnected. Reconnect will be attempted in ${timeout / 1000} seconds.`,event.reason);setTimeout(()=>{this.realtime.reconnectAttempts++;this.realtime.createSocket();},timeout);});}},onMessage:(event)=>{var _a,_b;try{const message=JSON.parse(event.data);this.realtime.lastMessage=message;switch(message.type){case'connected':const cookie=JSON.parse((_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'{}');const session=cookie===null||cookie===void 0?void 0:cookie[`a_session_${this.config.project}`];const messageData=message.data;if(session&&!messageData.user){(_b=this.realtime.socket)===null||_b===void 0?void 0:_b.send(JSON.stringify({type:'authentication',data:{session}}));} +break;case'event':let data=message.data;if(data===null||data===void 0?void 0:data.channels){const isSubscribed=data.channels.some(channel=>this.realtime.channels.has(channel));if(!isSubscribed) +return;this.realtime.subscriptions.forEach(subscription=>{if(data.channels.some(channel=>subscription.channels.includes(channel))){setTimeout(()=>subscription.callback(data));}});} +break;case'error':throw message.data;default:break;}} +catch(e){console.error(e);}},cleanUp:channels=>{this.realtime.channels.forEach(channel=>{if(channels.includes(channel)){let found=Array.from(this.realtime.subscriptions).some(([_key,subscription])=>{return subscription.channels.includes(channel);});if(!found){this.realtime.channels.delete(channel);}}});}};this.account={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} let path='/account';let payload={};if(typeof email!=='undefined'){payload['email']=email;} if(typeof password!=='undefined'){payload['password']=password;} @@ -462,21 +463,20 @@ const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri, if(typeof emailVerification==='undefined'){throw new AppwriteException('Missing required parameter: "emailVerification"');} let path='/users/{userId}/verification'.replace('{userId}',userId);let payload={};if(typeof emailVerification!=='undefined'){payload['emailVerification']=emailVerification;} const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);})};} -setEndpoint(endpoint){this.config.endpoint=endpoint;this.config.endpointRealtime=this.config.endpointRealtime||this.config.endpoint.replace("https://","wss://").replace("http://","ws://");return this;} +setEndpoint(endpoint){this.config.endpoint=endpoint;this.config.endpointRealtime=this.config.endpointRealtime||this.config.endpoint.replace('https://','wss://').replace('http://','ws://');return this;} setEndpointRealtime(endpointRealtime){this.config.endpointRealtime=endpointRealtime;return this;} setProject(value){this.headers['X-Appwrite-Project']=value;this.config.project=value;return this;} setKey(value){this.headers['X-Appwrite-Key']=value;this.config.key=value;return this;} setJWT(value){this.headers['X-Appwrite-JWT']=value;this.config.jwt=value;return this;} setLocale(value){this.headers['X-Appwrite-Locale']=value;this.config.locale=value;return this;} setMode(value){this.headers['X-Appwrite-Mode']=value;this.config.mode=value;return this;} -subscribe(channels,callback){let channelArray=typeof channels==='string'?[channels]:channels;let savedChannels=[];channelArray.forEach((channel,index)=>{if(!(channel in this.realtime.channels)){this.realtime.channels[channel]=[];} -savedChannels[index]={name:channel,index:(this.realtime.channels[channel].push(this.realtime.onMessage(channel,callback))-1)};clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},1);});return()=>{savedChannels.forEach(channel=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.removeEventListener('message',this.realtime.channels[channel.name][channel.index]);this.realtime.channels[channel.name].splice(channel.index,1);});};} -call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:"";} +subscribe(channels,callback){let channelArray=typeof channels==='string'?[channels]:channels;channelArray.forEach(channel=>this.realtime.channels.add(channel));const counter=this.realtime.subscriptionsCounter++;this.realtime.subscriptions.set(counter,{channels:channelArray,callback});this.realtime.connect();return()=>{this.realtime.subscriptions.delete(counter);this.realtime.cleanUp(channelArray);this.realtime.connect();};} +call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'';} if(method==='GET'){for(const[key,value]of Object.entries(this.flatten(params))){url.searchParams.append(key,value);}} else{switch(headers['content-type']){case'application/json':options.body=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(const key in params){if(Array.isArray(params[key])){formData.append(key+'[]',params[key].join(','));} else{formData.append(key,params[key]);}} options.body=formData;delete headers['content-type'];break;}} -try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get("content-type"))===null||_b===void 0?void 0:_b.includes("application/json")){data=yield response.json();} +try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get('content-type'))===null||_b===void 0?void 0:_b.includes('application/json')){data=yield response.json();} else{data={message:yield response.text()};} if(400<=response.status){throw new AppwriteException(data===null||data===void 0?void 0:data.message,response.status,data);} const cookieFallback=response.headers.get('X-Fallback-Cookies');if(typeof window!=='undefined'&&window.localStorage&&cookieFallback){window.console.warn('Appwrite is using localStorage for session management. Increase your security by adding a custom domain as your API endpoint.');window.localStorage.setItem('cookieFallback',cookieFallback);} diff --git a/public/dist/scripts/app-dep.js b/public/dist/scripts/app-dep.js index 7a5622742b..163a5f7072 100644 --- a/public/dist/scripts/app-dep.js +++ b/public/dist/scripts/app-dep.js @@ -5,13 +5,14 @@ function rejected(value){try{step(generator["throw"](value));}catch(e){reject(e) function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected);} step((generator=generator.apply(thisArg,_arguments||[])).next());});} class AppwriteException extends Error{constructor(message,code=0,response=''){super(message);this.name='AppwriteException';this.message=message;this.code=code;this.response=response;}} -class Appwrite{constructor(){this.config={endpoint:'https://appwrite.io/v1',endpointRealtime:'',project:'',key:'',jwt:'',locale:'',mode:'',};this.headers={'x-sdk-version':'appwrite:web:4.0.1','X-Appwrite-Response-Format':'0.10.0',};this.realtime={socket:undefined,timeout:undefined,channels:{},lastMessage:undefined,createSocket:()=>{var _a,_b;const channels=new URLSearchParams();channels.set('project',this.config.project);for(const property in this.realtime.channels){channels.append('channels[]',property);} -if(((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)===WebSocket.OPEN){this.realtime.socket.close();} -this.realtime.socket=new WebSocket(this.config.endpointRealtime+'/realtime?'+channels.toString());(_b=this.realtime.socket)===null||_b===void 0?void 0:_b.addEventListener('message',this.realtime.authenticate);for(const channel in this.realtime.channels){this.realtime.channels[channel].forEach(callback=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.addEventListener('message',callback);});} -this.realtime.socket.addEventListener('close',event=>{var _a,_b,_c;if(((_b=(_a=this.realtime)===null||_a===void 0?void 0:_a.lastMessage)===null||_b===void 0?void 0:_b.type)==='error'&&((_c=this.realtime)===null||_c===void 0?void 0:_c.lastMessage.data).code===1008){return;} -console.error('Realtime got disconnected. Reconnect will be attempted in 1 second.',event.reason);setTimeout(()=>{this.realtime.createSocket();},1000);});},authenticate:(event)=>{var _a,_b,_c;const message=JSON.parse(event.data);if(message.type==='connected'&&((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)===WebSocket.OPEN){const cookie=JSON.parse((_b=window.localStorage.getItem('cookieFallback'))!==null&&_b!==void 0?_b:"{}");const session=cookie===null||cookie===void 0?void 0:cookie[`a_session_${this.config.project}`];const data=message.data;if(session&&!data.user){(_c=this.realtime.socket)===null||_c===void 0?void 0:_c.send(JSON.stringify({type:"authentication",data:{session}}));}}},onMessage:(channel,callback)=>(event)=>{try{const message=JSON.parse(event.data);this.realtime.lastMessage=message;if(message.type==='event'){let data=message.data;if(data.channels&&data.channels.includes(channel)){callback(data);}} -else if(message.type==='error'){throw message.data;}} -catch(e){console.error(e);}}};this.account={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} +class Appwrite{constructor(){this.config={endpoint:'https://appwrite.io/v1',endpointRealtime:'',project:'',key:'',jwt:'',locale:'',mode:'',};this.headers={'x-sdk-version':'appwrite:web:4.0.1','X-Appwrite-Response-Format':'0.10.0',};this.realtime={socket:undefined,timeout:undefined,url:'',channels:new Set(),subscriptions:new Map(),subscriptionsCounter:0,reconnect:true,reconnectAttempts:0,lastMessage:undefined,connect:()=>{clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},50);},getTimeout:()=>{switch(true){case this.realtime.reconnectAttempts<5:return 1000;case this.realtime.reconnectAttempts<15:return 5000;case this.realtime.reconnectAttempts<100:return 10000;default:return 60000;}},createSocket:()=>{var _a,_b;if(this.realtime.channels.size<1) +return;const channels=new URLSearchParams();channels.set('project',this.config.project);this.realtime.channels.forEach(channel=>{channels.append('channels[]',channel);});const url=this.config.endpointRealtime+'/realtime?'+channels.toString();if(url!==this.realtime.url||!this.realtime.socket||((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)>WebSocket.OPEN){if(this.realtime.socket&&((_b=this.realtime.socket)===null||_b===void 0?void 0:_b.readyState){this.realtime.reconnectAttempts=0;});this.realtime.socket.addEventListener('close',event=>{var _a,_b,_c;if(!this.realtime.reconnect||(((_b=(_a=this.realtime)===null||_a===void 0?void 0:_a.lastMessage)===null||_b===void 0?void 0:_b.type)==='error'&&((_c=this.realtime)===null||_c===void 0?void 0:_c.lastMessage.data).code===1008)){this.realtime.reconnect=true;return;} +const timeout=this.realtime.getTimeout();console.error(`Realtime got disconnected. Reconnect will be attempted in ${timeout / 1000} seconds.`,event.reason);setTimeout(()=>{this.realtime.reconnectAttempts++;this.realtime.createSocket();},timeout);});}},onMessage:(event)=>{var _a,_b;try{const message=JSON.parse(event.data);this.realtime.lastMessage=message;switch(message.type){case'connected':const cookie=JSON.parse((_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'{}');const session=cookie===null||cookie===void 0?void 0:cookie[`a_session_${this.config.project}`];const messageData=message.data;if(session&&!messageData.user){(_b=this.realtime.socket)===null||_b===void 0?void 0:_b.send(JSON.stringify({type:'authentication',data:{session}}));} +break;case'event':let data=message.data;if(data===null||data===void 0?void 0:data.channels){const isSubscribed=data.channels.some(channel=>this.realtime.channels.has(channel));if(!isSubscribed) +return;this.realtime.subscriptions.forEach(subscription=>{if(data.channels.some(channel=>subscription.channels.includes(channel))){setTimeout(()=>subscription.callback(data));}});} +break;case'error':throw message.data;default:break;}} +catch(e){console.error(e);}},cleanUp:channels=>{this.realtime.channels.forEach(channel=>{if(channels.includes(channel)){let found=Array.from(this.realtime.subscriptions).some(([_key,subscription])=>{return subscription.channels.includes(channel);});if(!found){this.realtime.channels.delete(channel);}}});}};this.account={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} let path='/account';let payload={};if(typeof email!=='undefined'){payload['email']=email;} if(typeof password!=='undefined'){payload['password']=password;} @@ -462,21 +463,20 @@ const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri, if(typeof emailVerification==='undefined'){throw new AppwriteException('Missing required parameter: "emailVerification"');} let path='/users/{userId}/verification'.replace('{userId}',userId);let payload={};if(typeof emailVerification!=='undefined'){payload['emailVerification']=emailVerification;} const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);})};} -setEndpoint(endpoint){this.config.endpoint=endpoint;this.config.endpointRealtime=this.config.endpointRealtime||this.config.endpoint.replace("https://","wss://").replace("http://","ws://");return this;} +setEndpoint(endpoint){this.config.endpoint=endpoint;this.config.endpointRealtime=this.config.endpointRealtime||this.config.endpoint.replace('https://','wss://').replace('http://','ws://');return this;} setEndpointRealtime(endpointRealtime){this.config.endpointRealtime=endpointRealtime;return this;} setProject(value){this.headers['X-Appwrite-Project']=value;this.config.project=value;return this;} setKey(value){this.headers['X-Appwrite-Key']=value;this.config.key=value;return this;} setJWT(value){this.headers['X-Appwrite-JWT']=value;this.config.jwt=value;return this;} setLocale(value){this.headers['X-Appwrite-Locale']=value;this.config.locale=value;return this;} setMode(value){this.headers['X-Appwrite-Mode']=value;this.config.mode=value;return this;} -subscribe(channels,callback){let channelArray=typeof channels==='string'?[channels]:channels;let savedChannels=[];channelArray.forEach((channel,index)=>{if(!(channel in this.realtime.channels)){this.realtime.channels[channel]=[];} -savedChannels[index]={name:channel,index:(this.realtime.channels[channel].push(this.realtime.onMessage(channel,callback))-1)};clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},1);});return()=>{savedChannels.forEach(channel=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.removeEventListener('message',this.realtime.channels[channel.name][channel.index]);this.realtime.channels[channel.name].splice(channel.index,1);});};} -call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:"";} +subscribe(channels,callback){let channelArray=typeof channels==='string'?[channels]:channels;channelArray.forEach(channel=>this.realtime.channels.add(channel));const counter=this.realtime.subscriptionsCounter++;this.realtime.subscriptions.set(counter,{channels:channelArray,callback});this.realtime.connect();return()=>{this.realtime.subscriptions.delete(counter);this.realtime.cleanUp(channelArray);this.realtime.connect();};} +call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'';} if(method==='GET'){for(const[key,value]of Object.entries(this.flatten(params))){url.searchParams.append(key,value);}} else{switch(headers['content-type']){case'application/json':options.body=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(const key in params){if(Array.isArray(params[key])){formData.append(key+'[]',params[key].join(','));} else{formData.append(key,params[key]);}} options.body=formData;delete headers['content-type'];break;}} -try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get("content-type"))===null||_b===void 0?void 0:_b.includes("application/json")){data=yield response.json();} +try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get('content-type'))===null||_b===void 0?void 0:_b.includes('application/json')){data=yield response.json();} else{data={message:yield response.text()};} if(400<=response.status){throw new AppwriteException(data===null||data===void 0?void 0:data.message,response.status,data);} const cookieFallback=response.headers.get('X-Fallback-Cookies');if(typeof window!=='undefined'&&window.localStorage&&cookieFallback){window.console.warn('Appwrite is using localStorage for session management. Increase your security by adding a custom domain as your API endpoint.');window.localStorage.setItem('cookieFallback',cookieFallback);} diff --git a/public/scripts/dependencies/appwrite.js b/public/scripts/dependencies/appwrite.js index 8fc1fb6790..28ae6e1476 100644 --- a/public/scripts/dependencies/appwrite.js +++ b/public/scripts/dependencies/appwrite.js @@ -53,71 +53,128 @@ this.realtime = { socket: undefined, timeout: undefined, - channels: {}, + url: '', + channels: new Set(), + subscriptions: new Map(), + subscriptionsCounter: 0, + reconnect: true, + reconnectAttempts: 0, lastMessage: undefined, + connect: () => { + clearTimeout(this.realtime.timeout); + this.realtime.timeout = window === null || window === void 0 ? void 0 : window.setTimeout(() => { + this.realtime.createSocket(); + }, 50); + }, + getTimeout: () => { + switch (true) { + case this.realtime.reconnectAttempts < 5: + return 1000; + case this.realtime.reconnectAttempts < 15: + return 5000; + case this.realtime.reconnectAttempts < 100: + return 10000; + default: + return 60000; + } + }, createSocket: () => { var _a, _b; + if (this.realtime.channels.size < 1) + return; const channels = new URLSearchParams(); channels.set('project', this.config.project); - for (const property in this.realtime.channels) { - channels.append('channels[]', property); - } - if (((_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) { - this.realtime.socket.close(); - } - this.realtime.socket = new WebSocket(this.config.endpointRealtime + '/realtime?' + channels.toString()); - (_b = this.realtime.socket) === null || _b === void 0 ? void 0 : _b.addEventListener('message', this.realtime.authenticate); - for (const channel in this.realtime.channels) { - this.realtime.channels[channel].forEach(callback => { - var _a; - (_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.addEventListener('message', callback); + this.realtime.channels.forEach(channel => { + channels.append('channels[]', channel); + }); + const url = this.config.endpointRealtime + '/realtime?' + channels.toString(); + if (url !== this.realtime.url || // Check if URL is present + !this.realtime.socket || // Check if WebSocket has not been created + ((_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.readyState) > WebSocket.OPEN // Check if WebSocket is CLOSING (3) or CLOSED (4) + ) { + if (this.realtime.socket && + ((_b = this.realtime.socket) === null || _b === void 0 ? void 0 : _b.readyState) < WebSocket.CLOSING // Close WebSocket if it is CONNECTING (0) or OPEN (1) + ) { + this.realtime.reconnect = false; + this.realtime.socket.close(); + } + this.realtime.url = url; + this.realtime.socket = new WebSocket(url); + this.realtime.socket.addEventListener('message', this.realtime.onMessage); + this.realtime.socket.addEventListener('open', _event => { + this.realtime.reconnectAttempts = 0; + }); + this.realtime.socket.addEventListener('close', event => { + var _a, _b, _c; + if (!this.realtime.reconnect || + (((_b = (_a = this.realtime) === null || _a === void 0 ? void 0 : _a.lastMessage) === null || _b === void 0 ? void 0 : _b.type) === 'error' && // Check if last message was of type error + ((_c = this.realtime) === null || _c === void 0 ? void 0 : _c.lastMessage.data).code === 1008 // Check for policy violation 1008 + )) { + this.realtime.reconnect = true; + return; + } + const timeout = this.realtime.getTimeout(); + console.error(`Realtime got disconnected. Reconnect will be attempted in ${timeout / 1000} seconds.`, event.reason); + setTimeout(() => { + this.realtime.reconnectAttempts++; + this.realtime.createSocket(); + }, timeout); }); } - this.realtime.socket.addEventListener('close', event => { - var _a, _b, _c; - if (((_b = (_a = this.realtime) === null || _a === void 0 ? void 0 : _a.lastMessage) === null || _b === void 0 ? void 0 : _b.type) === 'error' && ((_c = this.realtime) === null || _c === void 0 ? void 0 : _c.lastMessage.data).code === 1008) { - return; - } - console.error('Realtime got disconnected. Reconnect will be attempted in 1 second.', event.reason); - setTimeout(() => { - this.realtime.createSocket(); - }, 1000); - }); }, - authenticate: (event) => { - var _a, _b, _c; - const message = JSON.parse(event.data); - if (message.type === 'connected' && ((_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) { - const cookie = JSON.parse((_b = window.localStorage.getItem('cookieFallback')) !== null && _b !== void 0 ? _b : "{}"); - const session = cookie === null || cookie === void 0 ? void 0 : cookie[`a_session_${this.config.project}`]; - const data = message.data; - if (session && !data.user) { - (_c = this.realtime.socket) === null || _c === void 0 ? void 0 : _c.send(JSON.stringify({ - type: "authentication", - data: { - session - } - })); - } - } - }, - onMessage: (channel, callback) => (event) => { + onMessage: (event) => { + var _a, _b; try { const message = JSON.parse(event.data); this.realtime.lastMessage = message; - if (message.type === 'event') { - let data = message.data; - if (data.channels && data.channels.includes(channel)) { - callback(data); - } - } - else if (message.type === 'error') { - throw message.data; + switch (message.type) { + case 'connected': + const cookie = JSON.parse((_a = window.localStorage.getItem('cookieFallback')) !== null && _a !== void 0 ? _a : '{}'); + const session = cookie === null || cookie === void 0 ? void 0 : cookie[`a_session_${this.config.project}`]; + const messageData = message.data; + if (session && !messageData.user) { + (_b = this.realtime.socket) === null || _b === void 0 ? void 0 : _b.send(JSON.stringify({ + type: 'authentication', + data: { + session + } + })); + } + break; + case 'event': + let data = message.data; + if (data === null || data === void 0 ? void 0 : data.channels) { + const isSubscribed = data.channels.some(channel => this.realtime.channels.has(channel)); + if (!isSubscribed) + return; + this.realtime.subscriptions.forEach(subscription => { + if (data.channels.some(channel => subscription.channels.includes(channel))) { + setTimeout(() => subscription.callback(data)); + } + }); + } + break; + case 'error': + throw message.data; + default: + break; } } catch (e) { console.error(e); } + }, + cleanUp: channels => { + this.realtime.channels.forEach(channel => { + if (channels.includes(channel)) { + let found = Array.from(this.realtime.subscriptions).some(([_key, subscription]) => { + return subscription.channels.includes(channel); + }); + if (!found) { + this.realtime.channels.delete(channel); + } + } + }); } }; this.account = { @@ -4264,7 +4321,7 @@ */ setEndpoint(endpoint) { this.config.endpoint = endpoint; - this.config.endpointRealtime = this.config.endpointRealtime || this.config.endpoint.replace("https://", "wss://").replace("http://", "ws://"); + this.config.endpointRealtime = this.config.endpointRealtime || this.config.endpoint.replace('https://', 'wss://').replace('http://', 'ws://'); return this; } /** @@ -4371,26 +4428,17 @@ */ subscribe(channels, callback) { let channelArray = typeof channels === 'string' ? [channels] : channels; - let savedChannels = []; - channelArray.forEach((channel, index) => { - if (!(channel in this.realtime.channels)) { - this.realtime.channels[channel] = []; - } - savedChannels[index] = { - name: channel, - index: (this.realtime.channels[channel].push(this.realtime.onMessage(channel, callback)) - 1) - }; - clearTimeout(this.realtime.timeout); - this.realtime.timeout = window === null || window === void 0 ? void 0 : window.setTimeout(() => { - this.realtime.createSocket(); - }, 1); + channelArray.forEach(channel => this.realtime.channels.add(channel)); + const counter = this.realtime.subscriptionsCounter++; + this.realtime.subscriptions.set(counter, { + channels: channelArray, + callback }); + this.realtime.connect(); return () => { - savedChannels.forEach(channel => { - var _a; - (_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.removeEventListener('message', this.realtime.channels[channel.name][channel.index]); - this.realtime.channels[channel.name].splice(channel.index, 1); - }); + this.realtime.subscriptions.delete(counter); + this.realtime.cleanUp(channelArray); + this.realtime.connect(); }; } call(method, url, headers = {}, params = {}) { @@ -4404,7 +4452,7 @@ credentials: 'include' }; if (typeof window !== 'undefined' && window.localStorage) { - headers['X-Fallback-Cookies'] = (_a = window.localStorage.getItem('cookieFallback')) !== null && _a !== void 0 ? _a : ""; + headers['X-Fallback-Cookies'] = (_a = window.localStorage.getItem('cookieFallback')) !== null && _a !== void 0 ? _a : ''; } if (method === 'GET') { for (const [key, value] of Object.entries(this.flatten(params))) { @@ -4434,7 +4482,7 @@ try { let data = null; const response = yield crossFetch.fetch(url.toString(), options); - if ((_b = response.headers.get("content-type")) === null || _b === void 0 ? void 0 : _b.includes("application/json")) { + if ((_b = response.headers.get('content-type')) === null || _b === void 0 ? void 0 : _b.includes('application/json')) { data = yield response.json(); } else { From 7c1686e19659aad51824d2d298debb017e86134e Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Mon, 20 Sep 2021 19:01:12 +0200 Subject: [PATCH 014/257] reverse sdk --- public/dist/scripts/app-all.js | 24 +-- public/dist/scripts/app-dep.js | 24 +-- public/scripts/dependencies/appwrite.js | 188 +++++++++--------------- 3 files changed, 94 insertions(+), 142 deletions(-) diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index 4ba22d8e66..4a4daa72fa 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -5,14 +5,13 @@ function rejected(value){try{step(generator["throw"](value));}catch(e){reject(e) function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected);} step((generator=generator.apply(thisArg,_arguments||[])).next());});} class AppwriteException extends Error{constructor(message,code=0,response=''){super(message);this.name='AppwriteException';this.message=message;this.code=code;this.response=response;}} -class Appwrite{constructor(){this.config={endpoint:'https://appwrite.io/v1',endpointRealtime:'',project:'',key:'',jwt:'',locale:'',mode:'',};this.headers={'x-sdk-version':'appwrite:web:4.0.1','X-Appwrite-Response-Format':'0.10.0',};this.realtime={socket:undefined,timeout:undefined,url:'',channels:new Set(),subscriptions:new Map(),subscriptionsCounter:0,reconnect:true,reconnectAttempts:0,lastMessage:undefined,connect:()=>{clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},50);},getTimeout:()=>{switch(true){case this.realtime.reconnectAttempts<5:return 1000;case this.realtime.reconnectAttempts<15:return 5000;case this.realtime.reconnectAttempts<100:return 10000;default:return 60000;}},createSocket:()=>{var _a,_b;if(this.realtime.channels.size<1) -return;const channels=new URLSearchParams();channels.set('project',this.config.project);this.realtime.channels.forEach(channel=>{channels.append('channels[]',channel);});const url=this.config.endpointRealtime+'/realtime?'+channels.toString();if(url!==this.realtime.url||!this.realtime.socket||((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)>WebSocket.OPEN){if(this.realtime.socket&&((_b=this.realtime.socket)===null||_b===void 0?void 0:_b.readyState){this.realtime.reconnectAttempts=0;});this.realtime.socket.addEventListener('close',event=>{var _a,_b,_c;if(!this.realtime.reconnect||(((_b=(_a=this.realtime)===null||_a===void 0?void 0:_a.lastMessage)===null||_b===void 0?void 0:_b.type)==='error'&&((_c=this.realtime)===null||_c===void 0?void 0:_c.lastMessage.data).code===1008)){this.realtime.reconnect=true;return;} -const timeout=this.realtime.getTimeout();console.error(`Realtime got disconnected. Reconnect will be attempted in ${timeout / 1000} seconds.`,event.reason);setTimeout(()=>{this.realtime.reconnectAttempts++;this.realtime.createSocket();},timeout);});}},onMessage:(event)=>{var _a,_b;try{const message=JSON.parse(event.data);this.realtime.lastMessage=message;switch(message.type){case'connected':const cookie=JSON.parse((_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'{}');const session=cookie===null||cookie===void 0?void 0:cookie[`a_session_${this.config.project}`];const messageData=message.data;if(session&&!messageData.user){(_b=this.realtime.socket)===null||_b===void 0?void 0:_b.send(JSON.stringify({type:'authentication',data:{session}}));} -break;case'event':let data=message.data;if(data===null||data===void 0?void 0:data.channels){const isSubscribed=data.channels.some(channel=>this.realtime.channels.has(channel));if(!isSubscribed) -return;this.realtime.subscriptions.forEach(subscription=>{if(data.channels.some(channel=>subscription.channels.includes(channel))){setTimeout(()=>subscription.callback(data));}});} -break;case'error':throw message.data;default:break;}} -catch(e){console.error(e);}},cleanUp:channels=>{this.realtime.channels.forEach(channel=>{if(channels.includes(channel)){let found=Array.from(this.realtime.subscriptions).some(([_key,subscription])=>{return subscription.channels.includes(channel);});if(!found){this.realtime.channels.delete(channel);}}});}};this.account={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} +class Appwrite{constructor(){this.config={endpoint:'https://appwrite.io/v1',endpointRealtime:'',project:'',key:'',jwt:'',locale:'',mode:'',};this.headers={'x-sdk-version':'appwrite:web:4.0.1','X-Appwrite-Response-Format':'0.10.0',};this.realtime={socket:undefined,timeout:undefined,channels:{},lastMessage:undefined,createSocket:()=>{var _a,_b;const channels=new URLSearchParams();channels.set('project',this.config.project);for(const property in this.realtime.channels){channels.append('channels[]',property);} +if(((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)===WebSocket.OPEN){this.realtime.socket.close();} +this.realtime.socket=new WebSocket(this.config.endpointRealtime+'/realtime?'+channels.toString());(_b=this.realtime.socket)===null||_b===void 0?void 0:_b.addEventListener('message',this.realtime.authenticate);for(const channel in this.realtime.channels){this.realtime.channels[channel].forEach(callback=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.addEventListener('message',callback);});} +this.realtime.socket.addEventListener('close',event=>{var _a,_b,_c;if(((_b=(_a=this.realtime)===null||_a===void 0?void 0:_a.lastMessage)===null||_b===void 0?void 0:_b.type)==='error'&&((_c=this.realtime)===null||_c===void 0?void 0:_c.lastMessage.data).code===1008){return;} +console.error('Realtime got disconnected. Reconnect will be attempted in 1 second.',event.reason);setTimeout(()=>{this.realtime.createSocket();},1000);});},authenticate:(event)=>{var _a,_b,_c;const message=JSON.parse(event.data);if(message.type==='connected'&&((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)===WebSocket.OPEN){const cookie=JSON.parse((_b=window.localStorage.getItem('cookieFallback'))!==null&&_b!==void 0?_b:"{}");const session=cookie===null||cookie===void 0?void 0:cookie[`a_session_${this.config.project}`];const data=message.data;if(session&&!data.user){(_c=this.realtime.socket)===null||_c===void 0?void 0:_c.send(JSON.stringify({type:"authentication",data:{session}}));}}},onMessage:(channel,callback)=>(event)=>{try{const message=JSON.parse(event.data);this.realtime.lastMessage=message;if(message.type==='event'){let data=message.data;if(data.channels&&data.channels.includes(channel)){callback(data);}} +else if(message.type==='error'){throw message.data;}} +catch(e){console.error(e);}}};this.account={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} let path='/account';let payload={};if(typeof email!=='undefined'){payload['email']=email;} if(typeof password!=='undefined'){payload['password']=password;} @@ -463,20 +462,21 @@ const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri, if(typeof emailVerification==='undefined'){throw new AppwriteException('Missing required parameter: "emailVerification"');} let path='/users/{userId}/verification'.replace('{userId}',userId);let payload={};if(typeof emailVerification!=='undefined'){payload['emailVerification']=emailVerification;} const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);})};} -setEndpoint(endpoint){this.config.endpoint=endpoint;this.config.endpointRealtime=this.config.endpointRealtime||this.config.endpoint.replace('https://','wss://').replace('http://','ws://');return this;} +setEndpoint(endpoint){this.config.endpoint=endpoint;this.config.endpointRealtime=this.config.endpointRealtime||this.config.endpoint.replace("https://","wss://").replace("http://","ws://");return this;} setEndpointRealtime(endpointRealtime){this.config.endpointRealtime=endpointRealtime;return this;} setProject(value){this.headers['X-Appwrite-Project']=value;this.config.project=value;return this;} setKey(value){this.headers['X-Appwrite-Key']=value;this.config.key=value;return this;} setJWT(value){this.headers['X-Appwrite-JWT']=value;this.config.jwt=value;return this;} setLocale(value){this.headers['X-Appwrite-Locale']=value;this.config.locale=value;return this;} setMode(value){this.headers['X-Appwrite-Mode']=value;this.config.mode=value;return this;} -subscribe(channels,callback){let channelArray=typeof channels==='string'?[channels]:channels;channelArray.forEach(channel=>this.realtime.channels.add(channel));const counter=this.realtime.subscriptionsCounter++;this.realtime.subscriptions.set(counter,{channels:channelArray,callback});this.realtime.connect();return()=>{this.realtime.subscriptions.delete(counter);this.realtime.cleanUp(channelArray);this.realtime.connect();};} -call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'';} +subscribe(channels,callback){let channelArray=typeof channels==='string'?[channels]:channels;let savedChannels=[];channelArray.forEach((channel,index)=>{if(!(channel in this.realtime.channels)){this.realtime.channels[channel]=[];} +savedChannels[index]={name:channel,index:(this.realtime.channels[channel].push(this.realtime.onMessage(channel,callback))-1)};clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},1);});return()=>{savedChannels.forEach(channel=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.removeEventListener('message',this.realtime.channels[channel.name][channel.index]);this.realtime.channels[channel.name].splice(channel.index,1);});};} +call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:"";} if(method==='GET'){for(const[key,value]of Object.entries(this.flatten(params))){url.searchParams.append(key,value);}} else{switch(headers['content-type']){case'application/json':options.body=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(const key in params){if(Array.isArray(params[key])){formData.append(key+'[]',params[key].join(','));} else{formData.append(key,params[key]);}} options.body=formData;delete headers['content-type'];break;}} -try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get('content-type'))===null||_b===void 0?void 0:_b.includes('application/json')){data=yield response.json();} +try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get("content-type"))===null||_b===void 0?void 0:_b.includes("application/json")){data=yield response.json();} else{data={message:yield response.text()};} if(400<=response.status){throw new AppwriteException(data===null||data===void 0?void 0:data.message,response.status,data);} const cookieFallback=response.headers.get('X-Fallback-Cookies');if(typeof window!=='undefined'&&window.localStorage&&cookieFallback){window.console.warn('Appwrite is using localStorage for session management. Increase your security by adding a custom domain as your API endpoint.');window.localStorage.setItem('cookieFallback',cookieFallback);} diff --git a/public/dist/scripts/app-dep.js b/public/dist/scripts/app-dep.js index 163a5f7072..7a5622742b 100644 --- a/public/dist/scripts/app-dep.js +++ b/public/dist/scripts/app-dep.js @@ -5,14 +5,13 @@ function rejected(value){try{step(generator["throw"](value));}catch(e){reject(e) function step(result){result.done?resolve(result.value):adopt(result.value).then(fulfilled,rejected);} step((generator=generator.apply(thisArg,_arguments||[])).next());});} class AppwriteException extends Error{constructor(message,code=0,response=''){super(message);this.name='AppwriteException';this.message=message;this.code=code;this.response=response;}} -class Appwrite{constructor(){this.config={endpoint:'https://appwrite.io/v1',endpointRealtime:'',project:'',key:'',jwt:'',locale:'',mode:'',};this.headers={'x-sdk-version':'appwrite:web:4.0.1','X-Appwrite-Response-Format':'0.10.0',};this.realtime={socket:undefined,timeout:undefined,url:'',channels:new Set(),subscriptions:new Map(),subscriptionsCounter:0,reconnect:true,reconnectAttempts:0,lastMessage:undefined,connect:()=>{clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},50);},getTimeout:()=>{switch(true){case this.realtime.reconnectAttempts<5:return 1000;case this.realtime.reconnectAttempts<15:return 5000;case this.realtime.reconnectAttempts<100:return 10000;default:return 60000;}},createSocket:()=>{var _a,_b;if(this.realtime.channels.size<1) -return;const channels=new URLSearchParams();channels.set('project',this.config.project);this.realtime.channels.forEach(channel=>{channels.append('channels[]',channel);});const url=this.config.endpointRealtime+'/realtime?'+channels.toString();if(url!==this.realtime.url||!this.realtime.socket||((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)>WebSocket.OPEN){if(this.realtime.socket&&((_b=this.realtime.socket)===null||_b===void 0?void 0:_b.readyState){this.realtime.reconnectAttempts=0;});this.realtime.socket.addEventListener('close',event=>{var _a,_b,_c;if(!this.realtime.reconnect||(((_b=(_a=this.realtime)===null||_a===void 0?void 0:_a.lastMessage)===null||_b===void 0?void 0:_b.type)==='error'&&((_c=this.realtime)===null||_c===void 0?void 0:_c.lastMessage.data).code===1008)){this.realtime.reconnect=true;return;} -const timeout=this.realtime.getTimeout();console.error(`Realtime got disconnected. Reconnect will be attempted in ${timeout / 1000} seconds.`,event.reason);setTimeout(()=>{this.realtime.reconnectAttempts++;this.realtime.createSocket();},timeout);});}},onMessage:(event)=>{var _a,_b;try{const message=JSON.parse(event.data);this.realtime.lastMessage=message;switch(message.type){case'connected':const cookie=JSON.parse((_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'{}');const session=cookie===null||cookie===void 0?void 0:cookie[`a_session_${this.config.project}`];const messageData=message.data;if(session&&!messageData.user){(_b=this.realtime.socket)===null||_b===void 0?void 0:_b.send(JSON.stringify({type:'authentication',data:{session}}));} -break;case'event':let data=message.data;if(data===null||data===void 0?void 0:data.channels){const isSubscribed=data.channels.some(channel=>this.realtime.channels.has(channel));if(!isSubscribed) -return;this.realtime.subscriptions.forEach(subscription=>{if(data.channels.some(channel=>subscription.channels.includes(channel))){setTimeout(()=>subscription.callback(data));}});} -break;case'error':throw message.data;default:break;}} -catch(e){console.error(e);}},cleanUp:channels=>{this.realtime.channels.forEach(channel=>{if(channels.includes(channel)){let found=Array.from(this.realtime.subscriptions).some(([_key,subscription])=>{return subscription.channels.includes(channel);});if(!found){this.realtime.channels.delete(channel);}}});}};this.account={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} +class Appwrite{constructor(){this.config={endpoint:'https://appwrite.io/v1',endpointRealtime:'',project:'',key:'',jwt:'',locale:'',mode:'',};this.headers={'x-sdk-version':'appwrite:web:4.0.1','X-Appwrite-Response-Format':'0.10.0',};this.realtime={socket:undefined,timeout:undefined,channels:{},lastMessage:undefined,createSocket:()=>{var _a,_b;const channels=new URLSearchParams();channels.set('project',this.config.project);for(const property in this.realtime.channels){channels.append('channels[]',property);} +if(((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)===WebSocket.OPEN){this.realtime.socket.close();} +this.realtime.socket=new WebSocket(this.config.endpointRealtime+'/realtime?'+channels.toString());(_b=this.realtime.socket)===null||_b===void 0?void 0:_b.addEventListener('message',this.realtime.authenticate);for(const channel in this.realtime.channels){this.realtime.channels[channel].forEach(callback=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.addEventListener('message',callback);});} +this.realtime.socket.addEventListener('close',event=>{var _a,_b,_c;if(((_b=(_a=this.realtime)===null||_a===void 0?void 0:_a.lastMessage)===null||_b===void 0?void 0:_b.type)==='error'&&((_c=this.realtime)===null||_c===void 0?void 0:_c.lastMessage.data).code===1008){return;} +console.error('Realtime got disconnected. Reconnect will be attempted in 1 second.',event.reason);setTimeout(()=>{this.realtime.createSocket();},1000);});},authenticate:(event)=>{var _a,_b,_c;const message=JSON.parse(event.data);if(message.type==='connected'&&((_a=this.realtime.socket)===null||_a===void 0?void 0:_a.readyState)===WebSocket.OPEN){const cookie=JSON.parse((_b=window.localStorage.getItem('cookieFallback'))!==null&&_b!==void 0?_b:"{}");const session=cookie===null||cookie===void 0?void 0:cookie[`a_session_${this.config.project}`];const data=message.data;if(session&&!data.user){(_c=this.realtime.socket)===null||_c===void 0?void 0:_c.send(JSON.stringify({type:"authentication",data:{session}}));}}},onMessage:(channel,callback)=>(event)=>{try{const message=JSON.parse(event.data);this.realtime.lastMessage=message;if(message.type==='event'){let data=message.data;if(data.channels&&data.channels.includes(channel)){callback(data);}} +else if(message.type==='error'){throw message.data;}} +catch(e){console.error(e);}}};this.account={get:()=>__awaiter(this,void 0,void 0,function*(){let path='/account';let payload={};const uri=new URL(this.config.endpoint+path);return yield this.call('get',uri,{'content-type':'application/json',},payload);}),create:(email,password,name)=>__awaiter(this,void 0,void 0,function*(){if(typeof email==='undefined'){throw new AppwriteException('Missing required parameter: "email"');} if(typeof password==='undefined'){throw new AppwriteException('Missing required parameter: "password"');} let path='/account';let payload={};if(typeof email!=='undefined'){payload['email']=email;} if(typeof password!=='undefined'){payload['password']=password;} @@ -463,20 +462,21 @@ const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri, if(typeof emailVerification==='undefined'){throw new AppwriteException('Missing required parameter: "emailVerification"');} let path='/users/{userId}/verification'.replace('{userId}',userId);let payload={};if(typeof emailVerification!=='undefined'){payload['emailVerification']=emailVerification;} const uri=new URL(this.config.endpoint+path);return yield this.call('patch',uri,{'content-type':'application/json',},payload);})};} -setEndpoint(endpoint){this.config.endpoint=endpoint;this.config.endpointRealtime=this.config.endpointRealtime||this.config.endpoint.replace('https://','wss://').replace('http://','ws://');return this;} +setEndpoint(endpoint){this.config.endpoint=endpoint;this.config.endpointRealtime=this.config.endpointRealtime||this.config.endpoint.replace("https://","wss://").replace("http://","ws://");return this;} setEndpointRealtime(endpointRealtime){this.config.endpointRealtime=endpointRealtime;return this;} setProject(value){this.headers['X-Appwrite-Project']=value;this.config.project=value;return this;} setKey(value){this.headers['X-Appwrite-Key']=value;this.config.key=value;return this;} setJWT(value){this.headers['X-Appwrite-JWT']=value;this.config.jwt=value;return this;} setLocale(value){this.headers['X-Appwrite-Locale']=value;this.config.locale=value;return this;} setMode(value){this.headers['X-Appwrite-Mode']=value;this.config.mode=value;return this;} -subscribe(channels,callback){let channelArray=typeof channels==='string'?[channels]:channels;channelArray.forEach(channel=>this.realtime.channels.add(channel));const counter=this.realtime.subscriptionsCounter++;this.realtime.subscriptions.set(counter,{channels:channelArray,callback});this.realtime.connect();return()=>{this.realtime.subscriptions.delete(counter);this.realtime.cleanUp(channelArray);this.realtime.connect();};} -call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:'';} +subscribe(channels,callback){let channelArray=typeof channels==='string'?[channels]:channels;let savedChannels=[];channelArray.forEach((channel,index)=>{if(!(channel in this.realtime.channels)){this.realtime.channels[channel]=[];} +savedChannels[index]={name:channel,index:(this.realtime.channels[channel].push(this.realtime.onMessage(channel,callback))-1)};clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},1);});return()=>{savedChannels.forEach(channel=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.removeEventListener('message',this.realtime.channels[channel.name][channel.index]);this.realtime.channels[channel.name].splice(channel.index,1);});};} +call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:"";} if(method==='GET'){for(const[key,value]of Object.entries(this.flatten(params))){url.searchParams.append(key,value);}} else{switch(headers['content-type']){case'application/json':options.body=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(const key in params){if(Array.isArray(params[key])){formData.append(key+'[]',params[key].join(','));} else{formData.append(key,params[key]);}} options.body=formData;delete headers['content-type'];break;}} -try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get('content-type'))===null||_b===void 0?void 0:_b.includes('application/json')){data=yield response.json();} +try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get("content-type"))===null||_b===void 0?void 0:_b.includes("application/json")){data=yield response.json();} else{data={message:yield response.text()};} if(400<=response.status){throw new AppwriteException(data===null||data===void 0?void 0:data.message,response.status,data);} const cookieFallback=response.headers.get('X-Fallback-Cookies');if(typeof window!=='undefined'&&window.localStorage&&cookieFallback){window.console.warn('Appwrite is using localStorage for session management. Increase your security by adding a custom domain as your API endpoint.');window.localStorage.setItem('cookieFallback',cookieFallback);} diff --git a/public/scripts/dependencies/appwrite.js b/public/scripts/dependencies/appwrite.js index 28ae6e1476..8fc1fb6790 100644 --- a/public/scripts/dependencies/appwrite.js +++ b/public/scripts/dependencies/appwrite.js @@ -53,128 +53,71 @@ this.realtime = { socket: undefined, timeout: undefined, - url: '', - channels: new Set(), - subscriptions: new Map(), - subscriptionsCounter: 0, - reconnect: true, - reconnectAttempts: 0, + channels: {}, lastMessage: undefined, - connect: () => { - clearTimeout(this.realtime.timeout); - this.realtime.timeout = window === null || window === void 0 ? void 0 : window.setTimeout(() => { - this.realtime.createSocket(); - }, 50); - }, - getTimeout: () => { - switch (true) { - case this.realtime.reconnectAttempts < 5: - return 1000; - case this.realtime.reconnectAttempts < 15: - return 5000; - case this.realtime.reconnectAttempts < 100: - return 10000; - default: - return 60000; - } - }, createSocket: () => { var _a, _b; - if (this.realtime.channels.size < 1) - return; const channels = new URLSearchParams(); channels.set('project', this.config.project); - this.realtime.channels.forEach(channel => { - channels.append('channels[]', channel); - }); - const url = this.config.endpointRealtime + '/realtime?' + channels.toString(); - if (url !== this.realtime.url || // Check if URL is present - !this.realtime.socket || // Check if WebSocket has not been created - ((_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.readyState) > WebSocket.OPEN // Check if WebSocket is CLOSING (3) or CLOSED (4) - ) { - if (this.realtime.socket && - ((_b = this.realtime.socket) === null || _b === void 0 ? void 0 : _b.readyState) < WebSocket.CLOSING // Close WebSocket if it is CONNECTING (0) or OPEN (1) - ) { - this.realtime.reconnect = false; - this.realtime.socket.close(); - } - this.realtime.url = url; - this.realtime.socket = new WebSocket(url); - this.realtime.socket.addEventListener('message', this.realtime.onMessage); - this.realtime.socket.addEventListener('open', _event => { - this.realtime.reconnectAttempts = 0; - }); - this.realtime.socket.addEventListener('close', event => { - var _a, _b, _c; - if (!this.realtime.reconnect || - (((_b = (_a = this.realtime) === null || _a === void 0 ? void 0 : _a.lastMessage) === null || _b === void 0 ? void 0 : _b.type) === 'error' && // Check if last message was of type error - ((_c = this.realtime) === null || _c === void 0 ? void 0 : _c.lastMessage.data).code === 1008 // Check for policy violation 1008 - )) { - this.realtime.reconnect = true; - return; - } - const timeout = this.realtime.getTimeout(); - console.error(`Realtime got disconnected. Reconnect will be attempted in ${timeout / 1000} seconds.`, event.reason); - setTimeout(() => { - this.realtime.reconnectAttempts++; - this.realtime.createSocket(); - }, timeout); + for (const property in this.realtime.channels) { + channels.append('channels[]', property); + } + if (((_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) { + this.realtime.socket.close(); + } + this.realtime.socket = new WebSocket(this.config.endpointRealtime + '/realtime?' + channels.toString()); + (_b = this.realtime.socket) === null || _b === void 0 ? void 0 : _b.addEventListener('message', this.realtime.authenticate); + for (const channel in this.realtime.channels) { + this.realtime.channels[channel].forEach(callback => { + var _a; + (_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.addEventListener('message', callback); }); } + this.realtime.socket.addEventListener('close', event => { + var _a, _b, _c; + if (((_b = (_a = this.realtime) === null || _a === void 0 ? void 0 : _a.lastMessage) === null || _b === void 0 ? void 0 : _b.type) === 'error' && ((_c = this.realtime) === null || _c === void 0 ? void 0 : _c.lastMessage.data).code === 1008) { + return; + } + console.error('Realtime got disconnected. Reconnect will be attempted in 1 second.', event.reason); + setTimeout(() => { + this.realtime.createSocket(); + }, 1000); + }); }, - onMessage: (event) => { - var _a, _b; + authenticate: (event) => { + var _a, _b, _c; + const message = JSON.parse(event.data); + if (message.type === 'connected' && ((_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.readyState) === WebSocket.OPEN) { + const cookie = JSON.parse((_b = window.localStorage.getItem('cookieFallback')) !== null && _b !== void 0 ? _b : "{}"); + const session = cookie === null || cookie === void 0 ? void 0 : cookie[`a_session_${this.config.project}`]; + const data = message.data; + if (session && !data.user) { + (_c = this.realtime.socket) === null || _c === void 0 ? void 0 : _c.send(JSON.stringify({ + type: "authentication", + data: { + session + } + })); + } + } + }, + onMessage: (channel, callback) => (event) => { try { const message = JSON.parse(event.data); this.realtime.lastMessage = message; - switch (message.type) { - case 'connected': - const cookie = JSON.parse((_a = window.localStorage.getItem('cookieFallback')) !== null && _a !== void 0 ? _a : '{}'); - const session = cookie === null || cookie === void 0 ? void 0 : cookie[`a_session_${this.config.project}`]; - const messageData = message.data; - if (session && !messageData.user) { - (_b = this.realtime.socket) === null || _b === void 0 ? void 0 : _b.send(JSON.stringify({ - type: 'authentication', - data: { - session - } - })); - } - break; - case 'event': - let data = message.data; - if (data === null || data === void 0 ? void 0 : data.channels) { - const isSubscribed = data.channels.some(channel => this.realtime.channels.has(channel)); - if (!isSubscribed) - return; - this.realtime.subscriptions.forEach(subscription => { - if (data.channels.some(channel => subscription.channels.includes(channel))) { - setTimeout(() => subscription.callback(data)); - } - }); - } - break; - case 'error': - throw message.data; - default: - break; + if (message.type === 'event') { + let data = message.data; + if (data.channels && data.channels.includes(channel)) { + callback(data); + } + } + else if (message.type === 'error') { + throw message.data; } } catch (e) { console.error(e); } - }, - cleanUp: channels => { - this.realtime.channels.forEach(channel => { - if (channels.includes(channel)) { - let found = Array.from(this.realtime.subscriptions).some(([_key, subscription]) => { - return subscription.channels.includes(channel); - }); - if (!found) { - this.realtime.channels.delete(channel); - } - } - }); } }; this.account = { @@ -4321,7 +4264,7 @@ */ setEndpoint(endpoint) { this.config.endpoint = endpoint; - this.config.endpointRealtime = this.config.endpointRealtime || this.config.endpoint.replace('https://', 'wss://').replace('http://', 'ws://'); + this.config.endpointRealtime = this.config.endpointRealtime || this.config.endpoint.replace("https://", "wss://").replace("http://", "ws://"); return this; } /** @@ -4428,17 +4371,26 @@ */ subscribe(channels, callback) { let channelArray = typeof channels === 'string' ? [channels] : channels; - channelArray.forEach(channel => this.realtime.channels.add(channel)); - const counter = this.realtime.subscriptionsCounter++; - this.realtime.subscriptions.set(counter, { - channels: channelArray, - callback + let savedChannels = []; + channelArray.forEach((channel, index) => { + if (!(channel in this.realtime.channels)) { + this.realtime.channels[channel] = []; + } + savedChannels[index] = { + name: channel, + index: (this.realtime.channels[channel].push(this.realtime.onMessage(channel, callback)) - 1) + }; + clearTimeout(this.realtime.timeout); + this.realtime.timeout = window === null || window === void 0 ? void 0 : window.setTimeout(() => { + this.realtime.createSocket(); + }, 1); }); - this.realtime.connect(); return () => { - this.realtime.subscriptions.delete(counter); - this.realtime.cleanUp(channelArray); - this.realtime.connect(); + savedChannels.forEach(channel => { + var _a; + (_a = this.realtime.socket) === null || _a === void 0 ? void 0 : _a.removeEventListener('message', this.realtime.channels[channel.name][channel.index]); + this.realtime.channels[channel.name].splice(channel.index, 1); + }); }; } call(method, url, headers = {}, params = {}) { @@ -4452,7 +4404,7 @@ credentials: 'include' }; if (typeof window !== 'undefined' && window.localStorage) { - headers['X-Fallback-Cookies'] = (_a = window.localStorage.getItem('cookieFallback')) !== null && _a !== void 0 ? _a : ''; + headers['X-Fallback-Cookies'] = (_a = window.localStorage.getItem('cookieFallback')) !== null && _a !== void 0 ? _a : ""; } if (method === 'GET') { for (const [key, value] of Object.entries(this.flatten(params))) { @@ -4482,7 +4434,7 @@ try { let data = null; const response = yield crossFetch.fetch(url.toString(), options); - if ((_b = response.headers.get('content-type')) === null || _b === void 0 ? void 0 : _b.includes('application/json')) { + if ((_b = response.headers.get("content-type")) === null || _b === void 0 ? void 0 : _b.includes("application/json")) { data = yield response.json(); } else { From d6b69340ba80424d09c8691d87965ef0eb470d16 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 22 Sep 2021 15:11:34 +0200 Subject: [PATCH 015/257] feat(sdks): release flutter 1.0.4 --- app/config/platforms.php | 2 +- composer.json | 2 +- composer.lock | 100 ++++++++++++++++----------------- docs/sdks/flutter/CHANGELOG.md | 6 ++ 4 files changed, 58 insertions(+), 52 deletions(-) diff --git a/app/config/platforms.php b/app/config/platforms.php index 348aa18cb4..ad4b317fff 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -62,7 +62,7 @@ return [ [ 'key' => 'flutter', 'name' => 'Flutter', - 'version' => '1.0.2', + 'version' => '1.0.4', 'url' => 'https://github.com/appwrite/sdk-for-flutter', 'package' => 'https://pub.dev/packages/appwrite', 'enabled' => true, diff --git a/composer.json b/composer.json index 3ca194945f..b5247333c8 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "slickdeals/statsd": "3.1.0" }, "require-dev": { - "appwrite/sdk-generator": "0.14.4", + "appwrite/sdk-generator": "0.14.6", "phpunit/phpunit": "9.5.6", "swoole/ide-helper": "4.6.7", "textalk/websocket": "1.5.2", diff --git a/composer.lock b/composer.lock index f991ded4f1..60081b2951 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "82b47392837605b4fb552e5c9374c4cc", + "content-hash": "2b6385366b1d4ed47d262088a6829e16", "packages": [ { "name": "adhocore/jwt", @@ -2516,16 +2516,16 @@ }, { "name": "appwrite/sdk-generator", - "version": "0.14.4", + "version": "0.14.6", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "b89a51170f99e6977df72c46522c7d931257bc28" + "reference": "1e7b9adc1b4489d7b09cd1976e331a9cab19eb53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/b89a51170f99e6977df72c46522c7d931257bc28", - "reference": "b89a51170f99e6977df72c46522c7d931257bc28", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/1e7b9adc1b4489d7b09cd1976e331a9cab19eb53", + "reference": "1e7b9adc1b4489d7b09cd1976e331a9cab19eb53", "shasum": "" }, "require": { @@ -2559,22 +2559,22 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.14.4" + "source": "https://github.com/appwrite/sdk-generator/tree/0.14.6" }, - "time": "2021-09-07T13:23:19+00:00" + "time": "2021-09-22T11:07:20+00:00" }, { "name": "composer/package-versions-deprecated", - "version": "1.11.99.3", + "version": "1.11.99.4", "source": { "type": "git", "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "fff576ac850c045158a250e7e27666e146e78d18" + "reference": "b174585d1fe49ceed21928a945138948cb394600" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/fff576ac850c045158a250e7e27666e146e78d18", - "reference": "fff576ac850c045158a250e7e27666e146e78d18", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", + "reference": "b174585d1fe49ceed21928a945138948cb394600", "shasum": "" }, "require": { @@ -2618,7 +2618,7 @@ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", "support": { "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.3" + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" }, "funding": [ { @@ -2634,7 +2634,7 @@ "type": "tidelift" } ], - "time": "2021-08-17T13:49:14+00:00" + "time": "2021-09-13T08:41:34+00:00" }, { "name": "composer/semver", @@ -3230,16 +3230,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.12.0", + "version": "v4.13.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143" + "reference": "50953a2691a922aa1769461637869a0a2faa3f53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/6608f01670c3cc5079e18c1dab1104e002579143", - "reference": "6608f01670c3cc5079e18c1dab1104e002579143", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/50953a2691a922aa1769461637869a0a2faa3f53", + "reference": "50953a2691a922aa1769461637869a0a2faa3f53", "shasum": "" }, "require": { @@ -3280,9 +3280,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.12.0" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.0" }, - "time": "2021-07-21T10:44:31+00:00" + "time": "2021-09-20T12:20:58+00:00" }, { "name": "openlss/lib-array2xml", @@ -3559,16 +3559,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.4.0", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0" + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", - "reference": "6a467b8989322d92aa1c8bf2bebcc6e5c2ba55c0", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/30f38bffc6f24293dadd1823936372dfa9e86e2f", + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f", "shasum": "" }, "require": { @@ -3576,7 +3576,8 @@ "phpdocumentor/reflection-common": "^2.0" }, "require-dev": { - "ext-tokenizer": "*" + "ext-tokenizer": "*", + "psalm/phar": "^4.8" }, "type": "library", "extra": { @@ -3602,39 +3603,39 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.4.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.0" }, - "time": "2020-09-17T18:55:26+00:00" + "time": "2021-09-17T15:28:14+00:00" }, { "name": "phpspec/prophecy", - "version": "1.13.0", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea" + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/be1996ed8adc35c3fd795488a653f4b518be70ea", - "reference": "be1996ed8adc35c3fd795488a653f4b518be70ea", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", "shasum": "" }, "require": { "doctrine/instantiator": "^1.2", - "php": "^7.2 || ~8.0, <8.1", + "php": "^7.2 || ~8.0, <8.2", "phpdocumentor/reflection-docblock": "^5.2", "sebastian/comparator": "^3.0 || ^4.0", "sebastian/recursion-context": "^3.0 || ^4.0" }, "require-dev": { - "phpspec/phpspec": "^6.0", + "phpspec/phpspec": "^6.0 || ^7.0", "phpunit/phpunit": "^8.0 || ^9.0" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.11.x-dev" + "dev-master": "1.x-dev" } }, "autoload": { @@ -3669,29 +3670,29 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.13.0" + "source": "https://github.com/phpspec/prophecy/tree/1.14.0" }, - "time": "2021-03-17T13:42:18+00:00" + "time": "2021-09-10T09:02:12+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.6", + "version": "9.2.7", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f6293e1b30a2354e8428e004689671b83871edde" + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f6293e1b30a2354e8428e004689671b83871edde", - "reference": "f6293e1b30a2354e8428e004689671b83871edde", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d4c798ed8d51506800b441f7a13ecb0f76f12218", + "reference": "d4c798ed8d51506800b441f7a13ecb0f76f12218", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.10.2", + "nikic/php-parser": "^4.12.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -3740,7 +3741,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.6" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.7" }, "funding": [ { @@ -3748,7 +3749,7 @@ "type": "github" } ], - "time": "2021-03-28T07:26:59+00:00" + "time": "2021-09-17T05:39:03+00:00" }, { "name": "phpunit/php-file-iterator", @@ -4995,7 +4996,6 @@ "type": "github" } ], - "abandoned": true, "time": "2020-09-28T06:45:17+00:00" }, { @@ -5995,16 +5995,16 @@ }, { "name": "twig/twig", - "version": "v2.14.6", + "version": "v2.14.7", "source": { "type": "git", "url": "https://github.com/twigphp/Twig.git", - "reference": "27e5cf2b05e3744accf39d4c68a3235d9966d260" + "reference": "8e202327ee1ed863629de9b18a5ec70ac614d88f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/twigphp/Twig/zipball/27e5cf2b05e3744accf39d4c68a3235d9966d260", - "reference": "27e5cf2b05e3744accf39d4c68a3235d9966d260", + "url": "https://api.github.com/repos/twigphp/Twig/zipball/8e202327ee1ed863629de9b18a5ec70ac614d88f", + "reference": "8e202327ee1ed863629de9b18a5ec70ac614d88f", "shasum": "" }, "require": { @@ -6014,7 +6014,7 @@ }, "require-dev": { "psr/container": "^1.0", - "symfony/phpunit-bridge": "^4.4.9|^5.0.9" + "symfony/phpunit-bridge": "^4.4.9|^5.0.9|^6.0" }, "type": "library", "extra": { @@ -6058,7 +6058,7 @@ ], "support": { "issues": "https://github.com/twigphp/Twig/issues", - "source": "https://github.com/twigphp/Twig/tree/v2.14.6" + "source": "https://github.com/twigphp/Twig/tree/v2.14.7" }, "funding": [ { @@ -6070,7 +6070,7 @@ "type": "tidelift" } ], - "time": "2021-05-16T12:12:47+00:00" + "time": "2021-09-17T08:39:54+00:00" }, { "name": "vimeo/psalm", diff --git a/docs/sdks/flutter/CHANGELOG.md b/docs/sdks/flutter/CHANGELOG.md index 4a74ebf1c4..b4ab9c16f7 100644 --- a/docs/sdks/flutter/CHANGELOG.md +++ b/docs/sdks/flutter/CHANGELOG.md @@ -1,3 +1,9 @@ +## 1.0.4 +- Fix user agent by using `packageName` instead of `appName` + +## 1.0.3 +- Upgrade `flutter_web_auth` to `0.3.1` + ## 1.0.2 - Fix timestamp in Realtime Response to Integer From 8d21e12d5702c55930fb527e3f7755b33eecae3e Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 23 Sep 2021 11:38:31 +0200 Subject: [PATCH 016/257] feat(sdks): flutter 2.0.0 --- app/config/platforms.php | 2 +- composer.json | 2 +- composer.lock | 14 +++++++------- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/config/platforms.php b/app/config/platforms.php index ad4b317fff..9280adf99a 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -62,7 +62,7 @@ return [ [ 'key' => 'flutter', 'name' => 'Flutter', - 'version' => '1.0.4', + 'version' => '2.0.0', 'url' => 'https://github.com/appwrite/sdk-for-flutter', 'package' => 'https://pub.dev/packages/appwrite', 'enabled' => true, diff --git a/composer.json b/composer.json index b5247333c8..5a9ab074cf 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "slickdeals/statsd": "3.1.0" }, "require-dev": { - "appwrite/sdk-generator": "0.14.6", + "appwrite/sdk-generator": "0.15.0", "phpunit/phpunit": "9.5.6", "swoole/ide-helper": "4.6.7", "textalk/websocket": "1.5.2", diff --git a/composer.lock b/composer.lock index 60081b2951..198ba6f7e9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2b6385366b1d4ed47d262088a6829e16", + "content-hash": "abc32e1f019a50a75b9f902b19643618", "packages": [ { "name": "adhocore/jwt", @@ -2516,16 +2516,16 @@ }, { "name": "appwrite/sdk-generator", - "version": "0.14.6", + "version": "0.15.0", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "1e7b9adc1b4489d7b09cd1976e331a9cab19eb53" + "reference": "48c2b85bf4790474b6814271b9da2abeba38e471" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/1e7b9adc1b4489d7b09cd1976e331a9cab19eb53", - "reference": "1e7b9adc1b4489d7b09cd1976e331a9cab19eb53", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/48c2b85bf4790474b6814271b9da2abeba38e471", + "reference": "48c2b85bf4790474b6814271b9da2abeba38e471", "shasum": "" }, "require": { @@ -2559,9 +2559,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.14.6" + "source": "https://github.com/appwrite/sdk-generator/tree/0.15.0" }, - "time": "2021-09-22T11:07:20+00:00" + "time": "2021-09-23T09:14:18+00:00" }, { "name": "composer/package-versions-deprecated", From 9af67bef6eb560c4595dea23f93e9a86274bd6b7 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 23 Sep 2021 11:40:32 +0200 Subject: [PATCH 017/257] chore(deps): compoer lock update --- composer.json | 2 +- composer.lock | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index f5c9af5768..5a9ab074cf 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "slickdeals/statsd": "3.1.0" }, "require-dev": { - "appwrite/sdk-generator": "0.14.5", + "appwrite/sdk-generator": "0.15.0", "phpunit/phpunit": "9.5.6", "swoole/ide-helper": "4.6.7", "textalk/websocket": "1.5.2", diff --git a/composer.lock b/composer.lock index 418b7120e5..198ba6f7e9 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3acb593da6b69af88e3b527b81929ed4", + "content-hash": "abc32e1f019a50a75b9f902b19643618", "packages": [ { "name": "adhocore/jwt", @@ -2516,16 +2516,16 @@ }, { "name": "appwrite/sdk-generator", - "version": "0.14.5", + "version": "0.15.0", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "6dfed83fb3aa85304ba86aeb2f1f282b9d8f80e5" + "reference": "48c2b85bf4790474b6814271b9da2abeba38e471" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/6dfed83fb3aa85304ba86aeb2f1f282b9d8f80e5", - "reference": "6dfed83fb3aa85304ba86aeb2f1f282b9d8f80e5", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/48c2b85bf4790474b6814271b9da2abeba38e471", + "reference": "48c2b85bf4790474b6814271b9da2abeba38e471", "shasum": "" }, "require": { @@ -2559,9 +2559,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.14.5" + "source": "https://github.com/appwrite/sdk-generator/tree/0.15.0" }, - "time": "2021-09-20T16:32:51+00:00" + "time": "2021-09-23T09:14:18+00:00" }, { "name": "composer/package-versions-deprecated", From fd601520fe340d03dc221b4a00a2e8a7f6799afe Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Thu, 23 Sep 2021 14:41:56 +0200 Subject: [PATCH 018/257] chore(sdks): add flutter changelog --- docs/sdks/flutter/CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/sdks/flutter/CHANGELOG.md b/docs/sdks/flutter/CHANGELOG.md index b4ab9c16f7..47f86d6e6e 100644 --- a/docs/sdks/flutter/CHANGELOG.md +++ b/docs/sdks/flutter/CHANGELOG.md @@ -1,3 +1,6 @@ +## 2.0.0 +- BREAKING All services and methods now return proper response objects instead of `Response` object + ## 1.0.4 - Fix user agent by using `packageName` instead of `appName` From 08fa3ecee7dfd0673d5cd3811d603e02db4214df Mon Sep 17 00:00:00 2001 From: Damodar Lohani Date: Fri, 24 Sep 2021 11:54:03 +0545 Subject: [PATCH 019/257] remove beta from Flutter and dart SDKs --- app/config/platforms.php | 4 ++-- app/views/console/home/index.phtml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/config/platforms.php b/app/config/platforms.php index b593184317..22b9761932 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -66,7 +66,7 @@ return [ 'url' => 'https://github.com/appwrite/sdk-for-flutter', 'package' => 'https://pub.dev/packages/appwrite', 'enabled' => true, - 'beta' => true, + 'beta' => false, 'dev' => false, 'hidden' => false, 'family' => APP_PLATFORM_CLIENT, @@ -323,7 +323,7 @@ return [ 'url' => 'https://github.com/appwrite/sdk-for-dart', 'package' => 'https://pub.dev/packages/dart_appwrite', 'enabled' => true, - 'beta' => true, + 'beta' => false, 'dev' => false, 'hidden' => false, 'family' => APP_PLATFORM_SERVER, diff --git a/app/views/console/home/index.phtml b/app/views/console/home/index.phtml index 3e86573c3a..4b2b56f243 100644 --- a/app/views/console/home/index.phtml +++ b/app/views/console/home/index.phtml @@ -237,7 +237,7 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true);

  • - +
  • From f736ce655daa64a16c6cb2f0b51521de4e7dfe67 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Fri, 24 Sep 2021 09:47:11 +0200 Subject: [PATCH 020/257] feat(sdks): update flutter 2.0.1 --- app/config/platforms.php | 2 +- composer.json | 2 +- composer.lock | 26 +++++++++++++------------- docs/sdks/flutter/CHANGELOG.md | 4 ++++ 4 files changed, 19 insertions(+), 15 deletions(-) diff --git a/app/config/platforms.php b/app/config/platforms.php index 94210c06b6..b5ef0b06c7 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -62,7 +62,7 @@ return [ [ 'key' => 'flutter', 'name' => 'Flutter', - 'version' => '2.0.0', + 'version' => '2.0.1', 'url' => 'https://github.com/appwrite/sdk-for-flutter', 'package' => 'https://pub.dev/packages/appwrite', 'enabled' => true, diff --git a/composer.json b/composer.json index 5a9ab074cf..223cf0147c 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "slickdeals/statsd": "3.1.0" }, "require-dev": { - "appwrite/sdk-generator": "0.15.0", + "appwrite/sdk-generator": "0.15.1", "phpunit/phpunit": "9.5.6", "swoole/ide-helper": "4.6.7", "textalk/websocket": "1.5.2", diff --git a/composer.lock b/composer.lock index 198ba6f7e9..0efed01a82 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "abc32e1f019a50a75b9f902b19643618", + "content-hash": "445af41f3f6195c547c0a5ad7b3220ac", "packages": [ { "name": "adhocore/jwt", @@ -2350,16 +2350,16 @@ "packages-dev": [ { "name": "amphp/amp", - "version": "v2.6.0", + "version": "v2.6.1", "source": { "type": "git", "url": "https://github.com/amphp/amp.git", - "reference": "caa95edeb1ca1bf7532e9118ede4a3c3126408cc" + "reference": "c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/amphp/amp/zipball/caa95edeb1ca1bf7532e9118ede4a3c3126408cc", - "reference": "caa95edeb1ca1bf7532e9118ede4a3c3126408cc", + "url": "https://api.github.com/repos/amphp/amp/zipball/c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae", + "reference": "c5fc66a78ee38d7ac9195a37bacaf940eb3f65ae", "shasum": "" }, "require": { @@ -2427,7 +2427,7 @@ "support": { "irc": "irc://irc.freenode.org/amphp", "issues": "https://github.com/amphp/amp/issues", - "source": "https://github.com/amphp/amp/tree/v2.6.0" + "source": "https://github.com/amphp/amp/tree/v2.6.1" }, "funding": [ { @@ -2435,7 +2435,7 @@ "type": "github" } ], - "time": "2021-07-16T20:06:06+00:00" + "time": "2021-09-23T18:43:08+00:00" }, { "name": "amphp/byte-stream", @@ -2516,16 +2516,16 @@ }, { "name": "appwrite/sdk-generator", - "version": "0.15.0", + "version": "0.15.1", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "48c2b85bf4790474b6814271b9da2abeba38e471" + "reference": "024dcb29e892fb22aede6d8040d20b1571e7105e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/48c2b85bf4790474b6814271b9da2abeba38e471", - "reference": "48c2b85bf4790474b6814271b9da2abeba38e471", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/024dcb29e892fb22aede6d8040d20b1571e7105e", + "reference": "024dcb29e892fb22aede6d8040d20b1571e7105e", "shasum": "" }, "require": { @@ -2559,9 +2559,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.15.0" + "source": "https://github.com/appwrite/sdk-generator/tree/0.15.1" }, - "time": "2021-09-23T09:14:18+00:00" + "time": "2021-09-24T07:42:53+00:00" }, { "name": "composer/package-versions-deprecated", diff --git a/docs/sdks/flutter/CHANGELOG.md b/docs/sdks/flutter/CHANGELOG.md index 47f86d6e6e..ccdd0eabd0 100644 --- a/docs/sdks/flutter/CHANGELOG.md +++ b/docs/sdks/flutter/CHANGELOG.md @@ -1,3 +1,7 @@ +## 2.0.1 +- Fix realtime close and reconnect working only 1 out of two times due to future returning too early +- Add dart doc comments to newly added response models + ## 2.0.0 - BREAKING All services and methods now return proper response objects instead of `Response` object From 59521d53dafbc1dd3ff64f9002a328f9f8b7c307 Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Sat, 25 Sep 2021 16:48:46 +0300 Subject: [PATCH 021/257] Fixed sum description --- src/Appwrite/Utopia/Response/Model/BaseList.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Appwrite/Utopia/Response/Model/BaseList.php b/src/Appwrite/Utopia/Response/Model/BaseList.php index 785fa5c7ed..a16cb95df5 100644 --- a/src/Appwrite/Utopia/Response/Model/BaseList.php +++ b/src/Appwrite/Utopia/Response/Model/BaseList.php @@ -34,7 +34,7 @@ class BaseList extends Model if ($paging) { $this->addRule('sum', [ 'type' => self::TYPE_INTEGER, - 'description' => 'Total sum of items in the list.', + 'description' => 'Total number of items available on the server.', 'default' => 0, 'example' => 5, ]); From 74ccfab77d050433897362567dab8bf1c41c4216 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Sun, 26 Sep 2021 12:41:32 +0200 Subject: [PATCH 022/257] feat(sdks): release web --- app/config/platforms.php | 2 +- composer.json | 2 +- composer.lock | 14 +++++++------- public/dist/scripts/app-all.js | 3 +-- public/dist/scripts/app-dep.js | 3 +-- public/scripts/dependencies/appwrite.js | 7 ++++--- 6 files changed, 15 insertions(+), 16 deletions(-) diff --git a/app/config/platforms.php b/app/config/platforms.php index b5ef0b06c7..d370bf9df3 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -15,7 +15,7 @@ return [ [ 'key' => 'web', 'name' => 'Web', - 'version' => '4.0.2', + 'version' => '4.0.3', 'url' => 'https://github.com/appwrite/sdk-for-web', 'package' => 'https://www.npmjs.com/package/appwrite', 'enabled' => true, diff --git a/composer.json b/composer.json index 223cf0147c..8a7b1570f5 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "slickdeals/statsd": "3.1.0" }, "require-dev": { - "appwrite/sdk-generator": "0.15.1", + "appwrite/sdk-generator": "0.15.2", "phpunit/phpunit": "9.5.6", "swoole/ide-helper": "4.6.7", "textalk/websocket": "1.5.2", diff --git a/composer.lock b/composer.lock index 0efed01a82..9d2ef6169b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "445af41f3f6195c547c0a5ad7b3220ac", + "content-hash": "984640c83bc02c3253a0f38b5f772011", "packages": [ { "name": "adhocore/jwt", @@ -2516,16 +2516,16 @@ }, { "name": "appwrite/sdk-generator", - "version": "0.15.1", + "version": "0.15.2", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "024dcb29e892fb22aede6d8040d20b1571e7105e" + "reference": "f42e70737d3b63fb8440111022c9509529a16479" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/024dcb29e892fb22aede6d8040d20b1571e7105e", - "reference": "024dcb29e892fb22aede6d8040d20b1571e7105e", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/f42e70737d3b63fb8440111022c9509529a16479", + "reference": "f42e70737d3b63fb8440111022c9509529a16479", "shasum": "" }, "require": { @@ -2559,9 +2559,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.15.1" + "source": "https://github.com/appwrite/sdk-generator/tree/0.15.2" }, - "time": "2021-09-24T07:42:53+00:00" + "time": "2021-09-24T16:14:17+00:00" }, { "name": "composer/package-versions-deprecated", diff --git a/public/dist/scripts/app-all.js b/public/dist/scripts/app-all.js index 4a4daa72fa..bacf1159a9 100644 --- a/public/dist/scripts/app-all.js +++ b/public/dist/scripts/app-all.js @@ -473,8 +473,7 @@ subscribe(channels,callback){let channelArray=typeof channels==='string'?[channe savedChannels[index]={name:channel,index:(this.realtime.channels[channel].push(this.realtime.onMessage(channel,callback))-1)};clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},1);});return()=>{savedChannels.forEach(channel=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.removeEventListener('message',this.realtime.channels[channel.name][channel.index]);this.realtime.channels[channel.name].splice(channel.index,1);});};} call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:"";} if(method==='GET'){for(const[key,value]of Object.entries(this.flatten(params))){url.searchParams.append(key,value);}} -else{switch(headers['content-type']){case'application/json':options.body=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(const key in params){if(Array.isArray(params[key])){formData.append(key+'[]',params[key].join(','));} -else{formData.append(key,params[key]);}} +else{switch(headers['content-type']){case'application/json':options.body=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(const key in params){if(Array.isArray(params[key])){params[key].forEach((value)=>{formData.append(key+'[]',value);})}else{formData.append(key,params[key]);}} options.body=formData;delete headers['content-type'];break;}} try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get("content-type"))===null||_b===void 0?void 0:_b.includes("application/json")){data=yield response.json();} else{data={message:yield response.text()};} diff --git a/public/dist/scripts/app-dep.js b/public/dist/scripts/app-dep.js index 7a5622742b..2f2bc8e0ad 100644 --- a/public/dist/scripts/app-dep.js +++ b/public/dist/scripts/app-dep.js @@ -473,8 +473,7 @@ subscribe(channels,callback){let channelArray=typeof channels==='string'?[channe savedChannels[index]={name:channel,index:(this.realtime.channels[channel].push(this.realtime.onMessage(channel,callback))-1)};clearTimeout(this.realtime.timeout);this.realtime.timeout=window===null||window===void 0?void 0:window.setTimeout(()=>{this.realtime.createSocket();},1);});return()=>{savedChannels.forEach(channel=>{var _a;(_a=this.realtime.socket)===null||_a===void 0?void 0:_a.removeEventListener('message',this.realtime.channels[channel.name][channel.index]);this.realtime.channels[channel.name].splice(channel.index,1);});};} call(method,url,headers={},params={}){var _a,_b;return __awaiter(this,void 0,void 0,function*(){method=method.toUpperCase();headers=Object.assign(Object.assign({},headers),this.headers);let options={method,headers,credentials:'include'};if(typeof window!=='undefined'&&window.localStorage){headers['X-Fallback-Cookies']=(_a=window.localStorage.getItem('cookieFallback'))!==null&&_a!==void 0?_a:"";} if(method==='GET'){for(const[key,value]of Object.entries(this.flatten(params))){url.searchParams.append(key,value);}} -else{switch(headers['content-type']){case'application/json':options.body=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(const key in params){if(Array.isArray(params[key])){formData.append(key+'[]',params[key].join(','));} -else{formData.append(key,params[key]);}} +else{switch(headers['content-type']){case'application/json':options.body=JSON.stringify(params);break;case'multipart/form-data':let formData=new FormData();for(const key in params){if(Array.isArray(params[key])){params[key].forEach((value)=>{formData.append(key+'[]',value);})}else{formData.append(key,params[key]);}} options.body=formData;delete headers['content-type'];break;}} try{let data=null;const response=yield crossFetch.fetch(url.toString(),options);if((_b=response.headers.get("content-type"))===null||_b===void 0?void 0:_b.includes("application/json")){data=yield response.json();} else{data={message:yield response.text()};} diff --git a/public/scripts/dependencies/appwrite.js b/public/scripts/dependencies/appwrite.js index 8fc1fb6790..3ac3e1b67a 100644 --- a/public/scripts/dependencies/appwrite.js +++ b/public/scripts/dependencies/appwrite.js @@ -4420,9 +4420,10 @@ let formData = new FormData(); for (const key in params) { if (Array.isArray(params[key])) { - formData.append(key + '[]', params[key].join(',')); - } - else { + params[key].forEach((value) => { + formData.append(key + '[]', value); + }) + } else { formData.append(key, params[key]); } } From 010202145e83684e68026aa1ac01e1a3fae4a86e Mon Sep 17 00:00:00 2001 From: Eldad Fux Date: Mon, 27 Sep 2021 11:30:31 +0300 Subject: [PATCH 023/257] og image fix --- app/views/layouts/default.phtml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/views/layouts/default.phtml b/app/views/layouts/default.phtml index aa4dfc3f5d..2818e4d923 100644 --- a/app/views/layouts/default.phtml +++ b/app/views/layouts/default.phtml @@ -10,6 +10,7 @@ $litespeed = $this->getParam('litespeed', true); $analytics = $this->getParam('analytics', 'UA-26264668-9'); $mode = $this->getParam('mode', ''); $canonical = $this->getParam('canonical', ''); +$image = $this->getParam('image', '/images/logo.png'); $locale = $this->getParam('locale', null); $runtimes = $this->getParam('runtimes', null); @@ -57,7 +58,7 @@ if(!empty($platforms)) { - + + + + + + + diff --git a/public/images/clients/tvos.png b/public/images/clients/tvos.png new file mode 100644 index 0000000000000000000000000000000000000000..cd8694ccfebf936b6d810c3b0e9df4e5f6fe7066 GIT binary patch literal 44737 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 ZuQbP=h^Ue){R8+pf6nP_)oI_m{{t({8sPu{ literal 0 HcmV?d00001 diff --git a/public/images/clients/watchos.png b/public/images/clients/watchos.png new file mode 100644 index 0000000000000000000000000000000000000000..a4310cbbe6d7511ec11ee88979cd695bd36ba577 GIT binary patch literal 59054 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 H&4>R1L^2`h literal 0 HcmV?d00001 From 222fbc7f5848cf3988573cb2ef2ecf3592a782b3 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Sat, 2 Oct 2021 00:10:49 +1300 Subject: [PATCH 040/257] Add swift getting started --- docs/sdks/swift/GETTING_STARTED.md | 96 ++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 docs/sdks/swift/GETTING_STARTED.md diff --git a/docs/sdks/swift/GETTING_STARTED.md b/docs/sdks/swift/GETTING_STARTED.md new file mode 100644 index 0000000000..4063657c7c --- /dev/null +++ b/docs/sdks/swift/GETTING_STARTED.md @@ -0,0 +1,96 @@ +## Getting Started + +### Init your SDK + +Initialize your SDK with your Appwrite server API endpoint and project ID which can be found in your project settings page and your new API secret Key project API keys section. + +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint(endPoint: "https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject(value: "5df5acd0d48c2") // Your project ID + .setKey(value: "919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + .setSelfSigned() // Use only on dev mode with a self-signed SSL cert +} +``` + +### Make Your First Request + +Once your SDK object is set, create any of the Appwrite service objects and choose any request to send. Full documentation for any service method you would like to use can be found in your SDK documentation or in the [API References](https://appwrite.io/docs) section. + +```swift +let users = Users(client: client) +users.create( + email: "email@example.com", + password: "password", +) { result in + switch result { + case .failure(let error): + print(error.localizedDescription) + case .success(var response): + let json = response.body!.readString(length: response.body!.readableBytes) + } +} +``` + +### Full Example + +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint(endPoint: "https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject(value: "5df5acd0d48c2") // Your project ID + .setKey(value: "919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + .setSelfSigned() // Use only on dev mode with a self-signed SSL cert + + let users = Users(client: client) + users.create( + email: "email@example.com", + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.localizedDescription) + case .success(var response): + let json = response.body!.readString(length: response.body!.readableBytes) + } + } +} +``` + +### Error Handling + +When an error occurs, the Appwrite Swift SDK responds with a result wrapping an `AppwriteError` object with `message` and `code` properties. You can handle any errors in the result's `.failure` case and present the `message` to the user or handle it yourself based on the provided error information. Below is an example. + +```swift +import Appwrite + +func main() { + let users = Users(client: client) + + users.create( + email: "email@example.com", + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(var response): + ... + } + } +} +``` + +### Learn more + +You can use the following resources to learn more and get help + +- 🚀 [Getting Started Tutorial](https://appwrite.io/docs/getting-started-for-server) +- 📜 [Appwrite Docs](https://appwrite.io/docs) +- 💬 [Discord Community](https://appwrite.io/discord) +- 🚂 [Appwrite Swift Playground](https://github.com/appwrite/playground-for-swift) From 337e0c3dac7bd20061d3b1df3ba6e70e1a6c1dac Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Sat, 2 Oct 2021 00:11:34 +1300 Subject: [PATCH 041/257] Update tvOS placeholder --- app/views/console/home/index.phtml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/console/home/index.phtml b/app/views/console/home/index.phtml index 494510cc3f..d9e047293c 100644 --- a/app/views/console/home/index.phtml +++ b/app/views/console/home/index.phtml @@ -506,7 +506,7 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true); - + From 40ee40a398c0c77de2abb1a224e30f0ec4a5d2fe Mon Sep 17 00:00:00 2001 From: "Eldad A. Fux" Date: Fri, 1 Oct 2021 14:13:20 +0300 Subject: [PATCH 042/257] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b3a0714789..ab4670f19a 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@

    -[![Hacktoberfest](https://badgen.net/badge/hacktoberfest/friendly/pink)](https://hacktoberfest.appwrite.io) +[![Hacktoberfest](https://img.shields.io/static/v1?label=hacktoberfest&message=friendly&color=90a88b&style=flat-square)](https://hacktoberfest.appwrite.io) [![Discord](https://img.shields.io/discord/564160730845151244?label=discord&style=flat-square)](https://appwrite.io/discord) [![Docker Pulls](https://img.shields.io/docker/pulls/appwrite/appwrite?color=f02e65&style=flat-square)](https://hub.docker.com/r/appwrite/appwrite) [![Build Status](https://img.shields.io/travis/com/appwrite/appwrite?style=flat-square)](https://travis-ci.com/appwrite/appwrite) From 158895a26f2b5d21d1e3bdcf8be666f727c216e2 Mon Sep 17 00:00:00 2001 From: Sang Song Date: Fri, 1 Oct 2021 00:25:52 +0100 Subject: [PATCH 043/257] chore: update the korean translation --- app/config/locale/translations/ko.json | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/ko.json b/app/config/locale/translations/ko.json index 0e564e55e8..7478b45fbe 100644 --- a/app/config/locale/translations/ko.json +++ b/app/config/locale/translations/ko.json @@ -3,30 +3,30 @@ "settings.locale": "ko", "settings.direction": "ltr", "emails.sender": "%s 팀", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "계정 인증", + "emails.verification.hello": "안녕하세요 {{name}}님", + "emails.verification.body": "이메일 인증을 위해 링크를 클릭하여주세요.", + "emails.verification.footer": "이메일 인증을 부탁하지 않으셨다면 이 메시지를 무시하여주세요.", + "emails.verification.thanks": "감사합니다", + "emails.verification.signature": "{{project}} 팀", + "emails.magicSession.subject": "로그인", + "emails.magicSession.hello": "안녕하세요,", + "emails.magicSession.body": "로그인 하시려면 링크를 클릭하여주세요.", + "emails.magicSession.footer": "이 이메일 계정으로 로그인 신청을 하지 않으셨다면 이 메세지를 무시하여주세요.", + "emails.magicSession.thanks": "감사합니다", + "emails.magicSession.signature": "{{project}} 팀", + "emails.recovery.subject": "비밀번호 재설정", + "emails.recovery.hello": "안녕하세요 {{name}}님", + "emails.recovery.body": "{{project}}의 비밀번호 재설정을 위해 링크를 클릭하여주세요.", + "emails.recovery.footer": "비밀번호 재설정 신청을 하지 않으셨다면 이 메세지를 무시하여주세요.", + "emails.recovery.thanks": "감사합니다", + "emails.recovery.signature": "{{project}} 팀", + "emails.invitation.subject": "초대장 %s 팀 - %s", + "emails.invitation.hello": "안녕하세요", + "emails.invitation.body": "{{owner}}님이 귀하를 {{project}}의 {{team}} 팀으로 초대합니다.", + "emails.invitation.footer": "팀에 합류할 의사가 없으시면 이 메세지를 무시하여주세요.", + "emails.invitation.thanks": "감사합니다", + "emails.invitation.signature": "{{project}} 팀", "locale.country.unknown": "알려지지 않은", "countries.af": "아프가니스탄", "countries.ao": "앙골라", @@ -63,7 +63,7 @@ "countries.cn": "중국", "countries.ci": "코트디부아르", "countries.cm": "카메룬", - "countries.cd": "콩고공화국의 행정", + "countries.cd": "콩고 민주 공화국", "countries.cg": "콩고 공화국", "countries.co": "콜롬비아", "countries.km": "코모로", From 1e8d5f1c5f30c8b6582670c3c54546f641c2e978 Mon Sep 17 00:00:00 2001 From: Jaswanth Remiel <66111735+JaswanthRemiel@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:07:20 +0530 Subject: [PATCH 044/257] Update README.md Regards, I have added A Link Of DEV Community Of Appwrite In the #Followus Section Of README.md Hope It Helps:) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ab4670f19a..837e305f10 100644 --- a/README.md +++ b/README.md @@ -148,7 +148,7 @@ For security issues, kindly email us at [security@appwrite.io](mailto:security@a ## Follow Us -Join our growing community around the world! See our official [Blog](https://medium.com/appwrite-io). Follow us on [Twitter](https://twitter.com/appwrite_io), [Facebook Page](https://www.facebook.com/appwrite.io), [Facebook Group](https://www.facebook.com/groups/appwrite.developers/) or join our live [Discord server](https://discord.gg/GSeTUeA) for more help, ideas, and discussions. +Join our growing community around the world! See our official [Blog](https://medium.com/appwrite-io). Follow us on [Twitter](https://twitter.com/appwrite_io), [Facebook Page](https://www.facebook.com/appwrite.io), [Facebook Group](https://www.facebook.com/groups/appwrite.developers/) , [Dev Community](https://dev.to/appwrite) or join our live [Discord server](https://discord.gg/GSeTUeA) for more help, ideas, and discussions. ## License From ad8c1c1534f3a0edcf7b4c72885d12b000955318 Mon Sep 17 00:00:00 2001 From: Herdi Tr Date: Fri, 1 Oct 2021 19:31:44 +0700 Subject: [PATCH 045/257] feat: indonesian translation --- app/config/locale/translations/id.json | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/id.json b/app/config/locale/translations/id.json index b84edadbc8..06429e9583 100644 --- a/app/config/locale/translations/id.json +++ b/app/config/locale/translations/id.json @@ -3,30 +3,30 @@ "settings.locale": "id", "settings.direction": "ltr", "emails.sender": "Tim %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Verifikasi Akun", + "emails.verification.hello": "Hai {{name}}", + "emails.verification.body": "Ikuti tautan ini untuk memverifikasi alamat email Anda.", + "emails.verification.footer": "Jika Anda tidak meminta untuk memverifikasi alamat email ini, Anda dapat mengabaikan pesan ini.", + "emails.verification.thanks": "Terima kasih", + "emails.verification.signature": "Tim {{project}}", + "emails.magicSession.subject": "Masuk", + "emails.magicSession.hello": "Hai,", + "emails.magicSession.body": "Ikuti tautan ini untuk masuk.", + "emails.magicSession.footer": "Jika Anda tidak meminta untuk masuk menggunakan email ini, Anda dapat mengabaikan pesan ini.", + "emails.magicSession.thanks": "Terima kasih", + "emails.magicSession.signature": "Tim {{project}}", + "emails.recovery.subject": "Atur Ulang Kata Sandi", + "emails.recovery.hello": "Halo {{name}}", + "emails.recovery.body": "Ikuti tautan ini untuk menyetel ulang kata sandi {{project}} Anda.", + "emails.recovery.footer": "Jika Anda tidak meminta untuk menyetel ulang kata sandi, Anda dapat mengabaikan pesan ini.", + "emails.recovery.thanks": "Terima kasih", + "emails.recovery.signature": "Tim {{project}}", + "emails.invitation.subject": "Undangan ke Tim %s di %s", + "emails.invitation.hello": "Halo", + "emails.invitation.body": "Email ini dikirimkan kepada Anda karena {{owner}} ingin mengundang Anda untuk menjadi anggota tim {{team}} di {{project}}.", + "emails.invitation.footer": "Jika Anda tidak tertarik, Anda dapat mengabaikan pesan ini.", + "emails.invitation.thanks": "Terima kasih", + "emails.invitation.signature": "Tim {{project}}", "locale.country.unknown": "Tidak diketahui", "countries.af": "Afganistan", "countries.ao": "Angola", From 37ed62be9dbe3e6c910ec7a585531fe5493c0d1c Mon Sep 17 00:00:00 2001 From: Renato Ramos Nascimento Date: Fri, 1 Oct 2021 09:35:55 -0300 Subject: [PATCH 046/257] added pt-br translations --- app/config/locale/translations/pt-br.json | 48 +++++++++++------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/pt-br.json b/app/config/locale/translations/pt-br.json index ce3e9f103d..9640df66c7 100644 --- a/app/config/locale/translations/pt-br.json +++ b/app/config/locale/translations/pt-br.json @@ -3,30 +3,30 @@ "settings.locale": "pt-br", "settings.direction": "ltr", "emails.sender": "Time %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Verificação da Conta", + "emails.verification.hello": "Olá {{name}}", + "emails.verification.body": "Clique neste link para verificar o seu endereço de e-mail.", + "emails.verification.footer": "Se não você que solicitou essa verificação deste e-mail, você pode ignorar essa mensagem", + "emails.verification.thanks": "Muito obrigado", + "emails.verification.signature": "Time {{project}}", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Olá,", + "emails.magicSession.body": "Clique neste link para entrar", + "emails.magicSession.footer": "Se não você que solicitou essa verificação deste e-mail, você pode ignorar essa mensagem", + "emails.magicSession.thanks": "Muito obrigado", + "emails.magicSession.signature": "Time {{project}}", + "emails.recovery.subject": "Redefinação de senha", + "emails.recovery.hello": "Olá {{name}}", + "emails.recovery.body": "Clique neste link para redefinir sua senha do {{project}}.", + "emails.recovery.footer": "Se você não solicitou a redefinição da sua senha, você pode ignorar essa mensagem", + "emails.recovery.thanks": "Muito obrigado", + "emails.recovery.signature": "Time {{project}}", + "emails.invitation.subject": "Convite para o Time %s em %s", + "emails.invitation.hello": "Olá", + "emails.invitation.body": "Este email foi enviado porque o {{owner}} deseja convidar você a se tornar membro do Time {{team}} em {{project}}.", + "emails.invitation.footer": "Se você não está interessado, você pode ignorar essa mensagem", + "emails.invitation.thanks": "Muito obrigado", + "emails.invitation.signature": "Time {{project}}", "locale.country.unknown": "Desconhecido", "countries.af": "Afeganistão", "countries.ao": "Angola", From e1235299f52123a01cb50f3d185836c6fcec4bf4 Mon Sep 17 00:00:00 2001 From: Dehami Koswatte Date: Fri, 1 Oct 2021 18:41:18 +0530 Subject: [PATCH 047/257] Fix parameter order at create-team-membership method --- app/controllers/api/teams.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index f7f7e2cb7e..645d08f57b 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -262,9 +262,9 @@ App::post('/v1/teams/:teamId/memberships') ->label('abuse-limit', 10) ->param('teamId', '', new UID(), 'Team unique ID.') ->param('email', '', new Email(), 'New team member email.') - ->param('name', '', new Text(128), 'New team member name. Max length: 128 chars.', true) ->param('roles', [], new ArrayList(new Key()), 'Array of strings. Use this param to set the user roles in the team. A role can be any string. Learn more about [roles and permissions](/docs/permissions). Max length for each role is 32 chars.') ->param('url', '', function ($clients) { return new Host($clients); }, 'URL to redirect the user back to your app from the invitation email. Only URLs from hostnames in your project platform list are allowed. This requirement helps to prevent an [open redirect](https://cheatsheetseries.owasp.org/cheatsheets/Unvalidated_Redirects_and_Forwards_Cheat_Sheet.html) attack against your project API.', false, ['clients']) // TODO add our own built-in confirm page + ->param('name', '', new Text(128), 'New team member name. Max length: 128 chars.', true) ->inject('response') ->inject('project') ->inject('user') From 09387cccd4126359fe0fef54d03f44d581e63706 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bo=C5=A1njak?= Date: Fri, 1 Oct 2021 15:49:31 +0200 Subject: [PATCH 048/257] Added locale translations for Croatian language --- app/config/locale/codes.php | 3 +- app/config/locale/translations/hr.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 app/config/locale/translations/hr.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index c8623f533c..cdfb30fc0e 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -19,7 +19,8 @@ return [ 'el', // Greek 'gu', //Gujrati 'he', // Hebrew - 'hi', // Hindi + 'hi', // Hindi, + 'hr', // Croatian 'hu', // Hungarian 'hy', // Armenian 'id', // Indonesian diff --git a/app/config/locale/translations/hr.json b/app/config/locale/translations/hr.json new file mode 100644 index 0000000000..2c218fc72c --- /dev/null +++ b/app/config/locale/translations/hr.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"Umjetnost mudrosti je umjetnost znanja o tome što zanemariti.\"", + "settings.locale": "hr", + "settings.direction": "ltr", + "emails.sender": "%s Tim", + "emails.verification.subject": "Verifikacija računa", + "emails.verification.hello": "Hej {{name}}", + "emails.verification.body": "Slijedite ovu poveznicu da biste potvrdili svoju adresu e-pošte.", + "emails.verification.footer": "Ukoliko niste zatražili potvrdu ove adrese, možete zanemariti ovu poruku.", + "emails.verification.thanks": "Hvala", + "emails.verification.signature": "{{project}} tim", + "emails.magicSession.subject": "Prijavi se", + "emails.magicSession.hello": "Hej,", + "emails.magicSession.body": "Slijedite ovu poveznicu za prijavu.", + "emails.magicSession.footer": "Ako niste zatražili prijavu putem ove e-pošte, možete zanemariti ovu poruku.", + "emails.magicSession.thanks": "Hvala", + "emails.magicSession.signature": "{{project}} tim", + "emails.recovery.subject": "Password Reset", + "emails.recovery.hello": "Pozdrav {{name}}", + "emails.recovery.body": "Slijedite ovu poveznicu za ponovno postavljanje {{project}} lozinke.", + "emails.recovery.footer": "Ako niste zatražili ponovno postavljanje Vaše lozinke, možete zanemariti ovu poruku.", + "emails.recovery.thanks": "Hvala", + "emails.recovery.signature": "{{project}} tim", + "emails.invitation.subject": "Pozivnica za %s tim na %s", + "emails.invitation.hello": "Pozdrav", + "emails.invitation.body": "Ova poruka Vam je poslana jer Vas je {{owner}} htio pozvati da postanete član {{team}} tima na {{project}}.", + "emails.invitation.footer": "Ukoliko niste zainteresirani, možete zanemariti ovu poruku.", + "emails.invitation.thanks": "Hvala", + "emails.invitation.signature": "{{project}} tim", + "locale.country.unknown": "Nepoznato", + "countries.af": "Afganistan", + "countries.ao": "Angola", + "countries.al": "Albanija", + "countries.ad": "Andora", + "countries.ae": "Ujedinjeni Arapski Emirati", + "countries.ar": "Argentina", + "countries.am": "Armenija", + "countries.ag": "Antigva i Barbuda", + "countries.au": "Australija", + "countries.at": "Austrija", + "countries.az": "Azerbajdžan", + "countries.bi": "Burundi", + "countries.be": "Belgija", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladeš", + "countries.bg": "Bugarska", + "countries.bh": "Bahrein", + "countries.bs": "Bahami", + "countries.ba": "Bosna i Hercegovina", + "countries.by": "Bjelorusija", + "countries.bz": "Belize", + "countries.bo": "Bolivija", + "countries.br": "Brazil", + "countries.bb": "Barbados", + "countries.bn": "Brunej", + "countries.bt": "Butan", + "countries.bw": "Bocvana", + "countries.cf": "Srednjoafrička Republika", + "countries.ca": "Kanada", + "countries.ch": "Švicarska", + "countries.cl": "Čile", + "countries.cn": "Kina", + "countries.ci": "Obala bjelokosti", + "countries.cm": "Kamerun", + "countries.cd": "Demokratska Republika Kongo", + "countries.cg": "Republika Kongo", + "countries.co": "Kolumbija", + "countries.km": "Komori", + "countries.cv": "Zelenortska Republika", + "countries.cr": "Kostarika", + "countries.cu": "Kuba", + "countries.cy": "Cipar", + "countries.cz": "Češka", + "countries.de": "Njemačka", + "countries.dj": "Džibuti", + "countries.dm": "Dominika", + "countries.dk": "Danska", + "countries.do": "Dominikanska Republika", + "countries.dz": "Alžir", + "countries.ec": "Ekvador", + "countries.eg": "Egipt", + "countries.er": "Eritreja", + "countries.es": "Španjolska", + "countries.ee": "Estonija", + "countries.et": "Etiopija", + "countries.fi": "Finska", + "countries.fj": "Fidži", + "countries.fr": "Francuska", + "countries.fm": "Mikronezija", + "countries.ga": "Gabon", + "countries.gb": "Ujedinjeno Kraljevstvo", + "countries.ge": "Gruzija", + "countries.gh": "Gana", + "countries.gn": "Gvineja", + "countries.gm": "Gambija", + "countries.gw": "Gvineja Bisau", + "countries.gq": "Ekvatorijalna Gvineja", + "countries.gr": "Grčka", + "countries.gd": "Grenada", + "countries.gt": "Gvatemala", + "countries.gy": "Gvajana", + "countries.hn": "Honduras", + "countries.hr": "Hrvatska", + "countries.ht": "Haiti", + "countries.hu": "Mađarska", + "countries.id": "Indonezija", + "countries.in": "Indija", + "countries.ie": "Irska", + "countries.ir": "Iran", + "countries.iq": "Irak", + "countries.is": "Island", + "countries.il": "Izrael", + "countries.it": "Italija", + "countries.jm": "Jamajka", + "countries.jo": "Jordan", + "countries.jp": "Japan", + "countries.kz": "Kazahstan", + "countries.ke": "Kenija", + "countries.kg": "Kirgistan", + "countries.kh": "Kambodža", + "countries.ki": "Kiribati", + "countries.kn": "Sveti Kristofor i Nevis", + "countries.kr": "Južna Koreja", + "countries.kw": "Kuvajt", + "countries.la": "Laos", + "countries.lb": "Libanon", + "countries.lr": "Liberija", + "countries.ly": "Libija", + "countries.lc": "Sveta Lucija", + "countries.li": "Lihtenštajn", + "countries.lk": "Šri Lanka", + "countries.ls": "Lesoto", + "countries.lt": "Litva", + "countries.lu": "Luksemburg", + "countries.lv": "Latvija", + "countries.ma": "Maroko", + "countries.mc": "Monako", + "countries.md": "Moldavija", + "countries.mg": "Madagaskar", + "countries.mv": "Maldivi", + "countries.mx": "Meksiko", + "countries.mh": "Maršalovi otoci", + "countries.mk": "Sjeverna Makedonija", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Mijanmar", + "countries.me": "Crna Gora", + "countries.mn": "Mongolija", + "countries.mz": "Mozambik", + "countries.mr": "Mauritanija", + "countries.mu": "Mauricijus", + "countries.mw": "Malavi", + "countries.my": "Malezija", + "countries.na": "Namibija", + "countries.ne": "Niger", + "countries.ng": "Nigerija", + "countries.ni": "Nikaragva", + "countries.nl": "Nizozemska", + "countries.no": "Norveška", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "Novi Zeland", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Filipini", + "countries.pw": "Palau", + "countries.pg": "Papua Nova Guineja", + "countries.pl": "Poljska", + "countries.kp": "Sjeverna Koreja", + "countries.pt": "Portugal", + "countries.py": "Paragvaj", + "countries.qa": "Katar", + "countries.ro": "Rumunjska", + "countries.ru": "Rusija", + "countries.rw": "Ruanda", + "countries.sa": "Saudijska Arabija", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapur", + "countries.sb": "Solomonski otoci", + "countries.sl": "Sijera Leone", + "countries.sv": "Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalija", + "countries.rs": "Srbija", + "countries.ss": "Južni Sudan", + "countries.st": "Sveti Toma i Prinsipe", + "countries.sr": "Surinam", + "countries.sk": "Slovačka", + "countries.si": "Slovenija", + "countries.se": "Švedska", + "countries.sz": "Esvatini", + "countries.sc": "Sejšeli", + "countries.sy": "Sirija", + "countries.td": "Čad", + "countries.tg": "Togo", + "countries.th": "Tajland", + "countries.tj": "Tadžikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Timor Leste", + "countries.to": "Tonga", + "countries.tt": "Trinidad i Tobago", + "countries.tn": "Tunis", + "countries.tr": "Turska", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzanija", + "countries.ug": "Uganda", + "countries.ua": "Ukrajina", + "countries.uy": "Urugvaj", + "countries.us": "Sjedinjene Američke Države", + "countries.uz": "Uzbekistan", + "countries.va": "Vatikan", + "countries.vc": "Sveti Vincent i Grenadini", + "countries.ve": "Venezuela", + "countries.vn": "Vijetnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Jemen", + "countries.za": "Južnoafrička Republika", + "countries.zm": "Zambija", + "countries.zw": "Zimbabve", + "continents.af": "Afrika", + "continents.an": "Antartika", + "continents.as": "Azija", + "continents.eu": "Europa", + "continents.na": "Sjeverna Amerika", + "continents.oc": "Oceanija", + "continents.sa": "Južna Amerika" +} \ No newline at end of file diff --git a/app/init.php b/app/init.php index 8c1d6cb455..83308e832e 100644 --- a/app/init.php +++ b/app/init.php @@ -280,6 +280,7 @@ Locale::setLanguageFromJSON('fr', __DIR__.'/config/locale/translations/fr.json') Locale::setLanguageFromJSON('gu', __DIR__.'/config/locale/translations/gu.json'); Locale::setLanguageFromJSON('he', __DIR__.'/config/locale/translations/he.json'); Locale::setLanguageFromJSON('hi', __DIR__.'/config/locale/translations/hi.json'); +Locale::setLanguageFromJSON('hr', __DIR__.'/config/locale/translations/hr.json'); Locale::setLanguageFromJSON('hu', __DIR__.'/config/locale/translations/hu.json'); Locale::setLanguageFromJSON('hy', __DIR__.'/config/locale/translations/hy.json'); Locale::setLanguageFromJSON('id', __DIR__.'/config/locale/translations/id.json'); From c4e0ef27c3b1528ed2d7355e2aff8ddaa6ee4fff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bo=C5=A1njak?= Date: Fri, 1 Oct 2021 15:52:02 +0200 Subject: [PATCH 049/257] Added missing translation for Croatian language --- app/config/locale/translations/hr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/hr.json b/app/config/locale/translations/hr.json index 2c218fc72c..d0b92aa945 100644 --- a/app/config/locale/translations/hr.json +++ b/app/config/locale/translations/hr.json @@ -15,7 +15,7 @@ "emails.magicSession.footer": "Ako niste zatražili prijavu putem ove e-pošte, možete zanemariti ovu poruku.", "emails.magicSession.thanks": "Hvala", "emails.magicSession.signature": "{{project}} tim", - "emails.recovery.subject": "Password Reset", + "emails.recovery.subject": "Ponovno postavljanje lozinke", "emails.recovery.hello": "Pozdrav {{name}}", "emails.recovery.body": "Slijedite ovu poveznicu za ponovno postavljanje {{project}} lozinke.", "emails.recovery.footer": "Ako niste zatražili ponovno postavljanje Vaše lozinke, možete zanemariti ovu poruku.", From a986e5b1511c3d7d4612fdd9f7439964216e2681 Mon Sep 17 00:00:00 2001 From: OscarRivasGonzalez Date: Fri, 1 Oct 2021 16:17:11 +0200 Subject: [PATCH 050/257] feat(locales):Add Portugal(pt-pt) translation --- app/config/locale/translations/pt-pt.json | 50 +++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/pt-pt.json b/app/config/locale/translations/pt-pt.json index db9bbde54b..ff16ab2202 100644 --- a/app/config/locale/translations/pt-pt.json +++ b/app/config/locale/translations/pt-pt.json @@ -3,30 +3,30 @@ "settings.locale": "pt-pt", "settings.direction": "ltr", "emails.sender": "Equipa %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Verificação de contas", + "emails.verification.hello": "Hey {{name}}", + "emails.verification.body": "Siga esta ligação para verificar o seu endereço de correio electrónico.", + "emails.verification.footer": "Se não pediu para verificar este endereço, pode ignorar esta mensagem.", + "emails.verification.thanks": "Obrigado", + "emails.verification.signature": "Equipa {{project}}", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Olá ,", + "emails.magicSession.body": "Siga esta ligação para iniciar sessão.", + "emails.magicSession.footer": "Se não pediu para entrar usando este e-mail, pode ignorar esta mensagem.", + "emails.magicSession.thanks": "Obrigado", + "emails.magicSession.signature": "Equipa {{project}}", + "emails.recovery.subject": "Redefinição de senha", + "emails.recovery.hello": u"Olá {{name}}", + "emails.recovery.body": "tilize este link para redefinir a palavra-passe do seu projecto {{project}}", + "emails.recovery.footer": "Se não pediu para redefinir a sua palavra-passe, pode ignorar esta mensagem.", + "emails.recovery.thanks": "Obrigado", + "emails.recovery.signature": "Equipa {{project}}", + "emails.invitation.subject": "Convite à equipa de %s às %s", + "emails.invitation.hello": "Olá", + "emails.invitation.body": "Este correio foi-lhe enviado porque {{{owner}} queria convidá-lo a tornar-se membro da equipa {{{team}} da {{project}}.", + "emails.invitation.footer": "Se não estiver interessado, pode ignorar esta mensagem.", + "emails.invitation.thanks": "Obrigado", + "emails.invitation.signature": "Equipa {{project}}", "locale.country.unknown": "Desconhecido", "countries.af": "Afeganistão", "countries.ao": "Angola", @@ -229,4 +229,4 @@ "continents.na": "América do Norte", "continents.oc": "Oceânia", "continents.sa": "América do Sul" -} \ No newline at end of file +} From 8200101a5cbe6e141d8f16298cc196914f7b30dc Mon Sep 17 00:00:00 2001 From: Jesper <36137226+Ganzabahl@users.noreply.github.com> Date: Fri, 1 Oct 2021 16:40:56 +0200 Subject: [PATCH 051/257] Added da.json Text to be translated added - First steps first ;) --- app/config/locale/translations/da.json | 232 +++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 app/config/locale/translations/da.json diff --git a/app/config/locale/translations/da.json b/app/config/locale/translations/da.json new file mode 100644 index 0000000000..ae53b18034 --- /dev/null +++ b/app/config/locale/translations/da.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"", + "settings.locale": "en", + "settings.direction": "ltr", + "emails.sender": "%s Team", + "emails.verification.subject": "Account Verification", + "emails.verification.hello": "Hey {{name}}", + "emails.verification.body": "Follow this link to verify your email address.", + "emails.verification.footer": "If you didn’t ask to verify this address, you can ignore this message.", + "emails.verification.thanks": "Thanks", + "emails.verification.signature": "{{project}} team", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Hey,", + "emails.magicSession.body": "Follow this link to login.", + "emails.magicSession.footer": "If you didn’t ask to login using this email, you can ignore this message.", + "emails.magicSession.thanks": "Thanks", + "emails.magicSession.signature": "{{project}} team", + "emails.recovery.subject": "Password Reset", + "emails.recovery.hello": "Hello {{name}}", + "emails.recovery.body": "Follow this link to reset your {{project}} password.", + "emails.recovery.footer": "If you didn’t ask to reset your password, you can ignore this message.", + "emails.recovery.thanks": "Thanks", + "emails.recovery.signature": "{{project}} team", + "emails.invitation.subject": "Invitation to %s Team at %s", + "emails.invitation.hello": "Hello", + "emails.invitation.body": "This mail was sent to you because {{owner}} wanted to invite you to become a member of the {{team}} team at {{project}}.", + "emails.invitation.footer": "If you are not interested, you can ignore this message.", + "emails.invitation.thanks": "Thanks", + "emails.invitation.signature": "{{project}} team", + "locale.country.unknown": "Unknown", + "countries.af": "Afghanistan", + "countries.ao": "Angola", + "countries.al": "Albania", + "countries.ad": "Andorra", + "countries.ae": "United Arab Emirates", + "countries.ar": "Argentina", + "countries.am": "Armenia", + "countries.ag": "Antigua and Barbuda", + "countries.au": "Australia", + "countries.at": "Austria", + "countries.az": "Azerbaijan", + "countries.bi": "Burundi", + "countries.be": "Belgium", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesh", + "countries.bg": "Bulgaria", + "countries.bh": "Bahrain", + "countries.bs": "Bahamas", + "countries.ba": "Bosnia and Herzegovina", + "countries.by": "Belarus", + "countries.bz": "Belize", + "countries.bo": "Bolivia", + "countries.br": "Brazil", + "countries.bb": "Barbados", + "countries.bn": "Brunei", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Central African Republic", + "countries.ca": "Canada", + "countries.ch": "Switzerland", + "countries.cl": "Chile", + "countries.cn": "China", + "countries.ci": "Ivory Coast", + "countries.cm": "Cameroon", + "countries.cd": "DR Congo", + "countries.cg": "Republic of the Congo", + "countries.co": "Colombia", + "countries.km": "Comoros", + "countries.cv": "Cape Verde", + "countries.cr": "Costa Rica", + "countries.cu": "Cuba", + "countries.cy": "Cyprus", + "countries.cz": "Czechia", + "countries.de": "Germany", + "countries.dj": "Djibouti", + "countries.dm": "Dominica", + "countries.dk": "Denmark", + "countries.do": "Dominican Republic", + "countries.dz": "Algeria", + "countries.ec": "Ecuador", + "countries.eg": "Egypt", + "countries.er": "Eritrea", + "countries.es": "Spain", + "countries.ee": "Estonia", + "countries.et": "Ethiopia", + "countries.fi": "Finland", + "countries.fj": "Fiji", + "countries.fr": "France", + "countries.fm": "Micronesia", + "countries.ga": "Gabon", + "countries.gb": "United Kingdom", + "countries.ge": "Georgia", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Equatorial Guinea", + "countries.gr": "Greece", + "countries.gd": "Grenada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Croatia", + "countries.ht": "Haiti", + "countries.hu": "Hungary", + "countries.id": "Indonesia", + "countries.in": "India", + "countries.ie": "Ireland", + "countries.ir": "Iran", + "countries.iq": "Iraq", + "countries.is": "Iceland", + "countries.il": "Israel", + "countries.it": "Italy", + "countries.jm": "Jamaica", + "countries.jo": "Jordan", + "countries.jp": "Japan", + "countries.kz": "Kazakhstan", + "countries.ke": "Kenya", + "countries.kg": "Kyrgyzstan", + "countries.kh": "Cambodia", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts and Nevis", + "countries.kr": "South Korea", + "countries.kw": "Kuwait", + "countries.la": "Laos", + "countries.lb": "Lebanon", + "countries.lr": "Liberia", + "countries.ly": "Libya", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Lithuania", + "countries.lu": "Luxembourg", + "countries.lv": "Latvia", + "countries.ma": "Morocco", + "countries.mc": "Monaco", + "countries.md": "Moldova", + "countries.mg": "Madagascar", + "countries.mv": "Maldives", + "countries.mx": "Mexico", + "countries.mh": "Marshall Islands", + "countries.mk": "Macedonia", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Myanmar", + "countries.me": "Montenegro", + "countries.mn": "Mongolia", + "countries.mz": "Mozambique", + "countries.mr": "Mauritania", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malaysia", + "countries.na": "Namibia", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nicaragua", + "countries.nl": "Netherlands", + "countries.no": "Norway", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "New Zealand", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Philippines", + "countries.pw": "Palau", + "countries.pg": "Papua New Guinea", + "countries.pl": "Poland", + "countries.kp": "North Korea", + "countries.pt": "Portugal", + "countries.py": "Paraguay", + "countries.qa": "Qatar", + "countries.ro": "Romania", + "countries.ru": "Russia", + "countries.rw": "Rwanda", + "countries.sa": "Saudi Arabia", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapore", + "countries.sb": "Solomon Islands", + "countries.sl": "Sierra Leone", + "countries.sv": "El Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbia", + "countries.ss": "South Sudan", + "countries.st": "São Tomé and Príncipe", + "countries.sr": "Suriname", + "countries.sk": "Slovakia", + "countries.si": "Slovenia", + "countries.se": "Sweden", + "countries.sz": "Swaziland", + "countries.sc": "Seychelles", + "countries.sy": "Syria", + "countries.td": "Chad", + "countries.tg": "Togo", + "countries.th": "Thailand", + "countries.tj": "Tajikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Timor-Leste", + "countries.to": "Tonga", + "countries.tt": "Trinidad and Tobago", + "countries.tn": "Tunisia", + "countries.tr": "Turkey", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzania", + "countries.ug": "Uganda", + "countries.ua": "Ukraine", + "countries.uy": "Uruguay", + "countries.us": "United States", + "countries.uz": "Uzbekistan", + "countries.va": "Vatican City", + "countries.vc": "Saint Vincent and the Grenadines", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Yemen", + "countries.za": "South Africa", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Africa", + "continents.an": "Antarctica", + "continents.as": "Asia", + "continents.eu": "Europe", + "continents.na": "North America", + "continents.oc": "Oceania", + "continents.sa": "South America" +} From 648f3f452ad3907e73ef02fdf5682ccc970dc249 Mon Sep 17 00:00:00 2001 From: Jesper <36137226+Ganzabahl@users.noreply.github.com> Date: Fri, 1 Oct 2021 16:50:52 +0200 Subject: [PATCH 052/257] Update da.json Updated first 20 lines --- app/config/locale/translations/da.json | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/config/locale/translations/da.json b/app/config/locale/translations/da.json index ae53b18034..f7f42573bc 100644 --- a/app/config/locale/translations/da.json +++ b/app/config/locale/translations/da.json @@ -1,23 +1,23 @@ { - "settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"", - "settings.locale": "en", + "settings.inspire": "\"Kunsten at være klog er kunsten at vide, hvad man skal overse.\"", + "settings.locale": "da", "settings.direction": "ltr", "emails.sender": "%s Team", - "emails.verification.subject": "Account Verification", - "emails.verification.hello": "Hey {{name}}", - "emails.verification.body": "Follow this link to verify your email address.", - "emails.verification.footer": "If you didn’t ask to verify this address, you can ignore this message.", - "emails.verification.thanks": "Thanks", + "emails.verification.subject": "Konto Verifikation", + "emails.verification.hello": "Hej {{name}}", + "emails.verification.body": "Følg dette link, for at verificere din email adresse.", + "emails.verification.footer": "Hvis du ikke har bedt om at verificere denne adresse, ignorer venligst denne besked.", + "emails.verification.thanks": "Tak", "emails.verification.signature": "{{project}} team", "emails.magicSession.subject": "Login", - "emails.magicSession.hello": "Hey,", - "emails.magicSession.body": "Follow this link to login.", - "emails.magicSession.footer": "If you didn’t ask to login using this email, you can ignore this message.", - "emails.magicSession.thanks": "Thanks", + "emails.magicSession.hello": "Hej,", + "emails.magicSession.body": "Følg dette link for at logge ind.", + "emails.magicSession.footer": "Hvis du ikke har bedt om at logge ind med denne email, ignorer venligst denne besked.", + "emails.magicSession.thanks": "Tak", "emails.magicSession.signature": "{{project}} team", - "emails.recovery.subject": "Password Reset", - "emails.recovery.hello": "Hello {{name}}", - "emails.recovery.body": "Follow this link to reset your {{project}} password.", + "emails.recovery.subject": "Nulstil Password", + "emails.recovery.hello": "Hej {{name}}", + "emails.recovery.body": "Følg dette link for at nulstille koden til {{project}}.", "emails.recovery.footer": "If you didn’t ask to reset your password, you can ignore this message.", "emails.recovery.thanks": "Thanks", "emails.recovery.signature": "{{project}} team", From ef3e73d00f6caba450c2792b4c57fcc0de7f470c Mon Sep 17 00:00:00 2001 From: Olyno Date: Fri, 1 Oct 2021 16:57:38 +0200 Subject: [PATCH 053/257] fix(translation): replace Salut with Bonjour --- app/config/locale/translations/fr.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/config/locale/translations/fr.json b/app/config/locale/translations/fr.json index 7a0cb6f19c..fe46599dd6 100644 --- a/app/config/locale/translations/fr.json +++ b/app/config/locale/translations/fr.json @@ -4,18 +4,18 @@ "settings.direction": "ltr", "emails.sender": "Équipe %s", "emails.verification.subject": "Vérification du compte", - "emails.verification.hello": "Salut {{name}}", + "emails.verification.hello": "Bonjour {{name}}", "emails.verification.body": "Suivez ce lien pour vérifier votre adresse mail.", "emails.verification.footer": "Si vous n'avez pas demandé à vérifier cette adresse mail, vous pouvez ignorer ce message.", "emails.verification.thanks": "Merci", "emails.verification.signature": "Équipe {{project}}", "emails.magicSession.subject": "Connexion", - "emails.magicSession.hello": "Salut", + "emails.magicSession.hello": "Bonjour", "emails.magicSession.body": "Suivez ce lien pour vous connecter.", "emails.magicSession.footer": "Si vous n'avez pas demandé à vous connecter en utilisant cet e-mail, vous pouvez ignorer ce message.", "emails.magicSession.thanks": "Merci", "emails.magicSession.signature": "Réinitialisation du mot de passe", - "emails.recovery.subject": "Salut {{name}}", + "emails.recovery.subject": "Bonjour {{name}}", "emails.recovery.hello": "Bonjour {{name}}", "emails.recovery.body": "Suivez ce lien pour réinitialiser votre mot de passe de {{projet}}.", "emails.recovery.footer": "Si vous n'avez pas demandé à réinitialiser votre mot de passe, vous pouvez ignorer ce message.", From f31fc0735ed1b0a858eac185e7a3ec19f90c7dac Mon Sep 17 00:00:00 2001 From: Dehami Koswatte Date: Fri, 1 Oct 2021 21:06:57 +0530 Subject: [PATCH 054/257] Add code review fixes --- app/controllers/api/teams.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/controllers/api/teams.php b/app/controllers/api/teams.php index 645d08f57b..128a03c2eb 100644 --- a/app/controllers/api/teams.php +++ b/app/controllers/api/teams.php @@ -272,7 +272,7 @@ App::post('/v1/teams/:teamId/memberships') ->inject('locale') ->inject('audits') ->inject('mails') - ->action(function ($teamId, $email, $name, $roles, $url, $response, $project, $user, $projectDB, $locale, $audits, $mails) { + ->action(function ($teamId, $email, $roles, $url, $name, $response, $project, $user, $projectDB, $locale, $audits, $mails) { /** @var Appwrite\Utopia\Response $response */ /** @var Appwrite\Database\Document $project */ /** @var Appwrite\Database\Document $user */ From b32606739a65e954efd31165e6dcd2d41a1170f2 Mon Sep 17 00:00:00 2001 From: Jesper <36137226+Ganzabahl@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:41:46 +0200 Subject: [PATCH 055/257] Update da.json Finished the list and double checked countries. --- app/config/locale/translations/da.json | 206 ++++++++++++------------- 1 file changed, 103 insertions(+), 103 deletions(-) diff --git a/app/config/locale/translations/da.json b/app/config/locale/translations/da.json index f7f42573bc..dbcaae2785 100644 --- a/app/config/locale/translations/da.json +++ b/app/config/locale/translations/da.json @@ -18,137 +18,137 @@ "emails.recovery.subject": "Nulstil Password", "emails.recovery.hello": "Hej {{name}}", "emails.recovery.body": "Følg dette link for at nulstille koden til {{project}}.", - "emails.recovery.footer": "If you didn’t ask to reset your password, you can ignore this message.", - "emails.recovery.thanks": "Thanks", + "emails.recovery.footer": "Hvis du ikke har bedt om at nulstille dit password, ignorer venligst denne besked.", + "emails.recovery.thanks": "Tak", "emails.recovery.signature": "{{project}} team", - "emails.invitation.subject": "Invitation to %s Team at %s", - "emails.invitation.hello": "Hello", - "emails.invitation.body": "This mail was sent to you because {{owner}} wanted to invite you to become a member of the {{team}} team at {{project}}.", - "emails.invitation.footer": "If you are not interested, you can ignore this message.", - "emails.invitation.thanks": "Thanks", + "emails.invitation.subject": "Invitation til %s Team på %s", + "emails.invitation.hello": "Hej", + "emails.invitation.body": "Denne mail blev sendt til dig, fordi {{owner}} vil invitere dig til at blive medlem af {{team}} teamet på {{project}}.", + "emails.invitation.footer": "Hvis du ikke er interesseret, ignorer venligst denne besked.", + "emails.invitation.thanks": "Tak", "emails.invitation.signature": "{{project}} team", - "locale.country.unknown": "Unknown", + "locale.country.unknown": "Ukendt", "countries.af": "Afghanistan", "countries.ao": "Angola", - "countries.al": "Albania", + "countries.al": "Albanien", "countries.ad": "Andorra", - "countries.ae": "United Arab Emirates", + "countries.ae": "Forenede Arabiske Emirater", "countries.ar": "Argentina", - "countries.am": "Armenia", + "countries.am": "Armenien", "countries.ag": "Antigua and Barbuda", - "countries.au": "Australia", - "countries.at": "Austria", - "countries.az": "Azerbaijan", + "countries.au": "Australien", + "countries.at": "Østrig", + "countries.az": "Aserbajdsjan", "countries.bi": "Burundi", - "countries.be": "Belgium", + "countries.be": "Belgien", "countries.bj": "Benin", "countries.bf": "Burkina Faso", "countries.bd": "Bangladesh", - "countries.bg": "Bulgaria", + "countries.bg": "Bulgarien", "countries.bh": "Bahrain", "countries.bs": "Bahamas", - "countries.ba": "Bosnia and Herzegovina", - "countries.by": "Belarus", + "countries.ba": "Bosnien-Hercegovina", + "countries.by": "Hviderusland", "countries.bz": "Belize", "countries.bo": "Bolivia", - "countries.br": "Brazil", + "countries.br": "Brasilien, "countries.bb": "Barbados", "countries.bn": "Brunei", "countries.bt": "Bhutan", "countries.bw": "Botswana", - "countries.cf": "Central African Republic", + "countries.cf": "Den Centralafrikanske Republik", "countries.ca": "Canada", - "countries.ch": "Switzerland", + "countries.ch": "Schweiz", "countries.cl": "Chile", - "countries.cn": "China", - "countries.ci": "Ivory Coast", - "countries.cm": "Cameroon", + "countries.cn": "Kina", + "countries.ci": "Elfenbenskysten", + "countries.cm": "Cameroun", "countries.cd": "DR Congo", - "countries.cg": "Republic of the Congo", + "countries.cg": "Republikken Congo", "countries.co": "Colombia", - "countries.km": "Comoros", - "countries.cv": "Cape Verde", + "countries.km": "Comorerne", + "countries.cv": "Kap Verde", "countries.cr": "Costa Rica", "countries.cu": "Cuba", - "countries.cy": "Cyprus", - "countries.cz": "Czechia", - "countries.de": "Germany", + "countries.cy": "Cypern", + "countries.cz": "Tjekkiet", + "countries.de": "Tyskland", "countries.dj": "Djibouti", "countries.dm": "Dominica", - "countries.dk": "Denmark", - "countries.do": "Dominican Republic", - "countries.dz": "Algeria", + "countries.dk": "Danmark", + "countries.do": "Dominikanske Republik", + "countries.dz": "Algeriet", "countries.ec": "Ecuador", - "countries.eg": "Egypt", + "countries.eg": "Egypten", "countries.er": "Eritrea", - "countries.es": "Spain", - "countries.ee": "Estonia", - "countries.et": "Ethiopia", + "countries.es": "Spainen", + "countries.ee": "Estland", + "countries.et": "Etiopien", "countries.fi": "Finland", "countries.fj": "Fiji", - "countries.fr": "France", - "countries.fm": "Micronesia", + "countries.fr": "Frankrig", + "countries.fm": "Mikronesien", "countries.ga": "Gabon", - "countries.gb": "United Kingdom", - "countries.ge": "Georgia", + "countries.gb": "Storbritannien", + "countries.ge": "Georgien", "countries.gh": "Ghana", "countries.gn": "Guinea", "countries.gm": "Gambia", "countries.gw": "Guinea-Bissau", - "countries.gq": "Equatorial Guinea", - "countries.gr": "Greece", + "countries.gq": "Ækvatorialguinea", + "countries.gr": "Grækenland", "countries.gd": "Grenada", "countries.gt": "Guatemala", "countries.gy": "Guyana", "countries.hn": "Honduras", - "countries.hr": "Croatia", + "countries.hr": "Kroatien", "countries.ht": "Haiti", - "countries.hu": "Hungary", - "countries.id": "Indonesia", - "countries.in": "India", - "countries.ie": "Ireland", + "countries.hu": "Ungarn", + "countries.id": "Indonesien", + "countries.in": "Indien", + "countries.ie": "Irland", "countries.ir": "Iran", - "countries.iq": "Iraq", - "countries.is": "Iceland", + "countries.iq": "Irak", + "countries.is": "Island", "countries.il": "Israel", - "countries.it": "Italy", + "countries.it": "Italen", "countries.jm": "Jamaica", "countries.jo": "Jordan", "countries.jp": "Japan", - "countries.kz": "Kazakhstan", + "countries.kz": "Kasakhstan", "countries.ke": "Kenya", - "countries.kg": "Kyrgyzstan", - "countries.kh": "Cambodia", + "countries.kg": "Kirgisistan", + "countries.kh": "Cambodja", "countries.ki": "Kiribati", - "countries.kn": "Saint Kitts and Nevis", - "countries.kr": "South Korea", + "countries.kn": "Saint Kitts og Nevis", + "countries.kr": "Sydkorea", "countries.kw": "Kuwait", "countries.la": "Laos", - "countries.lb": "Lebanon", + "countries.lb": "Libanon", "countries.lr": "Liberia", - "countries.ly": "Libya", + "countries.ly": "Libyen", "countries.lc": "Saint Lucia", "countries.li": "Liechtenstein", "countries.lk": "Sri Lanka", "countries.ls": "Lesotho", - "countries.lt": "Lithuania", + "countries.lt": "Litauen", "countries.lu": "Luxembourg", - "countries.lv": "Latvia", - "countries.ma": "Morocco", + "countries.lv": "Letland", + "countries.ma": "Marokko", "countries.mc": "Monaco", "countries.md": "Moldova", - "countries.mg": "Madagascar", - "countries.mv": "Maldives", + "countries.mg": "Madagaskar", + "countries.mv": "Maldiverne", "countries.mx": "Mexico", - "countries.mh": "Marshall Islands", - "countries.mk": "Macedonia", + "countries.mh": "Marshalløerne", + "countries.mk": "Makedonien", "countries.ml": "Mali", "countries.mt": "Malta", "countries.mm": "Myanmar", "countries.me": "Montenegro", - "countries.mn": "Mongolia", + "countries.mn": "Mongoliet", "countries.mz": "Mozambique", - "countries.mr": "Mauritania", + "countries.mr": "Mauritanien", "countries.mu": "Mauritius", "countries.mw": "Malawi", "countries.my": "Malaysia", @@ -156,8 +156,8 @@ "countries.ne": "Niger", "countries.ng": "Nigeria", "countries.ni": "Nicaragua", - "countries.nl": "Netherlands", - "countries.no": "Norway", + "countries.nl": "Holland", + "countries.no": "Norge", "countries.np": "Nepal", "countries.nr": "Nauru", "countries.nz": "New Zealand", @@ -165,68 +165,68 @@ "countries.pk": "Pakistan", "countries.pa": "Panama", "countries.pe": "Peru", - "countries.ph": "Philippines", + "countries.ph": "Filippinerne", "countries.pw": "Palau", - "countries.pg": "Papua New Guinea", - "countries.pl": "Poland", - "countries.kp": "North Korea", + "countries.pg": "Papua Ny Guinea", + "countries.pl": "Polen", + "countries.kp": "Nordkorea", "countries.pt": "Portugal", "countries.py": "Paraguay", "countries.qa": "Qatar", - "countries.ro": "Romania", - "countries.ru": "Russia", + "countries.ro": "Rumænien", + "countries.ru": "Rusland", "countries.rw": "Rwanda", - "countries.sa": "Saudi Arabia", + "countries.sa": "Saudi Arabien", "countries.sd": "Sudan", "countries.sn": "Senegal", "countries.sg": "Singapore", - "countries.sb": "Solomon Islands", + "countries.sb": "Salomonøerne", "countries.sl": "Sierra Leone", "countries.sv": "El Salvador", "countries.sm": "San Marino", "countries.so": "Somalia", - "countries.rs": "Serbia", - "countries.ss": "South Sudan", - "countries.st": "São Tomé and Príncipe", - "countries.sr": "Suriname", - "countries.sk": "Slovakia", - "countries.si": "Slovenia", - "countries.se": "Sweden", + "countries.rs": "Serbien", + "countries.ss": "Sydsudan", + "countries.st": "Sao Tome og Principe", + "countries.sr": "Surinam", + "countries.sk": "Slovakiet", + "countries.si": "Slovenien", + "countries.se": "Sverige", "countries.sz": "Swaziland", - "countries.sc": "Seychelles", - "countries.sy": "Syria", - "countries.td": "Chad", + "countries.sc": "Seychellerne", + "countries.sy": "Syrien", + "countries.td": "Tchad", "countries.tg": "Togo", "countries.th": "Thailand", - "countries.tj": "Tajikistan", + "countries.tj": "Tadsjikistan", "countries.tm": "Turkmenistan", "countries.tl": "Timor-Leste", "countries.to": "Tonga", - "countries.tt": "Trinidad and Tobago", - "countries.tn": "Tunisia", - "countries.tr": "Turkey", + "countries.tt": "Trinidad og Tobago", + "countries.tn": "Tunisien", + "countries.tr": "Tyrkiet", "countries.tv": "Tuvalu", "countries.tz": "Tanzania", "countries.ug": "Uganda", "countries.ua": "Ukraine", "countries.uy": "Uruguay", - "countries.us": "United States", - "countries.uz": "Uzbekistan", - "countries.va": "Vatican City", - "countries.vc": "Saint Vincent and the Grenadines", + "countries.us": "Amerikas Forenede Stater", + "countries.uz": "Usbekistan", + "countries.va": "Vatikanet", + "countries.vc": "Saint Vincent og Grenadinerne", "countries.ve": "Venezuela", "countries.vn": "Vietnam", "countries.vu": "Vanuatu", "countries.ws": "Samoa", "countries.ye": "Yemen", - "countries.za": "South Africa", + "countries.za": "Sydafrika", "countries.zm": "Zambia", "countries.zw": "Zimbabwe", - "continents.af": "Africa", - "continents.an": "Antarctica", - "continents.as": "Asia", - "continents.eu": "Europe", - "continents.na": "North America", - "continents.oc": "Oceania", - "continents.sa": "South America" + "continents.af": "Afrika", + "continents.an": "Antarktis", + "continents.as": "Asien", + "continents.eu": "Europa", + "continents.na": "Nordamerica", + "continents.oc": "Oceanien", + "continents.sa": "Sydamerica" } From e80198a0b1e1645fe30c30c9e5da5c056bb54292 Mon Sep 17 00:00:00 2001 From: Jesper <36137226+Ganzabahl@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:43:59 +0200 Subject: [PATCH 056/257] Update codes.php Added Danish and did some cosmetic tweaking of comments. --- app/config/locale/codes.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index c8623f533c..6bb8f0ea93 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -6,9 +6,10 @@ return [ 'be', // Belarusian 'bg', // Bulgarian 'bn', // Bengali - 'bs', //Bosnian + 'bs', // Bosnian 'ca', // Catalan 'cs', // Czech + 'da', // Danish 'de', // German 'en', // English 'es', // Spanish @@ -17,7 +18,7 @@ return [ 'fo', // Faroese 'fr', // French 'el', // Greek - 'gu', //Gujrati + 'gu', // Gujrati 'he', // Hebrew 'hi', // Hindi 'hu', // Hungarian @@ -42,7 +43,7 @@ return [ 'pl', // Polish 'pt-br', // Portuguese - Brazil 'pt-pt', // Portuguese - Portugal - 'pa', //Punjabi + 'pa', // Punjabi 'ro', // Romanian 'ru', // Russian 'si', // Sinhala @@ -53,7 +54,7 @@ return [ 'th', // Thai 'tr', // Turkish 'uk', // Ukrainian - 'ur', //Urdu + 'ur', // Urdu 'vi', // Vietnamese 'zh-cn', // Chinese - China 'zh-tw', // Chinese - Taiwan From 8e0d4a755c9a43528dba407fdbb560a46e78504f Mon Sep 17 00:00:00 2001 From: Jesper <36137226+Ganzabahl@users.noreply.github.com> Date: Fri, 1 Oct 2021 17:45:47 +0200 Subject: [PATCH 057/257] Update init.php Added Danish --- Locale::setLanguageFromJSON('da', __DIR__.'/config/locale/translations/da.json'); --- --- app/init.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/init.php b/app/init.php index 8c1d6cb455..d818d3b2ee 100644 --- a/app/init.php +++ b/app/init.php @@ -269,6 +269,7 @@ Locale::setLanguageFromJSON('bn', __DIR__.'/config/locale/translations/bn.json') Locale::setLanguageFromJSON('bs', __DIR__.'/config/locale/translations/bs.json'); Locale::setLanguageFromJSON('ca', __DIR__.'/config/locale/translations/ca.json'); Locale::setLanguageFromJSON('cs', __DIR__.'/config/locale/translations/cs.json'); +Locale::setLanguageFromJSON('da', __DIR__.'/config/locale/translations/da.json'); Locale::setLanguageFromJSON('de', __DIR__.'/config/locale/translations/de.json'); Locale::setLanguageFromJSON('el', __DIR__.'/config/locale/translations/el.json'); Locale::setLanguageFromJSON('en', __DIR__.'/config/locale/translations/en.json'); From abc532c5ce5a4f20bff6acb9b66db1675640eecb Mon Sep 17 00:00:00 2001 From: Daniele Maltese Date: Fri, 1 Oct 2021 17:55:21 +0200 Subject: [PATCH 058/257] feat(locales): italian translation --- app/config/locale/translations/it.json | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/it.json b/app/config/locale/translations/it.json index 1973230c0d..e949225892 100644 --- a/app/config/locale/translations/it.json +++ b/app/config/locale/translations/it.json @@ -3,30 +3,30 @@ "settings.locale": "it", "settings.direction": "ltr", "emails.sender": "Team %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Verifica account", + "emails.verification.hello": "Ciao {{name}}", + "emails.verification.body": "Clicca questo link per verificare il tuo indirizzo email.", + "emails.verification.footer": "Se non sei stato tu a richiedere la verifica dell’indirizzo email, puoi ignorare questo messaggio.", + "emails.verification.thanks": "Grazie", + "emails.verification.signature": "Il team {{project}}", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Ciao,", + "emails.magicSession.body": "Clicca questo link per accedere.", + "emails.magicSession.footer": "Se non sei stato tu a richiedere di effettuare l’accesso, puoi ignorare questo messaggio.", + "emails.magicSession.thanks": "Grazie", + "emails.magicSession.signature": "Il team {{project}}", + "emails.recovery.subject": "Reimpostazione password", + "emails.recovery.hello": "Ciao {{name}}", + "emails.recovery.body": "Clicca questo link per reimpostare la tua password di {{project}}.", + "emails.recovery.footer": "Se non sei stato tu a richiedere la reimpostazione della password, puoi ignorare questo messaggio.", + "emails.recovery.thanks": "Grazie", + "emails.recovery.signature": "Il team {{project}}", + "emails.invitation.subject": "Invito al Team %s per %s", + "emails.invitation.hello": "Ciao", + "emails.invitation.body": "Ricevi questa email perché {{owner}} ti ha invitato a diventare un membro del team {{team}} di {{project}}.", + "emails.invitation.footer": "Ignora questo messaggio se non sei interessato.", + "emails.invitation.thanks": "Grazie", + "emails.invitation.signature": "Il team {{project}}", "locale.country.unknown": "Sconosciuto", "countries.af": "Afghanistan", "countries.ao": "Angola", From 3eba9c9854ceab8d0ddba7d756841bd0ad8eb5f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bo=C5=A1njak?= Date: Fri, 1 Oct 2021 17:58:21 +0200 Subject: [PATCH 059/257] Changed translation of emails.verification.hello and emails.magicSession.hello to more formal --- app/config/locale/translations/hr.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/hr.json b/app/config/locale/translations/hr.json index d0b92aa945..78f2e830fb 100644 --- a/app/config/locale/translations/hr.json +++ b/app/config/locale/translations/hr.json @@ -4,13 +4,13 @@ "settings.direction": "ltr", "emails.sender": "%s Tim", "emails.verification.subject": "Verifikacija računa", - "emails.verification.hello": "Hej {{name}}", + "emails.verification.hello": "Pozdrav {{name}}", "emails.verification.body": "Slijedite ovu poveznicu da biste potvrdili svoju adresu e-pošte.", "emails.verification.footer": "Ukoliko niste zatražili potvrdu ove adrese, možete zanemariti ovu poruku.", "emails.verification.thanks": "Hvala", "emails.verification.signature": "{{project}} tim", "emails.magicSession.subject": "Prijavi se", - "emails.magicSession.hello": "Hej,", + "emails.magicSession.hello": "Pozdrav,", "emails.magicSession.body": "Slijedite ovu poveznicu za prijavu.", "emails.magicSession.footer": "Ako niste zatražili prijavu putem ove e-pošte, možete zanemariti ovu poruku.", "emails.magicSession.thanks": "Hvala", From 7061e295acb9e031f26bef8489f4b53fc296a3e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matej=20Bo=C5=A1njak?= Date: Fri, 1 Oct 2021 18:12:36 +0200 Subject: [PATCH 060/257] Changed formal typo of emails.magicSession.subject --- app/config/locale/translations/hr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/hr.json b/app/config/locale/translations/hr.json index 78f2e830fb..4dcebf0a41 100644 --- a/app/config/locale/translations/hr.json +++ b/app/config/locale/translations/hr.json @@ -9,7 +9,7 @@ "emails.verification.footer": "Ukoliko niste zatražili potvrdu ove adrese, možete zanemariti ovu poruku.", "emails.verification.thanks": "Hvala", "emails.verification.signature": "{{project}} tim", - "emails.magicSession.subject": "Prijavi se", + "emails.magicSession.subject": "Prijavite se", "emails.magicSession.hello": "Pozdrav,", "emails.magicSession.body": "Slijedite ovu poveznicu za prijavu.", "emails.magicSession.footer": "Ako niste zatražili prijavu putem ove e-pošte, možete zanemariti ovu poruku.", From 397c6611bb7808853d58f8fa4e138e427dffc0d2 Mon Sep 17 00:00:00 2001 From: Rutam Prita Mishra Date: Fri, 1 Oct 2021 23:21:19 +0530 Subject: [PATCH 061/257] Added Odia translations --- app/config/locale/translations/or.json | 54 +++++++++++++------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/app/config/locale/translations/or.json b/app/config/locale/translations/or.json index 8e4fd4bc5e..fdf5c7ab34 100644 --- a/app/config/locale/translations/or.json +++ b/app/config/locale/translations/or.json @@ -1,34 +1,34 @@ { - "settings.inspire": "\"ଜ୍ଞାନୀ ହେବାର କଳା ହେଉଛି କ’ଣ ଅଣଦେଖା କରାଯିବ ଜାଣିବାର କଳା |\"", + "settings.inspire": "\"ବୁଦ୍ଧିମାନ ହେବାର କଳା ହେଉଛି କ’ଣ ଅଣଦେଖା କରାଯିବ ଜାଣିବାର କଳା |\"", "settings.locale": "or", "settings.direction": "ltr", - "emails.sender": "%s ଟିମ", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.sender": "%s ଦଳ", + "emails.verification.subject": "ଖାତା ଯାଞ୍ଚ", + "emails.verification.hello": "ନମସ୍କାର {{name}}", + "emails.verification.body": "ଆପଣଙ୍କର ଇମେଲ୍ ଠିକଣା ଯାଞ୍ଚ କରିବାକୁ ଏହି ଲିଙ୍କ୍ ଅନୁସରଣ କରନ୍ତୁ |", + "emails.verification.footer": "ଯଦି ଆପଣ ଏହି ଠିକଣା ଯାଞ୍ଚ କରିବାକୁ କହି ନାହାଁନ୍ତି, ତେବେ ଆପଣ ଏହି ସନ୍ଦେଶକୁ ଉପେକ୍ଷା କରିପାରିବେ |", + "emails.verification.thanks": "ଧନ୍ୟବାଦ", + "emails.verification.signature": "{{project}} ଦଳ", + "emails.magicSession.subject": "ଲଗଇନ୍ କରନ୍ତୁ", + "emails.magicSession.hello": "ନମସ୍କାର,", + "emails.magicSession.body": "ଲଗଇନ୍ କରିବାକୁ ଏହି ଲିଙ୍କ୍ ଅନୁସରଣ କରନ୍ତୁ |", + "emails.magicSession.footer": "ଯଦି ଆପଣ ଏହି ଇମେଲ୍ ବ୍ୟବହାର କରି ଲଗଇନ୍ କରିବାକୁ କହି ନାହାଁନ୍ତି, ତେବେ ଆପଣ ଏହି ସନ୍ଦେଶକୁ ଉପେକ୍ଷା କରିପାରିବେ |", + "emails.magicSession.thanks": "ଧନ୍ୟବାଦ", + "emails.magicSession.signature": "{{project}} ଦଳ", + "emails.recovery.subject": "ପାସୱାର୍ଡ ପୁନଃ ସେଟ୍ କରନ୍ତୁ |", + "emails.recovery.hello": "ନମସ୍କାର {{name}}", + "emails.recovery.body": "ଆପଣଙ୍କର {{project}} ପାସୱାର୍ଡ ପୁନଃ ସେଟ୍ କରିବାକୁ ଏହି ଲିଙ୍କକୁ ଅନୁସରଣ କରନ୍ତୁ |", + "emails.recovery.footer": "ଯଦି ଆପଣ ଆପଣଙ୍କର ପାସୱାର୍ଡ ପୁନଃ ସେଟ୍ କରିବାକୁ କହି ନାହାଁନ୍ତି, ତେବେ ଆପଣ ଏହି ସନ୍ଦେଶକୁ ଉପେକ୍ଷା କରିପାରିବେ |", + "emails.recovery.thanks": "ଧନ୍ୟବାଦ", + "emails.recovery.signature": "{{project}} ଦଳ", + "emails.invitation.subject": "%s ରେ %s ଦଳକୁ ନିମନ୍ତ୍ରଣ |", + "emails.invitation.hello": "ନମସ୍କାର", + "emails.invitation.body": "ଏହି ମେଲ୍ ଆପଣଙ୍କୁ ପଠାଯାଇଥିଲା କାରଣ {{owner}} ଆପଣଙ୍କୁ {{project} ରେ {{team}} ଦଳର ସଦସ୍ୟ ହେବାକୁ ଆମନ୍ତ୍ରଣ କରିବାକୁ ଚାହୁଁଥିଲେ |", + "emails.invitation.footer": "ଯଦି ଆପଣ ଆଗ୍ରହୀ ନୁହଁନ୍ତି, ଆପଣ ଏହି ସନ୍ଦେଶକୁ ଅଣଦେଖା କରିପାରିବେ |", + "emails.invitation.thanks": "ଧନ୍ୟବାଦ", + "emails.invitation.signature": "{{project}} ଦଳ", "locale.country.unknown": "ଅଜ୍ଞାତ", - "countries.af": "ଅଫଘନିସ୍ତାନ", + "countries.af": "ଆଫଗାନିସ୍ତାନ", "countries.ao": "ଅଙ୍ଗୋଲା", "countries.al": "ଆଲବେନିଆ", "countries.ad": "ଆଣ୍ଡୋରା", From 70dc5d2123846b18341450b5efceeb95a785ca46 Mon Sep 17 00:00:00 2001 From: Nikhil Shanbhag <61755381+Nikhil-1503@users.noreply.github.com> Date: Sat, 2 Oct 2021 00:00:48 +0530 Subject: [PATCH 062/257] Added Kannada translations --- app/config/locale/translations/kn.json | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/kn.json b/app/config/locale/translations/kn.json index 69c110f8a1..12da1f7373 100644 --- a/app/config/locale/translations/kn.json +++ b/app/config/locale/translations/kn.json @@ -3,30 +3,30 @@ "settings.locale": "ka", "settings.direction": "ltr", "emails.sender": "%s ತಂಡ", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "ಖಾತೆ ಪರಿಶೀಲನೆ", + "emails.verification.hello": "ನಮಸ್ಕಾರ {{name}}", + "emails.verification.body": "ನಿಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸ ಪರಿಶೀಲನೆಗೆ ಈ ಲಿಂಕನ್ನು ಅನುಸರಿಸಿ", + "emails.verification.footer": "ನೀವು ಇಮೇಲ್ ವಿಳಾಸ ಪರಿಶೀಲನೆಗೆ ಕೇಳದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ", + "emails.verification.thanks": "ಧನ್ಯವಾದಗಳು", + "emails.verification.signature": "{{project}} ತಂಡ", + "emails.magicSession.subject": "ಲಾಗಿನ್", + "emails.magicSession.hello": "ನಮಸ್ಕಾರ,", + "emails.magicSession.body": "ಲಾಗಿನ್ ಮಾಡಲಿಕ್ಕೆ ಈ ಲಿಂಕನ್ನು ಅನುಸರಿಸಿ", + "emails.magicSession.footer": "ನೀವು ಈ ಇಮೇಲನಿಂದ ಲಾಗಿನ್ ಮಾಡಲು ಕೇಳದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ", + "emails.magicSession.thanks": "ಧನ್ಯವಾದಗಳು", + "emails.magicSession.signature": "{{project}} ತಂಡ", + "emails.recovery.subject": "ಗುಪ್ತಪದ ಮರುಹೊಂದಿಸಿ", + "emails.recovery.hello": "ನಮಸ್ಕಾರ {{name}}", + "emails.recovery.body": "ನಿಮ್ಮ {{project}} ಗುಪ್ತಪದವನ್ನು ಮರುಹೊಂದಿಸಲು ಈ ಲಿಂಕನ್ನು ಅನುಸರಿಸಿ", + "emails.recovery.footer": "ನೀವು ಗುಪ್ತಪದವನ್ನು ಮರುಹೊಂದಿಸಲು ಕೇಳದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ", + "emails.recovery.thanks": "ಧನ್ಯವಾದಗಳು", + "emails.recovery.signature": "{{project}} ತಂಡ", + "emails.invitation.subject": "%s ತಂಡಕ್ಕೆ %sರಲ್ಲಿ ಆಹ್ವಾನ", + "emails.invitation.hello": "ನಮಸ್ಕಾರ", + "emails.invitation.body": "ಈ ಇಮೇಲ್ ನಿಮಗೆ ಬಂದಿದೆ ಏಕೆಂದರೆ {{owner}} ನಿಮ್ಮನ್ನು {{team}} ತಂಡದ {{project}}ರಲ್ಲಿ ಸದಸ್ಯ ಆಗಲಿಕ್ಕೆ ಆಹ್ವಾನಿಸಿದ್ದಾರೆ", + "emails.invitation.footer": "ನಿಮಗೆ ಆಸಕ್ತಿಯಿಲ್ಲದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ", + "emails.invitation.thanks": "ಧನ್ಯವಾದಗಳು", + "emails.invitation.signature": "{{project}} ತಂಡ", "locale.country.unknown": "Unknown", "countries.af": "ಅಫ್ಘಾನಿಸ್ತಾನ", "countries.ao": "ಅಂಗೋಲಾ", From 949146f04627f06c669d89ba27fd82d765acfb3a Mon Sep 17 00:00:00 2001 From: Dazzler Kumar Date: Sat, 2 Oct 2021 00:44:46 +0530 Subject: [PATCH 063/257] Bhojpuri (Bihari) language support --- app/config/locale/codes.php | 1 + app/config/locale/translations/bh.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/bh.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index c8623f533c..c0fdc33bc0 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -5,6 +5,7 @@ return [ 'ar', // Arabic 'be', // Belarusian 'bg', // Bulgarian + 'bh', // Bhojpuri or Bihari 'bn', // Bengali 'bs', //Bosnian 'ca', // Catalan diff --git a/app/config/locale/translations/bh.json b/app/config/locale/translations/bh.json new file mode 100644 index 0000000000..426af925bd --- /dev/null +++ b/app/config/locale/translations/bh.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"बुद्धिमान होवे की वह कला बा जॉन जानने की कला होला कि का अनदेखा किया जाए। \"", + "settings.locale": "bh", + "settings.direction": "ltr", + "emails.sender": "%s टीम", + "emails.verification.subject": "", + "emails.verification.hello": "", + "emails.verification.body": "", + "emails.verification.footer": "", + "emails.verification.thanks": "", + "emails.verification.signature": "", + "emails.magicSession.subject": "", + "emails.magicSession.hello": "", + "emails.magicSession.body": "", + "emails.magicSession.footer": "", + "emails.magicSession.thanks": "", + "emails.magicSession.signature": "", + "emails.recovery.subject": "", + "emails.recovery.hello": "", + "emails.recovery.body": "", + "emails.recovery.footer": "", + "emails.recovery.thanks": "", + "emails.recovery.signature": "", + "emails.invitation.subject": "", + "emails.invitation.hello": "", + "emails.invitation.body": "", + "emails.invitation.footer": "", + "emails.invitation.thanks": "", + "emails.invitation.signature": "", + "locale.country.unknown": "अज्ञात", + "countries.af": "अफ़ग़ानिस्तान", + "countries.ao": "अंगोला", + "countries.al": "अल्बानिया", + "countries.ad": "अंडोरा", + "countries.ae": "संयुक्त अरब अमीरात", + "countries.ar": "अर्जेंटीना", + "countries.am": "आर्मीनिया", + "countries.ag": "अंटीगुआ और बारबूडा", + "countries.au": "ऑस्ट्रेलिया", + "countries.at": "ऑस्ट्रिया", + "countries.az": "अज़रबैजान", + "countries.bi": "बुरुंडी", + "countries.be": "बेल्जियम", + "countries.bj": "बेनिन", + "countries.bf": "बुर्किना फासो", + "countries.bd": "बांग्लादेश", + "countries.bg": "बुल्गारिया", + "countries.bh": "बहरीन", + "countries.bs": "बहामास", + "countries.ba": "बॉस्निया और हर्ज़ेगोविना", + "countries.by": "बेलारूस", + "countries.bz": "बेलीज़", + "countries.bo": "बोलीविया", + "countries.br": "ब्राज़ील", + "countries.bb": "बारबाडोस", + "countries.bn": "ब्रुनेई", + "countries.bt": "भूटान", + "countries.bw": "बोत्सवाना", + "countries.cf": "मध्य अफ्रीकी गणराज्य", + "countries.ca": "कनाडा", + "countries.ch": "स्विट्ज़रलैंड", + "countries.cl": "चिली", + "countries.cn": "चीन", + "countries.ci": "आइवरी कोस्ट", + "countries.cm": "कैमरून", + "countries.cd": "कांगो लोकतान्त्रिक गणराज्य", + "countries.cg": "कांगो गणराज्य", + "countries.co": "कोलंबिया", + "countries.km": "कोमोरोस", + "countries.cv": "केप वर्दे", + "countries.cr": "कोस्टा रीका", + "countries.cu": "क्यूबा", + "countries.cy": "साइप्रस", + "countries.cz": "चेक गणराज्य", + "countries.de": "जर्मनी", + "countries.dj": "जिबूती", + "countries.dm": "डोमिनिका", + "countries.dk": "डेनमार्क", + "countries.do": "डोमिनिकन रिपब्लिक", + "countries.dz": "अल्जीरिया", + "countries.ec": "ईक्वाडोर", + "countries.eg": "मिस्र", + "countries.er": "इरित्रिया", + "countries.es": "स्पेन", + "countries.ee": "एस्टोनिया", + "countries.et": "इथियोपिया", + "countries.fi": "फ़िनलैंड", + "countries.fj": "फ़िजी", + "countries.fr": "फ्रांस", + "countries.fm": "माइक्रोनेशिया", + "countries.ga": "गबोन", + "countries.gb": "यूनाइटेड किंगडम", + "countries.ge": "जॉर्जिया", + "countries.gh": "घाना", + "countries.gn": "गिनी", + "countries.gm": "ज़ाम्बिया", + "countries.gw": "गिनी-बिसाऊ", + "countries.gq": "इक्वेटोरियल गिनी", + "countries.gr": "यूनान", + "countries.gd": "ग्रेनाडा", + "countries.gt": "ग्वाटेमाला", + "countries.gy": "गयाना", + "countries.hn": "होंडुरस", + "countries.hr": "क्रोएशिया", + "countries.ht": "हैती", + "countries.hu": "हंगरी", + "countries.id": "इंडोनेशिया", + "countries.in": "भारत", + "countries.ie": "आयरलैंड", + "countries.ir": "ईरान", + "countries.iq": "इराक", + "countries.is": "आइसलैंड", + "countries.il": "इज़राइल", + "countries.it": "इटली", + "countries.jm": "जमैका", + "countries.jo": "जॉर्डन", + "countries.jp": "जापान", + "countries.kz": "कज़ाख़िस्तान", + "countries.ke": "कीनियाा", + "countries.kg": "किर्गिज़स्तान", + "countries.kh": "कंबोडिया", + "countries.ki": "किरिबाती", + "countries.kn": "सेंट किट्स एंड नेविस", + "countries.kr": "दक्षिण कोरिया", + "countries.kw": "कुवैत", + "countries.la": "लाओस", + "countries.lb": "लेबनान", + "countries.lr": "लाइबेरिया", + "countries.ly": "लीबिया", + "countries.lc": "सेंट लूसिया", + "countries.li": "लिकटेंस्टीन", + "countries.lk": "श्रीलंका", + "countries.ls": "लेसोथो", + "countries.lt": "लिथुआनिया", + "countries.lu": "लक्ज़मबर्ग", + "countries.lv": "लातविया", + "countries.ma": "मोरक्को", + "countries.mc": "मोनैको", + "countries.md": "मॉल्डोवा", + "countries.mg": "मेडागास्कर", + "countries.mv": "मालदीव", + "countries.mx": "मेक्सिको", + "countries.mh": "मार्शल द्वीपसमूह", + "countries.mk": "मैसिडोनिया", + "countries.ml": "माली", + "countries.mt": "माल्टा", + "countries.mm": "म्यांमार", + "countries.me": "मोंटेनेग्रो", + "countries.mn": "मंगोलिया", + "countries.mz": "मोज़ाम्बिक", + "countries.mr": "मॉरिटानिया", + "countries.mu": "मॉरिशस", + "countries.mw": "मलावी", + "countries.my": "मलेशिया", + "countries.na": "नामीबिया", + "countries.ne": "नाइजर", + "countries.ng": "नाईजीरिया", + "countries.ni": "निकारागुआ", + "countries.nl": "नीदरलैंड", + "countries.no": "नॉर्वे", + "countries.np": "नेपाल", + "countries.nr": "नाउरु", + "countries.nz": "न्यूजीलैंड", + "countries.om": "ओमान", + "countries.pk": "पाकिस्तान", + "countries.pa": "पनामा", + "countries.pe": "पेरू", + "countries.ph": "फिलीपींस", + "countries.pw": "पलाऊ", + "countries.pg": "पापुआ न्यू गिनी", + "countries.pl": "पोलैंड", + "countries.kp": "उत्तर कोरिया", + "countries.pt": "पुर्तगाल", + "countries.py": "पैराग्वे", + "countries.qa": "क़तर", + "countries.ro": "रोमानिया", + "countries.ru": "रूस", + "countries.rw": "रवांडा", + "countries.sa": "सऊदी अरब", + "countries.sd": "सूडान", + "countries.sn": "सेनेगल", + "countries.sg": "सिंगापुर", + "countries.sb": "सोलोमन द्वीप", + "countries.sl": "सिएरा लियोन", + "countries.sv": "अल साल्वाडोर", + "countries.sm": "सैन मैरिनो", + "countries.so": "सोमालिया", + "countries.rs": "सर्बिया", + "countries.ss": "दक्षिण सूडान", + "countries.st": "साओ तोमे और प्रिंसिपी", + "countries.sr": "सूरीनाम", + "countries.sk": "स्लोवाकिया", + "countries.si": "स्लोवेनिया", + "countries.se": "स्वीडन", + "countries.sz": "स्वाज़ीलैंड", + "countries.sc": "सेशेल्स", + "countries.sy": "सीरिया", + "countries.td": "चाड", + "countries.tg": "टोगो", + "countries.th": "थाईलैंड", + "countries.tj": "ताजिकिस्तान", + "countries.tm": "तुर्कमेनिस्तान", + "countries.tl": "तिमोर-लेस्ते", + "countries.to": "टोंगा", + "countries.tt": "त्रिनिदाद और टोबैगो", + "countries.tn": "ट्यूनीशिया", + "countries.tr": "तुर्की", + "countries.tv": "तुवालू", + "countries.tz": "तंजानिया", + "countries.ug": "युगांडा", + "countries.ua": "यूक्रेन", + "countries.uy": "उरुग्वे", + "countries.us": "संयुक्त राज्य अमेरिका", + "countries.uz": "उज़्बेकिस्तान", + "countries.va": "वैटिकन सिटी", + "countries.vc": "सेंट विंसेंट एंड ग्रेनेडाइंस", + "countries.ve": "वेनेज़ुएला", + "countries.vn": "वियतनाम", + "countries.vu": "वानूआतू", + "countries.ws": "समोआ", + "countries.ye": "यमन", + "countries.za": "दक्षिण अफ्रीका", + "countries.zm": "ज़ाम्बिया", + "countries.zw": "ज़िम्बाब्वे", + "continents.af": "अफ़्रीका", + "continents.an": "अंटार्कटिका", + "continents.as": "एशिया", + "continents.eu": "यूरोप", + "continents.na": "उत्तरी अमेरिका", + "continents.oc": "ओशिनिया", + "continents.sa": "दक्षिण अमेरिका" +} \ No newline at end of file diff --git a/app/init.php b/app/init.php index 8c1d6cb455..97768245ee 100644 --- a/app/init.php +++ b/app/init.php @@ -265,6 +265,7 @@ Locale::setLanguageFromJSON('af', __DIR__.'/config/locale/translations/af.json') Locale::setLanguageFromJSON('ar', __DIR__.'/config/locale/translations/ar.json'); Locale::setLanguageFromJSON('be', __DIR__.'/config/locale/translations/be.json'); Locale::setLanguageFromJSON('bg', __DIR__.'/config/locale/translations/bg.json'); +Locale::setLanguageFromJSON('bh', __DIR__.'/config/locale/translations/bh.json'); Locale::setLanguageFromJSON('bn', __DIR__.'/config/locale/translations/bn.json'); Locale::setLanguageFromJSON('bs', __DIR__.'/config/locale/translations/bs.json'); Locale::setLanguageFromJSON('ca', __DIR__.'/config/locale/translations/ca.json'); From 95838809381a5c526fb0a4fd65ab2bc04f51043b Mon Sep 17 00:00:00 2001 From: Arsan Gamal Date: Fri, 1 Oct 2021 23:16:33 +0200 Subject: [PATCH 064/257] [Fix] Typo fix in translations --- app/config/locale/translations/ar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/ar.json b/app/config/locale/translations/ar.json index 97405dbd0d..9a40d4f1c3 100644 --- a/app/config/locale/translations/ar.json +++ b/app/config/locale/translations/ar.json @@ -6,7 +6,7 @@ "emails.verification.subject": "تأكيد الحساب", "emails.verification.hello": "مرحبا {{name}}", "emails.verification.body": "برجاء اتباع الرابط التالي لتأكيد بريدك الإلكتروني", - "emails.verification.footer": "لو لم تطلب تأكيد هذا البريد الإلكتروني ، يمكنك تجاهل هذه الرسالة", + "emails.verification.footer": "لو لم تطلب تأكيد هذا البريد الإلكتروني، يمكنك تجاهل هذه الرسالة", "emails.verification.thanks": "شكرا", "emails.verification.signature": "فريق {{project}}", "emails.magicSession.subject": "تسجيل الدخول", From ff05dc02523565050e330d81c952fb4f76d08fd3 Mon Sep 17 00:00:00 2001 From: chuiizeet Date: Fri, 1 Oct 2021 16:40:04 -0500 Subject: [PATCH 065/257] Update spanish language translation file --- app/config/locale/translations/es.json | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/es.json b/app/config/locale/translations/es.json index b83bcdf4a4..014223e6ea 100644 --- a/app/config/locale/translations/es.json +++ b/app/config/locale/translations/es.json @@ -3,30 +3,30 @@ "settings.locale": "es", "settings.direction": "ltr", "emails.sender": "Equipo %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Verificación de cuenta", + "emails.verification.hello": "Hola {{name}}", + "emails.verification.body": "Haz clic en este enlace para verificar tu correo.", + "emails.verification.footer": "Si no has solicitado verificar este correo, puedes ignorar este mensaje.", + "emails.verification.thanks": "Gracias", + "emails.verification.signature": "Equipo de {{project}}", + "emails.magicSession.subject": "Inicio de Sesión", + "emails.magicSession.hello": "Hola,", + "emails.magicSession.body": "Haz clic en este enlace para iniciar sesión.", + "emails.magicSession.footer": "Si no has solicitado ingresar usando este correo, puedes ignorar este mensaje.", + "emails.magicSession.thanks": "Gracias", + "emails.magicSession.signature": "Equipo de {{project}}", + "emails.recovery.subject": "Restablecer contraseña", + "emails.recovery.hello": "Hola {{name}}", + "emails.recovery.body": "Haz clic en este enlace para restablecer la contraseña de tu proyecto {{project}}.", + "emails.recovery.footer": "Si no has solicitado restablecer la contraseña, puedes ignorar este mensaje.", + "emails.recovery.thanks": "Gracias", + "emails.recovery.signature": "Equipo de {{project}}", + "emails.invitation.subject": "Invitacion al Equipo %s en %s", + "emails.invitation.hello": "Hola", + "emails.invitation.body": "Este correo ha sido enviado a petición de {{owner}} quien quiere invitarte a formar parte del equipo {{team}} en el proyecto {{project}}.", + "emails.invitation.footer": "Si no estas interesado, puedes ignorar este mensaje.", + "emails.invitation.thanks": "Gracias", + "emails.invitation.signature": "Equipo de {{project}}", "locale.country.unknown": "Desconocido", "countries.af": "Afganistán", "countries.ao": "Angola", @@ -139,7 +139,7 @@ "countries.md": "Moldavia", "countries.mg": "Madagascar", "countries.mv": "Maldivas", - "countries.mx": "Mexico", + "countries.mx": "México", "countries.mh": "Islas Marshall", "countries.mk": "Macedonia", "countries.ml": "Malí", From 438974c4d229a852859468bffdc8f9a914a3fc92 Mon Sep 17 00:00:00 2001 From: RukmalFernando <66022861+RukmalFernando@users.noreply.github.com> Date: Sat, 2 Oct 2021 03:37:59 +0530 Subject: [PATCH 066/257] Update Sinhala translations & fix 2 country-name --- app/config/locale/translations/si.json | 54 +++++++++++++------------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/app/config/locale/translations/si.json b/app/config/locale/translations/si.json index 82e29b5b5c..0253a9420c 100644 --- a/app/config/locale/translations/si.json +++ b/app/config/locale/translations/si.json @@ -3,31 +3,31 @@ "settings.locale": "si", "settings.direction": "ltr", "emails.sender": "%s කණ්ඩායම", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", - "locale.country.unknown": "Unknown", + "emails.verification.subject": "ගිණුම් සත්‍යාපනය", + "emails.verification.hello": "හේයි {{name}}", + "emails.verification.body": "ඔබගේ විද්‍යුත් තැපැල් ලිපිනය සත්‍යාපනය කිරීමට මෙම සම්බන්ධකය අනුගමනය කරන්න.", + "emails.verification.footer": "මෙම ලිපිනය සත්‍යාපනය කරන ලෙස ඔබ ඉල්ලුවේ නැත්නම්, ඔබට මෙම පණිවිඩය නොසලකා හැරිය හැක.", + "emails.verification.thanks": "ස්තුතියි", + "emails.verification.signature": "{{project}} කණ්ඩායම", + "emails.magicSession.subject": "ප්‍රවේශ වන්න", + "emails.magicSession.hello": "හේයි,", + "emails.magicSession.body": "ප්‍රවේශ වීමට මෙම සම්බන්ධකය අනුගමනය කරන්න.", + "emails.magicSession.footer": "මෙම විද්‍යුත් තැපෑල භාවිතයෙන් ප්‍රවේශ වීමට ඔබ ඉල්ලුවේ නැත්නම්, ඔබට මෙම පණිවිඩය නොසලකා හැරිය හැක.", + "emails.magicSession.thanks": "ස්තුතියි", + "emails.magicSession.signature": "{{project}} කණ්ඩායම", + "emails.recovery.subject": "මුරපද යළි පිහිටුවීම", + "emails.recovery.hello": "ආයුබෝවන් {{name}}", + "emails.recovery.body": "ඔබගේ {{project}} මුරපදය නැවත සැකසීමට මෙම සම්බන්ධකය අනුගමනය කරන්න.", + "emails.recovery.footer": "ඔබගේ මුරපදය නැවත සකසන ලෙස ඔබ ඉල්ලුවේ නැත්නම්, ඔබට මෙම පණිවිඩය නොසලකා හැරිය හැක.", + "emails.recovery.thanks": "ස්තුතියි", + "emails.recovery.signature": "{{project}} කණ්ඩායම", + "emails.invitation.subject": "%s කණ්ඩායමට ආරාධනා %s හි", + "emails.invitation.hello": "ආයුබෝවන්", + "emails.invitation.body": "මෙම තැපැල් ඔබට එව්වේ, {{owner}} හට {{project}} හි {{team}} කණ්ඩායමේ සාමාජිකයෙකු වීමට ඔබට ආරාධනා කිරීමට අවශ්‍ය වූ බැවිනි.", + "emails.invitation.footer": "ඔබ උනන්දුවක් නොදක්වන්නේ නම්, ඔබට මෙම පණිවිඩය නොසලකා හැරිය හැක.", + "emails.invitation.thanks": "ස්තුතියි", + "emails.invitation.signature": "{{project}} කණ්ඩායම", + "locale.country.unknown": "නොදන්නා", "countries.af": "ඇෆ්ගනිස්ථානය", "countries.ao": "ඇන්ගෝලා", "countries.al": "ඇල්බේනියාව", @@ -110,14 +110,14 @@ "countries.ir": "ඉරානය", "countries.iq": "ඉරාකය", "countries.is": "අයිස්ලන්තය", - "countries.il": "ඊශ්රායෙල්", + "countries.il": "ඊශ්‍රායලය", "countries.it": "ඉතාලිය", "countries.jm": "ජැමෙයිකාව", "countries.jo": "ජෝර්දානය", "countries.jp": "ජපානය", "countries.kz": "කසකස්තානය", "countries.ke": "කෙන්යාව", - "countries.kg": "ක්‍රිගිස්තානය", + "countries.kg": "කිර්ගිස්තානය", "countries.kh": "කාම්බෝජය", "countries.ki": "කිරිබති", "countries.kn": "ශාන්ත කිට්ස් සහ නෙවිස්", From a2f6ef0b19b3bd9b6ef513995a51a4c485f44814 Mon Sep 17 00:00:00 2001 From: HelloSeaNation Date: Sat, 2 Oct 2021 14:41:43 +1300 Subject: [PATCH 067/257] Update zh-cn.json --- app/config/locale/translations/zh-cn.json | 50 +++++++++++------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/zh-cn.json b/app/config/locale/translations/zh-cn.json index f6739a1edb..fa997c07f6 100644 --- a/app/config/locale/translations/zh-cn.json +++ b/app/config/locale/translations/zh-cn.json @@ -3,30 +3,30 @@ "settings.locale": "zh", "settings.direction": "ltr", "emails.sender": "%s 小组", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "帐户验证", + "emails.verification.hello": "你好 {{name}}", + "emails.verification.body": "点此链接验证您的电子邮件地址。", + "emails.verification.footer": "如果您没有要求验证此地址,则可忽略此消息。", + "emails.verification.thanks": "谢谢", + "emails.verification.signature": "{{project}} 团队", + "emails.magicSession.subject": "登录", + "emails.magicSession.hello": "你好,", + "emails.magicSession.body": "点此链接登录。", + "emails.magicSession.footer": "如果您没有要求使用此电子邮件登录,则可忽略此消息。", + "emails.magicSession.thanks": "谢谢", + "emails.magicSession.signature": "{{project}} 团队", + "emails.recovery.subject": "重设密码", + "emails.recovery.hello": "你好 {{name}}", + "emails.recovery.body": "点此链接重置您的 {{project}} 密码。", + "emails.recovery.footer": "如果您没有要求重置密码,则可以忽略此消息。", + "emails.recovery.thanks": "谢谢", + "emails.recovery.signature": "{{project}} 团队", + "emails.invitation.subject": "邀请 %s 团队在 %s", + "emails.invitation.hello": "你好", + "emails.invitation.body": "这封邮件发送给您是因为 {{owner}} 想邀请您成为 {{team}} 团队在 {{project}}.", + "emails.invitation.footer": "如果您不感兴趣,可以忽略此消息。", + "emails.invitation.thanks": "谢谢", + "emails.invitation.signature": "{{project}} 团队", "locale.country.unknown": "未知", "countries.af": "阿富汗", "countries.ao": "安哥拉", @@ -229,4 +229,4 @@ "continents.na": "北美洲", "continents.oc": "大洋洲", "continents.sa": "南美洲" -} \ No newline at end of file +} From de43fabb93bdc63091e77926518529417de7782f Mon Sep 17 00:00:00 2001 From: HelloSeaNation Date: Sat, 2 Oct 2021 14:47:29 +1300 Subject: [PATCH 068/257] Update zh-cn.json tidy up the line at the bottom From d462db0cfbe81f2f8db4d1d130d54c3a40cea923 Mon Sep 17 00:00:00 2001 From: HelloSeaNation Date: Sat, 2 Oct 2021 14:48:03 +1300 Subject: [PATCH 069/257] Update zh-cn.json From 062da599a524634eb062437bacc3701451fc5863 Mon Sep 17 00:00:00 2001 From: Dazzler Kumar Date: Sat, 2 Oct 2021 15:01:54 +0530 Subject: [PATCH 070/257] Added Bihari Translations --- app/config/locale/codes.php | 2 +- app/config/locale/translations/bh.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index c0fdc33bc0..4d65a72dc7 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -5,7 +5,7 @@ return [ 'ar', // Arabic 'be', // Belarusian 'bg', // Bulgarian - 'bh', // Bhojpuri or Bihari + 'bh', // Bihari 'bn', // Bengali 'bs', //Bosnian 'ca', // Catalan diff --git a/app/config/locale/translations/bh.json b/app/config/locale/translations/bh.json index 426af925bd..7b48a4d2a7 100644 --- a/app/config/locale/translations/bh.json +++ b/app/config/locale/translations/bh.json @@ -1,5 +1,5 @@ { - "settings.inspire": "\"बुद्धिमान होवे की वह कला बा जॉन जानने की कला होला कि का अनदेखा किया जाए। \"", + "settings.inspire": "\"बुद्धिमान होइत क कला ई जाने क कला अछि जे की अनदेखा कर्मा चाहि| \"", "settings.locale": "bh", "settings.direction": "ltr", "emails.sender": "%s टीम", @@ -27,7 +27,7 @@ "emails.invitation.footer": "", "emails.invitation.thanks": "", "emails.invitation.signature": "", - "locale.country.unknown": "अज्ञात", + "locale.country.unknown": "अनजान", "countries.af": "अफ़ग़ानिस्तान", "countries.ao": "अंगोला", "countries.al": "अल्बानिया", From b6ee537537c3f402aa5a660979351307c49aec1b Mon Sep 17 00:00:00 2001 From: Kokoden <51828039+Kokoden@users.noreply.github.com> Date: Sat, 2 Oct 2021 16:39:06 +0200 Subject: [PATCH 071/257] Add Hebrew translation --- app/config/locale/translations/he.json | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/he.json b/app/config/locale/translations/he.json index 93527c6fab..71d171df4c 100644 --- a/app/config/locale/translations/he.json +++ b/app/config/locale/translations/he.json @@ -1,32 +1,32 @@ { - "settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"", + "settings.inspire": "\"להיות חכם זה לדעת מתי להתעלם.\"", "settings.locale": "he", "settings.direction": "rtl", "emails.sender": "צוות %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "אימות חשבון", + "emails.verification.hello": "שלום {{name}}", + "emails.verification.body": "לחץ על קישור זה כדי לאמת את כתובת הדוא\"ל שלך.", + "emails.verification.footer": "אם לא ביקשת לאמת כתובת זו, תוכל להתעלם מהודעה זו.", + "emails.verification.thanks": "תודה", + "emails.verification.signature": "צוות {{project}}", + "emails.magicSession.subject": "כניסה למערכת", + "emails.magicSession.hello": "שלום,", + "emails.magicSession.body": "לחץ על קישור זה כדי להיכנס.", + "emails.magicSession.footer": "אם לא ביקשת להיכנס באמצעות דוא\"ל זה, תוכל להתעלם מהודעה זו.", + "emails.magicSession.thanks": "תודה", + "emails.magicSession.signature": "צוות {{project}}", + "emails.recovery.subject": "איפוס סיסמא", + "emails.recovery.hello": "שלום {{name}}", + "emails.recovery.body": "עקוב אחר קישור זה כדי לאפס את סיסמת הפרויקט {{project}}.", + "emails.recovery.footer": "אם לא ביקשת לאפס את הסיסמה, תוכל להתעלם מהודעה זו.", + "emails.recovery.thanks": "תודה", + "emails.recovery.signature": "צוות {{project}}", + "emails.invitation.subject": "הזמנה לצוות %s ב- %s", + "emails.invitation.hello": "שלום", + "emails.invitation.body": "דואר זה נשלח אליך מכיוון ש {{owner}} רצה להזמין אותך להיות חבר בצוות {{team}} ב- {{project}}.", + "emails.invitation.footer": "אם אינך מעוניין, תוכל להתעלם מהודעה זו.", + "emails.invitation.thanks": "תודה", + "emails.invitation.signature": "צוות {{project}}", "locale.country.unknown": "לא ידוע", "countries.af": "אפגניסטן", "countries.ao": "אנגולה", From cc006d695465d063361ebb74c82ee007f372c5a7 Mon Sep 17 00:00:00 2001 From: Minna N <44906587+minna-xD@users.noreply.github.com> Date: Sat, 2 Oct 2021 20:32:51 +0300 Subject: [PATCH 072/257] Updated Finnish translations --- app/config/locale/translations/fi.json | 56 +++++++++++++------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/app/config/locale/translations/fi.json b/app/config/locale/translations/fi.json index 15d4508f5d..f407bf4d04 100644 --- a/app/config/locale/translations/fi.json +++ b/app/config/locale/translations/fi.json @@ -1,33 +1,33 @@ { - "settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"", + "settings.inspire": "\"Viisaus merkitsee epäolennaisen ohittamisen taitoa.\"", "settings.locale": "fi", "settings.direction": "ltr", "emails.sender": "%s Tiimi", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", - "locale.country.unknown": "Unknown", + "emails.verification.subject": "Tilin vahvistaminen", + "emails.verification.hello": "Hei {{name}}", + "emails.verification.body": "Vahvista sähköpostiosoitteesi napsauttamalla tätä linkkiä.", + "emails.verification.footer": "Voit ohittaa tämän viestin, jos et pyytänyt sähköpostiosoitteen vahvistamista.", + "emails.verification.thanks": "Kiitos", + "emails.verification.signature": "Projektin {{project}} tiimi", + "emails.magicSession.subject": "Sisäänkirjautuminen", + "emails.magicSession.hello": "Hei,", + "emails.magicSession.body": "Kirjaudu sisään napsauttamalla tätä linkkiä.", + "emails.magicSession.footer": "Voit ohittaa tämän viestin, jos et pyytänyt sisäänkirjautumista tällä sähköpostiosoitteella.", + "emails.magicSession.thanks": "Kiitos", + "emails.magicSession.signature": "Projektin {{project}} tiimi", + "emails.recovery.subject": "Salasanan nollaaminen", + "emails.recovery.hello": "Hei {{name}}", + "emails.recovery.body": "Nollaa projektin {{project}} salasanasi napsauttamalla tätä linkkiä.", + "emails.recovery.footer": "Voit ohittaa tämän viestin, jos et pyytänyt salasanasi nollaamista.", + "emails.recovery.thanks": "Kiitos", + "emails.recovery.signature": "Projektin {{project}} tiimi", + "emails.invitation.subject": "Kutsu liittyä tiimiin %s projektissa %s", + "emails.invitation.hello": "Hei", + "emails.invitation.body": "Saat tämän viestin, koska {{owner}} haluaa kutsua sinut tiimin {{team}} jäseneksi projektissa {{project}}.", + "emails.invitation.footer": "Voit ohittaa tämän viestin, jos et halua liittyä tiimiin.", + "emails.invitation.thanks": "Kiitos", + "emails.invitation.signature": "Projektin {{project}} tiimi", + "locale.country.unknown": "Tuntematon", "countries.af": "Afganistan", "countries.ao": "Angola", "countries.al": "Albania", @@ -226,7 +226,7 @@ "continents.an": "Antarktis", "continents.as": "Aasia", "continents.eu": "Eurooppa", - "continents.na": "Pohjois Amerikka", + "continents.na": "Pohjois-Amerikka", "continents.oc": "Oceania", - "continents.sa": "Etelä Amerikka" + "continents.sa": "Etelä-Amerikka" } \ No newline at end of file From 9a6a5cb37fe5de3853d45ed66311aed04ea9fb67 Mon Sep 17 00:00:00 2001 From: teeradon43 Date: Sun, 3 Oct 2021 03:13:37 +0700 Subject: [PATCH 073/257] Update translations for Thai --- app/config/locale/translations/th.json | 52 +++++++++++++------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/app/config/locale/translations/th.json b/app/config/locale/translations/th.json index df80f6c76e..aefa60203c 100644 --- a/app/config/locale/translations/th.json +++ b/app/config/locale/translations/th.json @@ -1,32 +1,32 @@ { - "settings.inspire": "\"ศิลปะแห่งความฉลาดคือศิลปะแห่งการรู้ว่าจะมองข้ามอะไร\"", + "settings.inspire": "\"ศิลปะของการมีปัญญา คือการตระหนักได้ว่าควรจะมองข้ามเรื่องอะไร\"", "settings.locale": "th", "settings.direction": "ltr", - "emails.sender": "%s ทีม", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.sender": "ทีม %s", + "emails.verification.subject": "การยืนยันบัญชีผู้ใช้", + "emails.verification.hello": "เรียนคุณ {{name}}", + "emails.verification.body": "กดเข้าไปที่ลิงก์นี้เพื่อยืนยันอีเมลของท่าน", + "emails.verification.footer": "หากท่านไม่ได้ต้องการที่จะยืนยันอีเมลนี้ ท่านสามารถเพิกเฉยกับข้อความนี้ได้", + "emails.verification.thanks": "ขอบคุณ", + "emails.verification.signature": "ทีม {{project}}", + "emails.magicSession.subject": "เข้าสู่ระบบ", + "emails.magicSession.hello": "เรียนผู้ใช้งาน,", + "emails.magicSession.body": "กดเข้าไปที่ลิงก์นี้เพื่อเข้าสู่ระบบ", + "emails.magicSession.footer": "หากท่านไม่ได้ต้องการที่จะเข้าสู่ระบบด้วยอีเมลนี้ ท่านสามารถเพิกเฉยกับข้อความนี้ได้", + "emails.magicSession.thanks": "ขอบคุณ", + "emails.magicSession.signature": "ทีม {{project}}", + "emails.recovery.subject": "รีเซ็ตรหัสผ่าน", + "emails.recovery.hello": "เรียนคุณ {{name}}", + "emails.recovery.body": "กดเข้าไปที่ลิงก์นี้เพื่อรีเซ็ตรหัสผ่าน {{project}} ของท่าน", + "emails.recovery.footer": "หากท่านไม่ได้ต้องการที่จะรีเซ็ตรหัสผ่านของท่าน ท่านสามารถเพิกเฉยกับข้อความนี้ได้", + "emails.recovery.thanks": "ขอบคุณ", + "emails.recovery.signature": "ทีม {{project}}", + "emails.invitation.subject": "เรียนเชิญเข้าร่วม ทีม %s จากโปรเจกต์ %s", + "emails.invitation.hello": "สวัสดี", + "emails.invitation.body": "ท่านได้รับอีเมลฉบับนี้เนื่องจาก {{owner}} ต้องการที่จะเชิญชวนคุณเข้าร่วมเป็นส่วนหนึ่งของ ทีม {{team}} จากโปรเจกต์ {{project}}", + "emails.invitation.footer": "หากท่านไม่ได้สนใจที่จะเข้าร่วม ท่านสามารถเพิกเฉยกับข้อความนี้ได้", + "emails.invitation.thanks": "ขอบคุณ", + "emails.invitation.signature": "ทีม {{project}}", "locale.country.unknown": "ไม่ทราบ", "countries.af": "อัฟกานิสถาน", "countries.ao": "แองโกลา", From 8a323c6e2b221d58fe4ee0411635dca7cdff3e1b Mon Sep 17 00:00:00 2001 From: teeradon43 Date: Sun, 3 Oct 2021 03:22:23 +0700 Subject: [PATCH 074/257] Updated th translations --- app/config/locale/translations/th.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/config/locale/translations/th.json b/app/config/locale/translations/th.json index aefa60203c..62b8f17cdb 100644 --- a/app/config/locale/translations/th.json +++ b/app/config/locale/translations/th.json @@ -6,25 +6,25 @@ "emails.verification.subject": "การยืนยันบัญชีผู้ใช้", "emails.verification.hello": "เรียนคุณ {{name}}", "emails.verification.body": "กดเข้าไปที่ลิงก์นี้เพื่อยืนยันอีเมลของท่าน", - "emails.verification.footer": "หากท่านไม่ได้ต้องการที่จะยืนยันอีเมลนี้ ท่านสามารถเพิกเฉยกับข้อความนี้ได้", + "emails.verification.footer": "หากท่านไม่ได้ต้องการที่จะยืนยันอีเมลนี้ ท่านสามารถเพิกเฉยข้อความนี้ได้", "emails.verification.thanks": "ขอบคุณ", "emails.verification.signature": "ทีม {{project}}", "emails.magicSession.subject": "เข้าสู่ระบบ", "emails.magicSession.hello": "เรียนผู้ใช้งาน,", "emails.magicSession.body": "กดเข้าไปที่ลิงก์นี้เพื่อเข้าสู่ระบบ", - "emails.magicSession.footer": "หากท่านไม่ได้ต้องการที่จะเข้าสู่ระบบด้วยอีเมลนี้ ท่านสามารถเพิกเฉยกับข้อความนี้ได้", + "emails.magicSession.footer": "หากท่านไม่ได้ต้องการที่จะเข้าสู่ระบบด้วยอีเมลนี้ ท่านสามารถเพิกเฉยข้อความนี้ได้", "emails.magicSession.thanks": "ขอบคุณ", "emails.magicSession.signature": "ทีม {{project}}", "emails.recovery.subject": "รีเซ็ตรหัสผ่าน", "emails.recovery.hello": "เรียนคุณ {{name}}", - "emails.recovery.body": "กดเข้าไปที่ลิงก์นี้เพื่อรีเซ็ตรหัสผ่าน {{project}} ของท่าน", - "emails.recovery.footer": "หากท่านไม่ได้ต้องการที่จะรีเซ็ตรหัสผ่านของท่าน ท่านสามารถเพิกเฉยกับข้อความนี้ได้", + "emails.recovery.body": "กดเข้าไปที่ลิงก์นี้เพื่อรีเซ็ตรหัสผ่านสำหรับโปรเจกต์ {{project}} ของท่าน", + "emails.recovery.footer": "หากท่านไม่ได้ต้องการที่จะรีเซ็ตรหัสผ่านของท่าน ท่านสามารถเพิกเฉยข้อความนี้ได้", "emails.recovery.thanks": "ขอบคุณ", "emails.recovery.signature": "ทีม {{project}}", "emails.invitation.subject": "เรียนเชิญเข้าร่วม ทีม %s จากโปรเจกต์ %s", "emails.invitation.hello": "สวัสดี", "emails.invitation.body": "ท่านได้รับอีเมลฉบับนี้เนื่องจาก {{owner}} ต้องการที่จะเชิญชวนคุณเข้าร่วมเป็นส่วนหนึ่งของ ทีม {{team}} จากโปรเจกต์ {{project}}", - "emails.invitation.footer": "หากท่านไม่ได้สนใจที่จะเข้าร่วม ท่านสามารถเพิกเฉยกับข้อความนี้ได้", + "emails.invitation.footer": "หากท่านไม่ได้สนใจที่จะเข้าร่วม ท่านสามารถเพิกเฉยข้อความนี้ได้", "emails.invitation.thanks": "ขอบคุณ", "emails.invitation.signature": "ทีม {{project}}", "locale.country.unknown": "ไม่ทราบ", From e08d9bbda2c4ba191a969cb700860e19529a486a Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Sat, 2 Oct 2021 22:26:55 +0200 Subject: [PATCH 075/257] Add new Titanium SDK --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ab4670f19a..42c6b99892 100644 --- a/README.md +++ b/README.md @@ -123,6 +123,7 @@ Below is a list of currently supported platforms and languages. If you wish to h * ✅   [Web](https://github.com/appwrite/sdk-for-web) (Maintained by the Appwrite Team) * ✅   [Flutter](https://github.com/appwrite/sdk-for-flutter) (Maintained by the Appwrite Team) * ✅   [Android](https://github.com/appwrite/sdk-for-android) (Maintained by the Appwrite Team) +* ✅   [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (Maintained by [Michael Gangolf](https://github.com/m1ga/)) #### Server * ✅   [NodeJS](https://github.com/appwrite/sdk-for-node) (Maintained by the Appwrite Team) From a8b06a51f289983cc70267c779c8af6ab98f70c6 Mon Sep 17 00:00:00 2001 From: Eden <51828039+Kokoden@users.noreply.github.com> Date: Sat, 2 Oct 2021 23:46:53 +0200 Subject: [PATCH 076/257] Fix Hebrew translation Co-authored-by: Eldad A. Fux --- app/config/locale/translations/he.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/he.json b/app/config/locale/translations/he.json index 71d171df4c..13ad351376 100644 --- a/app/config/locale/translations/he.json +++ b/app/config/locale/translations/he.json @@ -1,5 +1,5 @@ { - "settings.inspire": "\"להיות חכם זה לדעת מתי להתעלם.\"", + "settings.inspire": "\"להיות חכם זה לדעת ממה להתעלם.\"", "settings.locale": "he", "settings.direction": "rtl", "emails.sender": "צוות %s", From 32aa7c321b8bb045ba729cd97eee372f4442f1f3 Mon Sep 17 00:00:00 2001 From: Michael Gangolf Date: Sat, 2 Oct 2021 23:47:29 +0200 Subject: [PATCH 077/257] Update README.md move to `community` section --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 42c6b99892..b2cab46b4a 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ Table of Contents: - [SDKs](#sdks) - [Client](#client) - [Server](#server) + - [Community](#community) - [Contributing](#contributing) - [Security](#security) - [Follow Us](#follow-us) @@ -123,7 +124,6 @@ Below is a list of currently supported platforms and languages. If you wish to h * ✅   [Web](https://github.com/appwrite/sdk-for-web) (Maintained by the Appwrite Team) * ✅   [Flutter](https://github.com/appwrite/sdk-for-flutter) (Maintained by the Appwrite Team) * ✅   [Android](https://github.com/appwrite/sdk-for-android) (Maintained by the Appwrite Team) -* ✅   [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (Maintained by [Michael Gangolf](https://github.com/m1ga/)) #### Server * ✅   [NodeJS](https://github.com/appwrite/sdk-for-node) (Maintained by the Appwrite Team) @@ -135,6 +135,9 @@ Below is a list of currently supported platforms and languages. If you wish to h * ✅   [Kotlin](https://github.com/appwrite/sdk-for-kotlin) - **Beta** (Maintained by the Appwrite Team) * ✅   [.NET](https://github.com/appwrite/sdk-for-dotnet) - **Experimental** (Maintained by the Appwrite Team) +#### Community +* ✅   [Appcelerator Titanium](https://github.com/m1ga/ti.appwrite) (Maintained by [Michael Gangolf](https://github.com/m1ga/)) + Looking for more SDKs? - Help us by contributing a pull request to our [SDK Generator](https://github.com/appwrite/sdk-generator)! ## Contributing From 9782cb02f28cee176bd15e7658b854d85477922b Mon Sep 17 00:00:00 2001 From: Eden <51828039+Kokoden@users.noreply.github.com> Date: Sat, 2 Oct 2021 23:53:45 +0200 Subject: [PATCH 078/257] Apply translation fixes from code review Co-authored-by: Eldad A. Fux --- app/config/locale/translations/he.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/he.json b/app/config/locale/translations/he.json index 13ad351376..ef4af6f56e 100644 --- a/app/config/locale/translations/he.json +++ b/app/config/locale/translations/he.json @@ -17,13 +17,13 @@ "emails.magicSession.signature": "צוות {{project}}", "emails.recovery.subject": "איפוס סיסמא", "emails.recovery.hello": "שלום {{name}}", - "emails.recovery.body": "עקוב אחר קישור זה כדי לאפס את סיסמת הפרויקט {{project}}.", + "emails.recovery.body": "עקוב אחר קישור זה כדי לאפס את סיסמתך ב-{{project}}.", "emails.recovery.footer": "אם לא ביקשת לאפס את הסיסמה, תוכל להתעלם מהודעה זו.", "emails.recovery.thanks": "תודה", "emails.recovery.signature": "צוות {{project}}", "emails.invitation.subject": "הזמנה לצוות %s ב- %s", "emails.invitation.hello": "שלום", - "emails.invitation.body": "דואר זה נשלח אליך מכיוון ש {{owner}} רצה להזמין אותך להיות חבר בצוות {{team}} ב- {{project}}.", + "emails.invitation.body": "דואר זה נשלח אליך מכיוון ש {{owner}} רצה להזמין אותך להיות חבר בצוות {{team}} ב-{{project}}.", "emails.invitation.footer": "אם אינך מעוניין, תוכל להתעלם מהודעה זו.", "emails.invitation.thanks": "תודה", "emails.invitation.signature": "צוות {{project}}", From fbea7189602e3369afeb8fdfd8dc374fbd12d9a5 Mon Sep 17 00:00:00 2001 From: Oscar RG Date: Sun, 3 Oct 2021 09:26:03 +0200 Subject: [PATCH 079/257] feat(locales):Add Luxembourgish(lb) translation --- app/config/locale/codes.php | 1 + app/config/locale/translations/lb.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/lb.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index c8623f533c..0292315ce0 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -30,6 +30,7 @@ return [ 'kn', // Kannada 'km', // Khmer 'ko', // Korean + 'lb', // Luxembourgish 'lt', // Lithuanian 'ml', // Malayalam 'mr', // Marathi diff --git a/app/config/locale/translations/lb.json b/app/config/locale/translations/lb.json new file mode 100644 index 0000000000..d874d46a70 --- /dev/null +++ b/app/config/locale/translations/lb.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"", + "settings.locale": "lb", + "settings.direction": "ltr", + "emails.sender": "%s Team", + "emails.verification.subject": "Kont Verifikatioun", + "emails.verification.hello": "Hey {{name}}", + "emails.verification.body": "Follegt dëse Link fir Är E -Mail Adress z'iwwerpréiwen.", + "emails.verification.footer": "Wann Dir net gefrot hutt dës Adress z'iwwerpréiwen, kënnt Dir dëse Message ignoréieren.", + "emails.verification.thanks": "Merci", + "emails.verification.signature": "{{project}} équipe", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Hey,", + "emails.magicSession.body": "Follegt dëse Link fir umellen.", + "emails.magicSession.footer": "Wann Dir net gefrot hutt Iech mat dëser E -Mail anzemelden, kënnt Dir dëse Message ignoréieren.", + "emails.magicSession.thanks": "Merci", + "emails.magicSession.signature": "{{project}} équipe", + "emails.recovery.subject": "Password Reset", + "emails.recovery.hello": "Hello {{name}}", + "emails.recovery.body": "Follegt dëse Link fir Äert {{project}} Passwuert zréckzesetzen.", + "emails.recovery.footer": "Wann Dir net gefrot hutt Äert Passwuert zréckzesetzen, kënnt Dir dëse Message ignoréieren.", + "emails.recovery.thanks": "Merci", + "emails.recovery.signature": "{{project}} équipe", + "emails.invitation.subject": "Invitatioun un %s équipe bei %s", + "emails.invitation.hello": "Hallo", + "emails.invitation.body": "Dës E -Mail gouf un Iech geschéckt well {{owner}} Iech invitéiere wëllt fir Member vum {{team}} Team bei {{project}} ze ginn.", + "emails.invitation.footer": "Wann Dir net interesséiert sidd, kënnt Dir dëse Message ignoréieren.", + "emails.invitation.thanks": "Merci", + "emails.invitation.signature": "{{project}} équipe", + "locale.country.unknown": "Onbekannt", + "countries.af": "Afghanistan", + "countries.ao": "Angola", + "countries.al": "Albanien", + "countries.ad": "Andorra", + "countries.ae": "Vereenegt Arabesch Emirater", + "countries.ar": "Argentinien", + "countries.am": "Armenien", + "countries.ag": "Antigua a Barbuda", + "countries.au": "Australien", + "countries.at": "Éisträich", + "countries.az": "Aserbaidschan", + "countries.bi": "Burundi", + "countries.be": "Belsch", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesch", + "countries.bg": "Bulgarien", + "countries.bh": "Bahrain", + "countries.bs": "Bahamas", + "countries.ba": "Bosnien an Herzegowina", + "countries.by": "Wäissrussland", + "countries.bz": "Belize", + "countries.bo": "Bolivien", + "countries.br": "Brasilien", + "countries.bb": "Barbados", + "countries.bn": "Brunei", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Zentralafrikanesch Republik", + "countries.ca": "Kanada", + "countries.ch": "Schwäiz", + "countries.cl": "Chile", + "countries.cn": "China", + "countries.ci": "Côte d'Ivoire", + "countries.cm": "Kamerun", + "countries.cd": "DR Congo", + "countries.cg": "Republik Kongo", + "countries.co": "Kolumbien", + "countries.km": "Komoren", + "countries.cv": "Cap Vert", + "countries.cr": "Costa Rica", + "countries.cu": "Kuba", + "countries.cy": "Zypern", + "countries.cz": "Tschechien", + "countries.de": "Däitschland", + "countries.dj": "Djibouti", + "countries.dm": "Dominica", + "countries.dk": "Dänemark", + "countries.do": "Dominikanesch Republik", + "countries.dz": "Algerien", + "countries.ec": "Ecuador", + "countries.eg": "Ägypten", + "countries.er": "Eritrea", + "countries.es": "Spuenien", + "countries.ee": "Estland", + "countries.et": "Äthiopien", + "countries.fi": "Finnland", + "countries.fj": "Fidschi", + "countries.fr": "Frankräich", + "countries.fm": "Mikronesien", + "countries.ga": "Gabon", + "countries.gb": "Vereenegt Kinnekräich", + "countries.ge": "Georgien", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Äquatorialguinea", + "countries.gr": "Griichenland", + "countries.gd": "Granada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Kroatien", + "countries.ht": "Haïti", + "countries.hu": "Ungarn", + "countries.id": "Indonesien", + "countries.in": "Indien", + "countries.ie": "Irland", + "countries.ir": "Iran", + "countries.iq": "Irak", + "countries.is": "Island", + "countries.il": "Israel", + "countries.it": "Italien", + "countries.jm": "Jamaika", + "countries.jo": "Jordanien", + "countries.jp": "Japan", + "countries.kz": "Kazakhstan", + "countries.ke": "Kenia", + "countries.kg": "Kirgisistan", + "countries.kh": "Kambodscha", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts and Nevis", + "countries.kr": "Südkorea", + "countries.kw": "Kuwait", + "countries.la": "Laos", + "countries.lb": "Libanon", + "countries.lr": "Liberia", + "countries.ly": "Libyen", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Litauen", + "countries.lu": "Lëtzebuerg", + "countries.lv": "Lettland", + "countries.ma": "Marokko", + "countries.mc": "Monaco", + "countries.md": "Moldawien", + "countries.mg": "Madagaskar", + "countries.mv": "Malediven", + "countries.mx": "Mexiko", + "countries.mh": "Marshallinselen", + "countries.mk": "Mazedonien", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Myanmar", + "countries.me": "Montenegro", + "countries.mn": "Mongolei", + "countries.mz": "Mosambik", + "countries.mr": "Mauritanien", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malaysien", + "countries.na": "Namibien", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nicaragua", + "countries.nl": "Holland", + "countries.no": "Norwegen", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "Neiséiland", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Philippinnen", + "countries.pw": "Palau", + "countries.pg": "Papua-Neuguinea", + "countries.pl": "Polen", + "countries.kp": "Nordkorea", + "countries.pt": "Portugal", + "countries.py": "Paraguay", + "countries.qa": "Quatar", + "countries.ro": "Rumänien", + "countries.ru": "Russland", + "countries.rw": "Ruanda", + "countries.sa": "Saudi Arabien", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapur", + "countries.sb": "Solomon Inselen", + "countries.sl": "Sierra Leone", + "countries.sv": "El Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbien", + "countries.ss": "Südsudan", + "countries.st": "Sao Tome a Principe", + "countries.sr": "Suriname", + "countries.sk": "Slowakei", + "countries.si": "Slowenien", + "countries.se": "Schweden", + "countries.sz": "Swasiland", + "countries.sc": "Seychellen", + "countries.sy": "Syrien", + "countries.td": "Tschad", + "countries.tg": "Goen", + "countries.th": "Thailand", + "countries.tj": "Tadjikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Timor-Leste", + "countries.to": "Tonga", + "countries.tt": "Tinidad an Tobago", + "countries.tn": "Tunesien", + "countries.tr": "Tierkei", + "countries.tv": "Tuvalu", + "countries.tz": "Tansania", + "countries.ug": "Ugana", + "countries.ua": "Ukraine", + "countries.uy": "Uruguay", + "countries.us": "Vereenegt Staaten", + "countries.uz": "Usbekistan", + "countries.va": "Vatikan Stad", + "countries.vc": "Saint Vincent an d'Grenadinnen", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Yemen", + "countries.za": "Südafrika", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Afrika", + "continents.an": "Antarktis", + "continents.as": "Asien", + "continents.eu": "Europa", + "continents.na": "Nordamerika", + "continents.oc": "Ozeanien", + "continents.sa": "Südamerika" +} diff --git a/app/init.php b/app/init.php index 8c1d6cb455..6431c6eb95 100644 --- a/app/init.php +++ b/app/init.php @@ -290,6 +290,7 @@ Locale::setLanguageFromJSON('jv', __DIR__.'/config/locale/translations/jv.json') Locale::setLanguageFromJSON('kn', __DIR__.'/config/locale/translations/kn.json'); Locale::setLanguageFromJSON('km', __DIR__.'/config/locale/translations/km.json'); Locale::setLanguageFromJSON('ko', __DIR__.'/config/locale/translations/ko.json'); +Locale::setLanguageFromJSON('lb', __DIR__.'/config/locale/translations/lb.json'); Locale::setLanguageFromJSON('lt', __DIR__.'/config/locale/translations/lt.json'); Locale::setLanguageFromJSON('ml', __DIR__.'/config/locale/translations/ml.json'); Locale::setLanguageFromJSON('mr', __DIR__.'/config/locale/translations/mr.json'); From 80bd66136f3e414251f1436462e5c2ba94f967cc Mon Sep 17 00:00:00 2001 From: chuiizeet Date: Sun, 3 Oct 2021 02:49:37 -0500 Subject: [PATCH 080/257] Fix spanish language translation file --- app/config/locale/translations/es.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/es.json b/app/config/locale/translations/es.json index 014223e6ea..6310d8fe76 100644 --- a/app/config/locale/translations/es.json +++ b/app/config/locale/translations/es.json @@ -9,7 +9,7 @@ "emails.verification.footer": "Si no has solicitado verificar este correo, puedes ignorar este mensaje.", "emails.verification.thanks": "Gracias", "emails.verification.signature": "Equipo de {{project}}", - "emails.magicSession.subject": "Inicio de Sesión", + "emails.magicSession.subject": "Inicio de sesión", "emails.magicSession.hello": "Hola,", "emails.magicSession.body": "Haz clic en este enlace para iniciar sesión.", "emails.magicSession.footer": "Si no has solicitado ingresar usando este correo, puedes ignorar este mensaje.", @@ -21,7 +21,7 @@ "emails.recovery.footer": "Si no has solicitado restablecer la contraseña, puedes ignorar este mensaje.", "emails.recovery.thanks": "Gracias", "emails.recovery.signature": "Equipo de {{project}}", - "emails.invitation.subject": "Invitacion al Equipo %s en %s", + "emails.invitation.subject": "Invitación al equipo %s en %s", "emails.invitation.hello": "Hola", "emails.invitation.body": "Este correo ha sido enviado a petición de {{owner}} quien quiere invitarte a formar parte del equipo {{team}} en el proyecto {{project}}.", "emails.invitation.footer": "Si no estas interesado, puedes ignorar este mensaje.", From 411b581db43721364960a0aa588f41e2950f23fb Mon Sep 17 00:00:00 2001 From: Matej Baco Date: Sun, 3 Oct 2021 11:01:45 +0200 Subject: [PATCH 081/257] Code of conduct missing fixed --- .github/ISSUE_TEMPLATE/bug.yaml | 7 +++++++ .github/ISSUE_TEMPLATE/documentation.yaml | 5 ++--- .github/ISSUE_TEMPLATE/feature.yaml | 7 +++++++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index 2f33d76b82..f97c94167f 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -72,4 +72,11 @@ body: description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" options: - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: "🏢 Have you read the Code of Conduct?" + options: + - label: "I have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/HEAD/CODE_OF_CONDUCT.md)" required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/documentation.yaml b/.github/ISSUE_TEMPLATE/documentation.yaml index 5e8d8fd083..c2f829df39 100644 --- a/.github/ISSUE_TEMPLATE/documentation.yaml +++ b/.github/ISSUE_TEMPLATE/documentation.yaml @@ -6,7 +6,7 @@ body: - type: markdown attributes: value: | - Thanks for taking the time to fill out our documentation update request form 🙏 + Thanks for taking the time to make our documentation better 🙏 - type: textarea id: issue-description validations: @@ -26,8 +26,7 @@ body: - type: checkboxes id: read-code-of-conduct attributes: - description: "This is our [Code of Conduct](https://github.com/appwrite/appwrite/blob/master/CODE_OF_CONDUCT.md)." label: "🏢 Have you read the Code of Conduct?" options: - - label: "I read the Code of Conduct" + - label: "I have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/HEAD/CODE_OF_CONDUCT.md)" required: true \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/feature.yaml b/.github/ISSUE_TEMPLATE/feature.yaml index 025614bc8a..6181cda753 100644 --- a/.github/ISSUE_TEMPLATE/feature.yaml +++ b/.github/ISSUE_TEMPLATE/feature.yaml @@ -30,4 +30,11 @@ body: description: "Have you Googled for a similar issue or checked our older issues for a similar bug?" options: - label: "I checked and didn't find similar issue" + required: true + - type: checkboxes + id: read-code-of-conduct + attributes: + label: "🏢 Have you read the Code of Conduct?" + options: + - label: "I have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/HEAD/CODE_OF_CONDUCT.md)" required: true \ No newline at end of file From bbc744fc17f1960f78d739d297e8d01618522b81 Mon Sep 17 00:00:00 2001 From: Santosh Bhandari Date: Sun, 3 Oct 2021 16:39:57 +0545 Subject: [PATCH 082/257] Update app/config/locale/translations/ne.json Co-authored-by: Damodar Lohani --- app/config/locale/translations/ne.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/ne.json b/app/config/locale/translations/ne.json index 372a2717f2..2dc24e1910 100644 --- a/app/config/locale/translations/ne.json +++ b/app/config/locale/translations/ne.json @@ -1,5 +1,5 @@ { - "settings.inspire": "\"बुद्धिमान हुनु को कला के लाई बेवास्ता गर्न जान्ने को कला हो।\"", + "settings.inspire": "\"के लाई बेवास्ता गर्ने भन्ने जान्नुनै बुद्धिमान हुनुको कला हो ।\"", "settings.locale": "ne", "settings.direction": "ltr", "emails.sender": "%s समूह", From 48bde717939f034f5901a5c13960287e6450c691 Mon Sep 17 00:00:00 2001 From: Santosh Bhandari Date: Sun, 3 Oct 2021 16:41:46 +0545 Subject: [PATCH 083/257] Update app/config/locale/translations/ne.json Co-authored-by: Damodar Lohani --- app/config/locale/translations/ne.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/ne.json b/app/config/locale/translations/ne.json index 2dc24e1910..77de4c1541 100644 --- a/app/config/locale/translations/ne.json +++ b/app/config/locale/translations/ne.json @@ -23,7 +23,7 @@ "emails.recovery.signature": "{{project}} समूह", "emails.invitation.subject": "%s समूहको लागि %s मा निमन्त्रणा", "emails.invitation.hello": "नमस्ते", - "emails.invitation.body": "{{owner}}ले तपाइँलाई {{project}}मा {{team}}को सदस्य बन्न आमन्त्रित गर्नु भएको छ। तेसैले तपाइँलाई यो सन्देश पठाइएको हो।", + "emails.invitation.body": "{{owner}}ले तपाइँलाई {{project}}मा {{team}}को सदस्य बन्न आमन्त्रित गर्न चाहनु भएको छ। त्येसैले तपाइँलाई यो सन्देश पठाइएको हो।", "emails.invitation.footer": "यदि तपाइँ इच्छुक हुनुहुन्न भने, तपाइँले यो सन्देशलाई बेवास्ता गर्न सक्नुहुन्छ।", "emails.invitation.thanks": "धन्यवाद", "emails.invitation.signature": "{{project}} समूह", From 3a70c66ba0d75e27ff131d7af7a64151bb3f8981 Mon Sep 17 00:00:00 2001 From: Nguyen Long Nhat <27698189+torn4dom4n@users.noreply.github.com> Date: Sun, 3 Oct 2021 18:55:03 +0700 Subject: [PATCH 084/257] Getting started for Android --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b2cab46b4a..9ccd8e88ea 100644 --- a/README.md +++ b/README.md @@ -98,9 +98,9 @@ Getting started with Appwrite is as easy as creating a new project, choosing you * [Getting Started for Web](https://appwrite.io/docs/getting-started-for-web) * [Getting Started for Flutter](https://appwrite.io/docs/getting-started-for-flutter) +* [Getting Started for Android](https://appwrite.io/docs/getting-started-for-android) * [Getting Started for Server](https://appwrite.io/docs/getting-started-for-server) * [Getting Started for CLI](https://appwrite.io/docs/command-line) -* Getting Started for Android (Coming soon...) * Getting Started for iOS (Coming soon...) ### Services From 400c13cd21ba5a4b670cf9dc5c06aaefb299ef98 Mon Sep 17 00:00:00 2001 From: Matteo Gheza Date: Sun, 3 Oct 2021 16:25:10 +0200 Subject: [PATCH 085/257] Fix type in bug.yaml --- .github/ISSUE_TEMPLATE/bug.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug.yaml b/.github/ISSUE_TEMPLATE/bug.yaml index f97c94167f..2551c366bf 100644 --- a/.github/ISSUE_TEMPLATE/bug.yaml +++ b/.github/ISSUE_TEMPLATE/bug.yaml @@ -58,7 +58,7 @@ body: validations: required: true - type: textarea - id: enviromnemt + id: environment validations: required: false attributes: @@ -79,4 +79,4 @@ body: label: "🏢 Have you read the Code of Conduct?" options: - label: "I have read the [Code of Conduct](https://github.com/appwrite/appwrite/blob/HEAD/CODE_OF_CONDUCT.md)" - required: true \ No newline at end of file + required: true From 12d3ff0a93f01ecbfb5cddaf402ca7c215521c99 Mon Sep 17 00:00:00 2001 From: cristina-sirbu Date: Mon, 4 Oct 2021 07:24:20 +0300 Subject: [PATCH 086/257] Added romanian translations --- app/config/locale/translations/ro.json | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/ro.json b/app/config/locale/translations/ro.json index 44a0ca6fbc..5d8aa437e0 100644 --- a/app/config/locale/translations/ro.json +++ b/app/config/locale/translations/ro.json @@ -3,30 +3,30 @@ "settings.locale": "ro", "settings.direction": "ltr", "emails.sender": "%s Echipa", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Verificare cont", + "emails.verification.hello": "Bună ziua, {{name}}", + "emails.verification.body": "Click pe acest link pentru a valida adresa de email.", + "emails.verification.footer": "Dacă nu ai cerut validarea adresei de email, poți ignora acest mesaj.", + "emails.verification.thanks": "Mulțumim", + "emails.verification.signature": "Echipa {{project}}", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Bună ziua", + "emails.magicSession.body": "Urmează acest link pentru logare.", + "emails.magicSession.footer": "Dacă nu ai incercat să te loghezi folosing această adresa de email, poți ignora acest mesaj.", + "emails.magicSession.thanks": "Mulțumim", + "emails.magicSession.signature": "Echipa {{project}}", + "emails.recovery.subject": "Resetare parolă", + "emails.recovery.hello": "Bună ziua, {{name}}", + "emails.recovery.body": "Click aici pentru a reseta parola pentru {{project}}", + "emails.recovery.footer": "Dacă nu ai cerut să îți schimbi parola, ignoră acest mesaj.", + "emails.recovery.thanks": "Mulțumim", + "emails.recovery.signature": "Echipa {{project}}", + "emails.invitation.subject": "Invitatie catre %s Echipa la %s", + "emails.invitation.hello": "Bună ziua", + "emails.invitation.body": "Acest email a fost trimis pentru că {{owner}} a vrut ca tu să devii membru al echipei {{team}} la {{project}}.", + "emails.invitation.footer": "Dacă nu esti interesat, poți ignora acest email.", + "emails.invitation.thanks": "Mulțumim", + "emails.invitation.signature": "Echipa {{project}}", "locale.country.unknown": "Necunoscut", "countries.af": "Afghanistan", "countries.ao": "Angola", From d2ba7eab819cb8a55567bba6b96feee3710dd8f1 Mon Sep 17 00:00:00 2001 From: Lampros Kostapappas Date: Mon, 4 Oct 2021 08:28:06 +0300 Subject: [PATCH 087/257] Update el.json add greek translation --- app/config/locale/translations/el.json | 52 +++++++++++++------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/app/config/locale/translations/el.json b/app/config/locale/translations/el.json index 801568acab..83af3cad0b 100644 --- a/app/config/locale/translations/el.json +++ b/app/config/locale/translations/el.json @@ -1,32 +1,32 @@ { - "settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"", + "settings.inspire": "\"Η τέχνη του να είσαι σοφός, είναι η τέχνη να ξέρεις τι πρέπει να παραβλέψεις.\"", "settings.locale": "gr", "settings.direction": "ltr", "emails.sender": "Ομάδα %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Επαλήθευση Λογαριασμού", + "emails.verification.hello": "Γεια σου {{name}}", + "emails.verification.body": "Ακολουθήστε αυτό το link για να επαληθεύσετε τη δ/νση του email σας", + "emails.verification.footer": "Εάν δεν ζητήσατε επαλήθευση αυτής της δ/νσης email, μπορείτε να αγνοήσετε αυτό το μήνυμα", + "emails.verification.thanks": "Ευχαριστούμε", + "emails.verification.signature": "Η ομάδα του {{project}}", + "emails.magicSession.subject": "Είσοδος", + "emails.magicSession.hello": "Γεια σου,", + "emails.magicSession.body": "Ακολουθήστε αυτό το link για να συνδεθείτε", + "emails.magicSession.footer": "Εάν δεν ζητήσατε να συνδεθείτε χρησιμοποιώντας αυτό το email, μπορείτε να αγνοήσετε αυτό το μήνυμα.", + "emails.magicSession.thanks": "Ευχαριστούμε", + "emails.magicSession.signature": "Η ομάδα του {{project}}", + "emails.recovery.subject": "Αλλαγή κωδικού πρόσβασης", + "emails.recovery.hello": "Γεια σου {{name}}", + "emails.recovery.body": "Ακολουθήστε αυτό το link για να αλλάξετε τον {{project}} κωδικό σας", + "emails.recovery.footer": "Εάν δεν ζητήσατε αλλαγή του κωδικού σας πρόσβασης, μπορείτε να αγνοήσετε αυτό το μήνυμα", + "emails.recovery.thanks": "Ευχαριστούμε", + "emails.recovery.signature": "Η ομάδα του {{project}}", + "emails.invitation.subject": "Πρόσκληση στην %s Ομάδα στον %s", + "emails.invitation.hello": "Γεια σου", + "emails.invitation.body": "Αυτό το email στάλθηκε επειδή ο/η {{owner}} θέλει να σας προσκαλέσει να γίνετε μέλος της ομάδας {{team}} του {{project}}.", + "emails.invitation.footer": "Εάν δεν ενδιαφέρεστε, μπορείτε να αγνοήσετε αυτό το μήνυμα.", + "emails.invitation.thanks": "Ευχαριστούμε", + "emails.invitation.signature": "Η ομάδα του {{project}}", "locale.country.unknown": "Άγνωστο", "countries.af": "Αφγανιστάν", "countries.ao": "Ανγκόλα", @@ -229,4 +229,4 @@ "continents.na": "Βόρεια Αμερική", "continents.oc": "Ωκεανία", "continents.sa": "Νότια Αμερική" -} \ No newline at end of file +} From 41e4e6988bcab8c5aeec93518a41b9135b95a61b Mon Sep 17 00:00:00 2001 From: NeonSpork Date: Mon, 4 Oct 2021 10:14:01 +0200 Subject: [PATCH 088/257] fix: Added missing Norwegian translations --- app/config/locale/translations/no.json | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/no.json b/app/config/locale/translations/no.json index 0deffdd654..a09d4119db 100644 --- a/app/config/locale/translations/no.json +++ b/app/config/locale/translations/no.json @@ -3,30 +3,30 @@ "settings.locale": "no", "settings.direction": "ltr", "emails.sender": "%s Team", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Kontobekreftelse", + "emails.verification.hello": "Hallo {{name}}", + "emails.verification.body": "Følg denne lengken for å bekrefte din e-post adresse", + "emails.verification.footer": "Dersom du ikke ba om å bekrefte e-post adressen, kan du se bort fra denne meldingen.", + "emails.verification.thanks": "Takk", + "emails.verification.signature": "{{project}} team", + "emails.magicSession.subject": "Pålogging", + "emails.magicSession.hello": "Hallo", + "emails.magicSession.body": "Følg denne lenken for å logge på.", + "emails.magicSession.footer": "Dersom du ikke ba om å logge på med denne e-post adressen, kan du se bort fra denne meldingen.", + "emails.magicSession.thanks": "Takk", + "emails.magicSession.signature": "{{project}} team", + "emails.recovery.subject": "Nullstille passord", + "emails.recovery.hello": "Hallo {{name}}", + "emails.recovery.body": "Følg denne lenken for å nullstille ditt {{project}} passord.", + "emails.recovery.footer": "Dersom du ikke ba om å nullstille passordet ditt, kan du se bort fra denne meldingen.", + "emails.recovery.thanks": "Takk", + "emails.recovery.signature": "{{project}} team", + "emails.invitation.subject": "Invitasjon til %s Team ved %s", + "emails.invitation.hello": "Hallo", + "emails.invitation.body": "Denne meldingen ble sent til deg fordi {{owner}} ønsket å invitere deg til å bli medlem av {{team}} team i {{project}}.", + "emails.invitation.footer": "Dersom du ikke er interessert, kan du se bort fra denne meldingen.", + "emails.invitation.thanks": "Takk", + "emails.invitation.signature": "{{project}} team", "locale.country.unknown": "Ukjent", "countries.af": "Afghanistan", "countries.ao": "Angola", From 16b8dc3d0b306d6c0bc5e31a638376362b5b3b89 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Mon, 4 Oct 2021 08:50:27 +0000 Subject: [PATCH 089/257] ci(gh): add github action (#1823) * ci(gh): add github action * fix name * fix ci --- .github/workflows/tests.yml | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/tests.yml diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 0000000000..9d7423af82 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,41 @@ +name: "Tests" + +on: [pull_request] + +jobs: + tests: + name: Unit & E2E + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 + + # If this run was triggered by a pull request event, then checkout + # the head of the pull request instead of the merge commit. + - run: git checkout HEAD^2 + if: ${{ github.event_name == 'pull_request' }} + + - name: Build Appwrite + # Upstream bug causes buildkit pulls to fail so prefetch base images + # https://github.com/moby/moby/issues/41864 + run: | + echo "_APP_FUNCTIONS_RUNTIMES=php-8.0" >> .env + docker pull composer:2.0 + docker pull php:8.0-cli-alpine + docker-compose build + docker-compose up -d + sleep 10 + + - name: Doctor + run: docker-compose exec -T appwrite doctor + + - name: Environment Variables + run: docker-compose exec -T appwrite vars + + - name: Run Tests + run: docker-compose exec -T appwrite test --debug From bdc49c01a647e1701737b08dbe213fe4ed3f8254 Mon Sep 17 00:00:00 2001 From: und1n3 Date: Mon, 4 Oct 2021 14:31:22 +0200 Subject: [PATCH 090/257] Added catalan translations. --- app/config/locale/translations/ca.json | 56 +++++++++++++------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/app/config/locale/translations/ca.json b/app/config/locale/translations/ca.json index 72d167ef1f..32649b7e66 100644 --- a/app/config/locale/translations/ca.json +++ b/app/config/locale/translations/ca.json @@ -3,30 +3,30 @@ "settings.locale": "ca", "settings.direction": "ltr", "emails.sender": "%s Equip", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Verificació del compte", + "emails.verification.hello": "Hola {{name}}", + "emails.verification.body": "Accedeix a aquest enllaç per tal de verificar la teva adreça electrònica.", + "emails.verification.footer": "Si no has sol·licitat la verificació d'aquesta adreça electrònica, pots ignorar aquest missatge.", + "emails.verification.thanks": "Gràcies", + "emails.verification.signature": "Equip {{project}}", + "emails.magicSession.subject": "Entrar", + "emails.magicSession.hello": "Hola,", + "emails.magicSession.body": "Accedeix a aquest enllaç per a entrar.", + "emails.magicSession.footer": "Si no has sol·licitat entrar amb aquesta adreça electrònica, pots ignorar aquest missatge.", + "emails.magicSession.thanks": "Gràcies", + "emails.magicSession.signature": "Equip {{project}}", + "emails.recovery.subject": "Reinicialitzar contrasenya", + "emails.recovery.hello": "Hola {{name}}", + "emails.recovery.body": "Accedeix a aquest enllaç per a reinicialitzar la teva contrasenya de {{project}}.", + "emails.recovery.footer": "Si no has sol·licitat reinicialitzar la teva contrasenya, pots ignorar aquest missatge.", + "emails.recovery.thanks": "Gràcies", + "emails.recovery.signature": "Equip {{project}}", + "emails.invitation.subject": "Invitació a l'equip %s a s%", + "emails.invitation.hello": "Hola", + "emails.invitation.body": "Aquest correu se t'ha enviat perquè {{owner}} vol convidar-te a formar part de l'equip {{team}} al {{project}}.", + "emails.invitation.footer": "Si no és del teu interès, pots ignorar aquest missatge.", + "emails.invitation.thanks": "Gràcies", + "emails.invitation.signature": "Equip {{project}}", "locale.country.unknown": "Desconegut", "countries.af": "Afganistan", "countries.ao": "Angola", @@ -35,7 +35,7 @@ "countries.ae": "Unió dels Emirats Àrabs Units", "countries.ar": "Argentina", "countries.am": "Armènia", - "countries.ag": "Antigua o Barbuda", + "countries.ag": "Antigua i Barbuda", "countries.au": "Austràlia", "countries.at": "Àustria", "countries.az": "Azerbaidjan", @@ -44,7 +44,7 @@ "countries.bj": "Benín", "countries.bf": "Burkina Faso", "countries.bd": "Bangla Desh", - "countries.bg": "Bulgaria", + "countries.bg": "Bulgària", "countries.bh": "Bahrain", "countries.bs": "Bahamas", "countries.ba": "Bòsnia i Hercegovina", @@ -113,7 +113,7 @@ "countries.il": "Israel", "countries.it": "Itàlia", "countries.jm": "Jamaica", - "countries.jo": "Jordà", + "countries.jo": "Jordània", "countries.jp": "Japó", "countries.kz": "Kazakhstan", "countries.ke": "Kenya", @@ -127,7 +127,7 @@ "countries.lb": "Líban", "countries.lr": "Libèria", "countries.ly": "Líbia", - "countries.lc": "Santa Llúcia", + "countries.lc": "Saint Lucia", "countries.li": "Liechtenstein", "countries.lk": "Sri Lanka", "countries.ls": "Lesoto", From 37b34e8f189a0ef474d9a70afe45fe45fba4cf0b Mon Sep 17 00:00:00 2001 From: Honey Patel <66742927+honeykpatel@users.noreply.github.com> Date: Mon, 4 Oct 2021 18:34:19 +0530 Subject: [PATCH 091/257] Update app/config/locale/translations/gu.json Fixed an error and added a Gujarati Translation. Co-authored-by: Christy Jacob --- app/config/locale/translations/gu.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/gu.json b/app/config/locale/translations/gu.json index 48f537ddd0..9357160cc5 100644 --- a/app/config/locale/translations/gu.json +++ b/app/config/locale/translations/gu.json @@ -21,7 +21,7 @@ "emails.recovery.footer": "જો તમે તમારો પાસવર્ડ ફરીથી સેટ કરવાનું ન કહ્યું હોય, તો તમે આ સંદેશને અવગણી શકો છો.", "emails.recovery.thanks": "આભાર", "emails.recovery.signature": "{{project}} ટીમ", - "emails.invitation.subject": "%S ટીમને %s પર આમંત્રણ", + "emails.invitation.subject": "%s ટીમને %s પર આમંત્રણ", "emails.invitation.hello": "નમસ્કાર", "emails.invitation.body": "આ મેઇલ તમને મોકલવામાં આવ્યો હતો કારણ કે {{owner}} તમને {{project}} માં {{team}} ટીમના સભ્ય બનવા માટે આમંત્રિત કરવા માંગતા હતો.", "emails.invitation.footer": "જો તમને રસ નથી, તો તમે આ સંદેશને અવગણી શકો છો.", From 4c0e30ad6261a83c44bbfab7a14c2ba6ea659e39 Mon Sep 17 00:00:00 2001 From: Biki-das Date: Mon, 4 Oct 2021 18:47:11 +0530 Subject: [PATCH 092/257] fixed typo --- docs/tutorials/add-storage-adapter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/add-storage-adapter.md b/docs/tutorials/add-storage-adapter.md index 0b7777eb77..4a429a426b 100644 --- a/docs/tutorials/add-storage-adapter.md +++ b/docs/tutorials/add-storage-adapter.md @@ -40,7 +40,7 @@ In this phase we will add support to the new storage adapter in Appwrite. Upgrade the utopia-php/storage dependency in `composer.json` file. ### Introduce new environment variables -If required for the new adapter, may be for credentials, introduce new environment variables. The storage envorinment variables are prefixed as `_APP_STORAGE_DEVICE`. Please read [Adding Environment Variables]() guidelines in order to properly introduce new environment variables. +If required for the new adapter, may be for credentials, introduce new environment variables. The storage environment variables are prefixed as `_APP_STORAGE_DEVICE`. Please read [Adding Environment Variables]() guidelines in order to properly introduce new environment variables. ### Implement the device case In `app/controllers/shared/api.php` inside init function, there is a `switch/case` statements for each supported storage device. Implement the instantiation of your device type for your device case. The device cases are the devices constants listed in the `uptopa-php/storage/Storage` class. From 0e92a82de90891a0dcc25259de79a1f379784b07 Mon Sep 17 00:00:00 2001 From: Anoop M S Date: Mon, 4 Oct 2021 19:57:25 +0530 Subject: [PATCH 093/257] Fix punctuation issues --- app/config/locale/translations/ml.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/config/locale/translations/ml.json b/app/config/locale/translations/ml.json index d0a8202fb2..dce555c1cb 100644 --- a/app/config/locale/translations/ml.json +++ b/app/config/locale/translations/ml.json @@ -10,8 +10,8 @@ "emails.verification.thanks": "നന്ദി", "emails.verification.signature": "{{project}} ടീം", "emails.magicSession.subject": "ലോഗിൻ", - "emails.magicSession.hello": "നമസ്കാരം", - "emails.magicSession.body": "ലോഗിൻ ചെയ്യുന്നതിനായി ഈ ലിങ്ക് പിന്തുടരുക", + "emails.magicSession.hello": "നമസ്കാരം,", + "emails.magicSession.body": "ലോഗിൻ ചെയ്യുന്നതിനായി ഈ ലിങ്ക് പിന്തുടരുക.", "emails.magicSession.footer": "ഈ ഇമെയിൽ ഉപയോഗിച്ച് ലോഗിൻ ചെയ്യാൻ നിങ്ങൾ ആവശ്യപ്പെട്ടില്ലെങ്കിൽ, ഈ സന്ദേശം അവഗണിക്കാവുന്നതാണ്.", "emails.magicSession.thanks": "നന്ദി", "emails.magicSession.signature": "{{project}} ടീം", @@ -23,7 +23,7 @@ "emails.recovery.signature": "{{project}} ടീം", "emails.invitation.subject": "%s -ലെ %s ടീമിലേക്കുള്ള ക്ഷണം", "emails.invitation.hello": "നമസ്കാരം", - "emails.invitation.body": "നിങ്ങളെ {{project}} -ലെ {{team}} ടീമിലെ അംഗമാകുവാന്‍ ക്ഷണിക്കാൻ {{owner}} ആഗ്രഹിക്കുതിനാലാണ് ഈ മെയിൽ നിങ്ങൾക്ക് അയക്കുന്നത്", + "emails.invitation.body": "നിങ്ങളെ {{project}} -ലെ {{team}} ടീമിലെ അംഗമാകുവാന്‍ ക്ഷണിക്കാൻ {{owner}} ആഗ്രഹിക്കുതിനാലാണ് ഈ മെയിൽ നിങ്ങൾക്ക് അയക്കുന്നത്.", "emails.invitation.footer": "നിങ്ങൾക്ക് താൽപ്പര്യമില്ലെങ്കിൽ, ഈ സന്ദേശം അവഗണിക്കാവുന്നതാണ്.", "emails.invitation.thanks": "നന്ദി", "emails.invitation.signature": "{{project}} ടീം", From 79a2e5529b6ab02098b2be695f063437a02d66d0 Mon Sep 17 00:00:00 2001 From: Aleksander Chromik Date: Mon, 4 Oct 2021 16:35:01 +0200 Subject: [PATCH 094/257] Fix PL transaltion for invitation email body --- app/config/locale/translations/pl.json | 462 ++++++++++++------------- 1 file changed, 231 insertions(+), 231 deletions(-) diff --git a/app/config/locale/translations/pl.json b/app/config/locale/translations/pl.json index 8df68be33b..3079f0a311 100644 --- a/app/config/locale/translations/pl.json +++ b/app/config/locale/translations/pl.json @@ -1,232 +1,232 @@ { - "settings.inspire": "\"Sztuka bycia mądrym to sztuka wiedzieć, co przeoczyć.\"", - "settings.locale": "pl", - "settings.direction": "ltr", - "emails.sender": "Zespół %s", - "emails.verification.subject": "Weryfikacja konta", - "emails.verification.hello": "Cześć {{name}}", - "emails.verification.body": "Przejdź do tego linku, aby zweryfikować swój adres e-mail.", - "emails.verification.footer": "Jeśli to nie Ty prosiłeś o zweryfikowanie tego adresu, możesz zignorować tę wiadomość.", - "emails.verification.thanks": "Dziękujemy", - "emails.verification.signature": "Zespół {{project}}", - "emails.magicSession.subject": "Logowanie", - "emails.magicSession.hello": "Cześć,", - "emails.magicSession.body": "Przejdź do tego linku, aby zalogować się.", - "emails.magicSession.footer": "Jeśli to nie Ty prosiłeś o logowanie przy użyciu tego adresu e-mail, możesz zignorować tę wiadomość.", - "emails.magicSession.thanks": "Dziękujemy", - "emails.magicSession.signature": "Zespół {{project}}", - "emails.recovery.subject": "Resetowanie hasła", - "emails.recovery.hello": "Cześć {{name}}", - "emails.recovery.body": "Przejdź do tego linku, aby zresetować hasło dla {{project}}.", - "emails.recovery.footer": "Jeśli to nie Ty prosiłeś o zresetowanie swojego hasła, możesz zignorować tę wiadomość.", - "emails.recovery.thanks": "Dziękujemy", - "emails.recovery.signature": "Zespół {{project}}", - "emails.invitation.subject": "Zaproszenie do zespołu %s w %s", - "emails.invitation.hello": "Cześć", - "emails.invitation.body": "Otrzymujesz tę wiadomość, ponieważ {{owner}} zaprasza Cię do grona członków zespołu {{team}}.", - "emails.invitation.footer": "Jeśli nie jesteś zainteresowany, możesz zignorować tę wiadomość.", - "emails.invitation.thanks": "Dziękujemy", - "emails.invitation.signature": "Zespół {{project}}", - "locale.country.unknown": "Nieznany", - "countries.af": "Afganistan", - "countries.ao": "Angola", - "countries.al": "Albania", - "countries.ad": "Andora", - "countries.ae": "Zjednoczone Emiraty Arabskie", - "countries.ar": "Argentyna", - "countries.am": "Armenia", - "countries.ag": "Antigua i Barbuda", - "countries.au": "Australia", - "countries.at": "Austria", - "countries.az": "Azerbejdżan", - "countries.bi": "Burundi", - "countries.be": "Belgia", - "countries.bj": "Benin", - "countries.bf": "Burkina Faso", - "countries.bd": "Bangladesz", - "countries.bg": "Bułgaria", - "countries.bh": "Bahrajn", - "countries.bs": "Bahamy", - "countries.ba": "Bośnia i Hercegowina", - "countries.by": "Białoruś", - "countries.bz": "Belize", - "countries.bo": "Boliwia", - "countries.br": "Brazylia", - "countries.bb": "Barbados", - "countries.bn": "Brunei", - "countries.bt": "Bhutan", - "countries.bw": "Botswana", - "countries.cf": "Republika Środkowoafrykańska", - "countries.ca": "Kanada", - "countries.ch": "Szwajcaria", - "countries.cl": "Chile", - "countries.cn": "Chiny", - "countries.ci": "Wybrzeże Kości Słoniowej", - "countries.cm": "Kamerun", - "countries.cd": "DR Congo", - "countries.cg": "Republika Konga", - "countries.co": "Kolumbia", - "countries.km": "Komory", - "countries.cv": "Republika Zielonego Przylądka", - "countries.cr": "Kostaryka", - "countries.cu": "Kuba", - "countries.cy": "Cypr", - "countries.cz": "Czechy", - "countries.de": "Niemcy", - "countries.dj": "Dżibuti", - "countries.dm": "Dominica", - "countries.dk": "Dania", - "countries.do": "Republika Dominikańska", - "countries.dz": "Algieria", - "countries.ec": "Ekwador", - "countries.eg": "Egipt", - "countries.er": "Erytrea", - "countries.es": "Hiszpania", - "countries.ee": "Estonia", - "countries.et": "Etiopia", - "countries.fi": "Finlandia", - "countries.fj": "Fidżi", - "countries.fr": "Francja", - "countries.fm": "Mikronezja", - "countries.ga": "Gabon", - "countries.gb": "Wielka Brytania", - "countries.ge": "Georgia", - "countries.gh": "Ghana", - "countries.gn": "Gwinea", - "countries.gm": "Gambia", - "countries.gw": "Gwinea Bissau", - "countries.gq": "Gwinea Równikowa", - "countries.gr": "Grecja", - "countries.gd": "Grenada", - "countries.gt": "Gwatemala", - "countries.gy": "Gujana", - "countries.hn": "Honduras", - "countries.hr": "Chorwacja", - "countries.ht": "Haiti", - "countries.hu": "Węgry", - "countries.id": "Indonezja", - "countries.in": "Indie", - "countries.ie": "Irlandia", - "countries.ir": "Iran", - "countries.iq": "Irak", - "countries.is": "Islandia", - "countries.il": "Israel", - "countries.it": "Włochy", - "countries.jm": "Jamajka", - "countries.jo": "Jordan", - "countries.jp": "Japonia", - "countries.kz": "Kazachstan", - "countries.ke": "Kenia", - "countries.kg": "Kirgistan", - "countries.kh": "Kambodża", - "countries.ki": "Kiribati", - "countries.kn": "Saint Kitts i Nevis", - "countries.kr": "Korea Południowa", - "countries.kw": "Kuwejt", - "countries.la": "Laos", - "countries.lb": "Liban", - "countries.lr": "Liberia", - "countries.ly": "Libia", - "countries.lc": "Saint Lucia", - "countries.li": "Liechtenstein", - "countries.lk": "Sri Lanka", - "countries.ls": "Lesotho", - "countries.lt": "Litwa", - "countries.lu": "Luksemburg", - "countries.lv": "Łotwa", - "countries.ma": "Maroko", - "countries.mc": "Monaco", - "countries.md": "Mołdawia", - "countries.mg": "Madagaskar", - "countries.mv": "Malediwy", - "countries.mx": "Meksyk", - "countries.mh": "Wyspy Marshalla", - "countries.mk": "Macedonia", - "countries.ml": "Mali", - "countries.mt": "Malta", - "countries.mm": "Birma", - "countries.me": "Czarnogóra", - "countries.mn": "Mongolia", - "countries.mz": "Mozambik", - "countries.mr": "Mauretania", - "countries.mu": "Mauritius", - "countries.mw": "Malawi", - "countries.my": "Malezja", - "countries.na": "Namibia", - "countries.ne": "Niger", - "countries.ng": "Nigeria", - "countries.ni": "Nikaragua", - "countries.nl": "Holandia", - "countries.no": "Norwegia", - "countries.np": "Nepal", - "countries.nr": "Nauru", - "countries.nz": "Nowa Zelandia", - "countries.om": "Oman", - "countries.pk": "Pakistan", - "countries.pa": "Panama", - "countries.pe": "Peru", - "countries.ph": "Filipiny", - "countries.pw": "Palau", - "countries.pg": "Papua Nowa Gwinea", - "countries.pl": "Polska", - "countries.kp": "Korea Północna", - "countries.pt": "Portugalia", - "countries.py": "Paragwaj", - "countries.qa": "Katar", - "countries.ro": "Rumunia", - "countries.ru": "Rosja", - "countries.rw": "Rwanda", - "countries.sa": "Arabia Saudyjska", - "countries.sd": "Sudan", - "countries.sn": "Senegal", - "countries.sg": "Singapur", - "countries.sb": "Wyspy Salomona", - "countries.sl": "Sierra Leone", - "countries.sv": "Salwador", - "countries.sm": "San Marino", - "countries.so": "Somalia", - "countries.rs": "Serbia", - "countries.ss": "Sudan Południowy", - "countries.st": "Wyspy Świętego Tomasza i Książęca", - "countries.sr": "Surinam", - "countries.sk": "Słowacja", - "countries.si": "Słowenia", - "countries.se": "Szwecja", - "countries.sz": "Suazi", - "countries.sc": "Seszele", - "countries.sy": "Syria", - "countries.td": "Czad", - "countries.tg": "Togo", - "countries.th": "Tajlandia", - "countries.tj": "Tadżykistan", - "countries.tm": "Turkmenistan", - "countries.tl": "Timor Wschodni", - "countries.to": "Tonga", - "countries.tt": "Trynidad i Tobago", - "countries.tn": "Tunezja", - "countries.tr": "Turcja", - "countries.tv": "Tuvalu", - "countries.tz": "Tanzania", - "countries.ug": "Uganda", - "countries.ua": "Ukraina", - "countries.uy": "Urugwaj", - "countries.us": "Stany Zjednoczone", - "countries.uz": "Uzbekistan", - "countries.va": "Watykan", - "countries.vc": "Saint Vincent i Grenadyny", - "countries.ve": "Wenezuela", - "countries.vn": "Wietnam", - "countries.vu": "Vanuatu", - "countries.ws": "Samoa", - "countries.ye": "Jemen", - "countries.za": "Republika Południowej Afryki", - "countries.zm": "Zambia", - "countries.zw": "Zimbabwe", - "continents.af": "Afryka", - "continents.an": "Antarktyda", - "continents.as": "Azja", - "continents.eu": "Europa", - "continents.na": "Ameryka Północna", - "continents.oc": "Oceania", - "continents.sa": "Ameryka południowa" -} \ No newline at end of file + "settings.inspire": "\"Sztuka bycia mądrym to sztuka wiedzieć, co przeoczyć.\"", + "settings.locale": "pl", + "settings.direction": "ltr", + "emails.sender": "Zespół %s", + "emails.verification.subject": "Weryfikacja konta", + "emails.verification.hello": "Cześć {{name}}", + "emails.verification.body": "Przejdź do tego linku, aby zweryfikować swój adres e-mail.", + "emails.verification.footer": "Jeśli to nie Ty prosiłeś o zweryfikowanie tego adresu, możesz zignorować tę wiadomość.", + "emails.verification.thanks": "Dziękujemy", + "emails.verification.signature": "Zespół {{project}}", + "emails.magicSession.subject": "Logowanie", + "emails.magicSession.hello": "Cześć,", + "emails.magicSession.body": "Przejdź do tego linku, aby zalogować się.", + "emails.magicSession.footer": "Jeśli to nie Ty prosiłeś o logowanie przy użyciu tego adresu e-mail, możesz zignorować tę wiadomość.", + "emails.magicSession.thanks": "Dziękujemy", + "emails.magicSession.signature": "Zespół {{project}}", + "emails.recovery.subject": "Resetowanie hasła", + "emails.recovery.hello": "Cześć {{name}}", + "emails.recovery.body": "Przejdź do tego linku, aby zresetować hasło dla {{project}}.", + "emails.recovery.footer": "Jeśli to nie Ty prosiłeś o zresetowanie swojego hasła, możesz zignorować tę wiadomość.", + "emails.recovery.thanks": "Dziękujemy", + "emails.recovery.signature": "Zespół {{project}}", + "emails.invitation.subject": "Zaproszenie do zespołu %s w %s", + "emails.invitation.hello": "Cześć", + "emails.invitation.body": "Otrzymujesz tę wiadomość, ponieważ {{owner}} zaprasza Cię do grona członków zespołu {{team}} w projekcie {{project}}.", + "emails.invitation.footer": "Jeśli nie jesteś zainteresowany, możesz zignorować tę wiadomość.", + "emails.invitation.thanks": "Dziękujemy", + "emails.invitation.signature": "Zespół {{project}}", + "locale.country.unknown": "Nieznany", + "countries.af": "Afganistan", + "countries.ao": "Angola", + "countries.al": "Albania", + "countries.ad": "Andora", + "countries.ae": "Zjednoczone Emiraty Arabskie", + "countries.ar": "Argentyna", + "countries.am": "Armenia", + "countries.ag": "Antigua i Barbuda", + "countries.au": "Australia", + "countries.at": "Austria", + "countries.az": "Azerbejdżan", + "countries.bi": "Burundi", + "countries.be": "Belgia", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesz", + "countries.bg": "Bułgaria", + "countries.bh": "Bahrajn", + "countries.bs": "Bahamy", + "countries.ba": "Bośnia i Hercegowina", + "countries.by": "Białoruś", + "countries.bz": "Belize", + "countries.bo": "Boliwia", + "countries.br": "Brazylia", + "countries.bb": "Barbados", + "countries.bn": "Brunei", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Republika Środkowoafrykańska", + "countries.ca": "Kanada", + "countries.ch": "Szwajcaria", + "countries.cl": "Chile", + "countries.cn": "Chiny", + "countries.ci": "Wybrzeże Kości Słoniowej", + "countries.cm": "Kamerun", + "countries.cd": "DR Congo", + "countries.cg": "Republika Konga", + "countries.co": "Kolumbia", + "countries.km": "Komory", + "countries.cv": "Republika Zielonego Przylądka", + "countries.cr": "Kostaryka", + "countries.cu": "Kuba", + "countries.cy": "Cypr", + "countries.cz": "Czechy", + "countries.de": "Niemcy", + "countries.dj": "Dżibuti", + "countries.dm": "Dominica", + "countries.dk": "Dania", + "countries.do": "Republika Dominikańska", + "countries.dz": "Algieria", + "countries.ec": "Ekwador", + "countries.eg": "Egipt", + "countries.er": "Erytrea", + "countries.es": "Hiszpania", + "countries.ee": "Estonia", + "countries.et": "Etiopia", + "countries.fi": "Finlandia", + "countries.fj": "Fidżi", + "countries.fr": "Francja", + "countries.fm": "Mikronezja", + "countries.ga": "Gabon", + "countries.gb": "Wielka Brytania", + "countries.ge": "Georgia", + "countries.gh": "Ghana", + "countries.gn": "Gwinea", + "countries.gm": "Gambia", + "countries.gw": "Gwinea Bissau", + "countries.gq": "Gwinea Równikowa", + "countries.gr": "Grecja", + "countries.gd": "Grenada", + "countries.gt": "Gwatemala", + "countries.gy": "Gujana", + "countries.hn": "Honduras", + "countries.hr": "Chorwacja", + "countries.ht": "Haiti", + "countries.hu": "Węgry", + "countries.id": "Indonezja", + "countries.in": "Indie", + "countries.ie": "Irlandia", + "countries.ir": "Iran", + "countries.iq": "Irak", + "countries.is": "Islandia", + "countries.il": "Israel", + "countries.it": "Włochy", + "countries.jm": "Jamajka", + "countries.jo": "Jordan", + "countries.jp": "Japonia", + "countries.kz": "Kazachstan", + "countries.ke": "Kenia", + "countries.kg": "Kirgistan", + "countries.kh": "Kambodża", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts i Nevis", + "countries.kr": "Korea Południowa", + "countries.kw": "Kuwejt", + "countries.la": "Laos", + "countries.lb": "Liban", + "countries.lr": "Liberia", + "countries.ly": "Libia", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Litwa", + "countries.lu": "Luksemburg", + "countries.lv": "Łotwa", + "countries.ma": "Maroko", + "countries.mc": "Monaco", + "countries.md": "Mołdawia", + "countries.mg": "Madagaskar", + "countries.mv": "Malediwy", + "countries.mx": "Meksyk", + "countries.mh": "Wyspy Marshalla", + "countries.mk": "Macedonia", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Birma", + "countries.me": "Czarnogóra", + "countries.mn": "Mongolia", + "countries.mz": "Mozambik", + "countries.mr": "Mauretania", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malezja", + "countries.na": "Namibia", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nikaragua", + "countries.nl": "Holandia", + "countries.no": "Norwegia", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "Nowa Zelandia", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Filipiny", + "countries.pw": "Palau", + "countries.pg": "Papua Nowa Gwinea", + "countries.pl": "Polska", + "countries.kp": "Korea Północna", + "countries.pt": "Portugalia", + "countries.py": "Paragwaj", + "countries.qa": "Katar", + "countries.ro": "Rumunia", + "countries.ru": "Rosja", + "countries.rw": "Rwanda", + "countries.sa": "Arabia Saudyjska", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapur", + "countries.sb": "Wyspy Salomona", + "countries.sl": "Sierra Leone", + "countries.sv": "Salwador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbia", + "countries.ss": "Sudan Południowy", + "countries.st": "Wyspy Świętego Tomasza i Książęca", + "countries.sr": "Surinam", + "countries.sk": "Słowacja", + "countries.si": "Słowenia", + "countries.se": "Szwecja", + "countries.sz": "Suazi", + "countries.sc": "Seszele", + "countries.sy": "Syria", + "countries.td": "Czad", + "countries.tg": "Togo", + "countries.th": "Tajlandia", + "countries.tj": "Tadżykistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Timor Wschodni", + "countries.to": "Tonga", + "countries.tt": "Trynidad i Tobago", + "countries.tn": "Tunezja", + "countries.tr": "Turcja", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzania", + "countries.ug": "Uganda", + "countries.ua": "Ukraina", + "countries.uy": "Urugwaj", + "countries.us": "Stany Zjednoczone", + "countries.uz": "Uzbekistan", + "countries.va": "Watykan", + "countries.vc": "Saint Vincent i Grenadyny", + "countries.ve": "Wenezuela", + "countries.vn": "Wietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Jemen", + "countries.za": "Republika Południowej Afryki", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Afryka", + "continents.an": "Antarktyda", + "continents.as": "Azja", + "continents.eu": "Europa", + "continents.na": "Ameryka Północna", + "continents.oc": "Oceania", + "continents.sa": "Ameryka południowa" +} From 63bba101f9fbacfdf8d881f327ba0b99e700620b Mon Sep 17 00:00:00 2001 From: Christoffer Aske Date: Mon, 4 Oct 2021 16:59:27 +0200 Subject: [PATCH 095/257] =?UTF-8?q?Added=20Norsk=20Bokm=C3=A5l=20translati?= =?UTF-8?q?ons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config/locale/codes.php | 1 + app/config/locale/translations/nb.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/nb.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index c8623f533c..b956608e4f 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -35,6 +35,7 @@ return [ 'mr', // Marathi 'ms', // Malay 'nl', // Dutch + 'nb', // Norwegian Bokmål 'no', // Norwegian 'ne', // Nepali 'or', // Oriya diff --git a/app/config/locale/translations/nb.json b/app/config/locale/translations/nb.json new file mode 100644 index 0000000000..43aadaa238 --- /dev/null +++ b/app/config/locale/translations/nb.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"Kunsten å være klok er kunsten å vite hva man skal overse.\"", + "settings.locale": "nb", + "settings.direction": "ltr", + "emails.sender": "%s Teamet", + "emails.verification.subject": "Konto Verifisering", + "emails.verification.hello": "Hei {{name}}", + "emails.verification.body": "Følg denne lenken for å verifisere din epost adresse.", + "emails.verification.footer": "Hvis du ikke ba om å bekrefte denne adressen, kan du ignorere denne meldingen.", + "emails.verification.thanks": "Takk", + "emails.verification.signature": "{{project}} teamet", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Hei,", + "emails.magicSession.body": "Følg denne lenken for å logge inn.", + "emails.magicSession.footer": "Hvis du ikke ba om å logge inn med denne adressen, kan du ignorere denne meldingen.", + "emails.magicSession.thanks": "Takk", + "emails.magicSession.signature": "{{project}} teamet", + "emails.recovery.subject": "Reset Passord", + "emails.recovery.hello": "Hei {{name}}", + "emails.recovery.body": "Følg denne lenken for å resette ditt {{project}} passord.", + "emails.recovery.footer": "Hvis du ikke ba om å resette ditt passord, kan du ignorere denne meldingen.", + "emails.recovery.thanks": "Takk", + "emails.recovery.signature": "{{project}} teamet", + "emails.invitation.subject": "Invitasjon til %s Team ved %s", + "emails.invitation.hello": "Hei", + "emails.invitation.body": "Denne mailen ble sendt til deg fordi {{owner}} hadde lyst til å invitere deg til å bli et medlem av {{team}} teamet ved {{project}}.", + "emails.invitation.footer": "Hvis du ikke er interessert, kan du ignorere denne meldingen.", + "emails.invitation.thanks": "Takk", + "emails.invitation.signature": "{{project}} teamet", + "locale.country.unknown": "Ukjent", + "countries.af": "Afghanistan", + "countries.ao": "Angola", + "countries.al": "Albania", + "countries.ad": "Andorra", + "countries.ae": "De forente arabiske emirater", + "countries.ar": "Argentina", + "countries.am": "Armenia", + "countries.ag": "Antigua og Barbuda", + "countries.au": "Australia", + "countries.at": "Østerrike", + "countries.az": "Aserbajdsjan", + "countries.bi": "Burundi", + "countries.be": "Belgia", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesh", + "countries.bg": "Bulgaria", + "countries.bh": "Bahrain", + "countries.bs": "Bahamas", + "countries.ba": "Bosnia-Hercegovina", + "countries.by": "Hviterussland", + "countries.bz": "Belize", + "countries.bo": "Bolivia", + "countries.br": "Brasil", + "countries.bb": "Barbados", + "countries.bn": "Brunei Darussalam", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Den sentralafrikanske republikk", + "countries.ca": "Canada", + "countries.ch": "Sveits", + "countries.cl": "Chile", + "countries.cn": "Kina", + "countries.ci": "Elfenbenskysten", + "countries.cm": "Kamerun", + "countries.cd": "Den demokratiske republikken Kongo", + "countries.cg": "Republikken Kongo", + "countries.co": "Colombia", + "countries.km": "Komorene", + "countries.cv": "Kapp Verde", + "countries.cr": "Costa Rica", + "countries.cu": "Cuba", + "countries.cy": "Kypros", + "countries.cz": "Tjekkia", + "countries.de": "Tyskland", + "countries.dj": "Djibouti", + "countries.dm": "Dominica", + "countries.dk": "Danmark", + "countries.do": "Den dominikanske republikk", + "countries.dz": "Algerie", + "countries.ec": "Ecuador", + "countries.eg": "Egypt", + "countries.er": "Eritrea", + "countries.es": "Spania", + "countries.ee": "Estland", + "countries.et": "Etiopia", + "countries.fi": "Finland", + "countries.fj": "Fiji", + "countries.fr": "Frankrike", + "countries.fm": "Mikronesia", + "countries.ga": "Gabon", + "countries.gb": "Storbritannia", + "countries.ge": "Georgia", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Ekvatorial-Guinea", + "countries.gr": "Hellas", + "countries.gd": "Grenada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Kroatia", + "countries.ht": "Haiti", + "countries.hu": "Ungarn", + "countries.id": "Indonesia", + "countries.in": "India", + "countries.ie": "Irland", + "countries.ir": "Iran", + "countries.iq": "Irak", + "countries.is": "Island", + "countries.il": "Israel", + "countries.it": "Italia", + "countries.jm": "Jamaica", + "countries.jo": "Jordan", + "countries.jp": "Japan", + "countries.kz": "Kasakhstan", + "countries.ke": "Kenya", + "countries.kg": "Kirgisistan", + "countries.kh": "Kambodsja", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts og Nevis", + "countries.kr": "Sør-Korea", + "countries.kw": "Kuwait", + "countries.la": "Laos", + "countries.lb": "Libanon", + "countries.lr": "Liberia", + "countries.ly": "Libya", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Litauen", + "countries.lu": "Luxembourg", + "countries.lv": "Latvia", + "countries.ma": "Marokko", + "countries.mc": "Monaco", + "countries.md": "Moldova", + "countries.mg": "Madagaskar", + "countries.mv": "Maldivene", + "countries.mx": "Mexico", + "countries.mh": "Marshalløyene", + "countries.mk": "Nord-Makedonia", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Myanmar", + "countries.me": "Montenegro", + "countries.mn": "Mongolia", + "countries.mz": "Mozambik", + "countries.mr": "Mauritania", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malaysia", + "countries.na": "Namibia", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nicaragua", + "countries.nl": "Nederland", + "countries.no": "Norge", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "New Zealand", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Filippinene", + "countries.pw": "Palau", + "countries.pg": "Papua Ny-Guinea", + "countries.pl": "Polen", + "countries.kp": "Nord-Korea", + "countries.pt": "Portugal", + "countries.py": "Paraguay", + "countries.qa": "Qatar", + "countries.ro": "Romania", + "countries.ru": "Russland", + "countries.rw": "Rwanda", + "countries.sa": "Saudi-Arabia", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapore", + "countries.sb": "Solomonøyene", + "countries.sl": "Sierra Leone", + "countries.sv": "El Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbia", + "countries.ss": "Sør-Sudan", + "countries.st": "São Tomé og Príncipe", + "countries.sr": "Surinam", + "countries.sk": "Slovakia", + "countries.si": "Slovenia", + "countries.se": "Sverige", + "countries.sz": "Swaziland", + "countries.sc": "Seychellene", + "countries.sy": "Syria", + "countries.td": "Tsjad", + "countries.tg": "Togo", + "countries.th": "Thailand", + "countries.tj": "Tajikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Øst-Timor", + "countries.to": "Tonga", + "countries.tt": "Trinidad og Tobago", + "countries.tn": "Tunisia", + "countries.tr": "Tyrkia", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzania", + "countries.ug": "Uganda", + "countries.ua": "Ukraina", + "countries.uy": "Uruguay", + "countries.us": "Amerikas forente stater", + "countries.uz": "Usbekistan", + "countries.va": "Vatikanstaten", + "countries.vc": "Saint Vincent og Grenadinene", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Jemen", + "countries.za": "Sør-Africa", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Afrika", + "continents.an": "Antarktis", + "continents.as": "Asia", + "continents.eu": "Europa", + "continents.na": "Nord-Amerika", + "continents.oc": "Oseania", + "continents.sa": "Sør-Amerika" +} \ No newline at end of file diff --git a/app/init.php b/app/init.php index 8c1d6cb455..5d2c91ed38 100644 --- a/app/init.php +++ b/app/init.php @@ -296,6 +296,7 @@ Locale::setLanguageFromJSON('mr', __DIR__.'/config/locale/translations/mr.json') Locale::setLanguageFromJSON('ms', __DIR__.'/config/locale/translations/ms.json'); Locale::setLanguageFromJSON('ne', __DIR__.'/config/locale/translations/ne.json'); Locale::setLanguageFromJSON('nl', __DIR__.'/config/locale/translations/nl.json'); +Locale::setLanguageFromJSON('nb', __DIR__.'/config/locale/translations/nb.json'); Locale::setLanguageFromJSON('no', __DIR__.'/config/locale/translations/no.json'); Locale::setLanguageFromJSON('or', __DIR__.'/config/locale/translations/or.json'); Locale::setLanguageFromJSON('pa', __DIR__.'/config/locale/translations/pa.json'); From a855bb074304539f183a1f1ac9ccfad56c9a81c0 Mon Sep 17 00:00:00 2001 From: Subaraki Date: Mon, 4 Oct 2021 18:36:31 +0200 Subject: [PATCH 096/257] Updated nl.json Filled in empty translations for the dutch language. --- app/config/locale/translations/nl.json | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/nl.json b/app/config/locale/translations/nl.json index fca9472384..c41d3987bc 100644 --- a/app/config/locale/translations/nl.json +++ b/app/config/locale/translations/nl.json @@ -3,30 +3,30 @@ "settings.locale": "nl", "settings.direction": "ltr", "emails.sender": "%s Team", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Account Verificatie", + "emails.verification.hello": "Hoi {{name}}", + "emails.verification.body": "Volg deze link om uw e-mail te verifieren", + "emails.verification.footer": "Als u geen aanvraag voor verificatie heeft gemaakt, kan u deze mail negeren", + "emails.verification.thanks": "Bedankt", + "emails.verification.signature": "{{project}} team", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Hoi,", + "emails.magicSession.body": "Volg deze link om in te loggen", + "emails.magicSession.footer": "Als u geen aanvraag heeft gemaakt om met deze mail in te loggen, kan u deze mail negeren", + "emails.magicSession.thanks": "Bedankt", + "emails.magicSession.signature": "{{project}} team", + "emails.recovery.subject": "Wachtwoord Herinstellen", + "emails.recovery.hello": "Hallo {{name}}", + "emails.recovery.body": "Volg deze link om het wachtwoord van uw project {{project}} te wijzigen", + "emails.recovery.footer": "Als u geen aanvraag heeft gemaakt om uw wachtwoord te wijzigen, kan u deze mail negeren", + "emails.recovery.thanks": "Bedankt", + "emails.recovery.signature": "{{project}} team", + "emails.invitation.subject": "Uitnodiging van %s Team uit %s", + "emails.invitation.hello": "Hallo,", + "emails.invitation.body": "U ontvangt deze mail want u was uitgenodig door {{owner}} om lid van het {{team}} team te worden in {{project}} ", + "emails.invitation.footer": "Als u niet geintereseerd bent, kan u deze mail negeren.", + "emails.invitation.thanks": "Bedankt", + "emails.invitation.signature": "{{project}} team", "locale.country.unknown": "Onbekend", "countries.af": "Afghanistan", "countries.ao": "Angola", @@ -229,4 +229,4 @@ "continents.na": "Noord Amerika", "continents.oc": "Oceanië", "continents.sa": "Zuid Amerika" -} \ No newline at end of file +} From cca86170cfdf7e2dba24735eb2cf155a727e8af8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mohammad-Ali=20A=27R=C3=82BI?= Date: Mon, 4 Oct 2021 18:39:00 +0200 Subject: [PATCH 097/257] feat(locale): complete Persian translations fixes #1684 --- app/config/locale/translations/fa.json | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/fa.json b/app/config/locale/translations/fa.json index 0dc473dfe4..2dd6297064 100644 --- a/app/config/locale/translations/fa.json +++ b/app/config/locale/translations/fa.json @@ -3,30 +3,30 @@ "settings.locale": "fa", "settings.direction": "rtl", "emails.sender": "تیم %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "تأیید حساب", + "emails.verification.hello": "سلام {{name}}", + "emails.verification.body": "برای تأیید حساب‌تان پیوند زیر را دنبال کنید.", + "emails.verification.footer": "اگر شما درخواست تأیید حساب نداده‌اید، می‌توانید این ایمیل را نادیده بگیرید.", + "emails.verification.thanks": "سپاس فراوان", + "emails.verification.signature": "تیم {{name}}", + "emails.magicSession.subject": "ورود به حساب کاربری", + "emails.magicSession.hello": "سلام،", + "emails.magicSession.body": "برای ورود به حساب‌تان پیوند زیر را دنبال کنید.", + "emails.magicSession.footer": "اگر شما درخواست ورود به حساب کاربری نداد‌ه‌اید، می‌توانید این ایمیل را نادیده بگیرید.", + "emails.magicSession.thanks": "سپاس فراوان", + "emails.magicSession.signature": "تیم {{name}}", + "emails.recovery.subject": "بازیابی گذرواژه", + "emails.recovery.hello": "سلام {{name}}", + "emails.recovery.body": "برای بازیابی گذرواژه‌تان پیوند زیر را دنبال کنید.", + "emails.recovery.footer": "اگر شما درخواست بازیابی گذرواژه نداده‌اید، می‌توانید این ایمیل را نادیده بگیرید.", + "emails.recovery.thanks": "سپاس فراوان", + "emails.recovery.signature": "تیم {{name}}", + "emails.invitation.subject": "دعوت به تیم %s در %s", + "emails.invitation.hello": "سلام", + "emails.invitation.body": "این ایمیل برای شما فرستاده شده‌است زیرا {{owner}} می‌خواهد شما را به تیم {{team}} در پروژه‌ی {{project}} بیفزاید.", + "emails.invitation.footer": "اگر علاقه ندارید، می‌توانید این پیام را نادیده بگیرید.", + "emails.invitation.thanks": "سپاس فراوان", + "emails.invitation.signature": "تیم {{name}}", "locale.country.unknown": "ناشناخته", "countries.af": "افقانستان", "countries.ao": "آنگولا", @@ -229,4 +229,4 @@ "continents.na": "آمریکای شمالی", "continents.oc": "اقیانوسیه", "continents.sa": "آمریکای جنوبی" -} \ No newline at end of file +} From 7dc7e1c6a4179997c6bf400d6c69941c90b3a36c Mon Sep 17 00:00:00 2001 From: "hdkhoa.sgt" Date: Mon, 4 Oct 2021 23:57:37 +0700 Subject: [PATCH 098/257] Added Vietnamese translations --- app/config/locale/translations/vi.json | 162 ++++++++++++------------- 1 file changed, 81 insertions(+), 81 deletions(-) diff --git a/app/config/locale/translations/vi.json b/app/config/locale/translations/vi.json index 32f1a0eb0e..8c72832d2f 100644 --- a/app/config/locale/translations/vi.json +++ b/app/config/locale/translations/vi.json @@ -2,52 +2,52 @@ "settings.inspire": "\"Nghệ thuật khôn ngoan là nghệ thuật biết những gì cần bỏ qua.\"", "settings.locale": "vi", "settings.direction": "ltr", - "emails.sender": "%s Team", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", - "locale.country.unknown": "Chưa xác định", + "emails.sender": "Nhóm %s", + "emails.verification.subject": "Xác minh tài khoản", + "emails.verification.hello": "Chào {{name}}", + "emails.verification.body": "Nhấn vào đường dẫn sau để xác minh địa chỉ email của bạn.", + "emails.verification.footer": "Nếu bạn không yêu cầu xác minh tài khoản, bạn có thể bỏ qua email này.", + "emails.verification.thanks": "Cảm ơn", + "emails.verification.signature": "Nhóm {{project}}", + "emails.magicSession.subject": "Đăng nhập", + "emails.magicSession.hello": "Chào,", + "emails.magicSession.body": "Nhấn vào đường dẫn sau để đăng nhập.", + "emails.magicSession.footer": "Nếu bạn không yêu cầu đăng nhập bằng email, bạn có thể bỏ qua email này.", + "emails.magicSession.thanks": "Cảm ơn", + "emails.magicSession.signature": "Nhóm {{project}}", + "emails.recovery.subject": "Thiết lập lại mật khẩu", + "emails.recovery.hello": "Chào {{name}}", + "emails.recovery.body": "Nhấn vào đường dẫn sau để thiết lập lại mật khẩu {{project}} của bạn.", + "emails.recovery.footer": "Nếu bạn không yêu cầu thiết lập lại mật khẩu, bạn có thể bỏ qua email này.", + "emails.recovery.thanks": "Cảm ơn", + "emails.recovery.signature": "Nhóm {{project}}", + "emails.invitation.subject": "Lời mời tham gia nhóm %s tại %s", + "emails.invitation.hello": "Xin chào", + "emails.invitation.body": "Email này được gửi cho bạn vì {{owner}} muốn mời bạn trở thành một thành viên của nhóm {{team}} tại {{project}}.", + "emails.invitation.footer": "Nếu bạn không quan tâm, bạn có thể bỏ qua email này.", + "emails.invitation.thanks": "Cảm ơn", + "emails.invitation.signature": "Nhóm {{project}}", + "locale.country.unknown": "Không xác định", "countries.af": "Afghanistan", "countries.ao": "Angola", "countries.al": "Albania", "countries.ad": "Andorra", - "countries.ae": "United Arab Emirates", + "countries.ae": "Các tiểu vương quốc Ả Rập Thống nhất", "countries.ar": "Argentina", "countries.am": "Armenia", - "countries.ag": "Antigua and Barbuda", - "countries.au": "Australia", - "countries.at": "Austria", + "countries.ag": "Antigua và Barbuda", + "countries.au": "Úc", + "countries.at": "Áo", "countries.az": "Azerbaijan", "countries.bi": "Burundi", - "countries.be": "Belgium", + "countries.be": "Bỉ", "countries.bj": "Benin", "countries.bf": "Burkina Faso", "countries.bd": "Bangladesh", "countries.bg": "Bulgaria", "countries.bh": "Bahrain", "countries.bs": "Bahamas", - "countries.ba": "Bosnia and Herzegovina", + "countries.ba": "Bosnia và Herzegovina", "countries.by": "Belarus", "countries.bz": "Belize", "countries.bo": "Bolivia", @@ -56,47 +56,47 @@ "countries.bn": "Brunei", "countries.bt": "Bhutan", "countries.bw": "Botswana", - "countries.cf": "Central African Republic", + "countries.cf": "Cộng Hoà Trung Phi", "countries.ca": "Canada", - "countries.ch": "Switzerland", + "countries.ch": "Thuỵ Sĩ", "countries.cl": "Chile", - "countries.cn": "China", - "countries.ci": "Ivory Coast", + "countries.cn": "Trung Quốc", + "countries.ci": "Bờ Biển Ngà", "countries.cm": "Cameroon", - "countries.cd": "DR Congo", - "countries.cg": "Republic of the Congo", + "countries.cd": "Cộng hòa Dân chủ Congo", + "countries.cg": "Cộng hòa Congo", "countries.co": "Colombia", "countries.km": "Comoros", "countries.cv": "Cape Verde", "countries.cr": "Costa Rica", "countries.cu": "Cuba", - "countries.cy": "Cyprus", - "countries.cz": "Czechia", - "countries.de": "Germany", + "countries.cy": "Đảo Síp", + "countries.cz": "Cộng hòa Séc", + "countries.de": "Đức", "countries.dj": "Djibouti", "countries.dm": "Dominica", - "countries.dk": "Denmark", - "countries.do": "Dominican Republic", + "countries.dk": "Đan Mạch", + "countries.do": "Cộng hoà Dominica", "countries.dz": "Algeria", "countries.ec": "Ecuador", - "countries.eg": "Egypt", + "countries.eg": "Ai Cập", "countries.er": "Eritrea", - "countries.es": "Spain", + "countries.es": "Tây Ban Nha", "countries.ee": "Estonia", "countries.et": "Ethiopia", - "countries.fi": "Finland", + "countries.fi": "Phần Lan", "countries.fj": "Fiji", - "countries.fr": "France", + "countries.fr": "Pháp", "countries.fm": "Micronesia", "countries.ga": "Gabon", - "countries.gb": "United Kingdom", - "countries.ge": "Georgia", + "countries.gb": "Vương quốc Anh", + "countries.ge": "Gruzia", "countries.gh": "Ghana", "countries.gn": "Guinea", "countries.gm": "Gambia", "countries.gw": "Guinea-Bissau", - "countries.gq": "Equatorial Guinea", - "countries.gr": "Greece", + "countries.gq": "Guinea Xích đạo", + "countries.gr": "Hi Lạp", "countries.gd": "Grenada", "countries.gt": "Guatemala", "countries.gy": "Guyana", @@ -105,48 +105,48 @@ "countries.ht": "Haiti", "countries.hu": "Hungary", "countries.id": "Indonesia", - "countries.in": "India", + "countries.in": "Ấn Độ", "countries.ie": "Ireland", "countries.ir": "Iran", "countries.iq": "Iraq", "countries.is": "Iceland", "countries.il": "Israel", - "countries.it": "Italy", + "countries.it": "Ý", "countries.jm": "Jamaica", "countries.jo": "Jordan", - "countries.jp": "Japan", + "countries.jp": "Nhật Bản", "countries.kz": "Kazakhstan", "countries.ke": "Kenya", "countries.kg": "Kyrgyzstan", - "countries.kh": "Cambodia", + "countries.kh": "Campuchia", "countries.ki": "Kiribati", - "countries.kn": "Saint Kitts and Nevis", - "countries.kr": "South Korea", + "countries.kn": "Saint Kitts và Nevis", + "countries.kr": "Hàn Quốc", "countries.kw": "Kuwait", - "countries.la": "Laos", - "countries.lb": "Lebanon", + "countries.la": "Lào", + "countries.lb": "Li Băng", "countries.lr": "Liberia", "countries.ly": "Libya", "countries.lc": "Saint Lucia", "countries.li": "Liechtenstein", "countries.lk": "Sri Lanka", "countries.ls": "Lesotho", - "countries.lt": "Lithuania", + "countries.lt": "Litva", "countries.lu": "Luxembourg", "countries.lv": "Latvia", - "countries.ma": "Morocco", + "countries.ma": "Ma Rốc", "countries.mc": "Monaco", "countries.md": "Moldova", "countries.mg": "Madagascar", "countries.mv": "Maldives", "countries.mx": "Mexico", - "countries.mh": "Marshall Islands", + "countries.mh": "Quần đảo Marshall", "countries.mk": "Macedonia", "countries.ml": "Mali", "countries.mt": "Malta", "countries.mm": "Myanmar", "countries.me": "Montenegro", - "countries.mn": "Mongolia", + "countries.mn": "Mông Cổ", "countries.mz": "Mozambique", "countries.mr": "Mauritania", "countries.mu": "Mauritius", @@ -156,8 +156,8 @@ "countries.ne": "Niger", "countries.ng": "Nigeria", "countries.ni": "Nicaragua", - "countries.nl": "Netherlands", - "countries.no": "Norway", + "countries.nl": "Hà Lan", + "countries.no": "Na Uy", "countries.np": "Nepal", "countries.nr": "Nauru", "countries.nz": "New Zealand", @@ -168,58 +168,58 @@ "countries.ph": "Philippines", "countries.pw": "Palau", "countries.pg": "Papua New Guinea", - "countries.pl": "Poland", - "countries.kp": "North Korea", - "countries.pt": "Portugal", + "countries.pl": "Ba Lan", + "countries.kp": "Triều Tiên", + "countries.pt": "Bồ Đào Nha", "countries.py": "Paraguay", "countries.qa": "Qatar", "countries.ro": "Romania", - "countries.ru": "Russia", + "countries.ru": "Nga", "countries.rw": "Rwanda", - "countries.sa": "Saudi Arabia", + "countries.sa": "Ả Rập Xê Út", "countries.sd": "Sudan", "countries.sn": "Senegal", "countries.sg": "Singapore", - "countries.sb": "Solomon Islands", + "countries.sb": "Quần đảo Solomon", "countries.sl": "Sierra Leone", "countries.sv": "El Salvador", "countries.sm": "San Marino", "countries.so": "Somalia", "countries.rs": "Serbia", - "countries.ss": "South Sudan", - "countries.st": "São Tomé and Príncipe", + "countries.ss": "Nam Sudan", + "countries.st": "São Tomé và Príncipe", "countries.sr": "Suriname", "countries.sk": "Slovakia", "countries.si": "Slovenia", - "countries.se": "Sweden", + "countries.se": "Thuỵ Điển", "countries.sz": "Swaziland", "countries.sc": "Seychelles", "countries.sy": "Syria", "countries.td": "Chad", "countries.tg": "Togo", - "countries.th": "Thailand", + "countries.th": "Thái Lan", "countries.tj": "Tajikistan", "countries.tm": "Turkmenistan", "countries.tl": "Timor-Leste", "countries.to": "Tonga", - "countries.tt": "Trinidad and Tobago", + "countries.tt": "Trinidad và Tobago", "countries.tn": "Tunisia", - "countries.tr": "Turkey", + "countries.tr": "Thổ Nhĩ Kỳ", "countries.tv": "Tuvalu", "countries.tz": "Tanzania", "countries.ug": "Uganda", "countries.ua": "Ukraine", "countries.uy": "Uruguay", - "countries.us": "United States", + "countries.us": "Hoa Kỳ", "countries.uz": "Uzbekistan", - "countries.va": "Vatican City", - "countries.vc": "Saint Vincent and the Grenadines", + "countries.va": "Thành Vatican", + "countries.vc": "Saint Vincent và Grenadines", "countries.ve": "Venezuela", "countries.vn": "Việt Nam", "countries.vu": "Vanuatu", "countries.ws": "Samoa", "countries.ye": "Yemen", - "countries.za": "South Africa", + "countries.za": "Nam Phi", "countries.zm": "Zambia", "countries.zw": "Zimbabwe", "continents.af": "Châu Phi", From 8a66885c094863af44924c21c7144534e8dded93 Mon Sep 17 00:00:00 2001 From: Erfan Bahramali <77061285+ErfanBahramali@users.noreply.github.com> Date: Mon, 4 Oct 2021 21:40:14 +0330 Subject: [PATCH 099/257] Fix Persian translation (spelling correction) --- app/config/locale/translations/fa.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/config/locale/translations/fa.json b/app/config/locale/translations/fa.json index 0dc473dfe4..3200d780e4 100644 --- a/app/config/locale/translations/fa.json +++ b/app/config/locale/translations/fa.json @@ -28,7 +28,7 @@ "emails.invitation.thanks": "", "emails.invitation.signature": "", "locale.country.unknown": "ناشناخته", - "countries.af": "افقانستان", + "countries.af": "افغانستان", "countries.ao": "آنگولا", "countries.al": "آلبانی", "countries.ad": "آندورا", @@ -108,20 +108,20 @@ "countries.in": "هند", "countries.ie": "ایرلند", "countries.ir": "ایران", - "countries.iq": "عراث", + "countries.iq": "عراق", "countries.is": "ایسلند", "countries.il": "اسرائیل", "countries.it": "ایتالیا", "countries.jm": "جاماییکا", "countries.jo": "اردن", - "countries.jp": "جاپن", + "countries.jp": "ژاپن", "countries.kz": "قزاقستان", "countries.ke": "کنیا", "countries.kg": "قرقیزستان", "countries.kh": "کامبوج", "countries.ki": "کیریباتی", "countries.kn": "سنت کیتس و نویس", - "countries.kr": "کرخ جنوبی", + "countries.kr": "کره جنوبی", "countries.kw": "کویت", "countries.la": "لائوس", "countries.lb": "لبنان", @@ -229,4 +229,4 @@ "continents.na": "آمریکای شمالی", "continents.oc": "اقیانوسیه", "continents.sa": "آمریکای جنوبی" -} \ No newline at end of file +} From c0f324411fa627f052daefcad9c293f5929802fc Mon Sep 17 00:00:00 2001 From: OscarRG <80918302+OscarRG@users.noreply.github.com> Date: Mon, 4 Oct 2021 20:10:20 +0200 Subject: [PATCH 100/257] Update app/config/locale/translations/pt-pt.json Co-authored-by: Christy Jacob --- app/config/locale/translations/pt-pt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/pt-pt.json b/app/config/locale/translations/pt-pt.json index ff16ab2202..11cefb74d1 100644 --- a/app/config/locale/translations/pt-pt.json +++ b/app/config/locale/translations/pt-pt.json @@ -23,7 +23,7 @@ "emails.recovery.signature": "Equipa {{project}}", "emails.invitation.subject": "Convite à equipa de %s às %s", "emails.invitation.hello": "Olá", - "emails.invitation.body": "Este correio foi-lhe enviado porque {{{owner}} queria convidá-lo a tornar-se membro da equipa {{{team}} da {{project}}.", + "emails.invitation.body": "Este correio foi-lhe enviado porque {{owner}} queria convidá-lo a tornar-se membro da equipa {{team}} da {{project}}.", "emails.invitation.footer": "Se não estiver interessado, pode ignorar esta mensagem.", "emails.invitation.thanks": "Obrigado", "emails.invitation.signature": "Equipa {{project}}", From 0d41b1ffaaf79a666a9e1fff761f62c76341db1e Mon Sep 17 00:00:00 2001 From: Jesper <36137226+Ganzabahl@users.noreply.github.com> Date: Mon, 4 Oct 2021 20:40:54 +0200 Subject: [PATCH 101/257] Update app/config/locale/translations/da.json Sorry missed that one :) Co-authored-by: Christy Jacob --- app/config/locale/translations/da.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/da.json b/app/config/locale/translations/da.json index dbcaae2785..68401be419 100644 --- a/app/config/locale/translations/da.json +++ b/app/config/locale/translations/da.json @@ -51,7 +51,7 @@ "countries.by": "Hviderusland", "countries.bz": "Belize", "countries.bo": "Bolivia", - "countries.br": "Brasilien, + "countries.br": "Brasilien", "countries.bb": "Barbados", "countries.bn": "Brunei", "countries.bt": "Bhutan", From 4809598a3d7637cf9ef124536ec6074020ca4728 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 1 Oct 2021 05:01:12 +0300 Subject: [PATCH 102/257] feat(locales): add Belarusian translation --- app/config/locale/translations/be.json | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/be.json b/app/config/locale/translations/be.json index 3bd9ce00df..c46c40f2c3 100644 --- a/app/config/locale/translations/be.json +++ b/app/config/locale/translations/be.json @@ -3,30 +3,30 @@ "settings.locale": "be", "settings.direction": "ltr", "emails.sender": "Каманда %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Верыфікацыя акаўнта", + "emails.verification.hello": "Прывітанне {{name}}", + "emails.verification.body": "Перайдзіце па гэтай спасылцы, каб пацвердзіць свой адрас электроннай пошты", + "emails.verification.footer": "Калі вы не запытвалі пацвярджэнне гэтага адрасу, праігнаруйце гэтае паведамленне.", + "emails.verification.thanks": "Дзякуем", + "emails.verification.signature": "каманда {{project}}", + "emails.magicSession.subject": "Лагін", + "emails.magicSession.hello": "Прывітанне,", + "emails.magicSession.body": "Перайдзіце па спасылцы, каб увайсці.", + "emails.magicSession.footer": "Калі вы не прасілі ўвайсці, выкарыстоўваючы гэты адрас электроннай пошты, праігнаруйце гэтае паведамленне.", + "emails.magicSession.thanks": "Дзякуем", + "emails.magicSession.signature": "каманда {{project}}", + "emails.recovery.subject": "Скід пароля", + "emails.recovery.hello": "Прывітанне, {{name}}", + "emails.recovery.body": "Перайдзіце па гэтай спасылцы, каб скінуць пароль для праекта {{project}}.", + "emails.recovery.footer": "Калі вы не прасілі скінуць пароль, вы можаце праігнараваць гэта паведамленне.", + "emails.recovery.thanks": "Дзякуем", + "emails.recovery.signature": "каманда {{project}}", + "emails.invitation.subject": "Запрошення до Команди %s у %s", + "emails.invitation.hello": "Прывітанне", + "emails.invitation.body": "Гэта паведамленне было адпраўлена вам, таму што {{owner}} хацеў запрасіць вас стаць членам каманды {{team}} у {{project}}.", + "emails.invitation.footer": "Калі вам гэта не цікава, вы можаце праігнараваць гэтае паведамленне.", + "emails.invitation.thanks": "Дзякуем", + "emails.invitation.signature": "каманда {{project}}", "locale.country.unknown": "Невядомы", "countries.af": "Афганістан", "countries.ao": "Ангола", @@ -229,4 +229,4 @@ "continents.na": "Паўночная Амерыка", "continents.oc": "Акіянія", "continents.sa": "Паўднёвая Амерыка" -} \ No newline at end of file +} From 47b6edbf7d0cccf96fa01cc72686f9f85f477d51 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 1 Oct 2021 04:29:15 +0300 Subject: [PATCH 103/257] feat(locales): add Russian translation --- app/config/locale/translations/ru.json | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/ru.json b/app/config/locale/translations/ru.json index e390d5e6ab..9221996715 100644 --- a/app/config/locale/translations/ru.json +++ b/app/config/locale/translations/ru.json @@ -3,30 +3,30 @@ "settings.locale": "ru", "settings.direction": "ltr", "emails.sender": "Команда %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Верификация аккаунта", + "emails.verification.hello": "Здравствуйте, {{name}}", + "emails.verification.body": "Перейдите по ссылке, чтобы подтвердить свой адрес электронной почты.", + "emails.verification.footer": "Если вы не запрашивали подтверждение этого адреса, проигнорируйте это сообщение.", + "emails.verification.thanks": "Спасибо", + "emails.verification.signature": "команда {{project}}", + "emails.magicSession.subject": "Логин", + "emails.magicSession.hello": "Здравствуйте,", + "emails.magicSession.body": "Перейдите по ссылке, чтобы войти.", + "emails.magicSession.footer": "Если вы не просили войти, используя этот адрес электронной почты, проигнорируйте это сообщение.", + "emails.magicSession.thanks": "Спасибо", + "emails.magicSession.signature": "команда {{project}}", + "emails.recovery.subject": "Сброс пароля", + "emails.recovery.hello": "Здравствуйте, {{name}}", + "emails.recovery.body": "Перейдите по этой ссылке для того чтобы сбросить свой пароль для проекта {{project}}", + "emails.recovery.footer": "Если вы не запрашивали сброс пароля, проигнорируйте это сообщение.", + "emails.recovery.thanks": "Спасибо", + "emails.recovery.signature": "команда {{project}}", + "emails.invitation.subject": "Приглашение в команду %s по проекту %s", + "emails.invitation.hello": "Здравствуйте", + "emails.invitation.body": "Это письмо отправлено вам, потому что {{owner}} приглашает стать членом команды {{team}} в проекте {{project}}.", + "emails.invitation.footer": "Если вы не заинтересованы, проигнорируйте это сообщение.", + "emails.invitation.thanks": "Спасибо", + "emails.invitation.signature": "команда {{project}}", "locale.country.unknown": "Неизвестно", "countries.af": "Афганистан", "countries.ao": "Ангола", @@ -229,4 +229,4 @@ "continents.na": "Северная Америка", "continents.oc": "Океания", "continents.sa": "Южная Америка" -} \ No newline at end of file +} From dac6881c6208de1b542fb72b6398520545ac2a91 Mon Sep 17 00:00:00 2001 From: Dmitry Date: Fri, 1 Oct 2021 04:18:48 +0300 Subject: [PATCH 104/257] feat(locales): add Ukrainian translation --- app/config/locale/translations/uk.json | 52 +++++++++++++------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/app/config/locale/translations/uk.json b/app/config/locale/translations/uk.json index 903ad61fe4..ed87f08467 100644 --- a/app/config/locale/translations/uk.json +++ b/app/config/locale/translations/uk.json @@ -1,32 +1,32 @@ { - "settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"", + "settings.inspire": "\"Мистецтво бути мудрим - це мистецтво знати, чим можна знехтувати\"", "settings.locale": "uk", "settings.direction": "ltr", "emails.sender": "Команда %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Верифікація акаунта", + "emails.verification.hello": "Вітаємо, {{name}}", + "emails.verification.body": "Перейдіть за цим посиланням, щоб підтвердити свою електронну адресу.", + "emails.verification.footer": "Якщо ви не запитували підтвердження цієї адреси, ви можете ігнорувати це повідомлення.", + "emails.verification.thanks": "Дякуємо", + "emails.verification.signature": "команда {{project}}", + "emails.magicSession.subject": "Логін", + "emails.magicSession.hello": "Вітаємо,", + "emails.magicSession.body": "Перейдіть за цим посиланням, щоб увійти.", + "emails.magicSession.footer": "Якщо ви не просили увійти за допомогою цієї електронної пошти, ви можете ігнорувати це повідомлення.", + "emails.magicSession.thanks": "Дякуємо", + "emails.magicSession.signature": "команда {{project}}", + "emails.recovery.subject": "Скидання пароля", + "emails.recovery.hello": "Вітаємо, {{name}}", + "emails.recovery.body": "Перейдіть за цим посиланням для того щоб скинути свій пароль для проекту {{project}}", + "emails.recovery.footer": "Якщо ви не запитували скидання паролю, проігноруйте це повідомлення.", + "emails.recovery.thanks": "Дякуємо", + "emails.recovery.signature": "команда {{project}}", + "emails.invitation.subject": "Запрошення до %s Команди у %s", + "emails.invitation.hello": "Вітаємо", + "emails.invitation.body": "Цей лист був надісланий вам тому що {{owner}} запрошує вас стати членом команди {{team}} у проекті {{project}}.", + "emails.invitation.footer": "Якщо ви не зацікавлені, проігноруйте це повідомлення.", + "emails.invitation.thanks": "Дякуємо", + "emails.invitation.signature": "команда {{project}}", "locale.country.unknown": "Невідомо", "countries.af": "Афганістан", "countries.ao": "Ангола", @@ -229,4 +229,4 @@ "continents.na": "Північна Америка", "continents.oc": "Океанія", "continents.sa": "Південна Америка" -} \ No newline at end of file +} From e30df60832b66ab4530417fcabad0ce8a5731437 Mon Sep 17 00:00:00 2001 From: izqalan Date: Tue, 5 Oct 2021 07:27:08 +0800 Subject: [PATCH 105/257] fix: punctuation --- app/config/locale/translations/ms.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/ms.json b/app/config/locale/translations/ms.json index 1af17028de..23a302d684 100644 --- a/app/config/locale/translations/ms.json +++ b/app/config/locale/translations/ms.json @@ -10,8 +10,8 @@ "emails.verification.thanks": "Terima kasih", "emails.verification.signature": "{{project}} team", "emails.magicSession.subject": "Log masuk", - "emails.magicSession.hello": "Hey", - "emails.magicSession.body": "Tekan pautan ini untuk log masuk", + "emails.magicSession.hello": "Hey,", + "emails.magicSession.body": "Tekan pautan ini untuk log masuk.", "emails.magicSession.footer": "Sekiranya anda tidak membuat permintaan untuk log masuk menggunakan email ini, sila abaikan mesej ini.", "emails.magicSession.thanks": "Terima kasih", "emails.magicSession.signature": "{{project}} team", From 5bbc3fe141d6362c266ab35ececb408a4df21daf Mon Sep 17 00:00:00 2001 From: Olyno Date: Tue, 5 Oct 2021 10:52:21 +0200 Subject: [PATCH 106/257] revert(terms): readd english version --- app/config/locale/terms.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/terms.json b/app/config/locale/terms.json index b1ce5fca4c..428be46015 100644 --- a/app/config/locale/terms.json +++ b/app/config/locale/terms.json @@ -406,7 +406,7 @@ }, { "term": "countries.fr", - "comment": "Ces noms de pays sont utilisés dans l'API Locale d'Appwrite. Pour en savoir plus, consultez le site https://appwrite.io/docs/client/locale#localeGetCountries.", + "comment": "These country names are used in Appwrite's Locale API. Learn more at https://appwrite.io/docs/client/locale#localeGetCountries", "reference": "" }, { From d8fe0c3f6f0873dce75e6fec15b3427867b27273 Mon Sep 17 00:00:00 2001 From: Olyno Date: Tue, 5 Oct 2021 10:55:45 +0200 Subject: [PATCH 107/257] fix(punctuation): add missing --- app/config/locale/translations/fr.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/fr.json b/app/config/locale/translations/fr.json index fe46599dd6..704cf619e4 100644 --- a/app/config/locale/translations/fr.json +++ b/app/config/locale/translations/fr.json @@ -10,7 +10,7 @@ "emails.verification.thanks": "Merci", "emails.verification.signature": "Équipe {{project}}", "emails.magicSession.subject": "Connexion", - "emails.magicSession.hello": "Bonjour", + "emails.magicSession.hello": "Bonjour,", "emails.magicSession.body": "Suivez ce lien pour vous connecter.", "emails.magicSession.footer": "Si vous n'avez pas demandé à vous connecter en utilisant cet e-mail, vous pouvez ignorer ce message.", "emails.magicSession.thanks": "Merci", From ea0692cdecaffee244a34f0164a74b8abcb2954f Mon Sep 17 00:00:00 2001 From: Nikhil Shanbhag <61755381+Nikhil-1503@users.noreply.github.com> Date: Tue, 5 Oct 2021 15:39:12 +0530 Subject: [PATCH 108/257] Update kn.json Co-authored-by: Christy Jacob --- app/config/locale/translations/kn.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/kn.json b/app/config/locale/translations/kn.json index 12da1f7373..1dfe029778 100644 --- a/app/config/locale/translations/kn.json +++ b/app/config/locale/translations/kn.json @@ -21,7 +21,7 @@ "emails.recovery.footer": "ನೀವು ಗುಪ್ತಪದವನ್ನು ಮರುಹೊಂದಿಸಲು ಕೇಳದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ", "emails.recovery.thanks": "ಧನ್ಯವಾದಗಳು", "emails.recovery.signature": "{{project}} ತಂಡ", - "emails.invitation.subject": "%s ತಂಡಕ್ಕೆ %sರಲ್ಲಿ ಆಹ್ವಾನ", + "emails.invitation.subject": "%s ತಂಡಕ್ಕೆ %s ರಲ್ಲಿ ಆಹ್ವಾನ", "emails.invitation.hello": "ನಮಸ್ಕಾರ", "emails.invitation.body": "ಈ ಇಮೇಲ್ ನಿಮಗೆ ಬಂದಿದೆ ಏಕೆಂದರೆ {{owner}} ನಿಮ್ಮನ್ನು {{team}} ತಂಡದ {{project}}ರಲ್ಲಿ ಸದಸ್ಯ ಆಗಲಿಕ್ಕೆ ಆಹ್ವಾನಿಸಿದ್ದಾರೆ", "emails.invitation.footer": "ನಿಮಗೆ ಆಸಕ್ತಿಯಿಲ್ಲದಿದ್ದರೆ, ಈ ಸಂದೇಶವನ್ನು ನಿರ್ಲಕ್ಷಿಸಿ", From 0100eb2d80ea0a71cfbaa41424e06b4e8552826a Mon Sep 17 00:00:00 2001 From: OscarRG <80918302+OscarRG@users.noreply.github.com> Date: Tue, 5 Oct 2021 12:12:29 +0200 Subject: [PATCH 109/257] Update pt-pt.json --- app/config/locale/translations/pt-pt.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/pt-pt.json b/app/config/locale/translations/pt-pt.json index 11cefb74d1..e257b47281 100644 --- a/app/config/locale/translations/pt-pt.json +++ b/app/config/locale/translations/pt-pt.json @@ -16,7 +16,7 @@ "emails.magicSession.thanks": "Obrigado", "emails.magicSession.signature": "Equipa {{project}}", "emails.recovery.subject": "Redefinição de senha", - "emails.recovery.hello": u"Olá {{name}}", + "emails.recovery.hello": "Olá {{name}}", "emails.recovery.body": "tilize este link para redefinir a palavra-passe do seu projecto {{project}}", "emails.recovery.footer": "Se não pediu para redefinir a sua palavra-passe, pode ignorar esta mensagem.", "emails.recovery.thanks": "Obrigado", From ca9bfed85a397b460f7f00b5b4e80aca95e6fe40 Mon Sep 17 00:00:00 2001 From: harshita214 <79797000+harshita214@users.noreply.github.com> Date: Tue, 5 Oct 2021 17:32:33 +0530 Subject: [PATCH 110/257] Update languages.php --- app/config/locale/languages.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/languages.php b/app/config/locale/languages.php index ee0d8697c0..99b1cb8b2b 100644 --- a/app/config/locale/languages.php +++ b/app/config/locale/languages.php @@ -291,7 +291,7 @@ return [ [ "code" => "hi", "name" => "Hindi", - "nativeName" => "हिन्दी" + "nativeName" => "हिन्दी / हिंदी " ], [ "code" => "ho", @@ -706,7 +706,7 @@ return [ [ "code" => "sd", "name" => "Sindhi", - "nativeName" => "सिनधि" + "nativeName" => "सिन्धी / सिंधी " ], [ "code" => "se", From c7bba451b217ae531960dfb8b91eca2a7fd537fd Mon Sep 17 00:00:00 2001 From: Rutam Prita Mishra Date: Tue, 5 Oct 2021 17:50:20 +0530 Subject: [PATCH 111/257] Added Sanskrit translations --- app/config/locale/codes.php | 1 + app/config/locale/translations/sa.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/sa.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index c8623f533c..afdb844299 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -45,6 +45,7 @@ return [ 'pa', //Punjabi 'ro', // Romanian 'ru', // Russian + 'sa', //Sanskrit 'si', // Sinhala 'sl', // Slovenian 'sq', // Albanian diff --git a/app/config/locale/translations/sa.json b/app/config/locale/translations/sa.json new file mode 100644 index 0000000000..f77e5f5d4d --- /dev/null +++ b/app/config/locale/translations/sa.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"किं हेयमित्यस्य ज्ञानमेव ज्ञानिलक्षणम्‌।\"", + "settings.locale": "sa", + "settings.direction": "ltr", + "emails.sender": "%s गणः", + "emails.verification.subject": "पञ्जिकानिर्णायनम्‌", + "emails.verification.hello": "अयि {{name}}", + "emails.verification.body": "ई-पत्रनिर्णायनार्थमिदं संयोगसूत्रमनुसरतु।", + "emails.verification.footer": "यदि अस्य संकेतस्य निर्णायनं नेष्यते तर्हि वात्र्तामिमामुपेक्षताम्‌।", + "emails.verification.thanks": "धन्यवादः", + "emails.verification.signature": "{{project}} गणः", + "emails.magicSession.subject": "संप्रवेशः", + "emails.magicSession.hello": "अयि,", + "emails.magicSession.body": "संप्रवेशार्थमिदं संयोगसूत्रमनुसरतु।", + "emails.magicSession.footer": "अनेन ई-पत्रण यदि संप्रवेशो नेष्यते तर्हि वात्र्तामिमामुपेक्षताम्‌।", + "emails.magicSession.thanks": "धन्यवादः", + "emails.magicSession.signature": "{{project}} गणः", + "emails.recovery.subject": "कूटशब्दपुनयाेजनम्‌", + "emails.recovery.hello": "अयि भो {{name}}", + "emails.recovery.body": "{{project}} कूटशब्दपुनयाेजनाय संयोगमेनमनुसरतु।", + "emails.recovery.footer": "यदि कूटशब्दस्य पुनयाेजनं नेष्यते तर्हि वात्र्तामिमामुपेक्षताम्‌।", + "emails.recovery.thanks": "धन्यवादः", + "emails.recovery.signature": "{{project}} गणः", + "emails.invitation.subject": "गणस्य आमन्त्रणम्‌ %s इति %s", + "emails.invitation.hello": "अयि भो", + "emails.invitation.body": "{{owner}} {{team}} गणे {{project}} मध्ये भवद्योगदानमच्छितीति हेतोः पत्रमदिं भवत्सकाशं प्रेषतिम्।", + "emails.invitation.footer": "यदि भवदनिच्छा तर्हि वात्र्तामिमामुपेक्षताम्‌।", + "emails.invitation.thanks": "धन्यवादः", + "emails.invitation.signature": "{{project}} गणः", + "locale.country.unknown": "अज्ञातम्‌ ", + "countries.af": "आफगानिस्थानम्‌", + "countries.ao": "आङ्गोला", + "countries.al": "आलबनिआ", + "countries.ad": "आण्डोरा", + "countries.ae": "संयुक्त आरब गणराज्यम्‌", + "countries.ar": "अर्जेंटीना", + "countries.am": "अर्मेनिआ", + "countries.ag": "आण्टिगुआ बर्वुदा च", + "countries.au": "अष्ट्रेलिआ", + "countries.at": "अष्ट्रिआ", + "countries.az": "आज़रबाइजान्‌", + "countries.bi": "बुरुन्दि", + "countries.be": "बेल्जिअम्‌", + "countries.bj": "बेनिन्‌", + "countries.bf": "बुर्किना फाशो", + "countries.bd": "बाङ्गलादेशः", + "countries.bg": "बुल्गेरिआ", + "countries.bh": "बाहारिन्‌", + "countries.bs": "बाहामस्‌", + "countries.ba": "बोसिनिआ हर्जेगोविन च", + "countries.by": "बेलारुष्‌", + "countries.bz": "बेलिज", + "countries.bo": "बोलिभिआ", + "countries.br": "ब्राजिल", + "countries.bb": "बर्बादोस्‌", + "countries.bn": "ब्रुनेइ", + "countries.bt": "भुटान्‌", + "countries.bw": "बोटस्वान", + "countries.cf": "केन्द्रिय आफ़्रीका गणराज्यम्‌", + "countries.ca": "कनाडा", + "countries.ch": "स्विट्ज़रलैंड", + "countries.cl": "चिली", + "countries.cn": "चीन", + "countries.ci": "आइभोरि कोष्ट", + "countries.cm": "कामेरुन्‌", + "countries.cd": "कांगो लोकतांत्रिक गणराज्यम्‌", + "countries.cg": "कोलंबिया", + "countries.co": "कोलंबिया", + "countries.km": "कोमोरोस", + "countries.cv": "केप्‌ वर्दे", + "countries.cr": "कोष्टारिका", + "countries.cu": "क्युवा", + "countries.cy": "साइप्रस्‌", + "countries.cz": "चेकिया", + "countries.de": "जर्मनी", + "countries.dj": "जिबूती", + "countries.dm": "डोमिनिका", + "countries.dk": "डेनमार्क", + "countries.do": "डोमिनिका गणराज्यम्‌", + "countries.dz": "एलजीरिया", + "countries.ec": "इक्वेडोर", + "countries.eg": "मिस्र", + "countries.er": "एरिट्रिआ", + "countries.es": "स्पेन्‌", + "countries.ee": "एस्तोनिया", + "countries.et": "इथिओपिआ", + "countries.fi": "फिनलैंड", + "countries.fj": "फ़िजी", + "countries.fr": "फ्रांस", + "countries.fm": "माइक्रोनेशिया", + "countries.ga": "गैबॉन", + "countries.gb": "संयुक्त राज्यम्‌", + "countries.ge": "जॉर्जिया", + "countries.gh": "घाना", + "countries.gn": "गिन्नी", + "countries.gm": "गाम्बिया", + "countries.gw": "गिनी-बिसाऊ", + "countries.gq": "भूमध्यवर्ती गिनी", + "countries.gr": "ग्रीस्‌", + "countries.gd": "ग्रेनेडा", + "countries.gt": "ग्वाटेमाला", + "countries.gy": "गुयाना", + "countries.hn": "होंडुरस्‌", + "countries.hr": "क्रोएशिया", + "countries.ht": "हैती", + "countries.hu": "हङ्गेरी", + "countries.id": "इंडोनेशिया", + "countries.in": "भारत", + "countries.ie": "आयरलैंड", + "countries.ir": "ईरान", + "countries.iq": "इराक", + "countries.is": "आइसलैंड", + "countries.il": "इजराइल", + "countries.it": "इटली", + "countries.jm": "जमैका", + "countries.jo": "जॉर्डन", + "countries.jp": "जापान", + "countries.kz": "कजाखस्तान", + "countries.ke": "केन्या", + "countries.kg": "किर्गिज़स्तान", + "countries.kh": "कंबोडिया", + "countries.ki": "किरिबाती", + "countries.kn": "सेंट किट्ट्स नेविस च", + "countries.kr": "दक्षिण कोरिया", + "countries.kw": "कुवैट", + "countries.la": "लाओस", + "countries.lb": "लेबनान्", + "countries.lr": "लाइबेरिया", + "countries.ly": "लीबिया", + "countries.lc": "सेंट लूसिया", + "countries.li": "लिकटेंस्टाइन्", + "countries.lk": "श्री लंका", + "countries.ls": "लिसोटो", + "countries.lt": "लिथुआनिया", + "countries.lu": "लक्समबर्ग", + "countries.lv": "लातविया", + "countries.ma": "मोरक्को", + "countries.mc": "मोनाको", + "countries.md": "मोलदोवा", + "countries.mg": "मेडागास्कर", + "countries.mv": "मालद्वीप", + "countries.mx": "मेक्सिको", + "countries.mh": "मार्शल द्वीप समूह", + "countries.mk": "मैसेडोनिया", + "countries.ml": "माली", + "countries.mt": "माल्टा", + "countries.mm": "म्यांमार", + "countries.me": "मोंटेनेग्रो", + "countries.mn": "मंगोलिया", + "countries.mz": "मोजाम्बिक्", + "countries.mr": "मॉरिटानिया", + "countries.mu": "मॉरीशस्", + "countries.mw": "मलावी", + "countries.my": "मलेशिया", + "countries.na": "नामीबिया", + "countries.ne": "नाइजर्‌", + "countries.ng": "नाइजीरिया", + "countries.ni": "निकारागुआ", + "countries.nl": "नीदरलैंड", + "countries.no": "नॉर्वे", + "countries.np": "नेपाल", + "countries.nr": "नाउरू", + "countries.nz": "न्यूजीलैंड", + "countries.om": "ओमान", + "countries.pk": "पाकिस्तान", + "countries.pa": "पनामा", + "countries.pe": "पेरू", + "countries.ph": "फिलीपींस", + "countries.pw": "पलाउ", + "countries.pg": "पापुआ न्यू गिनी", + "countries.pl": "पोलैंड", + "countries.kp": "उत्तर कोरिया", + "countries.pt": "पुर्तगाल", + "countries.py": "परागुआ", + "countries.qa": "कतर", + "countries.ro": "रोमानिया", + "countries.ru": "रूस्", + "countries.rw": "रुआण्डा", + "countries.sa": "सऊदी अरब", + "countries.sd": "सूडान", + "countries.sn": "सेनेगल", + "countries.sg": "सिंगापुर", + "countries.sb": "सोलोमन द्वीप", + "countries.sl": "सियरा लिओन", + "countries.sv": "अल साल्वाडोर", + "countries.sm": "सैन् मैरीनो", + "countries.so": "सोमालिया", + "countries.rs": "सर्बिया", + "countries.ss": "दक्षिण सूडान", + "countries.st": "साओ टोमे प्रिंसिपे च", + "countries.sr": "सूरीनाम", + "countries.sk": "स्लोवाकिया", + "countries.si": "स्लोवेनिया", + "countries.se": "स्विडेन", + "countries.sz": "स्वाजीलैंड", + "countries.sc": "सेशेल्स", + "countries.sy": "सीरिया", + "countries.td": "चाड़", + "countries.tg": "टोगो", + "countries.th": "थाईलैंड", + "countries.tj": "तजाकिस्तान", + "countries.tm": "तुर्कमेनिस्तान", + "countries.tl": "तिमोर-लेस्ते", + "countries.to": "टोंगा", + "countries.tt": "त्रिनिदाद टोबैगो च", + "countries.tn": "ट्यूनीशिया", + "countries.tr": "तुर्की", + "countries.tv": "तुवालु", + "countries.tz": "तंजानिया", + "countries.ug": "युगांडा", + "countries.ua": "यूक्रेन", + "countries.uy": "उरुग्वे", + "countries.us": "संयुक्तराष्ट्रम्‌", + "countries.uz": "उज़्बेकिस्तान", + "countries.va": "वेटिकन सिटी", + "countries.vc": "सेंट विंसेंट ग्रेनडीनेस च", + "countries.ve": "वेनेजुएला", + "countries.vn": "वियतनाम", + "countries.vu": "वानुअतु", + "countries.ws": "समोआ", + "countries.ye": "यमन", + "countries.za": "दक्षिण अफ्रीका", + "countries.zm": "जाम्बिया", + "countries.zw": "जिम्बाब्वे", + "continents.af": "अफ्रीका", + "continents.an": "अंटार्कटिका", + "continents.as": "एशिया", + "continents.eu": "यूरोप", + "continents.na": "उत्तरी अमेरिका", + "continents.oc": "ओशिनिया", + "continents.sa": "दक्षिण अमेरिका" +} \ No newline at end of file diff --git a/app/init.php b/app/init.php index 8c1d6cb455..c11e1b252e 100644 --- a/app/init.php +++ b/app/init.php @@ -304,6 +304,7 @@ Locale::setLanguageFromJSON('pt-br', __DIR__.'/config/locale/translations/pt-br. Locale::setLanguageFromJSON('pt-pt', __DIR__.'/config/locale/translations/pt-pt.json'); Locale::setLanguageFromJSON('ro', __DIR__.'/config/locale/translations/ro.json'); Locale::setLanguageFromJSON('ru', __DIR__ . '/config/locale/translations/ru.json'); +Locale::setLanguageFromJSON('sa', __DIR__ . '/config/locale/translations/sa.json'); Locale::setLanguageFromJSON('si', __DIR__ . '/config/locale/translations/si.json'); Locale::setLanguageFromJSON('sl', __DIR__ . '/config/locale/translations/sl.json'); Locale::setLanguageFromJSON('sq', __DIR__ . '/config/locale/translations/sq.json'); From 58100ac26ac277e68076c79f6af102c9dd475ceb Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Tue, 5 Oct 2021 10:30:58 -0300 Subject: [PATCH 112/257] Create esp.json Add Esperanto translation --- app/config/locale/translations/esp.json | 30 +++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 app/config/locale/translations/esp.json diff --git a/app/config/locale/translations/esp.json b/app/config/locale/translations/esp.json new file mode 100644 index 0000000000..9b9fa2bc35 --- /dev/null +++ b/app/config/locale/translations/esp.json @@ -0,0 +1,30 @@ + "settings.locale": "esp", + "settings.direction": "ltr", + "emails.sender": "Teamo %s", + "emails.verification.subject": "Konta Konfirmo", + "emails.verification.hello": "Saluton {{name}}", + "emails.verification.body": "Alklaku ĉi tiun ligon por kontroli vian retpoŝtan adreson.”, + "emails.verification.footer": "Se vi ne petis ĉi tiun konfirmon de ĉi tiu retpoŝto, vi povas ignori ĉi tiun mesaĝon.”, + "emails.verification.thanks": "Dankegon.", + "emails.verification.signature": "Teamo {{project}}", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Saluton,", + "emails.magicSession.body": "Alklaku ĉi tiun ligon por eniri.”, + "emails.magicSession.footer": "Se vi ne petis ĉi tiun konfirmon de ĉi tiu retpoŝto, vi povas ignori ĉi tiun mesaĝon.", + "emails.magicSession.thanks": "Dankegon", + "emails.magicSession.signature": "Teamo {{project}}", + "emails.recovery.subject": "Parsvorta Restarigo", + "emails.recovery.hello": "Saluton {{name}}", + "emails.recovery.body": "Alklaku ĉi tiun ligon por reagordi vian pasvorton. {{project}}", + "emails.recovery.footer": "Se vi ne petis reagordi vian pasvorton, vi povas ignori ĉi tiun mesaĝon.", + "emails.recovery.thanks": "Dankegon", + "emails.recovery.signature": "Teamo {{project}}", + "emails.invitation.subject": "Invito al la Teamo %s em %s", + "emails.invitation.hello": "Dankegon", + "emails.invitation.body": "Ĉi tiu retpoŝto estis sendita ĉar la {{owner}} volas inviti vin fariĝi membro de la Teamo {{team}} en {{project}}.", + "emails.invitation.footer": "Se vi ne interesiĝas, vi povas ignori ĉi tiun mesaĝon.", + "emails.invitation.thanks": "Dankegon", + "emails.invitation.signature": "Teamo {{project}}", + "locale.country.unknown": "Nekonata", + "countries.af": "Afeganistão", + "countries.ao": "Angola", From 8a3c52fb27de693559464696c0cf6f8c496207d6 Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Tue, 5 Oct 2021 10:32:48 -0300 Subject: [PATCH 113/257] Update esp.json --- app/config/locale/translations/esp.json | 205 +++++++++++++++++++++++- 1 file changed, 202 insertions(+), 3 deletions(-) diff --git a/app/config/locale/translations/esp.json b/app/config/locale/translations/esp.json index 9b9fa2bc35..3a15bc5f4f 100644 --- a/app/config/locale/translations/esp.json +++ b/app/config/locale/translations/esp.json @@ -25,6 +25,205 @@ "emails.invitation.footer": "Se vi ne interesiĝas, vi povas ignori ĉi tiun mesaĝon.", "emails.invitation.thanks": "Dankegon", "emails.invitation.signature": "Teamo {{project}}", - "locale.country.unknown": "Nekonata", - "countries.af": "Afeganistão", - "countries.ao": "Angola", + "locale.country.unknown": "Unknown", + "countries.af": "Afghanistan", + "countries.ao": "Angola", + "countries.al": "Albania", + "countries.ad": "Andorra", + "countries.ae": "United Arab Emirates", + "countries.ar": "Argentina", + "countries.am": "Armenia", + "countries.ag": "Antigua and Barbuda", + "countries.au": "Australia", + "countries.at": "Austria", + "countries.az": "Azerbaijan", + "countries.bi": "Burundi", + "countries.be": "Belgium", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesh", + "countries.bg": "Bulgaria", + "countries.bh": "Bahrain", + "countries.bs": "Bahamas", + "countries.ba": "Bosnia and Herzegovina", + "countries.by": "Belarus", + "countries.bz": "Belize", + "countries.bo": "Bolivia", + "countries.br": "Brazil", + "countries.bb": "Barbados", + "countries.bn": "Brunei", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Central African Republic", + "countries.ca": "Canada", + "countries.ch": "Switzerland", + "countries.cl": "Chile", + "countries.cn": "China", + "countries.ci": "Ivory Coast", + "countries.cm": "Cameroon", + "countries.cd": "DR Congo", + "countries.cg": "Republic of the Congo", + "countries.co": "Colombia", + "countries.km": "Comoros", + "countries.cv": "Cape Verde", + "countries.cr": "Costa Rica", + "countries.cu": "Cuba", + "countries.cy": "Cyprus", + "countries.cz": "Czechia", + "countries.de": "Germany", + "countries.dj": "Djibouti", + "countries.dm": "Dominica", + "countries.dk": "Denmark", + "countries.do": "Dominican Republic", + "countries.dz": "Algeria", + "countries.ec": "Ecuador", + "countries.eg": "Egypt", + "countries.er": "Eritrea", + "countries.es": "Spain", + "countries.ee": "Estonia", + "countries.et": "Ethiopia", + "countries.fi": "Finland", + "countries.fj": "Fiji", + "countries.fr": "France", + "countries.fm": "Micronesia", + "countries.ga": "Gabon", + "countries.gb": "United Kingdom", + "countries.ge": "Georgia", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Equatorial Guinea", + "countries.gr": "Greece", + "countries.gd": "Grenada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Croatia", + "countries.ht": "Haiti", + "countries.hu": "Hungary", + "countries.id": "Indonesia", + "countries.in": "India", + "countries.ie": "Ireland", + "countries.ir": "Iran", + "countries.iq": "Iraq", + "countries.is": "Iceland", + "countries.il": "Israel", + "countries.it": "Italy", + "countries.jm": "Jamaica", + "countries.jo": "Jordan", + "countries.jp": "Japan", + "countries.kz": "Kazakhstan", + "countries.ke": "Kenya", + "countries.kg": "Kyrgyzstan", + "countries.kh": "Cambodia", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts and Nevis", + "countries.kr": "South Korea", + "countries.kw": "Kuwait", + "countries.la": "Laos", + "countries.lb": "Lebanon", + "countries.lr": "Liberia", + "countries.ly": "Libya", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Lithuania", + "countries.lu": "Luxembourg", + "countries.lv": "Latvia", + "countries.ma": "Morocco", + "countries.mc": "Monaco", + "countries.md": "Moldova", + "countries.mg": "Madagascar", + "countries.mv": "Maldives", + "countries.mx": "Mexico", + "countries.mh": "Marshall Islands", + "countries.mk": "Macedonia", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Myanmar", + "countries.me": "Montenegro", + "countries.mn": "Mongolia", + "countries.mz": "Mozambique", + "countries.mr": "Mauritania", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malaysia", + "countries.na": "Namibia", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nicaragua", + "countries.nl": "Netherlands", + "countries.no": "Norway", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "New Zealand", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Philippines", + "countries.pw": "Palau", + "countries.pg": "Papua New Guinea", + "countries.pl": "Poland", + "countries.kp": "North Korea", + "countries.pt": "Portugal", + "countries.py": "Paraguay", + "countries.qa": "Qatar", + "countries.ro": "Romania", + "countries.ru": "Russia", + "countries.rw": "Rwanda", + "countries.sa": "Saudi Arabia", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapore", + "countries.sb": "Solomon Islands", + "countries.sl": "Sierra Leone", + "countries.sv": "El Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbia", + "countries.ss": "South Sudan", + "countries.st": "São Tomé and Príncipe", + "countries.sr": "Suriname", + "countries.sk": "Slovakia", + "countries.si": "Slovenia", + "countries.se": "Sweden", + "countries.sz": "Swaziland", + "countries.sc": "Seychelles", + "countries.sy": "Syria", + "countries.td": "Chad", + "countries.tg": "Togo", + "countries.th": "Thailand", + "countries.tj": "Tajikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Timor-Leste", + "countries.to": "Tonga", + "countries.tt": "Trinidad and Tobago", + "countries.tn": "Tunisia", + "countries.tr": "Turkey", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzania", + "countries.ug": "Uganda", + "countries.ua": "Ukraine", + "countries.uy": "Uruguay", + "countries.us": "United States", + "countries.uz": "Uzbekistan", + "countries.va": "Vatican City", + "countries.vc": "Saint Vincent and the Grenadines", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Yemen", + "countries.za": "South Africa", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Africa", + "continents.an": "Antarctica", + "continents.as": "Asia", + "continents.eu": "Europe", + "continents.na": "North America", + "continents.oc": "Oceania", + "continents.sa": "South America" From b0b3a1fb34cf42b1156bf2288fcc2330bd2af04b Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Tue, 5 Oct 2021 10:33:45 -0300 Subject: [PATCH 114/257] Update esp.json --- app/config/locale/translations/esp.json | 1 + 1 file changed, 1 insertion(+) diff --git a/app/config/locale/translations/esp.json b/app/config/locale/translations/esp.json index 3a15bc5f4f..e1a3906505 100644 --- a/app/config/locale/translations/esp.json +++ b/app/config/locale/translations/esp.json @@ -227,3 +227,4 @@ "continents.na": "North America", "continents.oc": "Oceania", "continents.sa": "South America" +} From 9b44597ed7fb07e165a01e0212081d5197425f8a Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Tue, 5 Oct 2021 10:34:58 -0300 Subject: [PATCH 115/257] Update esp.json --- app/config/locale/translations/esp.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/config/locale/translations/esp.json b/app/config/locale/translations/esp.json index e1a3906505..bcf724cf47 100644 --- a/app/config/locale/translations/esp.json +++ b/app/config/locale/translations/esp.json @@ -1,4 +1,5 @@ - "settings.locale": "esp", +{ + "settings.locale": "esp", "settings.direction": "ltr", "emails.sender": "Teamo %s", "emails.verification.subject": "Konta Konfirmo", From b9bbfbe9ab0b4d8ce4269a4dc09ca8c9253b69e5 Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Tue, 5 Oct 2021 10:37:00 -0300 Subject: [PATCH 116/257] Update codes.php Add Esperanto --- app/config/locale/codes.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index 13f1e5baeb..dba9e84fa1 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -13,6 +13,7 @@ return [ 'de', // German 'en', // English 'es', // Spanish + 'esp',// Esperanto 'fa', // Farsi/Persian 'fi', // Finnish 'fo', // Faroese From 59013149b66c932d9ccdfd1c6410ba6402c3bdaf Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Tue, 5 Oct 2021 10:41:21 -0300 Subject: [PATCH 117/257] Update init.php Add Esperanto --- app/init.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/init.php b/app/init.php index de8986b285..579b05f7ec 100644 --- a/app/init.php +++ b/app/init.php @@ -274,6 +274,7 @@ Locale::setLanguageFromJSON('de', __DIR__.'/config/locale/translations/de.json') Locale::setLanguageFromJSON('el', __DIR__.'/config/locale/translations/el.json'); Locale::setLanguageFromJSON('en', __DIR__.'/config/locale/translations/en.json'); Locale::setLanguageFromJSON('es', __DIR__.'/config/locale/translations/es.json'); +Locale::setLanguageFromJSON('esp', __DIR__.'/config/locale/translations/esp.json'); Locale::setLanguageFromJSON('fa', __DIR__.'/config/locale/translations/fa.json'); Locale::setLanguageFromJSON('fi', __DIR__.'/config/locale/translations/fi.json'); Locale::setLanguageFromJSON('fo', __DIR__.'/config/locale/translations/fo.json'); From b15cbcf807c50207a28e21b7452a9e85f37e23dd Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 5 Oct 2021 20:18:10 +0530 Subject: [PATCH 118/257] Revert "Updated Finnish translations" --- app/config/locale/translations/fi.json | 56 +++++++++++++------------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/app/config/locale/translations/fi.json b/app/config/locale/translations/fi.json index f407bf4d04..15d4508f5d 100644 --- a/app/config/locale/translations/fi.json +++ b/app/config/locale/translations/fi.json @@ -1,33 +1,33 @@ { - "settings.inspire": "\"Viisaus merkitsee epäolennaisen ohittamisen taitoa.\"", + "settings.inspire": "\"The art of being wise is the art of knowing what to overlook.\"", "settings.locale": "fi", "settings.direction": "ltr", "emails.sender": "%s Tiimi", - "emails.verification.subject": "Tilin vahvistaminen", - "emails.verification.hello": "Hei {{name}}", - "emails.verification.body": "Vahvista sähköpostiosoitteesi napsauttamalla tätä linkkiä.", - "emails.verification.footer": "Voit ohittaa tämän viestin, jos et pyytänyt sähköpostiosoitteen vahvistamista.", - "emails.verification.thanks": "Kiitos", - "emails.verification.signature": "Projektin {{project}} tiimi", - "emails.magicSession.subject": "Sisäänkirjautuminen", - "emails.magicSession.hello": "Hei,", - "emails.magicSession.body": "Kirjaudu sisään napsauttamalla tätä linkkiä.", - "emails.magicSession.footer": "Voit ohittaa tämän viestin, jos et pyytänyt sisäänkirjautumista tällä sähköpostiosoitteella.", - "emails.magicSession.thanks": "Kiitos", - "emails.magicSession.signature": "Projektin {{project}} tiimi", - "emails.recovery.subject": "Salasanan nollaaminen", - "emails.recovery.hello": "Hei {{name}}", - "emails.recovery.body": "Nollaa projektin {{project}} salasanasi napsauttamalla tätä linkkiä.", - "emails.recovery.footer": "Voit ohittaa tämän viestin, jos et pyytänyt salasanasi nollaamista.", - "emails.recovery.thanks": "Kiitos", - "emails.recovery.signature": "Projektin {{project}} tiimi", - "emails.invitation.subject": "Kutsu liittyä tiimiin %s projektissa %s", - "emails.invitation.hello": "Hei", - "emails.invitation.body": "Saat tämän viestin, koska {{owner}} haluaa kutsua sinut tiimin {{team}} jäseneksi projektissa {{project}}.", - "emails.invitation.footer": "Voit ohittaa tämän viestin, jos et halua liittyä tiimiin.", - "emails.invitation.thanks": "Kiitos", - "emails.invitation.signature": "Projektin {{project}} tiimi", - "locale.country.unknown": "Tuntematon", + "emails.verification.subject": "", + "emails.verification.hello": "", + "emails.verification.body": "", + "emails.verification.footer": "", + "emails.verification.thanks": "", + "emails.verification.signature": "", + "emails.magicSession.subject": "", + "emails.magicSession.hello": "", + "emails.magicSession.body": "", + "emails.magicSession.footer": "", + "emails.magicSession.thanks": "", + "emails.magicSession.signature": "", + "emails.recovery.subject": "", + "emails.recovery.hello": "", + "emails.recovery.body": "", + "emails.recovery.footer": "", + "emails.recovery.thanks": "", + "emails.recovery.signature": "", + "emails.invitation.subject": "", + "emails.invitation.hello": "", + "emails.invitation.body": "", + "emails.invitation.footer": "", + "emails.invitation.thanks": "", + "emails.invitation.signature": "", + "locale.country.unknown": "Unknown", "countries.af": "Afganistan", "countries.ao": "Angola", "countries.al": "Albania", @@ -226,7 +226,7 @@ "continents.an": "Antarktis", "continents.as": "Aasia", "continents.eu": "Eurooppa", - "continents.na": "Pohjois-Amerikka", + "continents.na": "Pohjois Amerikka", "continents.oc": "Oceania", - "continents.sa": "Etelä-Amerikka" + "continents.sa": "Etelä Amerikka" } \ No newline at end of file From edf3a4d48dbb35184fa4f1c0a6a0269394123296 Mon Sep 17 00:00:00 2001 From: Dazzler Kumar Date: Tue, 5 Oct 2021 20:47:30 +0530 Subject: [PATCH 119/257] Update Bihari Translations --- app/config/locale/translations/bh.json | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/bh.json b/app/config/locale/translations/bh.json index 7b48a4d2a7..528ab379bf 100644 --- a/app/config/locale/translations/bh.json +++ b/app/config/locale/translations/bh.json @@ -3,30 +3,30 @@ "settings.locale": "bh", "settings.direction": "ltr", "emails.sender": "%s टीम", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "खाता प्रमाणिकरण", + "emails.verification.hello": "नमस्ते {{name}}", + "emails.verification.body": "ईमेल प्रमाणिकरण करे क लेल दिहल गइल लिंक फॉलो करें|", + "emails.verification.footer": "अगर ई पता को सत्यापित करे के लिए ना कहाले, तो आप ई संदेश क अनदेखा कर सकत अछि।", + "emails.verification.thanks": "धन्यवाद", + "emails.verification.signature": "{{project}} टीम", + "emails.magicSession.subject": "लॉग इन करीं|", + "emails.magicSession.hello": "प्रणाम", + "emails.magicSession.body": "लॉग इन करें लेल दिहल गइल लिंक फॉलो करें|", + "emails.magicSession.footer": "अगर लॉग इन करे के लिए ना कहाले, तो आप ई संदेश क अनदेखा कर सकत अछि।", + "emails.magicSession.thanks": "धन्यवाद", + "emails.magicSession.signature": "{{project}} टीम", + "emails.recovery.subject": "पासवर्ड बदल क लेल|", + "emails.recovery.hello": "प्रणाम {{name}}", + "emails.recovery.body": "पासवर्ड बदल क लेल दिहल गइल लिंक फॉलो करें|", + "emails.recovery.footer": "अगर पासवर्ड बदल क लेल ना कहाले, तो आप ई संदेश क अनदेखा कर सकत अछि।", + "emails.recovery.thanks": "धन्यवाद", + "emails.recovery.signature": "{{project}} टीम", + "emails.invitation.subject": "%s टीम क न्योता देवे क लेल|", + "emails.invitation.hello": "प्रणाम", + "emails.invitation.body": "ई मेल आपके एही लेल भेजल गईल रहल काहे क {{owner}} आपके {{project}} क {{team}} टीम का सदस्य बनावे चाहित रहे|", + "emails.invitation.footer": "अगर आवे क इच्छा ना होवत, तो आप ई संदेश क अनदेखा कर सकत अछि।", + "emails.invitation.thanks": "धन्यवाद", + "emails.invitation.signature": "{{project}} टीम", "locale.country.unknown": "अनजान", "countries.af": "अफ़ग़ानिस्तान", "countries.ao": "अंगोला", From 1d8b7da145059a4fe05ec91b88c36ace5f22b7f5 Mon Sep 17 00:00:00 2001 From: Ishan Sourav Date: Tue, 5 Oct 2021 21:57:40 +0530 Subject: [PATCH 120/257] Fix PSR issues in Detector #1939 --- src/Appwrite/Detector/Detector.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Appwrite/Detector/Detector.php b/src/Appwrite/Detector/Detector.php index d2a029fe41..75c4387244 100644 --- a/src/Appwrite/Detector/Detector.php +++ b/src/Appwrite/Detector/Detector.php @@ -26,7 +26,7 @@ class Detector /** * Get OS info - * + * * @return array */ public function getOS(): array @@ -42,7 +42,7 @@ class Detector /** * Get client info - * + * * @return array */ public function getClient(): array @@ -61,7 +61,7 @@ class Detector /** * Get device info - * + * * @return array */ public function getDevice(): array @@ -78,7 +78,7 @@ class Detector */ protected function getDetector(): DeviceDetector { - if(!$this->detctor) { + if (!$this->detctor) { $this->detctor = new DeviceDetector($this->userAgent); $this->detctor->skipBotDetection(); // OPTIONAL: If called, bot detection will completely be skipped (bots will be detected as regular devices then) $this->detctor->parse(); From af56a8efba3cad54c273530c2c172eecf5ddbb5e Mon Sep 17 00:00:00 2001 From: JB Leiknes <33250853+NeonSpork@users.noreply.github.com> Date: Tue, 5 Oct 2021 18:28:54 +0200 Subject: [PATCH 121/257] fix: change line 13 to more closely follow en.json --- app/config/locale/translations/no.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/no.json b/app/config/locale/translations/no.json index a09d4119db..ec96cb4483 100644 --- a/app/config/locale/translations/no.json +++ b/app/config/locale/translations/no.json @@ -10,7 +10,7 @@ "emails.verification.thanks": "Takk", "emails.verification.signature": "{{project}} team", "emails.magicSession.subject": "Pålogging", - "emails.magicSession.hello": "Hallo", + "emails.magicSession.hello": "Hei,", "emails.magicSession.body": "Følg denne lenken for å logge på.", "emails.magicSession.footer": "Dersom du ikke ba om å logge på med denne e-post adressen, kan du se bort fra denne meldingen.", "emails.magicSession.thanks": "Takk", @@ -229,4 +229,4 @@ "continents.na": "Nord-Amerika", "continents.oc": "Oseania", "continents.sa": "Sør-Amerika" -} \ No newline at end of file +} From e8becd73dc48eeee55e6675488f27a221685c818 Mon Sep 17 00:00:00 2001 From: NeonSpork Date: Tue, 5 Oct 2021 19:28:12 +0200 Subject: [PATCH 122/257] fix: add missing period --- app/config/locale/translations/no.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/no.json b/app/config/locale/translations/no.json index ec96cb4483..d46e1bba36 100644 --- a/app/config/locale/translations/no.json +++ b/app/config/locale/translations/no.json @@ -5,7 +5,7 @@ "emails.sender": "%s Team", "emails.verification.subject": "Kontobekreftelse", "emails.verification.hello": "Hallo {{name}}", - "emails.verification.body": "Følg denne lengken for å bekrefte din e-post adresse", + "emails.verification.body": "Følg denne lengken for å bekrefte din e-post adresse.", "emails.verification.footer": "Dersom du ikke ba om å bekrefte e-post adressen, kan du se bort fra denne meldingen.", "emails.verification.thanks": "Takk", "emails.verification.signature": "{{project}} team", From d7ef9410286fb2bbb36b593c47e473a0ee42d974 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Tue, 5 Oct 2021 22:58:47 +0530 Subject: [PATCH 123/257] =?UTF-8?q?Revert=20"Added=20Norsk=20Bokm=C3=A5l?= =?UTF-8?q?=20translations"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config/locale/codes.php | 1 - app/config/locale/translations/nb.json | 232 ------------------------- app/init.php | 1 - 3 files changed, 234 deletions(-) delete mode 100644 app/config/locale/translations/nb.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index b956608e4f..c8623f533c 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -35,7 +35,6 @@ return [ 'mr', // Marathi 'ms', // Malay 'nl', // Dutch - 'nb', // Norwegian Bokmål 'no', // Norwegian 'ne', // Nepali 'or', // Oriya diff --git a/app/config/locale/translations/nb.json b/app/config/locale/translations/nb.json deleted file mode 100644 index 43aadaa238..0000000000 --- a/app/config/locale/translations/nb.json +++ /dev/null @@ -1,232 +0,0 @@ -{ - "settings.inspire": "\"Kunsten å være klok er kunsten å vite hva man skal overse.\"", - "settings.locale": "nb", - "settings.direction": "ltr", - "emails.sender": "%s Teamet", - "emails.verification.subject": "Konto Verifisering", - "emails.verification.hello": "Hei {{name}}", - "emails.verification.body": "Følg denne lenken for å verifisere din epost adresse.", - "emails.verification.footer": "Hvis du ikke ba om å bekrefte denne adressen, kan du ignorere denne meldingen.", - "emails.verification.thanks": "Takk", - "emails.verification.signature": "{{project}} teamet", - "emails.magicSession.subject": "Login", - "emails.magicSession.hello": "Hei,", - "emails.magicSession.body": "Følg denne lenken for å logge inn.", - "emails.magicSession.footer": "Hvis du ikke ba om å logge inn med denne adressen, kan du ignorere denne meldingen.", - "emails.magicSession.thanks": "Takk", - "emails.magicSession.signature": "{{project}} teamet", - "emails.recovery.subject": "Reset Passord", - "emails.recovery.hello": "Hei {{name}}", - "emails.recovery.body": "Følg denne lenken for å resette ditt {{project}} passord.", - "emails.recovery.footer": "Hvis du ikke ba om å resette ditt passord, kan du ignorere denne meldingen.", - "emails.recovery.thanks": "Takk", - "emails.recovery.signature": "{{project}} teamet", - "emails.invitation.subject": "Invitasjon til %s Team ved %s", - "emails.invitation.hello": "Hei", - "emails.invitation.body": "Denne mailen ble sendt til deg fordi {{owner}} hadde lyst til å invitere deg til å bli et medlem av {{team}} teamet ved {{project}}.", - "emails.invitation.footer": "Hvis du ikke er interessert, kan du ignorere denne meldingen.", - "emails.invitation.thanks": "Takk", - "emails.invitation.signature": "{{project}} teamet", - "locale.country.unknown": "Ukjent", - "countries.af": "Afghanistan", - "countries.ao": "Angola", - "countries.al": "Albania", - "countries.ad": "Andorra", - "countries.ae": "De forente arabiske emirater", - "countries.ar": "Argentina", - "countries.am": "Armenia", - "countries.ag": "Antigua og Barbuda", - "countries.au": "Australia", - "countries.at": "Østerrike", - "countries.az": "Aserbajdsjan", - "countries.bi": "Burundi", - "countries.be": "Belgia", - "countries.bj": "Benin", - "countries.bf": "Burkina Faso", - "countries.bd": "Bangladesh", - "countries.bg": "Bulgaria", - "countries.bh": "Bahrain", - "countries.bs": "Bahamas", - "countries.ba": "Bosnia-Hercegovina", - "countries.by": "Hviterussland", - "countries.bz": "Belize", - "countries.bo": "Bolivia", - "countries.br": "Brasil", - "countries.bb": "Barbados", - "countries.bn": "Brunei Darussalam", - "countries.bt": "Bhutan", - "countries.bw": "Botswana", - "countries.cf": "Den sentralafrikanske republikk", - "countries.ca": "Canada", - "countries.ch": "Sveits", - "countries.cl": "Chile", - "countries.cn": "Kina", - "countries.ci": "Elfenbenskysten", - "countries.cm": "Kamerun", - "countries.cd": "Den demokratiske republikken Kongo", - "countries.cg": "Republikken Kongo", - "countries.co": "Colombia", - "countries.km": "Komorene", - "countries.cv": "Kapp Verde", - "countries.cr": "Costa Rica", - "countries.cu": "Cuba", - "countries.cy": "Kypros", - "countries.cz": "Tjekkia", - "countries.de": "Tyskland", - "countries.dj": "Djibouti", - "countries.dm": "Dominica", - "countries.dk": "Danmark", - "countries.do": "Den dominikanske republikk", - "countries.dz": "Algerie", - "countries.ec": "Ecuador", - "countries.eg": "Egypt", - "countries.er": "Eritrea", - "countries.es": "Spania", - "countries.ee": "Estland", - "countries.et": "Etiopia", - "countries.fi": "Finland", - "countries.fj": "Fiji", - "countries.fr": "Frankrike", - "countries.fm": "Mikronesia", - "countries.ga": "Gabon", - "countries.gb": "Storbritannia", - "countries.ge": "Georgia", - "countries.gh": "Ghana", - "countries.gn": "Guinea", - "countries.gm": "Gambia", - "countries.gw": "Guinea-Bissau", - "countries.gq": "Ekvatorial-Guinea", - "countries.gr": "Hellas", - "countries.gd": "Grenada", - "countries.gt": "Guatemala", - "countries.gy": "Guyana", - "countries.hn": "Honduras", - "countries.hr": "Kroatia", - "countries.ht": "Haiti", - "countries.hu": "Ungarn", - "countries.id": "Indonesia", - "countries.in": "India", - "countries.ie": "Irland", - "countries.ir": "Iran", - "countries.iq": "Irak", - "countries.is": "Island", - "countries.il": "Israel", - "countries.it": "Italia", - "countries.jm": "Jamaica", - "countries.jo": "Jordan", - "countries.jp": "Japan", - "countries.kz": "Kasakhstan", - "countries.ke": "Kenya", - "countries.kg": "Kirgisistan", - "countries.kh": "Kambodsja", - "countries.ki": "Kiribati", - "countries.kn": "Saint Kitts og Nevis", - "countries.kr": "Sør-Korea", - "countries.kw": "Kuwait", - "countries.la": "Laos", - "countries.lb": "Libanon", - "countries.lr": "Liberia", - "countries.ly": "Libya", - "countries.lc": "Saint Lucia", - "countries.li": "Liechtenstein", - "countries.lk": "Sri Lanka", - "countries.ls": "Lesotho", - "countries.lt": "Litauen", - "countries.lu": "Luxembourg", - "countries.lv": "Latvia", - "countries.ma": "Marokko", - "countries.mc": "Monaco", - "countries.md": "Moldova", - "countries.mg": "Madagaskar", - "countries.mv": "Maldivene", - "countries.mx": "Mexico", - "countries.mh": "Marshalløyene", - "countries.mk": "Nord-Makedonia", - "countries.ml": "Mali", - "countries.mt": "Malta", - "countries.mm": "Myanmar", - "countries.me": "Montenegro", - "countries.mn": "Mongolia", - "countries.mz": "Mozambik", - "countries.mr": "Mauritania", - "countries.mu": "Mauritius", - "countries.mw": "Malawi", - "countries.my": "Malaysia", - "countries.na": "Namibia", - "countries.ne": "Niger", - "countries.ng": "Nigeria", - "countries.ni": "Nicaragua", - "countries.nl": "Nederland", - "countries.no": "Norge", - "countries.np": "Nepal", - "countries.nr": "Nauru", - "countries.nz": "New Zealand", - "countries.om": "Oman", - "countries.pk": "Pakistan", - "countries.pa": "Panama", - "countries.pe": "Peru", - "countries.ph": "Filippinene", - "countries.pw": "Palau", - "countries.pg": "Papua Ny-Guinea", - "countries.pl": "Polen", - "countries.kp": "Nord-Korea", - "countries.pt": "Portugal", - "countries.py": "Paraguay", - "countries.qa": "Qatar", - "countries.ro": "Romania", - "countries.ru": "Russland", - "countries.rw": "Rwanda", - "countries.sa": "Saudi-Arabia", - "countries.sd": "Sudan", - "countries.sn": "Senegal", - "countries.sg": "Singapore", - "countries.sb": "Solomonøyene", - "countries.sl": "Sierra Leone", - "countries.sv": "El Salvador", - "countries.sm": "San Marino", - "countries.so": "Somalia", - "countries.rs": "Serbia", - "countries.ss": "Sør-Sudan", - "countries.st": "São Tomé og Príncipe", - "countries.sr": "Surinam", - "countries.sk": "Slovakia", - "countries.si": "Slovenia", - "countries.se": "Sverige", - "countries.sz": "Swaziland", - "countries.sc": "Seychellene", - "countries.sy": "Syria", - "countries.td": "Tsjad", - "countries.tg": "Togo", - "countries.th": "Thailand", - "countries.tj": "Tajikistan", - "countries.tm": "Turkmenistan", - "countries.tl": "Øst-Timor", - "countries.to": "Tonga", - "countries.tt": "Trinidad og Tobago", - "countries.tn": "Tunisia", - "countries.tr": "Tyrkia", - "countries.tv": "Tuvalu", - "countries.tz": "Tanzania", - "countries.ug": "Uganda", - "countries.ua": "Ukraina", - "countries.uy": "Uruguay", - "countries.us": "Amerikas forente stater", - "countries.uz": "Usbekistan", - "countries.va": "Vatikanstaten", - "countries.vc": "Saint Vincent og Grenadinene", - "countries.ve": "Venezuela", - "countries.vn": "Vietnam", - "countries.vu": "Vanuatu", - "countries.ws": "Samoa", - "countries.ye": "Jemen", - "countries.za": "Sør-Africa", - "countries.zm": "Zambia", - "countries.zw": "Zimbabwe", - "continents.af": "Afrika", - "continents.an": "Antarktis", - "continents.as": "Asia", - "continents.eu": "Europa", - "continents.na": "Nord-Amerika", - "continents.oc": "Oseania", - "continents.sa": "Sør-Amerika" -} \ No newline at end of file diff --git a/app/init.php b/app/init.php index 5d2c91ed38..8c1d6cb455 100644 --- a/app/init.php +++ b/app/init.php @@ -296,7 +296,6 @@ Locale::setLanguageFromJSON('mr', __DIR__.'/config/locale/translations/mr.json') Locale::setLanguageFromJSON('ms', __DIR__.'/config/locale/translations/ms.json'); Locale::setLanguageFromJSON('ne', __DIR__.'/config/locale/translations/ne.json'); Locale::setLanguageFromJSON('nl', __DIR__.'/config/locale/translations/nl.json'); -Locale::setLanguageFromJSON('nb', __DIR__.'/config/locale/translations/nb.json'); Locale::setLanguageFromJSON('no', __DIR__.'/config/locale/translations/no.json'); Locale::setLanguageFromJSON('or', __DIR__.'/config/locale/translations/or.json'); Locale::setLanguageFromJSON('pa', __DIR__.'/config/locale/translations/pa.json'); From 7024af064351748e8f83a9ee001ba53fbdfb2b08 Mon Sep 17 00:00:00 2001 From: NeonSpork Date: Tue, 5 Oct 2021 19:29:25 +0200 Subject: [PATCH 124/257] fix: typo --- app/config/locale/translations/no.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/no.json b/app/config/locale/translations/no.json index d46e1bba36..30acd50b82 100644 --- a/app/config/locale/translations/no.json +++ b/app/config/locale/translations/no.json @@ -5,7 +5,7 @@ "emails.sender": "%s Team", "emails.verification.subject": "Kontobekreftelse", "emails.verification.hello": "Hallo {{name}}", - "emails.verification.body": "Følg denne lengken for å bekrefte din e-post adresse.", + "emails.verification.body": "Følg denne lenken for å bekrefte din e-post adresse.", "emails.verification.footer": "Dersom du ikke ba om å bekrefte e-post adressen, kan du se bort fra denne meldingen.", "emails.verification.thanks": "Takk", "emails.verification.signature": "{{project}} team", From 735c04318db27511744d35a1cb2ecac9ce111026 Mon Sep 17 00:00:00 2001 From: David Mendoza Date: Tue, 5 Oct 2021 11:46:56 -0600 Subject: [PATCH 125/257] fixed PSR issues on event library issue #1943 --- src/Appwrite/Event/Event.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Appwrite/Event/Event.php b/src/Appwrite/Event/Event.php index b2c69337a2..19496bee75 100644 --- a/src/Appwrite/Event/Event.php +++ b/src/Appwrite/Event/Event.php @@ -6,7 +6,6 @@ use Resque; class Event { - const DELETE_QUEUE_NAME = 'v1-deletes'; const DELETE_CLASS_NAME = 'DeletesV1'; From 4228c304a5de694830c56436cb033a0605225d71 Mon Sep 17 00:00:00 2001 From: David Mendoza Date: Tue, 5 Oct 2021 11:49:05 -0600 Subject: [PATCH 126/257] Revert "fixed PSR issues on event library issue #1943" This reverts commit 735c04318db27511744d35a1cb2ecac9ce111026. --- src/Appwrite/Event/Event.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Appwrite/Event/Event.php b/src/Appwrite/Event/Event.php index 19496bee75..b2c69337a2 100644 --- a/src/Appwrite/Event/Event.php +++ b/src/Appwrite/Event/Event.php @@ -6,6 +6,7 @@ use Resque; class Event { + const DELETE_QUEUE_NAME = 'v1-deletes'; const DELETE_CLASS_NAME = 'DeletesV1'; From 154a91ff11f4b99e10d1f33fc3444fc11bd688f1 Mon Sep 17 00:00:00 2001 From: Christoffer Aske Date: Tue, 5 Oct 2021 19:50:20 +0200 Subject: [PATCH 127/257] =?UTF-8?q?Added=20Norsk=20Bokm=C3=A5l=20translati?= =?UTF-8?q?ons?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/config/locale/codes.php | 1 + app/config/locale/translations/nb.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/nb.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index c8623f533c..de4909ad3e 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -34,6 +34,7 @@ return [ 'ml', // Malayalam 'mr', // Marathi 'ms', // Malay + 'nb', // Norwegian - Bokmål 'nl', // Dutch 'no', // Norwegian 'ne', // Nepali diff --git a/app/config/locale/translations/nb.json b/app/config/locale/translations/nb.json new file mode 100644 index 0000000000..89d53f0538 --- /dev/null +++ b/app/config/locale/translations/nb.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"Kunsten å være klok er kunsten å vite hva man skal overse.\"", + "settings.locale": "nb", + "settings.direction": "ltr", + "emails.sender": "%s Teamet", + "emails.verification.subject": "Konto Verifisering", + "emails.verification.hello": "Hei {{name}}", + "emails.verification.body": "Følg denne lenken for å verifisere din epost adresse.", + "emails.verification.footer": "Hvis du ikke ba om å bekrefte denne adressen, kan du ignorere denne meldingen.", + "emails.verification.thanks": "Takk", + "emails.verification.signature": "{{project}} teamet", + "emails.magicSession.subject": "Login", + "emails.magicSession.hello": "Hei,", + "emails.magicSession.body": "Følg denne lenken for å logge inn.", + "emails.magicSession.footer": "Hvis du ikke ba om å logge inn med denne adressen, kan du ignorere denne meldingen.", + "emails.magicSession.thanks": "Takk", + "emails.magicSession.signature": "{{project}} teamet", + "emails.recovery.subject": "Reset Passord", + "emails.recovery.hello": "Hei {{name}}", + "emails.recovery.body": "Følg denne lenken for å resette ditt {{project}} passord.", + "emails.recovery.footer": "Hvis du ikke ba om å resette ditt passord, kan du ignorere denne meldingen.", + "emails.recovery.thanks": "Takk", + "emails.recovery.signature": "{{project}} teamet", + "emails.invitation.subject": "Invitasjon til %s Team ved %s", + "emails.invitation.hello": "Hei", + "emails.invitation.body": "Denne mailen ble sendt til deg fordi {{owner}} hadde lyst til å invitere deg til å bli et medlem av {{team}} teamet ved {{project}}.", + "emails.invitation.footer": "Hvis du ikke er interessert, kan du ignorere denne meldingen.", + "emails.invitation.thanks": "Takk", + "emails.invitation.signature": "{{project}} teamet", + "locale.country.unknown": "Ukjent", + "countries.af": "Afghanistan", + "countries.ao": "Angola", + "countries.al": "Albania", + "countries.ad": "Andorra", + "countries.ae": "De forente arabiske emirater", + "countries.ar": "Argentina", + "countries.am": "Armenia", + "countries.ag": "Antigua og Barbuda", + "countries.au": "Australia", + "countries.at": "Østerrike", + "countries.az": "Aserbajdsjan", + "countries.bi": "Burundi", + "countries.be": "Belgia", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesh", + "countries.bg": "Bulgaria", + "countries.bh": "Bahrain", + "countries.bs": "Bahamas", + "countries.ba": "Bosnia-Hercegovina", + "countries.by": "Hviterussland", + "countries.bz": "Belize", + "countries.bo": "Bolivia", + "countries.br": "Brasil", + "countries.bb": "Barbados", + "countries.bn": "Brunei Darussalam", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Den sentralafrikanske republikk", + "countries.ca": "Canada", + "countries.ch": "Sveits", + "countries.cl": "Chile", + "countries.cn": "Kina", + "countries.ci": "Elfenbenskysten", + "countries.cm": "Kamerun", + "countries.cd": "Den demokratiske republikken Kongo", + "countries.cg": "Republikken Kongo", + "countries.co": "Colombia", + "countries.km": "Komorene", + "countries.cv": "Kapp Verde", + "countries.cr": "Costa Rica", + "countries.cu": "Cuba", + "countries.cy": "Kypros", + "countries.cz": "Tjekkia", + "countries.de": "Tyskland", + "countries.dj": "Djibouti", + "countries.dm": "Dominica", + "countries.dk": "Danmark", + "countries.do": "Den dominikanske republikk", + "countries.dz": "Algerie", + "countries.ec": "Ecuador", + "countries.eg": "Egypt", + "countries.er": "Eritrea", + "countries.es": "Spania", + "countries.ee": "Estland", + "countries.et": "Etiopia", + "countries.fi": "Finland", + "countries.fj": "Fiji", + "countries.fr": "Frankrike", + "countries.fm": "Mikronesia", + "countries.ga": "Gabon", + "countries.gb": "Storbritannia", + "countries.ge": "Georgia", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Ekvatorial-Guinea", + "countries.gr": "Hellas", + "countries.gd": "Grenada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Kroatia", + "countries.ht": "Haiti", + "countries.hu": "Ungarn", + "countries.id": "Indonesia", + "countries.in": "India", + "countries.ie": "Irland", + "countries.ir": "Iran", + "countries.iq": "Irak", + "countries.is": "Island", + "countries.il": "Israel", + "countries.it": "Italia", + "countries.jm": "Jamaica", + "countries.jo": "Jordan", + "countries.jp": "Japan", + "countries.kz": "Kasakhstan", + "countries.ke": "Kenya", + "countries.kg": "Kirgisistan", + "countries.kh": "Kambodsja", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts og Nevis", + "countries.kr": "Sør-Korea", + "countries.kw": "Kuwait", + "countries.la": "Laos", + "countries.lb": "Libanon", + "countries.lr": "Liberia", + "countries.ly": "Libya", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Litauen", + "countries.lu": "Luxembourg", + "countries.lv": "Latvia", + "countries.ma": "Marokko", + "countries.mc": "Monaco", + "countries.md": "Moldova", + "countries.mg": "Madagaskar", + "countries.mv": "Maldivene", + "countries.mx": "Mexico", + "countries.mh": "Marshalløyene", + "countries.mk": "Nord-Makedonia", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Myanmar", + "countries.me": "Montenegro", + "countries.mn": "Mongolia", + "countries.mz": "Mozambik", + "countries.mr": "Mauritania", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malaysia", + "countries.na": "Namibia", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nicaragua", + "countries.nl": "Nederland", + "countries.no": "Norge", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "New Zealand", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Filippinene", + "countries.pw": "Palau", + "countries.pg": "Papua Ny-Guinea", + "countries.pl": "Polen", + "countries.kp": "Nord-Korea", + "countries.pt": "Portugal", + "countries.py": "Paraguay", + "countries.qa": "Qatar", + "countries.ro": "Romania", + "countries.ru": "Russland", + "countries.rw": "Rwanda", + "countries.sa": "Saudi-Arabia", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapore", + "countries.sb": "Solomonøyene", + "countries.sl": "Sierra Leone", + "countries.sv": "El Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbia", + "countries.ss": "Sør-Sudan", + "countries.st": "São Tomé og Príncipe", + "countries.sr": "Surinam", + "countries.sk": "Slovakia", + "countries.si": "Slovenia", + "countries.se": "Sverige", + "countries.sz": "Swaziland", + "countries.sc": "Seychellene", + "countries.sy": "Syria", + "countries.td": "Tsjad", + "countries.tg": "Togo", + "countries.th": "Thailand", + "countries.tj": "Tajikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Øst-Timor", + "countries.to": "Tonga", + "countries.tt": "Trinidad og Tobago", + "countries.tn": "Tunisia", + "countries.tr": "Tyrkia", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzania", + "countries.ug": "Uganda", + "countries.ua": "Ukraina", + "countries.uy": "Uruguay", + "countries.us": "Amerikas forente stater", + "countries.uz": "Usbekistan", + "countries.va": "Vatikanstaten", + "countries.vc": "Saint Vincent og Grenadinene", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Jemen", + "countries.za": "Sør-Africa", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Afrika", + "continents.an": "Antarktis", + "continents.as": "Asia", + "continents.eu": "Europa", + "continents.na": "Nord-Amerika", + "continents.oc": "Oseania", + "continents.sa": "Sør-Amerika" +} \ No newline at end of file diff --git a/app/init.php b/app/init.php index 8c1d6cb455..7f58edf9ce 100644 --- a/app/init.php +++ b/app/init.php @@ -294,6 +294,7 @@ Locale::setLanguageFromJSON('lt', __DIR__.'/config/locale/translations/lt.json') Locale::setLanguageFromJSON('ml', __DIR__.'/config/locale/translations/ml.json'); Locale::setLanguageFromJSON('mr', __DIR__.'/config/locale/translations/mr.json'); Locale::setLanguageFromJSON('ms', __DIR__.'/config/locale/translations/ms.json'); +Locale::setLanguageFromJSON('nb', __DIR__.'/config/locale/translations/nb.json'); Locale::setLanguageFromJSON('ne', __DIR__.'/config/locale/translations/ne.json'); Locale::setLanguageFromJSON('nl', __DIR__.'/config/locale/translations/nl.json'); Locale::setLanguageFromJSON('no', __DIR__.'/config/locale/translations/no.json'); From 3ee11afe8878120d43330ea138677e255a7d11fb Mon Sep 17 00:00:00 2001 From: David Mendoza Date: Tue, 5 Oct 2021 11:50:54 -0600 Subject: [PATCH 128/257] Fixed PSR issues on event library --- src/Appwrite/Event/Event.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Appwrite/Event/Event.php b/src/Appwrite/Event/Event.php index b2c69337a2..19496bee75 100644 --- a/src/Appwrite/Event/Event.php +++ b/src/Appwrite/Event/Event.php @@ -6,7 +6,6 @@ use Resque; class Event { - const DELETE_QUEUE_NAME = 'v1-deletes'; const DELETE_CLASS_NAME = 'DeletesV1'; From 13c8c9a6fdf59ed38bc9463f0950e5c03da4b999 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Ekstro=CC=88m?= Date: Tue, 5 Oct 2021 19:51:28 +0200 Subject: [PATCH 129/257] Add missing Swedish translations --- app/config/locale/translations/sv.json | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/sv.json b/app/config/locale/translations/sv.json index cef2c1cde4..83135464e3 100644 --- a/app/config/locale/translations/sv.json +++ b/app/config/locale/translations/sv.json @@ -3,30 +3,30 @@ "settings.locale": "sv", "settings.direction": "ltr", "emails.sender": "%s-teamet", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Verifiera konto", + "emails.verification.hello": "Hej {{name}}", + "emails.verification.body": "Klicka på denna länk för att verifiera din email", + "emails.verification.footer": "Om du inte bad om att verifiera den här adressen kan du ignorera detta mail.", + "emails.verification.thanks": "Tack", + "emails.verification.signature": "{{project}} teamet", + "emails.magicSession.subject": "Logga in", + "emails.magicSession.hello": "Hej,", + "emails.magicSession.body": "Klicka på denna länk för att logga in.", + "emails.magicSession.footer": "Om du inte bad om att logga in med denna address kan du ignorera detta mail.", + "emails.magicSession.thanks": "Tack", + "emails.magicSession.signature": "{{project}} teamet", + "emails.recovery.subject": "Återställ lösenord", + "emails.recovery.hello": "Hej {{name}}", + "emails.recovery.body": "Klicka på denna länk för att återställa lösenordet på {{project}}", + "emails.recovery.footer": "Om du inte bad om att återställa ditt lösenord kan du ignorera detta mail.", + "emails.recovery.thanks": "Tack", + "emails.recovery.signature": "{{project}} teamet", + "emails.invitation.subject": "Inbjudan till %s teamet på %s", + "emails.invitation.hello": "Hej", + "emails.invitation.body": "Detta mail skickades till dig eftersom {{owner}} ville bjuda in dig att bli medlem i teamet {{team}} på {{project}}.", + "emails.invitation.footer": "Om du inte är intresserad kan du ignorera detta mail.", + "emails.invitation.thanks": "Tack", + "emails.invitation.signature": "{{project}} teamet", "locale.country.unknown": "Okänt", "countries.af": "Afghanistan", "countries.ao": "Angola", From 0f89d969e83115e6329ee1515bc80fc910c5cf03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Ekstro=CC=88m?= Date: Tue, 5 Oct 2021 19:53:06 +0200 Subject: [PATCH 130/257] Use e-postadressen instead of adressen --- app/config/locale/translations/sv.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/sv.json b/app/config/locale/translations/sv.json index 83135464e3..78f3dc57b3 100644 --- a/app/config/locale/translations/sv.json +++ b/app/config/locale/translations/sv.json @@ -6,13 +6,13 @@ "emails.verification.subject": "Verifiera konto", "emails.verification.hello": "Hej {{name}}", "emails.verification.body": "Klicka på denna länk för att verifiera din email", - "emails.verification.footer": "Om du inte bad om att verifiera den här adressen kan du ignorera detta mail.", + "emails.verification.footer": "Om du inte bad om att verifiera den här e-postadressen kan du ignorera detta mail.", "emails.verification.thanks": "Tack", "emails.verification.signature": "{{project}} teamet", "emails.magicSession.subject": "Logga in", "emails.magicSession.hello": "Hej,", "emails.magicSession.body": "Klicka på denna länk för att logga in.", - "emails.magicSession.footer": "Om du inte bad om att logga in med denna address kan du ignorera detta mail.", + "emails.magicSession.footer": "Om du inte bad om att logga in med denna e-postadress kan du ignorera detta mail.", "emails.magicSession.thanks": "Tack", "emails.magicSession.signature": "{{project}} teamet", "emails.recovery.subject": "Återställ lösenord", From 3897b2293b39022509d2c35fd13ee0899b2be579 Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Tue, 5 Oct 2021 15:21:23 -0300 Subject: [PATCH 131/257] Update app/config/locale/translations/esp.json Co-authored-by: Christy Jacob --- app/config/locale/translations/esp.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/esp.json b/app/config/locale/translations/esp.json index bcf724cf47..a726beebb7 100644 --- a/app/config/locale/translations/esp.json +++ b/app/config/locale/translations/esp.json @@ -4,7 +4,7 @@ "emails.sender": "Teamo %s", "emails.verification.subject": "Konta Konfirmo", "emails.verification.hello": "Saluton {{name}}", - "emails.verification.body": "Alklaku ĉi tiun ligon por kontroli vian retpoŝtan adreson.”, + "emails.verification.body": "Alklaku ĉi tiun ligon por kontroli vian retpoŝtan adreson.", "emails.verification.footer": "Se vi ne petis ĉi tiun konfirmon de ĉi tiu retpoŝto, vi povas ignori ĉi tiun mesaĝon.”, "emails.verification.thanks": "Dankegon.", "emails.verification.signature": "Teamo {{project}}", From 6122578fe51780e56b48675289924117290b1dac Mon Sep 17 00:00:00 2001 From: Papu Kumar Date: Wed, 6 Oct 2021 00:53:04 +0530 Subject: [PATCH 132/257] fix PSR issues in Auth library #1937 --- src/Appwrite/Auth/Auth.php | 18 +++++++++--------- src/Appwrite/Auth/OAuth2/Box.php | 8 ++++---- src/Appwrite/Auth/OAuth2/PaypalSandbox.php | 1 - src/Appwrite/Auth/OAuth2/Twitch.php | 3 ++- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Appwrite/Auth/Auth.php b/src/Appwrite/Auth/Auth.php index 4ea9751854..603983c7fd 100644 --- a/src/Appwrite/Auth/Auth.php +++ b/src/Appwrite/Auth/Auth.php @@ -241,14 +241,14 @@ class Auth /** * Is Previligged User? - * + * * @param array $roles - * + * * @return bool */ public static function isPrivilegedUser(array $roles): bool { - if( + if ( array_key_exists('role:'.self::USER_ROLE_OWNER, $roles) || array_key_exists('role:'.self::USER_ROLE_DEVELOPER, $roles) || array_key_exists('role:'.self::USER_ROLE_ADMIN, $roles) @@ -261,14 +261,14 @@ class Auth /** * Is App User? - * + * * @param array $roles - * + * * @return bool */ public static function isAppUser(array $roles): bool { - if(array_key_exists('role:'.self::USER_ROLE_APP, $roles)) { + if (array_key_exists('role:'.self::USER_ROLE_APP, $roles)) { return true; } @@ -277,9 +277,9 @@ class Auth /** * Returns all roles for a user. - * - * @param Document $user - * @return array + * + * @param Document $user + * @return array */ public static function getRoles(Document $user): array { diff --git a/src/Appwrite/Auth/OAuth2/Box.php b/src/Appwrite/Auth/OAuth2/Box.php index 7fbcf59545..ad626b633e 100644 --- a/src/Appwrite/Auth/OAuth2/Box.php +++ b/src/Appwrite/Auth/OAuth2/Box.php @@ -28,7 +28,7 @@ class Box extends OAuth2 * @var array */ protected $scopes = [ - 'manage_app_users', + 'manage_app_users', ]; /** @@ -45,10 +45,10 @@ class Box extends OAuth2 public function getLoginURL(): string { $url = $this->endpoint . 'authorize?'. - \http_build_query([ + \http_build_query([ 'response_type' => 'code', 'client_id' => $this->appID, - 'scope' => \implode(',', $this->getScopes()), + 'scope' => \implode(',', $this->getScopes()), 'redirect_uri' => $this->callback, 'state' => \json_encode($this->state), ]); @@ -156,4 +156,4 @@ class Box extends OAuth2 return $this->user; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Auth/OAuth2/PaypalSandbox.php b/src/Appwrite/Auth/OAuth2/PaypalSandbox.php index 8c4baee6ba..82698555d4 100644 --- a/src/Appwrite/Auth/OAuth2/PaypalSandbox.php +++ b/src/Appwrite/Auth/OAuth2/PaypalSandbox.php @@ -4,7 +4,6 @@ namespace Appwrite\Auth\OAuth2; use Appwrite\Auth\OAuth2\Paypal; - class PaypalSandbox extends Paypal { protected $environment = 'sandbox'; diff --git a/src/Appwrite/Auth/OAuth2/Twitch.php b/src/Appwrite/Auth/OAuth2/Twitch.php index 9608f9f619..7e0c040337 100644 --- a/src/Appwrite/Auth/OAuth2/Twitch.php +++ b/src/Appwrite/Auth/OAuth2/Twitch.php @@ -139,7 +139,8 @@ class Twitch extends OAuth2 if (empty($this->user)) { $response = \json_decode($this->request( 'GET', - $this->resourceEndpoint , [ + $this->resourceEndpoint, + [ 'Authorization: Bearer '.\urlencode($accessToken), 'Client-Id: '. \urlencode($this->appID) ] From ef0172beb11647ffd1ad7406d072b4d9922685d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andreas=20Ekstro=CC=88m?= Date: Tue, 5 Oct 2021 21:43:16 +0200 Subject: [PATCH 133/257] Fix indentation --- app/config/locale/translations/sv.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/sv.json b/app/config/locale/translations/sv.json index 78f3dc57b3..eecca99a55 100644 --- a/app/config/locale/translations/sv.json +++ b/app/config/locale/translations/sv.json @@ -12,7 +12,7 @@ "emails.magicSession.subject": "Logga in", "emails.magicSession.hello": "Hej,", "emails.magicSession.body": "Klicka på denna länk för att logga in.", - "emails.magicSession.footer": "Om du inte bad om att logga in med denna e-postadress kan du ignorera detta mail.", + "emails.magicSession.footer": "Om du inte bad om att logga in med denna e-postadress kan du ignorera detta mail.", "emails.magicSession.thanks": "Tack", "emails.magicSession.signature": "{{project}} teamet", "emails.recovery.subject": "Återställ lösenord", From 2865921c0099195e052b0ef8272b389a752ba14b Mon Sep 17 00:00:00 2001 From: Emilia Date: Tue, 5 Oct 2021 22:07:39 +0200 Subject: [PATCH 134/257] Fix PSR issues in Network --- src/Appwrite/Network/Validator/IP.php | 14 ++++---- src/Appwrite/Network/Validator/Origin.php | 42 +++++++++++------------ 2 files changed, 28 insertions(+), 28 deletions(-) diff --git a/src/Appwrite/Network/Validator/IP.php b/src/Appwrite/Network/Validator/IP.php index 84689b3ff7..5d7833da6f 100644 --- a/src/Appwrite/Network/Validator/IP.php +++ b/src/Appwrite/Network/Validator/IP.php @@ -14,9 +14,9 @@ use Utopia\Validator; */ class IP extends Validator { - const ALL = 'all'; - const V4 = 'ipv4'; - const V6 = 'ipv6'; + public const ALL = 'all'; + public const V4 = 'ipv4'; + public const V6 = 'ipv6'; /** * @var string @@ -67,24 +67,24 @@ class IP extends Validator return true; } break; - + case self::V4: if (\filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { return true; } break; - + case self::V6: if (\filter_var($value, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) { return true; } break; - + default: return false; break; } - + return false; } diff --git a/src/Appwrite/Network/Validator/Origin.php b/src/Appwrite/Network/Validator/Origin.php index 1581c445c6..9677bc14eb 100644 --- a/src/Appwrite/Network/Validator/Origin.php +++ b/src/Appwrite/Network/Validator/Origin.php @@ -6,24 +6,24 @@ use Utopia\Validator; class Origin extends Validator { - const CLIENT_TYPE_UNKNOWN = 'unknown'; - const CLIENT_TYPE_WEB = 'web'; - const CLIENT_TYPE_FLUTTER_IOS = 'flutter-ios'; - const CLIENT_TYPE_FLUTTER_ANDROID = 'flutter-android'; - const CLIENT_TYPE_FLUTTER_MACOS = 'flutter-macos'; - const CLIENT_TYPE_FLUTTER_WINDOWS = 'flutter-windows'; - const CLIENT_TYPE_FLUTTER_LINUX = 'flutter-linux'; - const CLIENT_TYPE_ANDROID = 'android'; - const CLIENT_TYPE_IOS = 'ios'; + public const CLIENT_TYPE_UNKNOWN = 'unknown'; + public const CLIENT_TYPE_WEB = 'web'; + public const CLIENT_TYPE_FLUTTER_IOS = 'flutter-ios'; + public const CLIENT_TYPE_FLUTTER_ANDROID = 'flutter-android'; + public const CLIENT_TYPE_FLUTTER_MACOS = 'flutter-macos'; + public const CLIENT_TYPE_FLUTTER_WINDOWS = 'flutter-windows'; + public const CLIENT_TYPE_FLUTTER_LINUX = 'flutter-linux'; + public const CLIENT_TYPE_ANDROID = 'android'; + public const CLIENT_TYPE_IOS = 'ios'; - - const SCHEME_TYPE_HTTP = 'http'; - const SCHEME_TYPE_HTTPS = 'https'; - const SCHEME_TYPE_IOS = 'appwrite-ios'; - const SCHEME_TYPE_ANDROID = 'appwrite-android'; - const SCHEME_TYPE_MACOS = 'appwrite-macos'; - const SCHEME_TYPE_WINDOWS = 'appwrite-windows'; - const SCHEME_TYPE_LINUX = 'appwrite-linux'; + + public const SCHEME_TYPE_HTTP = 'http'; + public const SCHEME_TYPE_HTTPS = 'https'; + public const SCHEME_TYPE_IOS = 'appwrite-ios'; + public const SCHEME_TYPE_ANDROID = 'appwrite-android'; + public const SCHEME_TYPE_MACOS = 'appwrite-macos'; + public const SCHEME_TYPE_WINDOWS = 'appwrite-windows'; + public const SCHEME_TYPE_LINUX = 'appwrite-linux'; /** * @var array @@ -61,22 +61,22 @@ class Origin extends Validator { foreach ($platforms as $platform) { $type = (isset($platform['type'])) ? $platform['type'] : ''; - + switch ($type) { case self::CLIENT_TYPE_WEB: $this->clients[] = (isset($platform['hostname'])) ? $platform['hostname'] : ''; break; - + case self::CLIENT_TYPE_FLUTTER_IOS: case self::CLIENT_TYPE_FLUTTER_ANDROID: case self::CLIENT_TYPE_FLUTTER_MACOS: case self::CLIENT_TYPE_FLUTTER_WINDOWS: case self::CLIENT_TYPE_FLUTTER_LINUX: case self::CLIENT_TYPE_ANDROID: - case self::CLIENT_TYPE_IOS: + case self::CLIENT_TYPE_IOS: $this->clients[] = (isset($platform['key'])) ? $platform['key'] : ''; break; - + default: # code... break; From f5cccb975b3a4f3d9a18e2d9f842b3942788aa52 Mon Sep 17 00:00:00 2001 From: jakubhi Date: Tue, 5 Oct 2021 22:28:01 +0200 Subject: [PATCH 135/257] Added Slovak translation Added the Slovak translations of countries, emails and settings (basically everything). --- app/config/locale/codes.php | 1 + app/config/locale/translations/sk.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/sk.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index 13f1e5baeb..156c0a253a 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -48,6 +48,7 @@ return [ 'ro', // Romanian 'ru', // Russian 'si', // Sinhala + 'sk', // Slovakia 'sl', // Slovenian 'sq', // Albanian 'sv', // Swedish diff --git a/app/config/locale/translations/sk.json b/app/config/locale/translations/sk.json new file mode 100644 index 0000000000..9ee0ce410e --- /dev/null +++ b/app/config/locale/translations/sk.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"Umenie múdrosti je umenie vedieť, čo prehliadnuť.\"", + "settings.locale": "sk", + "settings.direction": "ltr", + "emails.sender": "%s Tím", + "emails.verification.subject": "Overenie účtu", + "emails.verification.hello": "Ahoj {{name}}", + "emails.verification.body": "Použi tento link pre overenie svojej emailovej adresy.", + "emails.verification.footer": "Ak si nepožiadal o overenie tejto adresy, môžeš túto správu ignorovať.", + "emails.verification.thanks": "Ďakujeme.", + "emails.verification.signature": "{{project}} tím", + "emails.magicSession.subject": "Prihlásenie", + "emails.magicSession.hello": "Ahoj,", + "emails.magicSession.body": "Použi tento link pre prihlásenie.", + "emails.magicSession.footer": "Ak si nepožiadal o prihlásenie cez email, túto správu môžeš ignorovať.", + "emails.magicSession.thanks": "Ďakujeme", + "emails.magicSession.signature": "{{project}} tím", + "emails.recovery.subject": "Obnovenie hesla", + "emails.recovery.hello": "Ahoj {{name}}", + "emails.recovery.body": "Použi tento link pre obnovenie svojho {{project}} hesla.", + "emails.recovery.footer": "Ak si nepožiadal o obnovu svojho hesla, túto správu môžeš ignorovať.", + "emails.recovery.thanks": "Ďakujeme", + "emails.recovery.signature": "{{project}} tím", + "emails.invitation.subject": "Pozvánka do %s Tímu v %s", + "emails.invitation.hello": "Ahoj", + "emails.invitation.body": "Tento email ti bol zaslaný, pretože {{owner}} ťa chce pozvať aby si sa stal členom {{team}} tímu v {{project}}.", + "emails.invitation.footer": "Ak nemáš záujem, môžeš túto správu ignorovať.", + "emails.invitation.thanks": "Ďakujeme", + "emails.invitation.signature": "{{project}} tím", + "locale.country.unknown": "Neznámy", + "countries.af": "Afganistan", + "countries.ao": "Angola", + "countries.al": "Albánsko", + "countries.ad": "Andorra", + "countries.ae": "Spojené arabské emiráty", + "countries.ar": "Argentína", + "countries.am": "Arménsko", + "countries.ag": "Antigua a Barbuda", + "countries.au": "Austrália", + "countries.at": "Rakúsko", + "countries.az": "Azerbajdžan", + "countries.bi": "Burundi", + "countries.be": "Belgicko", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladéš", + "countries.bg": "Bulharsko", + "countries.bh": "Bahrajn", + "countries.bs": "Bahamy", + "countries.ba": "Bosnia and Herzegovina", + "countries.by": "Bielorusko", + "countries.bz": "Belize", + "countries.bo": "Bolívia", + "countries.br": "Brazília", + "countries.bb": "Barbados", + "countries.bn": "Brunej", + "countries.bt": "Bhután", + "countries.bw": "Botswana", + "countries.cf": "Stredoafrická republika", + "countries.ca": "Kanada", + "countries.ch": "Švajčiarsko", + "countries.cl": "Čile", + "countries.cn": "Čína", + "countries.ci": "Pobrežie Slonoviny", + "countries.cm": "Kamerun", + "countries.cd": "Konžská demokratická republika", + "countries.cg": "Kongo", + "countries.co": "Kolumbia", + "countries.km": "Komory", + "countries.cv": "Kapverdy", + "countries.cr": "Kostarika", + "countries.cu": "Kuba", + "countries.cy": "Cyprus", + "countries.cz": "Česko", + "countries.de": "Nemecko", + "countries.dj": "Džibutsko", + "countries.dm": "Dominika", + "countries.dk": "Denmark", + "countries.do": "Dominikánska republika", + "countries.dz": "Alžírsko", + "countries.ec": "Ekvádor", + "countries.eg": "Egypt", + "countries.er": "Eritrea", + "countries.es": "Španielsko", + "countries.ee": "Estónsko", + "countries.et": "Etiópia", + "countries.fi": "Fínsko", + "countries.fj": "Fidži", + "countries.fr": "Francúzsko", + "countries.fm": "Mikronézia", + "countries.ga": "Gabon", + "countries.gb": "Spojené kráľovstvo", + "countries.ge": "Gruzínsko", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Rovníková Guinea", + "countries.gr": "Grécko", + "countries.gd": "Grenada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Chorvátsko", + "countries.ht": "Haiti", + "countries.hu": "Maďarsko", + "countries.id": "Indonézia", + "countries.in": "India", + "countries.ie": "Írsko", + "countries.ir": "Irán", + "countries.iq": "Irak", + "countries.is": "Island", + "countries.il": "Izrael", + "countries.it": "Taliansko", + "countries.jm": "Jamajka", + "countries.jo": "Jordánsko", + "countries.jp": "Japonsko", + "countries.kz": "Kazachstan", + "countries.ke": "Keňa", + "countries.kg": "Kirgizsko", + "countries.kh": "Kambodža", + "countries.ki": "Kiribati", + "countries.kn": "Svätý Krištof a Nevis", + "countries.kr": "Južná Kórea", + "countries.kw": "Kuvajt", + "countries.la": "Laos", + "countries.lb": "Libanon", + "countries.lr": "Libéria", + "countries.ly": "Líbya", + "countries.lc": "Svätá Lucia", + "countries.li": "Lichtenštajnsko", + "countries.lk": "Srí Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Litva", + "countries.lu": "Luxembursko", + "countries.lv": "Lotyšsko", + "countries.ma": "Maroko", + "countries.mc": "Monako", + "countries.md": "Moldavsko", + "countries.mg": "Madagaskar", + "countries.mv": "Maldivy", + "countries.mx": "Mexiko", + "countries.mh": "Marshall Islands", + "countries.mk": "Macedónsko", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Mjanmarsko", + "countries.me": "Čierna Hora", + "countries.mn": "Monglosko", + "countries.mz": "Mozambik", + "countries.mr": "Mauritánia", + "countries.mu": "Maurícius", + "countries.mw": "Malawi", + "countries.my": "Malajzia", + "countries.na": "Namíbia", + "countries.ne": "Niger", + "countries.ng": "Nigéria", + "countries.ni": "Nikaragua", + "countries.nl": "Holandsko", + "countries.no": "Nórsko", + "countries.np": "Nepál", + "countries.nr": "Nauru", + "countries.nz": "Nový Zéland", + "countries.om": "Omán", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Filipíny", + "countries.pw": "Palau", + "countries.pg": "Papua-Nová Guinea", + "countries.pl": "Poľsko", + "countries.kp": "Severná Kórea", + "countries.pt": "Portugalsko", + "countries.py": "Paraguaj", + "countries.qa": "Katar", + "countries.ro": "Rumunsko", + "countries.ru": "Rusko", + "countries.rw": "Rwanda", + "countries.sa": "Saudská Arábia", + "countries.sd": "Sudán", + "countries.sn": "Senegal", + "countries.sg": "Singapur", + "countries.sb": "Šalamúnove ostrovy", + "countries.sl": "Sierra Leone", + "countries.sv": "Salvádor", + "countries.sm": "San Maríno", + "countries.so": "Somálsko", + "countries.rs": "Srbsko", + "countries.ss": "Južný Sudán", + "countries.st": "Svätý Tomáš a Princov ostrov", + "countries.sr": "Surinam", + "countries.sk": "Slovensko", + "countries.si": "Slovinsko", + "countries.se": "Švédsko", + "countries.sz": "Svazijsko", + "countries.sc": "Seychely", + "countries.sy": "Sýria", + "countries.td": "Čad", + "countries.tg": "Togo", + "countries.th": "Thajsko", + "countries.tj": "Tadžikistan", + "countries.tm": "Turkménsko", + "countries.tl": "Východný Timor", + "countries.to": "Tonga", + "countries.tt": "Trinidad a Tobago", + "countries.tn": "Tunisko", + "countries.tr": "Turecko", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzánia", + "countries.ug": "Uganda", + "countries.ua": "Ukrajna", + "countries.uy": "Uruguaj", + "countries.us": "Spojené štáty", + "countries.uz": "Uzbekistan", + "countries.va": "Vatikán", + "countries.vc": "Svätý Vincent a Grenadíny", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Jemen", + "countries.za": "Južná Afrika", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Afrika", + "continents.an": "Antarktída", + "continents.as": "Ázia", + "continents.eu": "Európa", + "continents.na": "Severná Amerika", + "continents.oc": "Oceánia", + "continents.sa": "Južná Amerika" +} \ No newline at end of file diff --git a/app/init.php b/app/init.php index de8986b285..181c659d21 100644 --- a/app/init.php +++ b/app/init.php @@ -307,6 +307,7 @@ Locale::setLanguageFromJSON('pt-pt', __DIR__.'/config/locale/translations/pt-pt. Locale::setLanguageFromJSON('ro', __DIR__.'/config/locale/translations/ro.json'); Locale::setLanguageFromJSON('ru', __DIR__ . '/config/locale/translations/ru.json'); Locale::setLanguageFromJSON('si', __DIR__ . '/config/locale/translations/si.json'); +Locale::setLanguageFromJSON('sk', __DIR__ . '/config/locale/translations/sk.json'); Locale::setLanguageFromJSON('sl', __DIR__ . '/config/locale/translations/sl.json'); Locale::setLanguageFromJSON('sq', __DIR__ . '/config/locale/translations/sq.json'); Locale::setLanguageFromJSON('sv', __DIR__ . '/config/locale/translations/sv.json'); From a9cee981455ef98d83ad23cf92d8a1d12c3feebd Mon Sep 17 00:00:00 2001 From: Christian Leo-Pernold Date: Tue, 5 Oct 2021 23:36:03 +0200 Subject: [PATCH 136/257] Update de.json Fix spelling of Nordkorea. Change Mazedonien to Nordmazedonien --- app/config/locale/translations/de.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/de.json b/app/config/locale/translations/de.json index e680db4a1f..b3de6a2fb1 100644 --- a/app/config/locale/translations/de.json +++ b/app/config/locale/translations/de.json @@ -141,7 +141,7 @@ "countries.mv": "Malediven", "countries.mx": "Mexiko", "countries.mh": "Marshallinseln", - "countries.mk": "Mazedonien", + "countries.mk": "Nordmazedonien", "countries.ml": "Mali", "countries.mt": "Malta", "countries.mm": "Myanmar", @@ -169,7 +169,7 @@ "countries.pw": "Palau", "countries.pg": "Papua Neu-Guinea", "countries.pl": "Polen", - "countries.kp": "Nord Korea", + "countries.kp": "Nordkorea", "countries.pt": "Portugal", "countries.py": "Paraguay", "countries.qa": "Katar", From 39644c1562b76913f81915dd4dc30634a111d743 Mon Sep 17 00:00:00 2001 From: Luke Banicevic <60857954+banaboi@users.noreply.github.com> Date: Wed, 6 Oct 2021 12:37:53 +1100 Subject: [PATCH 137/257] Fixed typo --- docs/services/functions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/services/functions.md b/docs/services/functions.md index 26267dcfa7..a5faec534e 100644 --- a/docs/services/functions.md +++ b/docs/services/functions.md @@ -1,5 +1,5 @@ The Functions service allows you to create custom behaviour that can be triggered by any supported Appwrite system events or by a predefined schedule. -Appwrite Cloud Functions lets you automatically run backend code in response to events triggered by Appwrite or by setting it to be executed in a predefined schedule. Your code is stored in a secure way on your Appwrite instance and is executed in an isolated enviornment. +Appwrite Cloud Functions lets you automatically run backend code in response to events triggered by Appwrite or by setting it to be executed in a predefined schedule. Your code is stored in a secure way on your Appwrite instance and is executed in an isolated environment. You can learn more by following our [Cloud Functions tutorial](https://appwrite.io/docs/functions). \ No newline at end of file From bb7bc65f0653e6d6ffb43fd8362549fb57fec356 Mon Sep 17 00:00:00 2001 From: Aman Atman <41161981+willtryagain@users.noreply.github.com> Date: Wed, 6 Oct 2021 10:44:15 +0530 Subject: [PATCH 138/257] Update hi.json --- app/config/locale/translations/hi.json | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/app/config/locale/translations/hi.json b/app/config/locale/translations/hi.json index b1da830854..a1ef9b7aa5 100644 --- a/app/config/locale/translations/hi.json +++ b/app/config/locale/translations/hi.json @@ -5,26 +5,26 @@ "emails.sender": "%s टीम", "emails.verification.subject": "खाता सत्यापन", "emails.verification.hello": "नमस्ते {{name}}", - "emails.verification.body": "अपना ईमेल सत्यापित करने के लिए इस लिंक का अनुसरण करें।", - "emails.verification.footer": "यदि आपने इस पते को सत्यापित करने के लिए नहीं कहा है, तो आप इस संदेश को अनदेखा कर सकते हैं।", + "emails.verification.body": "इस लिंक के माध्यम से ईमेल सत्यापित कीजिये।", + "emails.verification.footer": "यदि आपने इस पते को सत्यापित करने के लिए नहीं कहा है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", "emails.verification.thanks": "धन्यवाद", "emails.verification.signature": "{{project}} टीम", "emails.magicSession.subject": "लॉग इन", "emails.magicSession.hello": "नमस्ते,", - "emails.magicSession.body": "लॉग इन करने के लिए इस लिंक का पालन करें।", - "emails.magicSession.footer": "यदि आपने इस ईमेल का उपयोग करके लॉगिन करने के लिए नहीं कहा है, तो आप इस संदेश को अनदेखा कर सकते हैं।", + "emails.magicSession.body": "इस लिंक के माध्यम से लॉग इन करें।", + "emails.magicSession.footer": "यदि आपने इस ईमेल का उपयोग करके लॉगिन करने के लिए नहीं कहा है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", "emails.magicSession.thanks": "धन्यवाद", "emails.magicSession.signature": "{{project}} टीम", "emails.recovery.subject": "पासवर्ड रीसेट", "emails.recovery.hello": "नमस्ते {{name}}", - "emails.recovery.body": "अपना {{project}} पासवर्ड रीसेट करने के लिए इस लिंक का अनुसरण करें।", - "emails.recovery.footer": "यदि आपने अपना पासवर्ड रीसेट करने के लिए नहीं कहा है, तो आप इस संदेश को अनदेखा कर सकते हैं।", + "emails.recovery.body": "इस लिंक के माध्यम से अपना {{project}} पासवर्ड रीसेट करें।", + "emails.recovery.footer": "यदि आपने अपना पासवर्ड रीसेट करने के लिए नहीं कहा है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", "emails.recovery.thanks": "धन्यवाद", "emails.recovery.signature": "{{project}} टीम", "emails.invitation.subject": "%s टीम को %s पर आमंत्रण", "emails.invitation.hello": "नमस्ते", - "emails.invitation.body": "यह मेल आपको इसलिए भेजा गया था क्योंकि {{owner}} आपको {{project}} पर {{team}} टीम का सदस्य बनने के लिए आमंत्रित करना चाहता था।", - "emails.invitation.footer": "यदि आप रुचि नहीं रखते हैं, तो आप इस संदेश को अनदेखा कर सकते हैं।", + "emails.invitation.body": "यह मेल आपको इसलिए भेजा गया था क्योंकि {{owner}} आपको {{team}} टीम का सदस्य बनने के लिए आमंत्रित करना चाहते थे जो {{project}} से जुड़ा है।", + "emails.invitation.footer": "यदि यह आपके लिए आवश्यक नहीं है, तो आप इस संदेश को नज़रअंदाज़ कर सकते हैं।", "emails.invitation.thanks": "धन्यवाद", "emails.invitation.signature": "{{project}} टीम", "locale.country.unknown": "अज्ञात", From 1a2a1c4df80821377cad66846e14279a3a85706b Mon Sep 17 00:00:00 2001 From: divshacker Date: Wed, 6 Oct 2021 12:26:23 +0530 Subject: [PATCH 139/257] updated_templates --- src/Appwrite/Template/Template.php | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/src/Appwrite/Template/Template.php b/src/Appwrite/Template/Template.php index 425014e210..7c175de770 100644 --- a/src/Appwrite/Template/Template.php +++ b/src/Appwrite/Template/Template.php @@ -5,24 +5,22 @@ namespace Appwrite\Template; use Exception; use Utopia\View; - class Template extends View { - /** * @var string */ - protected string $content = ''; + protected string $content = ''; /** * fromFile * * Creates a new Template() from the file at $path - * + * * @param string $path * * @return self - * + * */ public static function fromFile(string $path): self { @@ -38,11 +36,11 @@ class Template extends View * fromString * * Creates a new Template() using a raw string - * + * * @param string $content * * @return self - * + * */ public static function fromString(string $content): self { @@ -73,7 +71,7 @@ class Template extends View if (\is_readable($this->path)) { $template = \file_get_contents($this->path); // Include template file - } else if (!empty($this->content)) { + } elseif (!empty($this->content)) { $template = $this->print($this->content, self::FILTER_NL2P); } else { throw new Exception('"'.$this->path.'" template is not readable or not found'); @@ -116,7 +114,7 @@ class Template extends View $port = isset($url['port']) ? ':'.$url['port'] : ''; $user = isset($url['user']) ? $url['user'] : ''; - $pass = isset($url['pass']) ? ':'.$url['pass'] : ''; + $pass = isset($url['pass']) ? ':'.$url['pass'] : ''; $pass = ($user || $pass) ? "$pass@" : ''; $path = isset($url['path']) ? $url['path'] : ''; @@ -150,9 +148,9 @@ class Template extends View /** * From Camel Case - * + * * @var string $input - * + * * @return string */ public static function fromCamelCaseToSnake($input): string @@ -168,14 +166,13 @@ class Template extends View /** * From Camel Case to Dash Case - * + * * @var string $input - * + * * @return string */ public static function fromCamelCaseToDash($input): string { return \str_replace([' ', '_'], '-', \strtolower(\preg_replace('/([a-zA-Z])(?=[A-Z])/', '$1-', $input))); } - } From d41384f01cabda3ea905b5677c50fbae9b903bed Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 6 Oct 2021 12:33:58 +0530 Subject: [PATCH 140/257] feat: added swift runtime image --- .env | 1 + composer.json | 2 +- composer.lock | 33 +++++++++++++++++-------------- docker-compose.yml | 2 +- public/images/runtimes/swift.png | Bin 0 -> 32573 bytes 5 files changed, 21 insertions(+), 17 deletions(-) create mode 100644 public/images/runtimes/swift.png diff --git a/.env b/.env index 9f6050fe50..9d0fe52448 100644 --- a/.env +++ b/.env @@ -43,3 +43,4 @@ _APP_MAINTENANCE_RETENTION_EXECUTION=1209600 _APP_MAINTENANCE_RETENTION_ABUSE=86400 _APP_MAINTENANCE_RETENTION_AUDIT=1209600 _APP_USAGE_STATS=enabled +_APP_FUNCTIONS_RUNTIMES=swift-5.5 \ No newline at end of file diff --git a/composer.json b/composer.json index 8a7b1570f5..ed8f07dd4c 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "ext-sockets": "*", "appwrite/php-clamav": "1.1.*", - "appwrite/php-runtimes": "0.4.*", + "appwrite/php-runtimes": "dev-main", "utopia-php/framework": "0.18.*", "utopia-php/abuse": "0.5.*", diff --git a/composer.lock b/composer.lock index 9d2ef6169b..d1b1db9b87 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "984640c83bc02c3253a0f38b5f772011", + "content-hash": "097f65580ec4701183436e6cbec01895", "packages": [ { "name": "adhocore/jwt", @@ -115,16 +115,16 @@ }, { "name": "appwrite/php-runtimes", - "version": "0.4.0", + "version": "dev-main", "source": { "type": "git", "url": "https://github.com/appwrite/php-runtimes.git", - "reference": "cc7090a67d8824c779190b38873f0f8154f906b2" + "reference": "1b4caf08eaaca5dca781874a615e967db2670d53" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/php-runtimes/zipball/cc7090a67d8824c779190b38873f0f8154f906b2", - "reference": "cc7090a67d8824c779190b38873f0f8154f906b2", + "url": "https://api.github.com/repos/appwrite/php-runtimes/zipball/1b4caf08eaaca5dca781874a615e967db2670d53", + "reference": "1b4caf08eaaca5dca781874a615e967db2670d53", "shasum": "" }, "require": { @@ -136,6 +136,7 @@ "utopia-php/cli": "0.11.*", "vimeo/psalm": "4.0.1" }, + "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -164,9 +165,9 @@ ], "support": { "issues": "https://github.com/appwrite/php-runtimes/issues", - "source": "https://github.com/appwrite/php-runtimes/tree/0.4.0" + "source": "https://github.com/appwrite/php-runtimes/tree/main" }, - "time": "2021-06-23T07:17:12+00:00" + "time": "2021-10-05T11:14:21+00:00" }, { "name": "chillerlan/php-qrcode", @@ -3559,16 +3560,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.5.0", + "version": "1.5.1", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f" + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/30f38bffc6f24293dadd1823936372dfa9e86e2f", - "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", "shasum": "" }, "require": { @@ -3603,9 +3604,9 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.0" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" }, - "time": "2021-09-17T15:28:14+00:00" + "time": "2021-10-02T14:08:47+00:00" }, { "name": "phpspec/prophecy", @@ -6230,7 +6231,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "appwrite/php-runtimes": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -6252,5 +6255,5 @@ "platform-overrides": { "php": "8.0" }, - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } diff --git a/docker-compose.yml b/docker-compose.yml index 8bb3885ef9..672ee5c9ad 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -71,7 +71,7 @@ services: - ./psalm.xml:/usr/src/code/psalm.xml - ./tests:/usr/src/code/tests - ./app:/usr/src/code/app - # - ./vendor:/usr/src/code/vendor + - ./vendor:/usr/src/code/vendor - ./docs:/usr/src/code/docs - ./public:/usr/src/code/public - ./src:/usr/src/code/src diff --git a/public/images/runtimes/swift.png b/public/images/runtimes/swift.png new file mode 100644 index 0000000000000000000000000000000000000000..1f417900abc3340d700e4a0c30b19ed28b478881 GIT binary patch literal 32573 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 HZP@<-Wm@tc literal 0 HcmV?d00001 From b25bd2c0baedfe739f454e5249f6c0443a63a4d4 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 6 Oct 2021 16:37:01 +0530 Subject: [PATCH 141/257] feat: revert changes --- composer.json | 2 +- docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/composer.json b/composer.json index ed8f07dd4c..8a7b1570f5 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "ext-sockets": "*", "appwrite/php-clamav": "1.1.*", - "appwrite/php-runtimes": "dev-main", + "appwrite/php-runtimes": "0.4.*", "utopia-php/framework": "0.18.*", "utopia-php/abuse": "0.5.*", diff --git a/docker-compose.yml b/docker-compose.yml index 672ee5c9ad..8bb3885ef9 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -71,7 +71,7 @@ services: - ./psalm.xml:/usr/src/code/psalm.xml - ./tests:/usr/src/code/tests - ./app:/usr/src/code/app - - ./vendor:/usr/src/code/vendor + # - ./vendor:/usr/src/code/vendor - ./docs:/usr/src/code/docs - ./public:/usr/src/code/public - ./src:/usr/src/code/src From db988d43abdc5961cb1518f5692deb74fcf19d6a Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Wed, 6 Oct 2021 16:40:13 +0530 Subject: [PATCH 142/257] feat: revert changes --- .env | 1 - composer.lock | 33 +++++++++++++++------------------ 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/.env b/.env index 9d0fe52448..9f6050fe50 100644 --- a/.env +++ b/.env @@ -43,4 +43,3 @@ _APP_MAINTENANCE_RETENTION_EXECUTION=1209600 _APP_MAINTENANCE_RETENTION_ABUSE=86400 _APP_MAINTENANCE_RETENTION_AUDIT=1209600 _APP_USAGE_STATS=enabled -_APP_FUNCTIONS_RUNTIMES=swift-5.5 \ No newline at end of file diff --git a/composer.lock b/composer.lock index d1b1db9b87..9d2ef6169b 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "097f65580ec4701183436e6cbec01895", + "content-hash": "984640c83bc02c3253a0f38b5f772011", "packages": [ { "name": "adhocore/jwt", @@ -115,16 +115,16 @@ }, { "name": "appwrite/php-runtimes", - "version": "dev-main", + "version": "0.4.0", "source": { "type": "git", "url": "https://github.com/appwrite/php-runtimes.git", - "reference": "1b4caf08eaaca5dca781874a615e967db2670d53" + "reference": "cc7090a67d8824c779190b38873f0f8154f906b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/php-runtimes/zipball/1b4caf08eaaca5dca781874a615e967db2670d53", - "reference": "1b4caf08eaaca5dca781874a615e967db2670d53", + "url": "https://api.github.com/repos/appwrite/php-runtimes/zipball/cc7090a67d8824c779190b38873f0f8154f906b2", + "reference": "cc7090a67d8824c779190b38873f0f8154f906b2", "shasum": "" }, "require": { @@ -136,7 +136,6 @@ "utopia-php/cli": "0.11.*", "vimeo/psalm": "4.0.1" }, - "default-branch": true, "type": "library", "autoload": { "psr-4": { @@ -165,9 +164,9 @@ ], "support": { "issues": "https://github.com/appwrite/php-runtimes/issues", - "source": "https://github.com/appwrite/php-runtimes/tree/main" + "source": "https://github.com/appwrite/php-runtimes/tree/0.4.0" }, - "time": "2021-10-05T11:14:21+00:00" + "time": "2021-06-23T07:17:12+00:00" }, { "name": "chillerlan/php-qrcode", @@ -3560,16 +3559,16 @@ }, { "name": "phpdocumentor/type-resolver", - "version": "1.5.1", + "version": "1.5.0", "source": { "type": "git", "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae" + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/a12f7e301eb7258bb68acd89d4aefa05c2906cae", - "reference": "a12f7e301eb7258bb68acd89d4aefa05c2906cae", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/30f38bffc6f24293dadd1823936372dfa9e86e2f", + "reference": "30f38bffc6f24293dadd1823936372dfa9e86e2f", "shasum": "" }, "require": { @@ -3604,9 +3603,9 @@ "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", "support": { "issues": "https://github.com/phpDocumentor/TypeResolver/issues", - "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.1" + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.5.0" }, - "time": "2021-10-02T14:08:47+00:00" + "time": "2021-09-17T15:28:14+00:00" }, { "name": "phpspec/prophecy", @@ -6231,9 +6230,7 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": { - "appwrite/php-runtimes": 20 - }, + "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -6255,5 +6252,5 @@ "platform-overrides": { "php": "8.0" }, - "plugin-api-version": "2.1.0" + "plugin-api-version": "2.0.0" } From 4df8803c75d35e7c7e049805bc6f4e213e5b9b77 Mon Sep 17 00:00:00 2001 From: Srijit Date: Wed, 6 Oct 2021 17:14:03 +0530 Subject: [PATCH 143/257] fix: Fix PSR issue in database library --- src/Appwrite/Database/Adapter/MySQL.php | 11 +++++----- src/Appwrite/Database/Adapter/Redis.php | 2 +- src/Appwrite/Database/Database.php | 22 +++++++++---------- .../Database/Validator/Authorization.php | 4 ++-- .../Database/Validator/Collection.php | 2 +- src/Appwrite/Database/Validator/Structure.php | 4 ++-- 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/src/Appwrite/Database/Adapter/MySQL.php b/src/Appwrite/Database/Adapter/MySQL.php index fc3370c778..945a2c852e 100644 --- a/src/Appwrite/Database/Adapter/MySQL.php +++ b/src/Appwrite/Database/Adapter/MySQL.php @@ -569,7 +569,7 @@ class MySQL extends Adapter //$path = implode('.', $path); - if(array_key_exists($key, $filterTypes) && $filterTypes[$key] === 'numeric') { + if (array_key_exists($key, $filterTypes) && $filterTypes[$key] === 'numeric') { $value = (float) $value; } else { $value = $this->getPDO()->quote($value, PDO::PARAM_STR); @@ -607,7 +607,7 @@ class MySQL extends Adapter } // Sorting - if(!empty($options['orderField'])) { + if (!empty($options['orderField'])) { $orderPath = \explode('.', $options['orderField']); $len = \count($orderPath); $orderKey = 'order_b'; @@ -634,9 +634,8 @@ class MySQL extends Adapter $prev = 'd'; } } - } - } - else { + } + } else { $orderSelect = 'a.uid AS sort_ff'; } @@ -984,4 +983,4 @@ class MySQL extends Adapter { return $this->redis; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Database/Adapter/Redis.php b/src/Appwrite/Database/Adapter/Redis.php index 68946b0469..eb2c185281 100644 --- a/src/Appwrite/Database/Adapter/Redis.php +++ b/src/Appwrite/Database/Adapter/Redis.php @@ -297,4 +297,4 @@ class Redis extends Adapter return parent::setNamespace($namespace); } -} \ No newline at end of file +} diff --git a/src/Appwrite/Database/Database.php b/src/Appwrite/Database/Database.php index 43f7403795..a1e5e52fb2 100644 --- a/src/Appwrite/Database/Database.php +++ b/src/Appwrite/Database/Database.php @@ -59,12 +59,12 @@ class Database /** * @var array */ - static protected $filters = []; + protected static $filters = []; /** * @var bool */ - static protected $statusFilters = true; + protected static $statusFilters = true; /** * @var array @@ -462,7 +462,7 @@ class Database * * @return void */ - static public function addFilter(string $name, callable $encode, callable $decode): void + public static function addFilter(string $name, callable $encode, callable $decode): void { self::$filters[$name] = [ 'encode' => $encode, @@ -496,7 +496,7 @@ class Database return $document; } - $collection = $this->getDocument($document->getCollection(), true , false); + $collection = $this->getDocument($document->getCollection(), true, false); $rules = $collection->getAttribute('rules', []); foreach ($rules as $key => $rule) { @@ -508,7 +508,7 @@ class Database if (($value !== null)) { if ($type === self::SYSTEM_VAR_TYPE_DOCUMENT) { - if($array) { + if ($array) { $list = []; foreach ($value as $child) { $list[] = $this->encode($child); @@ -536,7 +536,7 @@ class Database return $document; } - $collection = $this->getDocument($document->getCollection(), true , false); + $collection = $this->getDocument($document->getCollection(), true, false); $rules = $collection->getAttribute('rules', []); foreach ($rules as $key => $rule) { @@ -548,7 +548,7 @@ class Database if (($value !== null)) { if ($type === self::SYSTEM_VAR_TYPE_DOCUMENT) { - if($array) { + if ($array) { $list = []; foreach ($value as $child) { $list[] = $this->decode($child); @@ -572,11 +572,11 @@ class Database /** * Encode Attribute - * + * * @param string $name * @param mixed $value */ - static protected function encodeAttribute(string $name, $value) + protected static function encodeAttribute(string $name, $value) { if (!isset(self::$filters[$name])) { return $value; @@ -594,11 +594,11 @@ class Database /** * Decode Attribute - * + * * @param string $name * @param mixed $value */ - static protected function decodeAttribute(string $name, $value) + protected static function decodeAttribute(string $name, $value) { if (!isset(self::$filters[$name])) { return $value; diff --git a/src/Appwrite/Database/Validator/Authorization.php b/src/Appwrite/Database/Validator/Authorization.php index 1ae2554001..4a7f82b392 100644 --- a/src/Appwrite/Database/Validator/Authorization.php +++ b/src/Appwrite/Database/Validator/Authorization.php @@ -10,7 +10,7 @@ class Authorization extends Validator /** * @var array */ - static $roles = ['*' => true]; + public static $roles = ['*' => true]; /** * @var Document @@ -125,7 +125,7 @@ class Authorization extends Validator /** * @param string $role - * + * * @return bool */ public static function isRole(string $role): bool diff --git a/src/Appwrite/Database/Validator/Collection.php b/src/Appwrite/Database/Validator/Collection.php index 4941a777e5..45faa2801d 100644 --- a/src/Appwrite/Database/Validator/Collection.php +++ b/src/Appwrite/Database/Validator/Collection.php @@ -34,7 +34,7 @@ class Collection extends Structure * Is valid. * * Returns true if valid or false if not. - * + * * @param mixed $document * * @return bool diff --git a/src/Appwrite/Database/Validator/Structure.php b/src/Appwrite/Database/Validator/Structure.php index 58a4eeadd2..7f33074766 100644 --- a/src/Appwrite/Database/Validator/Structure.php +++ b/src/Appwrite/Database/Validator/Structure.php @@ -277,9 +277,9 @@ class Structure extends Validator /** * Get Collection - * + * * Get Collection by unique ID - * + * * @return Document */ protected function getCollection($id): Document From 1c63ffa5b7a550084a2756bacfb837b540baabfe Mon Sep 17 00:00:00 2001 From: Dazzler Kumar Date: Wed, 6 Oct 2021 18:49:31 +0530 Subject: [PATCH 144/257] Update Bihari Translation --- app/config/locale/translations/bh.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/bh.json b/app/config/locale/translations/bh.json index 528ab379bf..d151297932 100644 --- a/app/config/locale/translations/bh.json +++ b/app/config/locale/translations/bh.json @@ -21,9 +21,9 @@ "emails.recovery.footer": "अगर पासवर्ड बदल क लेल ना कहाले, तो आप ई संदेश क अनदेखा कर सकत अछि।", "emails.recovery.thanks": "धन्यवाद", "emails.recovery.signature": "{{project}} टीम", - "emails.invitation.subject": "%s टीम क न्योता देवे क लेल|", + "emails.invitation.subject": "%s टीम क %s पे न्योता देवे क लेल|", "emails.invitation.hello": "प्रणाम", - "emails.invitation.body": "ई मेल आपके एही लेल भेजल गईल रहल काहे क {{owner}} आपके {{project}} क {{team}} टीम का सदस्य बनावे चाहित रहे|", + "emails.invitation.body": "ई मेल आपके एही लेल भेजल गईल रहल काहे क {{owner}} आपके {{project}} क {{team}} टीम का सदस्य बनावे चाहित रहे|", "emails.invitation.footer": "अगर आवे क इच्छा ना होवत, तो आप ई संदेश क अनदेखा कर सकत अछि।", "emails.invitation.thanks": "धन्यवाद", "emails.invitation.signature": "{{project}} टीम", From 8531eddeb42cc06bd0045132c9bba78f9ade6082 Mon Sep 17 00:00:00 2001 From: kaczmarekdaniel <58387964+kaczmarekdaniel@users.noreply.github.com> Date: Wed, 6 Oct 2021 15:39:14 +0200 Subject: [PATCH 145/257] Docker library psr issues fix --- src/Appwrite/Docker/Compose/Service.php | 2 +- src/Appwrite/Docker/Env.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Appwrite/Docker/Compose/Service.php b/src/Appwrite/Docker/Compose/Service.php index c3af364836..66aae8b740 100644 --- a/src/Appwrite/Docker/Compose/Service.php +++ b/src/Appwrite/Docker/Compose/Service.php @@ -21,7 +21,7 @@ class Service $ports = (isset($this->service['ports']) && is_array($this->service['ports'])) ? $this->service['ports'] : []; $this->service['ports'] = []; - array_walk($ports, function(&$value, $key) { + array_walk($ports, function (&$value, $key) { $split = explode(':', $value); $this->service['ports'][ (isset($split[0])) ? $split[0] : '' diff --git a/src/Appwrite/Docker/Env.php b/src/Appwrite/Docker/Env.php index 3076eb643a..07966edb34 100644 --- a/src/Appwrite/Docker/Env.php +++ b/src/Appwrite/Docker/Env.php @@ -54,7 +54,7 @@ class Env /** * Get All Vars - * + * * @return array */ public function list(): array From 5a729e09327f6a81604695dbdfef4ddfd6693202 Mon Sep 17 00:00:00 2001 From: Asmit2952 Date: Wed, 6 Oct 2021 19:52:38 +0530 Subject: [PATCH 146/257] Fixed PSR issues in Utopia Library Signed-off-by: Asmit2952 --- src/Appwrite/Utopia/Response.php | 32 ++++----- src/Appwrite/Utopia/Response/Filter.php | 8 +-- src/Appwrite/Utopia/Response/Filters/V06.php | 69 ++++++++++--------- src/Appwrite/Utopia/Response/Filters/V07.php | 30 +++++--- src/Appwrite/Utopia/Response/Filters/V08.php | 26 +++---- src/Appwrite/Utopia/Response/Model.php | 24 +++---- src/Appwrite/Utopia/Response/Model/Any.php | 6 +- .../Utopia/Response/Model/BaseList.php | 6 +- .../Utopia/Response/Model/Collection.php | 6 +- .../Utopia/Response/Model/Continent.php | 6 +- .../Utopia/Response/Model/Country.php | 6 +- .../Utopia/Response/Model/Currency.php | 6 +- .../Utopia/Response/Model/Document.php | 4 +- src/Appwrite/Utopia/Response/Model/Domain.php | 6 +- src/Appwrite/Utopia/Response/Model/Error.php | 6 +- .../Utopia/Response/Model/ErrorDev.php | 4 +- .../Utopia/Response/Model/Execution.php | 6 +- src/Appwrite/Utopia/Response/Model/File.php | 6 +- src/Appwrite/Utopia/Response/Model/Func.php | 6 +- src/Appwrite/Utopia/Response/Model/JWT.php | 6 +- src/Appwrite/Utopia/Response/Model/Key.php | 6 +- .../Utopia/Response/Model/Language.php | 6 +- src/Appwrite/Utopia/Response/Model/Locale.php | 6 +- src/Appwrite/Utopia/Response/Model/Log.php | 6 +- .../Utopia/Response/Model/Membership.php | 6 +- src/Appwrite/Utopia/Response/Model/Mock.php | 6 +- src/Appwrite/Utopia/Response/Model/None.php | 6 +- .../Utopia/Response/Model/Permissions.php | 6 +- src/Appwrite/Utopia/Response/Model/Phone.php | 6 +- .../Utopia/Response/Model/Platform.php | 6 +- .../Utopia/Response/Model/Preferences.php | 6 +- .../Utopia/Response/Model/Project.php | 6 +- src/Appwrite/Utopia/Response/Model/Rule.php | 6 +- .../Utopia/Response/Model/Session.php | 6 +- src/Appwrite/Utopia/Response/Model/Tag.php | 6 +- src/Appwrite/Utopia/Response/Model/Task.php | 6 +- src/Appwrite/Utopia/Response/Model/Team.php | 6 +- src/Appwrite/Utopia/Response/Model/Token.php | 6 +- src/Appwrite/Utopia/Response/Model/User.php | 6 +- .../Utopia/Response/Model/Webhook.php | 6 +- 40 files changed, 201 insertions(+), 188 deletions(-) diff --git a/src/Appwrite/Utopia/Response.php b/src/Appwrite/Utopia/Response.php index 527c529087..6a9f62cc4c 100644 --- a/src/Appwrite/Utopia/Response.php +++ b/src/Appwrite/Utopia/Response.php @@ -136,7 +136,7 @@ class Response extends SwooleResponse /** * Response constructor. - * + * * @param float $time */ public function __construct(SwooleHTTPResponse $response) @@ -220,7 +220,7 @@ class Response extends SwooleResponse /** * Set Model Object - * + * * @return self */ public function setModel(Model $instance) @@ -232,7 +232,7 @@ class Response extends SwooleResponse /** * Get Model Object - * + * * @return Model */ public function getModel(string $key): Model @@ -246,7 +246,7 @@ class Response extends SwooleResponse /** * Get Models List - * + * * @return Model[] */ public function getModels(): array @@ -257,10 +257,10 @@ class Response extends SwooleResponse /** * Validate response objects and outputs * the response according to given format type - * + * * @param Document $document * @param string $model - * + * * return void */ public function dynamic(Document $document, string $model): void @@ -268,7 +268,7 @@ class Response extends SwooleResponse $output = $this->output($document, $model); // If filter is set, parse the output - if(self::isFilter()){ + if (self::isFilter()) { $output = self::getFilter()->parse($output, $model); } @@ -277,10 +277,10 @@ class Response extends SwooleResponse /** * Generate valid response object from document data - * + * * @param Document $document * @param string $model - * + * * return array */ public function output(Document $document, string $model): array @@ -362,32 +362,32 @@ class Response extends SwooleResponse /** * Function to set a response filter - * + * * @param $filter the response filter to set - * + * * @return void */ - public static function setFilter(?Filter $filter) + public static function setFilter(?Filter $filter) { self::$filter = $filter; } /** * Return the currently set filter - * + * * @return Filter */ - public static function getFilter(): ?Filter + public static function getFilter(): ?Filter { return self::$filter; } /** * Check if a filter has been set - * + * * @return bool */ - public static function isFilter(): bool + public static function isFilter(): bool { return self::$filter != null; } diff --git a/src/Appwrite/Utopia/Response/Filter.php b/src/Appwrite/Utopia/Response/Filter.php index 6974c4ba89..5446dff924 100644 --- a/src/Appwrite/Utopia/Response/Filter.php +++ b/src/Appwrite/Utopia/Response/Filter.php @@ -2,7 +2,8 @@ namespace Appwrite\Utopia\Response; -abstract class Filter { +abstract class Filter +{ /** * Parse the content to another format. @@ -12,6 +13,5 @@ abstract class Filter { * * @return array */ - abstract function parse(array $content, string $model): array; - -} \ No newline at end of file + abstract public function parse(array $content, string $model): array; +} diff --git a/src/Appwrite/Utopia/Response/Filters/V06.php b/src/Appwrite/Utopia/Response/Filters/V06.php index d3d5f03293..592f1fd147 100644 --- a/src/Appwrite/Utopia/Response/Filters/V06.php +++ b/src/Appwrite/Utopia/Response/Filters/V06.php @@ -12,17 +12,18 @@ use Exception; use Utopia\Config\Config; use Utopia\Locale\Locale as Locale; -class V06 extends Filter { +class V06 extends Filter +{ // Convert 0.7 Data format to 0.6 format - public function parse(array $content, string $model): array { - + public function parse(array $content, string $model): array + { $parsedResponse = []; - switch($model) { + switch ($model) { case Response::MODEL_DOCUMENT_LIST: - $parsedResponse = $content; + $parsedResponse = $content; break; case Response::MODEL_COLLECTION: @@ -33,15 +34,15 @@ class V06 extends Filter { $parsedResponse = $this->parseCollectionList($content); break; - case Response::MODEL_FILE : + case Response::MODEL_FILE: $parsedResponse = $this->parseFile($content); break; - case Response::MODEL_FILE_LIST : + case Response::MODEL_FILE_LIST: $parsedResponse = $content; break; - case Response::MODEL_USER : + case Response::MODEL_USER: $parsedResponse = $this->parseUser($content); break; @@ -65,20 +66,20 @@ class V06 extends Filter { $parsedResponse = $content['memberships']; break; - case Response::MODEL_SESSION : + case Response::MODEL_SESSION: $parsedResponse = $this->parseSession($content); break; - case Response::MODEL_SESSION_LIST : + case Response::MODEL_SESSION_LIST: $parsedResponse = $this->parseSessionList($content); break; - case Response::MODEL_LOG_LIST : + case Response::MODEL_LOG_LIST: $parsedResponse = $this->parseLogList($content); break; case Response::MODEL_TOKEN: - $parsedResponse = $this->parseToken($content); + $parsedResponse = $this->parseToken($content); break; case Response::MODEL_LOCALE: @@ -105,9 +106,9 @@ class V06 extends Filter { $parsedResponse = $content; break; - case Response::MODEL_ANY : - case Response::MODEL_DOCUMENT : - case Response::MODEL_PREFERENCES : + case Response::MODEL_ANY: + case Response::MODEL_DOCUMENT: + case Response::MODEL_PREFERENCES: $parsedResponse = $content; break; @@ -120,7 +121,7 @@ class V06 extends Filter { private function parseCollectionList(array $content) { - foreach($content['collections'] as $key => $collection){ + foreach ($content['collections'] as $key => $collection) { $content['collections'][$key] = $this->parseCollection($collection); } return $content; @@ -149,12 +150,12 @@ class V06 extends Filter { return $content; } - private function parseCurrencyList(array $content) + private function parseCurrencyList(array $content) { $content['locations'] = []; $currencies = $content['currencies']; $parsedResponse = []; - foreach($currencies as $currency) { + foreach ($currencies as $currency) { $currency['locations'] = []; $parsedResponse[] = $currency; } @@ -166,7 +167,7 @@ class V06 extends Filter { { $continents = $content['continents']; $parsedResponse = []; - foreach($continents as $continent) { + foreach ($continents as $continent) { $parsedResponse[$continent['code']] = $continent['name']; } $content['continents'] = $parsedResponse; @@ -177,25 +178,25 @@ class V06 extends Filter { { $phones = $content['phones']; $parsedResponse = []; - foreach($phones as $phone) { + foreach ($phones as $phone) { $parsedResponse[$phone['countryCode']] = $phone['code']; } $content['phones'] = $parsedResponse; return $content; } - private function parseCountryList(array $content) + private function parseCountryList(array $content) { $countries = $content['countries']; $parsedResponse = []; - foreach($countries as $country) { + foreach ($countries as $country) { $parsedResponse[$country['code']] = $country['name']; } $content['countries'] = $parsedResponse; return $content; } - private function parseLocale(array $content) + private function parseLocale(array $content) { $content['ip'] = $content['ip'] ?? ''; $content['countryCode'] = $content['countryCode'] ?? '--'; @@ -215,7 +216,7 @@ class V06 extends Filter { private function parseTeam(array $content) { - $content['$collection'] = Database::SYSTEM_COLLECTION_TEAMS; + $content['$collection'] = Database::SYSTEM_COLLECTION_TEAMS; $content['$permissions'] = []; return $content; } @@ -224,7 +225,7 @@ class V06 extends Filter { { $teams = $content['teams']; $parsedResponse = []; - foreach($teams as $team) { + foreach ($teams as $team) { $parsedResponse[] = $this->parseTeam($team); } $content['teams'] = $parsedResponse; @@ -235,7 +236,7 @@ class V06 extends Filter { { $logs = $content['logs']; $parsedResponse = []; - foreach($logs as $log) { + foreach ($logs as $log) { $parsedResponse[] = [ 'brand' => $log['deviceBrand'], 'device' => $log['deviceName'], @@ -245,7 +246,7 @@ class V06 extends Filter { 'time' => $log['time'], 'geo' => [ 'isoCode' => empty($log['countryCode']) ? '---' : $log['countryCode'] , - 'country' => empty($log['countryName'] ) ? Locale::getText('locale.country.unknown') : $log['countryName'] + 'country' => empty($log['countryName']) ? Locale::getText('locale.country.unknown') : $log['countryName'] ], 'OS' => [ 'name' => $log['osName'], @@ -270,7 +271,7 @@ class V06 extends Filter { { $sessions = $content['sessions']; $parsedResponse = []; - foreach($sessions as $session) { + foreach ($sessions as $session) { $parsedResponse[] = [ '$id' => $session['$id'], 'brand' => $session['deviceBrand'], @@ -280,7 +281,7 @@ class V06 extends Filter { 'model' => $session['deviceModel'], 'geo' => [ 'isoCode' => empty($session['countryCode']) ? '---' : $session['countryCode'] , - 'country' => empty($session['countryName'] ) ? Locale::getText('locale.country.unknown') : $session['countryName'] + 'country' => empty($session['countryName']) ? Locale::getText('locale.country.unknown') : $session['countryName'] ], 'OS' => [ 'name' => $session['osName'], @@ -301,8 +302,8 @@ class V06 extends Filter { return $content; } - private function parseSession(array $content) - { + private function parseSession(array $content) + { $content['type'] = Auth::TOKEN_TYPE_LOGIN; return $content; } @@ -311,7 +312,7 @@ class V06 extends Filter { { $users = $content['users']; $parsedResponse = []; - foreach($users as $user) { + foreach ($users as $user) { $parsedResponse[] = $this->parseUser($user); } $content['users'] = $parsedResponse; @@ -327,8 +328,8 @@ class V06 extends Filter { $content['oauth2'.ucfirst($key)] = ''; $content['oauth2'.ucfirst($key).'AccessToken'] = ''; } - $content['status'] = empty($content['status']) ? 0 : $content['status']; + $content['status'] = empty($content['status']) ? 0 : $content['status']; $content['roles'] = Authorization::getRoles() ?? []; return $content; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Filters/V07.php b/src/Appwrite/Utopia/Response/Filters/V07.php index 86465a417c..7ab0838578 100644 --- a/src/Appwrite/Utopia/Response/Filters/V07.php +++ b/src/Appwrite/Utopia/Response/Filters/V07.php @@ -5,19 +5,25 @@ namespace Appwrite\Utopia\Response\Filters; use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter; use Exception; -class V07 extends Filter { + +class V07 extends Filter +{ // Convert 0.8 Data format to 0.7 format - public function parse(array $content, string $model): array { - + public function parse(array $content, string $model): array + { $parsedResponse = []; - switch($model) { + switch ($model) { case Response::MODEL_DOCUMENT_LIST: /** ANY was replaced by DOCUMENT in 0.8.x but this is backward compatible with 0.7.x */ + // no break case Response::MODEL_DOCUMENT: /** ANY was replaced by DOCUMENT in 0.8.x but this is backward compatible with 0.7.x */ + // no break case Response::MODEL_USER_LIST: /** [FIELDS ADDED in 0.8.x] passwordUpdate */ + // no break case Response::MODEL_USER: /** [FIELDS ADDED in 0.8.x] passwordUpdate */ + // no break case Response::MODEL_COLLECTION_LIST: case Response::MODEL_COLLECTION: case Response::MODEL_FILE_LIST: @@ -31,7 +37,9 @@ class V07 extends Filter { case Response::MODEL_MEMBERSHIP_LIST: case Response::MODEL_MEMBERSHIP: case Response::MODEL_SESSION_LIST: /** [FIELDS ADDED in 0.8.x] provider, providerUid, providerToken */ + // no break case Response::MODEL_SESSION: /** [FIELDS ADDED in 0.8.x] provider, providerUid, providerToken */ + // no break case Response::MODEL_JWT: case Response::MODEL_LOG: case Response::MODEL_LOG_LIST: @@ -63,10 +71,11 @@ class V07 extends Filter { case Response::MODEL_MOCK: case Response::MODEL_ANY: case Response::MODEL_PREFERENCES: /** ANY was replaced by PREFERENCES in 0.8.x but this is backward compatible with 0.7.x */ + // no break case Response::MODEL_NONE: case Response::MODEL_ERROR: case Response::MODEL_ERROR_DEV: - $parsedResponse = $content; + $parsedResponse = $content; break; case Response::MODEL_FUNCTION_LIST: /** Function property env was renamed to runtime in 0.9.x */ $parsedResponse = $this->parseFunctionList($content); @@ -81,20 +90,21 @@ class V07 extends Filter { return $parsedResponse; } - protected function parseFunction(array $content) { + protected function parseFunction(array $content) + { $content['env'] = $content['runtime']; unset($content['runtime']); return $content; } - protected function parseFunctionList(array $content){ + protected function parseFunctionList(array $content) + { $functions = $content['functions']; $parsedResponse = []; - foreach($functions as $function) { + foreach ($functions as $function) { $parsedResponse[] = $this->parseFunction($function); } $content['functions'] = $parsedResponse; return $content; } - -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Filters/V08.php b/src/Appwrite/Utopia/Response/Filters/V08.php index 32d4cdc833..2527562f8e 100644 --- a/src/Appwrite/Utopia/Response/Filters/V08.php +++ b/src/Appwrite/Utopia/Response/Filters/V08.php @@ -6,18 +6,18 @@ use Appwrite\Utopia\Response; use Appwrite\Utopia\Response\Filter; use Exception; - -class V08 extends Filter { +class V08 extends Filter +{ // Convert 0.9 Data format to 0.8 format - public function parse(array $content, string $model): array { - + public function parse(array $content, string $model): array + { $parsedResponse = []; - switch($model) { + switch ($model) { - case Response::MODEL_DOCUMENT_LIST: - case Response::MODEL_DOCUMENT: + case Response::MODEL_DOCUMENT_LIST: + case Response::MODEL_DOCUMENT: case Response::MODEL_USER_LIST: case Response::MODEL_USER: case Response::MODEL_COLLECTION_LIST: @@ -68,7 +68,7 @@ class V08 extends Filter { case Response::MODEL_NONE: case Response::MODEL_ERROR: case Response::MODEL_ERROR_DEV: - $parsedResponse = $content; + $parsedResponse = $content; break; case Response::MODEL_FUNCTION_LIST: /** Function property env was renamed to runtime in 0.9.x */ $parsedResponse = $this->parseFunctionList($content); @@ -83,19 +83,21 @@ class V08 extends Filter { return $parsedResponse; } - protected function parseFunction(array $content) { + protected function parseFunction(array $content) + { $content['env'] = $content['runtime']; unset($content['runtime']); return $content; } - protected function parseFunctionList(array $content){ + protected function parseFunctionList(array $content) + { $functions = $content['functions']; $parsedResponse = []; - foreach($functions as $function) { + foreach ($functions as $function) { $parsedResponse[] = $this->parseFunction($function); } $content['functions'] = $parsedResponse; return $content; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model.php b/src/Appwrite/Utopia/Response/Model.php index af71a57596..9b91c23e81 100644 --- a/src/Appwrite/Utopia/Response/Model.php +++ b/src/Appwrite/Utopia/Response/Model.php @@ -32,21 +32,21 @@ abstract class Model /** * Get Name - * + * * @return string */ abstract public function getName():string; /** * Get Collection - * + * * @return string */ abstract public function getType():string; /** * Get Rules - * + * * @return array */ public function getRules(): array @@ -75,8 +75,8 @@ abstract class Model { $list = []; - foreach($this->rules as $key => $rule) { - if(isset($rule['require']) || $rule['require']) { + foreach ($this->rules as $key => $rule) { + if (isset($rule['require']) || $rule['require']) { $list[] = $key; } } @@ -86,9 +86,9 @@ abstract class Model /** * Is None - * + * * Use to check if response is empty - * + * * @return bool */ public function isNone(): bool @@ -98,9 +98,9 @@ abstract class Model /** * Is Any - * + * * Use to check if response is a wildcard - * + * * @return bool */ public function isAny(): bool @@ -110,13 +110,13 @@ abstract class Model /** * Is Public - * + * * Should this model be publicly available in docs and spec files? - * + * * @return bool */ public function isPublic(): bool { return $this->public; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Any.php b/src/Appwrite/Utopia/Response/Model/Any.php index 1a5defec66..1613f0728c 100644 --- a/src/Appwrite/Utopia/Response/Model/Any.php +++ b/src/Appwrite/Utopia/Response/Model/Any.php @@ -14,7 +14,7 @@ class Any extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -24,11 +24,11 @@ class Any extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_ANY; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/BaseList.php b/src/Appwrite/Utopia/Response/Model/BaseList.php index a16cb95df5..8328853c68 100644 --- a/src/Appwrite/Utopia/Response/Model/BaseList.php +++ b/src/Appwrite/Utopia/Response/Model/BaseList.php @@ -49,7 +49,7 @@ class BaseList extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -59,11 +59,11 @@ class BaseList extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return $this->type; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Collection.php b/src/Appwrite/Utopia/Response/Model/Collection.php index 9b1f184b97..a8acb47688 100644 --- a/src/Appwrite/Utopia/Response/Model/Collection.php +++ b/src/Appwrite/Utopia/Response/Model/Collection.php @@ -52,7 +52,7 @@ class Collection extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -62,11 +62,11 @@ class Collection extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_COLLECTION; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Continent.php b/src/Appwrite/Utopia/Response/Model/Continent.php index 82948b646a..b7311d0d48 100644 --- a/src/Appwrite/Utopia/Response/Model/Continent.php +++ b/src/Appwrite/Utopia/Response/Model/Continent.php @@ -27,7 +27,7 @@ class Continent extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -37,11 +37,11 @@ class Continent extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_CONTINENT; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Country.php b/src/Appwrite/Utopia/Response/Model/Country.php index 85ed0a2d5d..3c9eb6b6e1 100644 --- a/src/Appwrite/Utopia/Response/Model/Country.php +++ b/src/Appwrite/Utopia/Response/Model/Country.php @@ -27,7 +27,7 @@ class Country extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -37,11 +37,11 @@ class Country extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_COUNTRY; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Currency.php b/src/Appwrite/Utopia/Response/Model/Currency.php index e17ab3fb8c..10d0d77ff5 100644 --- a/src/Appwrite/Utopia/Response/Model/Currency.php +++ b/src/Appwrite/Utopia/Response/Model/Currency.php @@ -57,7 +57,7 @@ class Currency extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -67,11 +67,11 @@ class Currency extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_CURRENCY; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Document.php b/src/Appwrite/Utopia/Response/Model/Document.php index a8a9f80970..b69fe5b15f 100644 --- a/src/Appwrite/Utopia/Response/Model/Document.php +++ b/src/Appwrite/Utopia/Response/Model/Document.php @@ -8,7 +8,7 @@ class Document extends Any { /** * Get Name - * + * * @return string */ public function getName(): string @@ -18,7 +18,7 @@ class Document extends Any /** * Get Collection - * + * * @return string */ public function getType(): string diff --git a/src/Appwrite/Utopia/Response/Model/Domain.php b/src/Appwrite/Utopia/Response/Model/Domain.php index fb56312871..20ee9b853e 100644 --- a/src/Appwrite/Utopia/Response/Model/Domain.php +++ b/src/Appwrite/Utopia/Response/Model/Domain.php @@ -56,7 +56,7 @@ class Domain extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -66,11 +66,11 @@ class Domain extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_DOMAIN; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Error.php b/src/Appwrite/Utopia/Response/Model/Error.php index 48e30cd817..118e405d86 100644 --- a/src/Appwrite/Utopia/Response/Model/Error.php +++ b/src/Appwrite/Utopia/Response/Model/Error.php @@ -33,7 +33,7 @@ class Error extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -43,11 +43,11 @@ class Error extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_ERROR; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/ErrorDev.php b/src/Appwrite/Utopia/Response/Model/ErrorDev.php index 2e0bf88dae..779314e594 100644 --- a/src/Appwrite/Utopia/Response/Model/ErrorDev.php +++ b/src/Appwrite/Utopia/Response/Model/ErrorDev.php @@ -40,11 +40,11 @@ class ErrorDev extends Error /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_ERROR_DEV; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Execution.php b/src/Appwrite/Utopia/Response/Model/Execution.php index 9d85d0cfec..7f3fe19246 100644 --- a/src/Appwrite/Utopia/Response/Model/Execution.php +++ b/src/Appwrite/Utopia/Response/Model/Execution.php @@ -76,7 +76,7 @@ class Execution extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -86,11 +86,11 @@ class Execution extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_EXECUTION; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/File.php b/src/Appwrite/Utopia/Response/Model/File.php index 5d0d511539..345093dc25 100644 --- a/src/Appwrite/Utopia/Response/Model/File.php +++ b/src/Appwrite/Utopia/Response/Model/File.php @@ -58,7 +58,7 @@ class File extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -68,11 +68,11 @@ class File extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_FILE; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Func.php b/src/Appwrite/Utopia/Response/Model/Func.php index 6d5bf8c01a..cb869a6b5f 100644 --- a/src/Appwrite/Utopia/Response/Model/Func.php +++ b/src/Appwrite/Utopia/Response/Model/Func.php @@ -101,7 +101,7 @@ class Func extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -111,11 +111,11 @@ class Func extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_FUNCTION; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/JWT.php b/src/Appwrite/Utopia/Response/Model/JWT.php index 67aa0f4d36..b30f51702c 100644 --- a/src/Appwrite/Utopia/Response/Model/JWT.php +++ b/src/Appwrite/Utopia/Response/Model/JWT.php @@ -20,7 +20,7 @@ class JWT extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -30,11 +30,11 @@ class JWT extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_JWT; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Key.php b/src/Appwrite/Utopia/Response/Model/Key.php index 79e3417ee0..bca3ba7f96 100644 --- a/src/Appwrite/Utopia/Response/Model/Key.php +++ b/src/Appwrite/Utopia/Response/Model/Key.php @@ -45,7 +45,7 @@ class Key extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -55,11 +55,11 @@ class Key extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_KEY; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Language.php b/src/Appwrite/Utopia/Response/Model/Language.php index 8819b520bb..77a115ab69 100644 --- a/src/Appwrite/Utopia/Response/Model/Language.php +++ b/src/Appwrite/Utopia/Response/Model/Language.php @@ -33,7 +33,7 @@ class Language extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -43,11 +43,11 @@ class Language extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_LANGUAGE; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Locale.php b/src/Appwrite/Utopia/Response/Model/Locale.php index 7f430d8072..c725d65f97 100644 --- a/src/Appwrite/Utopia/Response/Model/Locale.php +++ b/src/Appwrite/Utopia/Response/Model/Locale.php @@ -57,7 +57,7 @@ class Locale extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -67,11 +67,11 @@ class Locale extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_LOCALE; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Log.php b/src/Appwrite/Utopia/Response/Model/Log.php index baf2f83347..8d987c8668 100644 --- a/src/Appwrite/Utopia/Response/Model/Log.php +++ b/src/Appwrite/Utopia/Response/Model/Log.php @@ -117,7 +117,7 @@ class Log extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -127,11 +127,11 @@ class Log extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_LOG; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Membership.php b/src/Appwrite/Utopia/Response/Model/Membership.php index 808b996695..419eeac3eb 100644 --- a/src/Appwrite/Utopia/Response/Model/Membership.php +++ b/src/Appwrite/Utopia/Response/Model/Membership.php @@ -70,7 +70,7 @@ class Membership extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -80,11 +80,11 @@ class Membership extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_MEMBERSHIP; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Mock.php b/src/Appwrite/Utopia/Response/Model/Mock.php index dade6e00d9..3490421526 100644 --- a/src/Appwrite/Utopia/Response/Model/Mock.php +++ b/src/Appwrite/Utopia/Response/Model/Mock.php @@ -21,7 +21,7 @@ class Mock extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -31,11 +31,11 @@ class Mock extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_MOCK; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/None.php b/src/Appwrite/Utopia/Response/Model/None.php index 87bb1ca243..956ba0b723 100644 --- a/src/Appwrite/Utopia/Response/Model/None.php +++ b/src/Appwrite/Utopia/Response/Model/None.php @@ -14,7 +14,7 @@ class None extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -24,11 +24,11 @@ class None extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_NONE; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Permissions.php b/src/Appwrite/Utopia/Response/Model/Permissions.php index 3dc389e850..a173c6db8c 100644 --- a/src/Appwrite/Utopia/Response/Model/Permissions.php +++ b/src/Appwrite/Utopia/Response/Model/Permissions.php @@ -29,7 +29,7 @@ class Permissions extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -39,11 +39,11 @@ class Permissions extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_PERMISSIONS; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Phone.php b/src/Appwrite/Utopia/Response/Model/Phone.php index e077193e8d..5f1153a76b 100644 --- a/src/Appwrite/Utopia/Response/Model/Phone.php +++ b/src/Appwrite/Utopia/Response/Model/Phone.php @@ -33,7 +33,7 @@ class Phone extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -43,11 +43,11 @@ class Phone extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_PHONE; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Platform.php b/src/Appwrite/Utopia/Response/Model/Platform.php index 9925d4c2df..f48f9890a1 100644 --- a/src/Appwrite/Utopia/Response/Model/Platform.php +++ b/src/Appwrite/Utopia/Response/Model/Platform.php @@ -67,7 +67,7 @@ class Platform extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -77,11 +77,11 @@ class Platform extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_PLATFORM; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Preferences.php b/src/Appwrite/Utopia/Response/Model/Preferences.php index 24196f6a84..c95c13710f 100644 --- a/src/Appwrite/Utopia/Response/Model/Preferences.php +++ b/src/Appwrite/Utopia/Response/Model/Preferences.php @@ -13,7 +13,7 @@ class Preferences extends Any /** * Get Name - * + * * @return string */ public function getName():string @@ -23,11 +23,11 @@ class Preferences extends Any /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_PREFERENCES; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Project.php b/src/Appwrite/Utopia/Response/Model/Project.php index fa3589e1f4..7adadfb87a 100644 --- a/src/Appwrite/Utopia/Response/Model/Project.php +++ b/src/Appwrite/Utopia/Response/Model/Project.php @@ -175,7 +175,7 @@ class Project extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -185,11 +185,11 @@ class Project extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_PROJECT; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Rule.php b/src/Appwrite/Utopia/Response/Model/Rule.php index a98fb77a34..018ab5afc7 100644 --- a/src/Appwrite/Utopia/Response/Model/Rule.php +++ b/src/Appwrite/Utopia/Response/Model/Rule.php @@ -69,7 +69,7 @@ class Rule extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -79,11 +79,11 @@ class Rule extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_RULE; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Session.php b/src/Appwrite/Utopia/Response/Model/Session.php index f431f3f431..81b975fb78 100644 --- a/src/Appwrite/Utopia/Response/Model/Session.php +++ b/src/Appwrite/Utopia/Response/Model/Session.php @@ -147,7 +147,7 @@ class Session extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -157,11 +157,11 @@ class Session extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_SESSION; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Tag.php b/src/Appwrite/Utopia/Response/Model/Tag.php index b48e157291..27c80c1c27 100644 --- a/src/Appwrite/Utopia/Response/Model/Tag.php +++ b/src/Appwrite/Utopia/Response/Model/Tag.php @@ -45,7 +45,7 @@ class Tag extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -55,11 +55,11 @@ class Tag extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_TAG; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Task.php b/src/Appwrite/Utopia/Response/Model/Task.php index 10e97acad9..c4080a1123 100644 --- a/src/Appwrite/Utopia/Response/Model/Task.php +++ b/src/Appwrite/Utopia/Response/Model/Task.php @@ -117,7 +117,7 @@ class Task extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -127,11 +127,11 @@ class Task extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_TASK; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Team.php b/src/Appwrite/Utopia/Response/Model/Team.php index b5f7482a19..8d68316ab9 100644 --- a/src/Appwrite/Utopia/Response/Model/Team.php +++ b/src/Appwrite/Utopia/Response/Model/Team.php @@ -39,7 +39,7 @@ class Team extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -49,11 +49,11 @@ class Team extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_TEAM; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Token.php b/src/Appwrite/Utopia/Response/Model/Token.php index fb34f01fd7..df812a51ad 100644 --- a/src/Appwrite/Utopia/Response/Model/Token.php +++ b/src/Appwrite/Utopia/Response/Model/Token.php @@ -39,7 +39,7 @@ class Token extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -49,11 +49,11 @@ class Token extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_TOKEN; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/User.php b/src/Appwrite/Utopia/Response/Model/User.php index 00353724cd..8421c46ce1 100644 --- a/src/Appwrite/Utopia/Response/Model/User.php +++ b/src/Appwrite/Utopia/Response/Model/User.php @@ -63,7 +63,7 @@ class User extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -73,11 +73,11 @@ class User extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_USER; } -} \ No newline at end of file +} diff --git a/src/Appwrite/Utopia/Response/Model/Webhook.php b/src/Appwrite/Utopia/Response/Model/Webhook.php index f8967cb27a..fe3ce84898 100644 --- a/src/Appwrite/Utopia/Response/Model/Webhook.php +++ b/src/Appwrite/Utopia/Response/Model/Webhook.php @@ -63,7 +63,7 @@ class Webhook extends Model /** * Get Name - * + * * @return string */ public function getName():string @@ -73,11 +73,11 @@ class Webhook extends Model /** * Get Collection - * + * * @return string */ public function getType():string { return Response::MODEL_WEBHOOK; } -} \ No newline at end of file +} From 1aa3fe036a36271fe17c9b98591897401ba28990 Mon Sep 17 00:00:00 2001 From: jakubhi <50047839+jakubhi@users.noreply.github.com> Date: Wed, 6 Oct 2021 16:59:31 +0200 Subject: [PATCH 147/257] Changed emails.invitation.body Rephrased the invitation sentence. --- app/config/locale/translations/sk.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/sk.json b/app/config/locale/translations/sk.json index 9ee0ce410e..b891e4e3a3 100644 --- a/app/config/locale/translations/sk.json +++ b/app/config/locale/translations/sk.json @@ -23,7 +23,7 @@ "emails.recovery.signature": "{{project}} tím", "emails.invitation.subject": "Pozvánka do %s Tímu v %s", "emails.invitation.hello": "Ahoj", - "emails.invitation.body": "Tento email ti bol zaslaný, pretože {{owner}} ťa chce pozvať aby si sa stal členom {{team}} tímu v {{project}}.", + "emails.invitation.body": "Tento email ti bol zaslaný, pretože {{owner}} ťa pozval, aby si sa stal členom {{team}} tímu v projekte {{project}}.", "emails.invitation.footer": "Ak nemáš záujem, môžeš túto správu ignorovať.", "emails.invitation.thanks": "Ďakujeme", "emails.invitation.signature": "{{project}} tím", @@ -229,4 +229,4 @@ "continents.na": "Severná Amerika", "continents.oc": "Oceánia", "continents.sa": "Južná Amerika" -} \ No newline at end of file +} From 11b0c37f98beeafcbefa0edbdfc6c7c4d1e7cc04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mantas=20Pies=CC=8Ckaitis?= Date: Wed, 6 Oct 2021 21:42:19 +0300 Subject: [PATCH 148/257] Add Lithuanian translation --- app/config/locale/translations/lt.json | 78 +++++++++++++------------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/app/config/locale/translations/lt.json b/app/config/locale/translations/lt.json index 8e54032f55..ef836b0ab2 100644 --- a/app/config/locale/translations/lt.json +++ b/app/config/locale/translations/lt.json @@ -1,32 +1,32 @@ { - "settings.inspire": "\"Menas būti išmintingu — tai menas žinoti, ką galima paniekti.\"", + "settings.inspire": "\"Menas būti išmintingu — tai menas žinoti, ko galima nepamatyti.\"", "settings.locale": "lt", "settings.direction": "ltr", - "emails.sender": "Komanda %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.sender": "%s komanda", + "emails.verification.subject": "Paskyros Patvirtinimas", + "emails.verification.hello": "Labas {{name}}", + "emails.verification.body": "Spauskite šią nuorodą, kad patvirtintumėte savo el. paštą.", + "emails.verification.footer": "Jei neprašėte patvirtinti šio el. pašto, galite ignoruoti šį pranešimą.", + "emails.verification.thanks": "Ačiū", + "emails.verification.signature": "{{project}} komanda", + "emails.magicSession.subject": "Prisijungti", + "emails.magicSession.hello": "Labas,", + "emails.magicSession.body": "Spauskite šią nuorodą, kad prisijungtumėte.", + "emails.magicSession.footer": "Jei neprašėte prisijungti naudojantis šiuo el. paštu, galite ignoruoti šį pranešimą.", + "emails.magicSession.thanks": "Ačiū", + "emails.magicSession.signature": "{{project}} komanda", + "emails.recovery.subject": "Slaptažodžio Atkūrimas", + "emails.recovery.hello": "Labas {{name}}", + "emails.recovery.body": "Spauskite šią nuorodą, kad atkurtumėte projekto {{project}} slaptažodį.", + "emails.recovery.footer": "Jei neprašėte atkurti savo slaptažodzio, galite ignoruoti šį pranešimą.", + "emails.recovery.thanks": "Ačiū", + "emails.recovery.signature": "{{project}} komanda", + "emails.invitation.subject": "Pakvietimas į %s komandą %s projekte", + "emails.invitation.hello": "Labas", + "emails.invitation.body": "Šis el. laiškas buvo atsiųstas jums, nes {{owner}} norėjo jus pakviesti tapti projekto {{project}} dalimi {{team}} komandoje.", + "emails.invitation.footer": "Jei jūsų tai nedomina, galite ignoruoti šį pranešimą.", + "emails.invitation.thanks": "Ačiū", + "emails.invitation.signature": "{{project}} komanda", "locale.country.unknown": "Nežinoma", "countries.af": "Afganistanas", "countries.ao": "Angola", @@ -39,17 +39,17 @@ "countries.au": "Australija", "countries.at": "Austrija", "countries.az": "Azerbaidžanas", - "countries.bi": "Burundi", + "countries.bi": "Burundis", "countries.be": "Belgija", "countries.bj": "Beninas", - "countries.bf": "Burkina Faso", + "countries.bf": "Burkina Fasas", "countries.bd": "Bangladešas", "countries.bg": "Bulgarija", "countries.bh": "Bahreinas", "countries.bs": "Bahamai", "countries.ba": "Bosnija ir Hercegovina", "countries.by": "Baltarusija", - "countries.bz": "Baileys", + "countries.bz": "Belizas", "countries.bo": "Bolivija", "countries.br": "Brazilija", "countries.bb": "Barbadosas", @@ -90,7 +90,7 @@ "countries.fm": "Mikronezija", "countries.ga": "Gabonas", "countries.gb": "Jungtinė Karalystė", - "countries.ge": "Gruzija", + "countries.ge": "Sakartvelas", "countries.gh": "Gana", "countries.gn": "Gvinėja", "countries.gm": "Gambija", @@ -135,16 +135,16 @@ "countries.lu": "Liuksemburgas", "countries.lv": "Latvija", "countries.ma": "Marokas", - "countries.mc": "Monaco", + "countries.mc": "Monakas", "countries.md": "Moldova", "countries.mg": "Madagaskaras", "countries.mv": "Maldyvai", "countries.mx": "Meksika", - "countries.mh": "Maršalo salos", + "countries.mh": "Maršalo Salos", "countries.mk": "Makedonija", "countries.ml": "Malis", "countries.mt": "Malta", - "countries.mm": "Mianmaras", + "countries.mm": "Mianmaras / Birma", "countries.me": "Juodkalnija", "countries.mn": "Mongolija", "countries.mz": "Mozambikas", @@ -172,7 +172,7 @@ "countries.kp": "Šiaurės Korėja", "countries.pt": "Portugalija", "countries.py": "Paragvajus", - "countries.qa": "Qatar", + "countries.qa": "Kataras", "countries.ro": "Rumunija", "countries.ru": "Rusija", "countries.rw": "Ruanda", @@ -183,7 +183,7 @@ "countries.sb": "Saliamono Salos", "countries.sl": "Siera Leonė", "countries.sv": "Salvadoras", - "countries.sm": "San Marino", + "countries.sm": "San Marinas", "countries.so": "Somalis", "countries.rs": "Serbija", "countries.ss": "Pietų Sudanas", @@ -192,11 +192,11 @@ "countries.sk": "Slovakija", "countries.si": "Slovėnija", "countries.se": "Švedija", - "countries.sz": "Svazilandas", + "countries.sz": "Esvatinis", "countries.sc": "Seišeliai", "countries.sy": "Sirija", - "countries.td": "Chadas", - "countries.tg": "Togo", + "countries.td": "Čadas", + "countries.tg": "Togas", "countries.th": "Tailandas", "countries.tj": "Tadžikistanas", "countries.tm": "Turkmėnistanas", @@ -229,4 +229,4 @@ "continents.na": "Šiaurės Amerika", "continents.oc": "Okeanija", "continents.sa": "Pietų Amerika" -} \ No newline at end of file +} From b9a95e535147cc955485ad96c7b38fc700ed3de0 Mon Sep 17 00:00:00 2001 From: NeonSpork Date: Wed, 6 Oct 2021 22:50:40 +0200 Subject: [PATCH 149/257] fix: corrected typos "e-postadresse" should be one word, misspelled "sendt" --- app/config/locale/translations/no.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/config/locale/translations/no.json b/app/config/locale/translations/no.json index 30acd50b82..4f83dc677a 100644 --- a/app/config/locale/translations/no.json +++ b/app/config/locale/translations/no.json @@ -5,14 +5,14 @@ "emails.sender": "%s Team", "emails.verification.subject": "Kontobekreftelse", "emails.verification.hello": "Hallo {{name}}", - "emails.verification.body": "Følg denne lenken for å bekrefte din e-post adresse.", - "emails.verification.footer": "Dersom du ikke ba om å bekrefte e-post adressen, kan du se bort fra denne meldingen.", + "emails.verification.body": "Følg denne lenken for å bekrefte din e-postadresse.", + "emails.verification.footer": "Dersom du ikke ba om å bekrefte e-postadressen, kan du se bort fra denne meldingen.", "emails.verification.thanks": "Takk", "emails.verification.signature": "{{project}} team", "emails.magicSession.subject": "Pålogging", "emails.magicSession.hello": "Hei,", "emails.magicSession.body": "Følg denne lenken for å logge på.", - "emails.magicSession.footer": "Dersom du ikke ba om å logge på med denne e-post adressen, kan du se bort fra denne meldingen.", + "emails.magicSession.footer": "Dersom du ikke ba om å logge på med denne e-postadressen, kan du se bort fra denne meldingen.", "emails.magicSession.thanks": "Takk", "emails.magicSession.signature": "{{project}} team", "emails.recovery.subject": "Nullstille passord", @@ -23,7 +23,7 @@ "emails.recovery.signature": "{{project}} team", "emails.invitation.subject": "Invitasjon til %s Team ved %s", "emails.invitation.hello": "Hallo", - "emails.invitation.body": "Denne meldingen ble sent til deg fordi {{owner}} ønsket å invitere deg til å bli medlem av {{team}} team i {{project}}.", + "emails.invitation.body": "Denne meldingen ble sendt til deg fordi {{owner}} ønsket å invitere deg til å bli medlem av {{team}} team i {{project}}.", "emails.invitation.footer": "Dersom du ikke er interessert, kan du se bort fra denne meldingen.", "emails.invitation.thanks": "Takk", "emails.invitation.signature": "{{project}} team", @@ -56,7 +56,7 @@ "countries.bn": "Brunei Darussalam", "countries.bt": "Bhutan", "countries.bw": "Botswana", - "countries.cf": "Den sentralafrikanske republikk", + "countries.cf": "Den sentralafrikanske republikken", "countries.ca": "Canada", "countries.ch": "Sveits", "countries.cl": "Chile", From 36ae9def87e637b24480b25f170c073a2095581a Mon Sep 17 00:00:00 2001 From: NeonSpork Date: Wed, 6 Oct 2021 22:53:25 +0200 Subject: [PATCH 150/257] feat: Nynorsk Norwegian translation --- app/config/locale/codes.php | 3 +- app/config/locale/translations/nn.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 235 insertions(+), 1 deletion(-) create mode 100644 app/config/locale/translations/nn.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index 390a215eaf..c1ca5baecb 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -38,7 +38,8 @@ return [ 'mr', // Marathi 'ms', // Malay 'nl', // Dutch - 'no', // Norwegian + 'nn', // Norwegian (nynorsk) + 'no', // Norwegian (bokmål) 'ne', // Nepali 'or', // Oriya 'tl', // Filipino diff --git a/app/config/locale/translations/nn.json b/app/config/locale/translations/nn.json new file mode 100644 index 0000000000..b87f14d8d1 --- /dev/null +++ b/app/config/locale/translations/nn.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"Kunsten å væra klok er kunsten å vita kva man skal oversjå.\"", + "settings.locale": "nn", + "settings.direction": "ltr", + "emails.sender": "%s Team", + "emails.verification.subject": "Kontostadfesting", + "emails.verification.hello": "Hallo {{name}}", + "emails.verification.body": "Følg denne lenkja for å bekrefta din e-postadresse.", + "emails.verification.footer": "Om du ikkje bad om å bekrefta e-postadressa, kan du ignorera denne meldinga.", + "emails.verification.thanks": "Takk", + "emails.verification.signature": "{{project}} team", + "emails.magicSession.subject": "Pålogging", + "emails.magicSession.hello": "Hei,", + "emails.magicSession.body": "Følg denne lenkja for å logge på.", + "emails.magicSession.footer": "Om du ikkje ba om å logge på med denne e-postadressa, kan du ignorera denne meldinga.", + "emails.magicSession.thanks": "Takk", + "emails.magicSession.signature": "{{project}} team", + "emails.recovery.subject": "Nullstilla passord", + "emails.recovery.hello": "Hallo {{name}}", + "emails.recovery.body": "Følg denne lenkja for å nullstilla ditt {{project}} passord.", + "emails.recovery.footer": "Om du ikkje ba om å nullstilla passordet ditt, kan du ignorera denne meldinga.", + "emails.recovery.thanks": "Takk", + "emails.recovery.signature": "{{project}} team", + "emails.invitation.subject": "Innbyding til %s Team ved %s", + "emails.invitation.hello": "Hallo", + "emails.invitation.body": "Denne meldinga ble sendt til deg fordi {{owner}} ynskja å invitera deg til å bli medlem av {{team}} team i {{project}}.", + "emails.invitation.footer": "Om du ikkje er interessert, kan du ignorera denne meldinga.", + "emails.invitation.thanks": "Takk", + "emails.invitation.signature": "{{project}} team", + "locale.country.unknown": "Ukjend", + "countries.af": "Afghanistan", + "countries.ao": "Angola", + "countries.al": "Albania", + "countries.ad": "Andorra", + "countries.ae": "Dei sameinte arabiske emirata", + "countries.ar": "Argentina", + "countries.am": "Armenia", + "countries.ag": "Antigua og Barbuda", + "countries.au": "Australia", + "countries.at": "Austerrike", + "countries.az": "Aserbajdsjan", + "countries.bi": "Burundi", + "countries.be": "Belgia", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesh", + "countries.bg": "Bulgaria", + "countries.bh": "Bahrain", + "countries.bs": "Bahamas", + "countries.ba": "Bosnia-Hercegovina", + "countries.by": "Kviterussland", + "countries.bz": "Belize", + "countries.bo": "Bolivia", + "countries.br": "Brasil", + "countries.bb": "Barbados", + "countries.bn": "Brunei Darussalam", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Den sentralafrikanske republikken", + "countries.ca": "Canada", + "countries.ch": "Sveits", + "countries.cl": "Chile", + "countries.cn": "Kina", + "countries.ci": "Elfenbeinskysten", + "countries.cm": "Kamerun", + "countries.cd": "Den demokratiske republikken Kongo", + "countries.cg": "Republikken Kongo", + "countries.co": "Colombia", + "countries.km": "Komorane", + "countries.cv": "Kapp Verde", + "countries.cr": "Costa Rica", + "countries.cu": "Cuba", + "countries.cy": "Kypros", + "countries.cz": "Tjekkia", + "countries.de": "Tyskland", + "countries.dj": "Djibouti", + "countries.dm": "Dominica", + "countries.dk": "Danmark", + "countries.do": "Den dominikanske republikk", + "countries.dz": "Algerie", + "countries.ec": "Ecuador", + "countries.eg": "Egypt", + "countries.er": "Eritrea", + "countries.es": "Spania", + "countries.ee": "Estland", + "countries.et": "Etiopia", + "countries.fi": "Finland", + "countries.fj": "Fiji", + "countries.fr": "Frankrike", + "countries.fm": "Mikronesia", + "countries.ga": "Gabon", + "countries.gb": "Storbritannia", + "countries.ge": "Georgia", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Ekvatorial-Guinea", + "countries.gr": "Hellas", + "countries.gd": "Grenada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Kroatia", + "countries.ht": "Haiti", + "countries.hu": "Ungarn", + "countries.id": "Indonesia", + "countries.in": "India", + "countries.ie": "Irland", + "countries.ir": "Iran", + "countries.iq": "Irak", + "countries.is": "Island", + "countries.il": "Israel", + "countries.it": "Italia", + "countries.jm": "Jamaica", + "countries.jo": "Jordan", + "countries.jp": "Japan", + "countries.kz": "Kasakhstan", + "countries.ke": "Kenya", + "countries.kg": "Kirgisistan", + "countries.kh": "Kambodsja", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts og Nevis", + "countries.kr": "Sør-Korea", + "countries.kw": "Kuwait", + "countries.la": "Laos", + "countries.lb": "Libanon", + "countries.lr": "Liberia", + "countries.ly": "Libya", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Litauen", + "countries.lu": "Luxembourg", + "countries.lv": "Latvia", + "countries.ma": "Marokko", + "countries.mc": "Monaco", + "countries.md": "Moldova", + "countries.mg": "Madagaskar", + "countries.mv": "Maldivene", + "countries.mx": "Mexico", + "countries.mh": "Marshalløyane", + "countries.mk": "Nord-Makedonia", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Myanmar", + "countries.me": "Montenegro", + "countries.mn": "Mongolia", + "countries.mz": "Mozambik", + "countries.mr": "Mauritania", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malaysia", + "countries.na": "Namibia", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nicaragua", + "countries.nl": "Nederland", + "countries.no": "Norge", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "New Zealand", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Filippinene", + "countries.pw": "Palau", + "countries.pg": "Papua Ny-Guinea", + "countries.pl": "Polen", + "countries.kp": "Nord-Korea", + "countries.pt": "Portugal", + "countries.py": "Paraguay", + "countries.qa": "Qatar", + "countries.ro": "Romania", + "countries.ru": "Russland", + "countries.rw": "Rwanda", + "countries.sa": "Saudi-Arabia", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapore", + "countries.sb": "Solomonøyene", + "countries.sl": "Sierra Leone", + "countries.sv": "El Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbia", + "countries.ss": "Sør-Sudan", + "countries.st": "São Tomé og Príncipe", + "countries.sr": "Surinam", + "countries.sk": "Slovakia", + "countries.si": "Slovenia", + "countries.se": "Sverige", + "countries.sz": "Swaziland", + "countries.sc": "Seychellene", + "countries.sy": "Syria", + "countries.td": "Tsjad", + "countries.tg": "Togo", + "countries.th": "Thailand", + "countries.tj": "Tajikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Aust-Timor", + "countries.to": "Tonga", + "countries.tt": "Trinidad og Tobago", + "countries.tn": "Tunisia", + "countries.tr": "Tyrkia", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzania", + "countries.ug": "Uganda", + "countries.ua": "Ukraina", + "countries.uy": "Uruguay", + "countries.us": "Amerikas forente stater", + "countries.uz": "Usbekistan", + "countries.va": "Vatikanstaten", + "countries.vc": "Saint Vincent og Grenadinene", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Jemen", + "countries.za": "Sør-Africa", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Afrika", + "continents.an": "Antarktis", + "continents.as": "Asia", + "continents.eu": "Europa", + "continents.na": "Nord-Amerika", + "continents.oc": "Oseania", + "continents.sa": "Sør-Amerika" +} diff --git a/app/init.php b/app/init.php index 5a3bc1d065..6db82f0dce 100644 --- a/app/init.php +++ b/app/init.php @@ -299,6 +299,7 @@ Locale::setLanguageFromJSON('mr', __DIR__.'/config/locale/translations/mr.json') Locale::setLanguageFromJSON('ms', __DIR__.'/config/locale/translations/ms.json'); Locale::setLanguageFromJSON('ne', __DIR__.'/config/locale/translations/ne.json'); Locale::setLanguageFromJSON('nl', __DIR__.'/config/locale/translations/nl.json'); +Locale::setLanguageFromJSON('nn', __DIR__.'/config/locale/translations/nn.json'); Locale::setLanguageFromJSON('no', __DIR__.'/config/locale/translations/no.json'); Locale::setLanguageFromJSON('or', __DIR__.'/config/locale/translations/or.json'); Locale::setLanguageFromJSON('pa', __DIR__.'/config/locale/translations/pa.json'); From c8b02b9177685607626932846334d02e398b8de8 Mon Sep 17 00:00:00 2001 From: Ruta R Date: Wed, 6 Oct 2021 18:04:57 -0400 Subject: [PATCH 151/257] Added Latvian translations --- app/config/locale/codes.php | 1 + app/config/locale/translations/lv.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/lv.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index 390a215eaf..1885117399 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -34,6 +34,7 @@ return [ 'ko', // Korean 'lb', // Luxembourgish 'lt', // Lithuanian + 'lv', // Latvian 'ml', // Malayalam 'mr', // Marathi 'ms', // Malay diff --git a/app/config/locale/translations/lv.json b/app/config/locale/translations/lv.json new file mode 100644 index 0000000000..c5fe8533f4 --- /dev/null +++ b/app/config/locale/translations/lv.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"Māksla būt gudram ir māksla zināt, ko aizmirst.\"", + "settings.locale": "lv", + "settings.direction": "ltr", + "emails.sender": "%s komanda", + "emails.verification.subject": "Konta verifikācija", + "emails.verification.hello": "Sveicināti, {{name}}", + "emails.verification.body": "Sekojiet saitei, lai apstiprinātu savu e-pasta adresi.", + "emails.verification.footer": "Ja Jūs nepieprasījāt šīs adreses apstiprinājumu, lūdzu, ignorējiet šo ziņu.", + "emails.verification.thanks": "Paldies", + "emails.verification.signature": "{{project}} komanda", + "emails.magicSession.subject": "Ieiet", + "emails.magicSession.hello": "Sveicināti,", + "emails.magicSession.body": "Sekojiet saitei, lai ieietu.", + "emails.magicSession.footer": "Ja Jūs nepieprasījāt ieiet ar šo e-pasta adresi, lūdzu, ignorējiet šo ziņu.", + "emails.magicSession.thanks": "Paldies", + "emails.magicSession.signature": "{{project}} komanda", + "emails.recovery.subject": "Paroles atjaunināšana", + "emails.recovery.hello": "Labdien, {{name}}", + "emails.recovery.body": "Sekojiet saitei, lai atjauninātu {{project}} paroli.", + "emails.recovery.footer": "Ja Jūs nepieprasījāt paroles atjaunināšanu, lūdzu, ignorējiet šo ziņu.", + "emails.recovery.thanks": "Paldies", + "emails.recovery.signature": "{{project}} komanda", + "emails.invitation.subject": "Ielūgums piebiedroties %s komandai %s projektā.", + "emails.invitation.hello": "Labdien", + "emails.invitation.body": "Šis e-pasts tika nosūtīts Jums, jo {{owner}} vēlējās Jūs ielūgt kļūt par {{team}} komandas biedru {{project}} projektā.", + "emails.invitation.footer": "Ja Jūs neesat ieinteresēts, lūdzu, ignorējiet šo ziņu.", + "emails.invitation.thanks": "Paldies", + "emails.invitation.signature": "{{project}} komanda", + "locale.country.unknown": "Nav zināms", + "countries.af": "Afganistāna", + "countries.ao": "Angola", + "countries.al": "Albānija", + "countries.ad": "Andora", + "countries.ae": "Apvienotie Arābu Emirāti", + "countries.ar": "Argentīna", + "countries.am": "Armēnija", + "countries.ag": "Antigva un Barbuda", + "countries.au": "Austrālija", + "countries.at": "Austrija", + "countries.az": "Azerbaidžāna", + "countries.bi": "Burundi", + "countries.be": "Beļģija", + "countries.bj": "Benina", + "countries.bf": "Burkinafaso", + "countries.bd": "Bangladeša", + "countries.bg": "Bulgārija", + "countries.bh": "Bahreina", + "countries.bs": "Bahamas", + "countries.ba": "Bosnija un Hercegovina", + "countries.by": "Baltkrievija", + "countries.bz": "Beliza", + "countries.bo": "Bolīvija", + "countries.br": "Brazīlija", + "countries.bb": "Barbadosa", + "countries.bn": "Bruneja", + "countries.bt": "Butāna", + "countries.bw": "Botsvana", + "countries.cf": "Centrālāfrikas Republika", + "countries.ca": "Kanāda", + "countries.ch": "Šveice", + "countries.cl": "Čīle", + "countries.cn": "Ķīna", + "countries.ci": "Kotdivuāra", + "countries.cm": "Kamerūna", + "countries.cd": "Kongo Demokrātiskā Republika", + "countries.cg": "Kongo", + "countries.co": "Kolumbija", + "countries.km": "Komoras", + "countries.cv": "Kaboverde", + "countries.cr": "Kostarika", + "countries.cu": "Kuba", + "countries.cy": "Kipra", + "countries.cz": "Čehija", + "countries.de": "Vācija", + "countries.dj": "Džibutija", + "countries.dm": "Dominika", + "countries.dk": "Dānija", + "countries.do": "Dominikāna", + "countries.dz": "Alžīrija", + "countries.ec": "Ekvadora", + "countries.eg": "Ēģipte", + "countries.er": "Eritreja", + "countries.es": "Spānija", + "countries.ee": "Igaunija", + "countries.et": "Etiopija", + "countries.fi": "Somija", + "countries.fj": "Fidži", + "countries.fr": "Francija", + "countries.fm": "Mikronēzija", + "countries.ga": "Gabona", + "countries.gb": "Apvienotā Karaliste", + "countries.ge": "Gruzija", + "countries.gh": "Gana", + "countries.gn": "Gvineja", + "countries.gm": "Gambija", + "countries.gw": "Gvineja-Bisava", + "countries.gq": "Ekvatoriālā Gvineja", + "countries.gr": "Grieķija", + "countries.gd": "Grenada", + "countries.gt": "Gvatemala", + "countries.gy": "Gajāna", + "countries.hn": "Hondurasa", + "countries.hr": "Horvātija", + "countries.ht": "Haiti", + "countries.hu": "Ungārija", + "countries.id": "Indonēzija", + "countries.in": "Indija", + "countries.ie": "Īrija", + "countries.ir": "Irāna", + "countries.iq": "Irāka", + "countries.is": "Islande", + "countries.il": "Izraēla", + "countries.it": "Itālija", + "countries.jm": "Jamaika", + "countries.jo": "Jordānija", + "countries.jp": "Japāna", + "countries.kz": "Kazahstāna", + "countries.ke": "Kenija", + "countries.kg": "Kirgizstāna", + "countries.kh": "Kambodža", + "countries.ki": "Kiribati", + "countries.kn": "Sentkitsa un Nevisa", + "countries.kr": "Dienvidkoreja", + "countries.kw": "Kuveita", + "countries.la": "Laosa", + "countries.lb": "Libāna", + "countries.lr": "Libērija", + "countries.ly": "Lībija", + "countries.lc": "Sentlūsija", + "countries.li": "Lihtenšteina", + "countries.lk": "Šrilanka", + "countries.ls": "Lesoto", + "countries.lt": "Lietuva", + "countries.lu": "Luksemburga", + "countries.lv": "Latvija", + "countries.ma": "Maroka", + "countries.mc": "Monako", + "countries.md": "Moldova", + "countries.mg": "Madagaskara", + "countries.mv": "Maldīvija", + "countries.mx": "Meksika", + "countries.mh": "Māršala salas", + "countries.mk": "Ziemeļmaķedonijas Republika", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Mjanma", + "countries.me": "Melnkalne", + "countries.mn": "Mongolija", + "countries.mz": "Mozambika", + "countries.mr": "Mauritānija", + "countries.mu": "Maurīcija", + "countries.mw": "Malāvija", + "countries.my": "Malaizija", + "countries.na": "Namībija", + "countries.ne": "Nigēra", + "countries.ng": "Nigērija", + "countries.ni": "Nikaragva", + "countries.nl": "Nīderlande", + "countries.no": "Norvēģija", + "countries.np": "Nepāla", + "countries.nr": "Nauru", + "countries.nz": "Jaunzēlande", + "countries.om": "Omāna", + "countries.pk": "Pakistāna", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Filipīnas", + "countries.pw": "Palau", + "countries.pg": "Papua-Jaungvineja", + "countries.pl": "Polija", + "countries.kp": "Ziemeļkoreja", + "countries.pt": "Portugāle", + "countries.py": "Paragvaja", + "countries.qa": "Katara", + "countries.ro": "Rumānija", + "countries.ru": "Krievija", + "countries.rw": "Ruanda", + "countries.sa": "Saūda Arābija", + "countries.sd": "Sudāna", + "countries.sn": "Senegāla", + "countries.sg": "Singapūra", + "countries.sb": "Zālamana salas", + "countries.sl": "Sjerraleone", + "countries.sv": "Salvadora", + "countries.sm": "Sanmarīno", + "countries.so": "Somālija", + "countries.rs": "Serbija", + "countries.ss": "Dienvidsudāna", + "countries.st": "Santome un Prinsipi", + "countries.sr": "Surinama", + "countries.sk": "Slovākija", + "countries.si": "Slovēnija", + "countries.se": "Zviedrija", + "countries.sz": "Svatini", + "countries.sc": "Seišelas", + "countries.sy": "Sīrija", + "countries.td": "Čada", + "countries.tg": "Togo", + "countries.th": "Taizeme", + "countries.tj": "Tadžikistāna", + "countries.tm": "Turkmenistāna", + "countries.tl": "Austrumtimora", + "countries.to": "Tonga", + "countries.tt": "Trinidāda un Tobāgo", + "countries.tn": "Tunisija", + "countries.tr": "Turcija", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzānija", + "countries.ug": "Uganda", + "countries.ua": "Ukraina", + "countries.uy": "Urugvaja", + "countries.us": "Amerikas Savienotās Valstis", + "countries.uz": "Uzbekistāna", + "countries.va": "Vatikāns", + "countries.vc": "Sentvinsenta un Grenadīnas", + "countries.ve": "Venecuēla", + "countries.vn": "Vjetnama", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Jemena", + "countries.za": "Dienvidāfrikas Republika", + "countries.zm": "Zambija", + "countries.zw": "Zimbabve", + "continents.af": "Āfrika", + "continents.an": "Antarktīda", + "continents.as": "Āzija", + "continents.eu": "Eiropa", + "continents.na": "Ziemeļamerika", + "continents.oc": "Okeānija", + "continents.sa": "Dienvidamerika" +} diff --git a/app/init.php b/app/init.php index 5a3bc1d065..c19d9f70e5 100644 --- a/app/init.php +++ b/app/init.php @@ -294,6 +294,7 @@ Locale::setLanguageFromJSON('km', __DIR__.'/config/locale/translations/km.json') Locale::setLanguageFromJSON('ko', __DIR__.'/config/locale/translations/ko.json'); Locale::setLanguageFromJSON('lb', __DIR__.'/config/locale/translations/lb.json'); Locale::setLanguageFromJSON('lt', __DIR__.'/config/locale/translations/lt.json'); +Locale::setLanguageFromJSON('lv', __DIR__.'/config/locale/translations/lv.json'); Locale::setLanguageFromJSON('ml', __DIR__.'/config/locale/translations/ml.json'); Locale::setLanguageFromJSON('mr', __DIR__.'/config/locale/translations/mr.json'); Locale::setLanguageFromJSON('ms', __DIR__.'/config/locale/translations/ms.json'); From e3a7a14364485f4553b06f570a247795933eb98d Mon Sep 17 00:00:00 2001 From: Prerak Mathur Date: Thu, 7 Oct 2021 05:54:12 +0530 Subject: [PATCH 152/257] assamese-trans --- app/config/locale/codes.php | 1 + app/config/locale/translations/as.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/as.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index 9a884bbc25..0a474d8aa5 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -3,6 +3,7 @@ return [ 'af', // Afrikaans 'ar', // Arabic + 'as', // Assamese 'be', // Belarusian 'bg', // Bulgarian 'bn', // Bengali diff --git a/app/config/locale/translations/as.json b/app/config/locale/translations/as.json new file mode 100644 index 0000000000..4aee32a44e --- /dev/null +++ b/app/config/locale/translations/as.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"জ্ঞানী হোৱাৰ কলা হৈছে কি উপেক্ষা কৰিব লাগে জনাৰ কলা।\"", + "settings.locale": "as", + "settings.direction": "ltr", + "emails.sender": "%s দল", + "emails.verification.subject": "একাউণ্ট প্ৰমাণীকৰণ", + "emails.verification.hello": "নমস্কাৰ {{name}}", + "emails.verification.body": "আপোনাৰ ইমেইল ঠিকনা প্ৰমাণিত কৰিবলৈ এই লিংকটো অনুসৰণ কৰক।", + "emails.verification.footer": "যদি আপুনি এই ঠিকনাটো সত্যাপিত কৰিবলৈ কোৱা নাই, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।", + "emails.verification.thanks": "ধন্যবাদ", + "emails.verification.signature": "{{project}} দল", + "emails.magicSession.subject": "লগইন", + "emails.magicSession.hello": "নমস্কাৰ,", + "emails.magicSession.body": "লগইন কৰিবলৈ এই লিংকটো অনুসৰণ কৰক।", + "emails.magicSession.footer": "যদি আপুনি এই ইমেইল ব্যৱহাৰ কৰি লগইন কৰিবলৈ কোৱা নাছিল, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।", + "emails.magicSession.thanks": "ধন্যবাদ", + "emails.magicSession.signature": "{{project}} দল", + "emails.recovery.subject": "পাছৱাৰ্ড ৰিছেট", + "emails.recovery.hello": "ধন্যবাদ {{name}}", + "emails.recovery.body": "আপোনাৰ {{project}} পাছৱৰ্ড ৰিছেট কৰিবলৈ এই লিংকটো অনুসৰণ কৰক।.", + "emails.recovery.footer": "যদি আপুনি আপোনাৰ পাছৱৰ্ড ৰিছেট কৰিবলৈ কোৱা নাছিল, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।", + "emails.recovery.thanks": "ধন্যবাদ", + "emails.recovery.signature": "{{project}} দল", + "emails.invitation.subject": "%s বছৰত %s দললৈ নিমন্ত্ৰণ", + "emails.invitation.hello": "নমস্কাৰ", + "emails.invitation.body": "এই মেইলটো আপোনালৈ প্ৰেৰণ কৰা হৈছিল কাৰণ {{owner}} জনে আপোনাক {{project}} বছৰবয়সত {{team}} দলৰ সদস্য হ'বলৈ আমন্ত্ৰণ জনাব বিচাৰিছিল।", + "emails.invitation.footer": "যদি আপুনি আগ্ৰহী নহয়, আপুনি এই বাৰ্তাটো উপেক্ষা কৰিব পাৰে।", + "emails.invitation.thanks": "ধন্যবাদ", + "emails.invitation.signature": "{{project}} দল", + "locale.country.unknown": "অজ্ঞাত ", + "countries.af": "আফগানিস্তান ", + "countries.ao": "এঙ্গোলা", + "countries.al": "আল্বেনিয়া", + "countries.ad": "এণ্ডোৰা", + "countries.ae": "সংযুক্ত আৰৱ আমিৰাট", + "countries.ar": "আৰ্জেণ্টিনা", + "countries.am": "আৰ্মেনিয়া", + "countries.ag": "এণ্টিগুয়া আৰু বাৰ্বুডা", + "countries.au": "অষ্ট্ৰেলিয়া", + "countries.at": "অষ্ট্ৰিয়া", + "countries.az": "আজাৰবাইজান", + "countries.bi": "বুৰুণ্ডি", + "countries.be": "বেলজিয়াম", + "countries.bj": "বেনিন", + "countries.bf": "বুৰ্কিনা ফাছো", + "countries.bd": "বাংলাদেশ", + "countries.bg": "বুলগেৰিয়া", + "countries.bh": "বাহৰেইন", + "countries.bs": "বাহামা", + "countries.ba": "বোছনিয়া আৰু হাৰ্জেগোভিনা", + "countries.by": "বেলাৰুচ", + "countries.bz": "বেলিজ", + "countries.bo": "বোলিভিয়া", + "countries.br": "ব্ৰাজিল", + "countries.bb": "বাৰ্বাডোচ", + "countries.bn": "ব্ৰুনেই", + "countries.bt": "ভূটান", + "countries.bw": "বটচৱানা", + "countries.cf": "মধ্য আফ্ৰিকান গণৰাজ্য", + "countries.ca": "কানাডা", + "countries.ch": "ছুইজাৰলেণ্ড", + "countries.cl": "চিলি", + "countries.cn": "চীন", + "countries.ci": "আইভৰী কোষ্ট", + "countries.cm": "কেমেৰুন", + "countries.cd": "ডি আৰ কঙ্গো", + "countries.cg": "কঙ্গো গণৰাজ্য", + "countries.co": "কলোম্বিয়া", + "countries.km": "কোমোৰোচ", + "countries.cv": "কেপ ভাৰ্ডে", + "countries.cr": "কোষ্টা ৰিকা", + "countries.cu": "কিউবা", + "countries.cy": "চাইপ্ৰাছ", + "countries.cz": "চেকিয়া", + "countries.de": "জাৰ্মানী", + "countries.dj": "জিবুতি", + "countries.dm": "ডমিনিকা", + "countries.dk": "ডেনমাৰ্ক", + "countries.do": "ডমিনিকান ৰিপাব্লিক", + "countries.dz": "আলজেৰিয়া", + "countries.ec": "ইকুৱেডৰ", + "countries.eg": "ইজিপ্ত", + "countries.er": "ইৰিট্ৰিয়া", + "countries.es": "স্পেইন", + "countries.ee": "এষ্টোনিয়া", + "countries.et": "ইথিওপিয়া", + "countries.fi": "ফিনলেণ্ড", + "countries.fj": "ফিজি", + "countries.fr": "ফ্ৰান্স", + "countries.fm": "মাইক্ৰনেচিয়া", + "countries.ga": "গেবন", + "দেশ.জিবি": "যুক্তৰাজ্য", + "countries.ge": "জৰ্জিয়া", + "countries.gh": "ঘানা", + "countries.gn": "গিনি", + "countries.gm": "গাম্বিয়া", + "countries.gw": "গিনি-বিচাউ", + "countries.gq": "বিষুৱীয় গিনি", + "countries.gr": "গ্ৰীচ", + "countries.gd": "গ্ৰেনাডা", + "countries.gt": "গুয়াতেমালা", + "countries.gy": "গায়ানা", + "countries.hn": "হণ্ডুৰাছ", + "countries.hr": "ক্ৰোৱেছিয়া", + "countries.ht": "হাইতি", + "countries.hu": "হাংগেৰী", + "countries.id": "ইণ্ডোনেছিয়া", + "countries.in": "ভাৰত", + "countries.ie": "আয়াৰলেণ্ড", + "countries.ir": "ইৰাণ", + "countries.iq": "ইৰাক", + "countries.is": "আইচলেণ্ড", + "countries.il": "ইস্ৰায়েল", + "countries.it": "ইটালী", + "countries.jm": "জামাইকা", + "countries.jo": "জৰ্ডান", + "countries.jp": "জাপান", + "countries.kz": "কাজাখস্তান", + "countries.ke": "কেনিয়া", + "countries.kg": "কিৰগিজস্তান", + "countries.kh": "কম্বোডিয়া", + "countries.ki": "কিৰিবাটি", + "countries.kn": "ছেইণ্ট কিটছ এণ্ড নেভিছ", + "countries.kr": "দক্ষিণ কোৰিয়া", + "countries.kw": "কুৱেইট", + "countries.la": "লাওচ", + "countries.lb": "লেবানন", + "countries.lr": "লাইবেৰিয়া", + "countries.ly": "লিবিয়া", + "countries.lc": "ছেইণ্ট লুচিয়া", + "countries.li": "লিকটেনষ্টাইন", + "countries.lk": "শ্ৰীলংকা", + "countries.ls": "লেচোথো", + "countries.lt": "লিথুৱানিয়া", + "countries.lu": "লাক্সেমবাৰ্গ", + "countries.lv": "লাটভিয়া", + "countries.ma": "মৰক্কো", + "countries.mc": "মোনাকো", + "countries.md": "মলদোভা", + "countries.mg": "মাদাগাস্কাৰ", + "countries.mv": "মালদ্বীপ", + "countries.mx": "মেক্সিকো", + "countries.mh": "মাৰ্শ্বেল দ্বীপপুঞ্জ", + "countries.mk": "মেচিডোনিয়া", + "countries.ml": "মালি", + "countries.mt": "মাল্টা", + "countries.mm": "ম্যানমাৰ", + "countries.me": "মণ্টেনিগ্ৰো", + "countries.mn": "মঙ্গোলিয়া", + "countries.mz": "মোজাম্বিক", + "countries.mr": "মৌৰিতানিয়া", + "countries.mu": "মৰিচাছ", + "countries.mw": "মালাৱী", + "countries.my": "মালয়েছিয়া", + "countries.na": "নামিবিয়া", + "countries.ne": "নাইজাৰ", + "countries.ng": "নাইজেৰিয়া", + "countries.ni": "নিকাৰাগুয়া", + "countries.nl": "নেডাৰলেণ্ড", + "countries.no": "নৰৱে", + "countries.np": "নেপাল", + "countries.nr": "নাউৰু", + "countries.nz": "নিউজিলেণ্ড", + "countries.om": "ওমান", + "countries.pk": "পাকিস্তান", + "countries.pa": "পানামা", + "countries.pe": "পেৰু", + "countries.ph": "ফিলিপাইনচ", + "countries.pw": "পালাউ", + "countries.pg": "পাপুয়া নিউ গিনি", + "countries.pl": "পোলেণ্ড", + "countries.kp": "উত্তৰ কোৰিয়া", + "countries.pt": "পৰ্তুগাল", + "countries.py": "পাৰাগুৱে", + "countries.qa": "কাটাৰ", + "countries.ro": "ৰোমানিয়া", + "countries.ru": "ৰাছিয়া", + "countries.rw": "ৰৱাণ্ডা", + "countries.sa": "চৌদি আৰৱ", + "countries.sd": "চুদান", + "countries.sn": "ছেনেগাল", + "countries.sg": "ছিংগাপুৰ", + "countries.sb": "চলোমন দ্বীপপুঞ্জ", + "countries.sl": "চিয়েৰা লিয়ন", + "countries.sv": "এল চালভাডৰ", + "countries.sm": "চান মাৰিনো", + "countries.so": "চোমালিয়া", + "countries.rs": "ছাৰ্বিয়া", + "countries.ss": "দক্ষিণ চুদান", + "countries.st": "চাও টোম আৰু প্ৰিন্সিপ", + "countries.sr": "চুৰিনাম", + "countries.sk": "স্লোভাকিয়া", + "countries.si": "স্লোভেনিয়া", + "countries.se": "চুইডেন", + "countries.sz": "স্বাজিলেণ্ড", + "countries.sc": "চেচেলচ", + "countries.sy": "চিৰিয়া", + "countries.td": "চাদ", + "countries.tg": "টোগো", + "countries.th": "থাইলেণ্ড", + "countries.tj": "তাজিকিস্তান", + "countries.tm": "তুৰ্কমেনিস্তান", + "countries.tl": "তিমুৰ-লেষ্টে", + "countries.to": "টংগা", + "countries.tt": "ত্ৰিনিদাদ আৰু টোবাগো", + "countries.tn": "টিউনিচিয়া", + "countries.tr": "তুৰ্কী", + "countries.tv": "টুভালু", + "countries.tz": "তাঞ্জানিয়া", + "countries.ug": "উগাণ্ডা", + "countries.ua": "ইউক্ৰেইন", + "countries.uy": "উৰুগুৱে", + "countries.us": "আমেৰিকা যুক্তৰাষ্ট্ৰ", + "countries.uz": "উজবেকিস্তান", + "countries.va": "ভেটিকান চিটি", + "countries.vc": "ছেইণ্ট ভিনচেণ্ট এণ্ড দ্য গ্ৰেনাডাইনচ", + "countries.ve": "ভেনিজুৱেলা", + "countries.vn": "ভিয়েটনাম", + "countries.vu": "ভানুৱাটু", + "countries.ws": "চামোৱা", + "countries.ye": "য়েমেন", + "countries.za": "দক্ষিণ আফ্ৰিকা", + "countries.zm": "জাম্বিয়া", + "countries.zw": "জিম্বাবোৱে", + "continents.af": "আফ্ৰিকা", + "মহাদেশ।আন": "এণ্টাৰ্কটিকা", + "continents.as": "এছিয়া", + "continents.eu": "ইউৰোপ", + "continents.na": "উত্তৰ আমেৰিকা", + "মহাদেশ.অক": "ওচেনিয়া", + "continents.sa": "দক্ষিণ আমেৰিকা" +} \ No newline at end of file diff --git a/app/init.php b/app/init.php index 8b2e9dcd37..050e43164e 100644 --- a/app/init.php +++ b/app/init.php @@ -263,6 +263,7 @@ $register->set('geodb', function () { Locale::$exceptions = false; Locale::setLanguageFromJSON('af', __DIR__.'/config/locale/translations/af.json'); Locale::setLanguageFromJSON('ar', __DIR__.'/config/locale/translations/ar.json'); +Locale::setLanguageFromJSON('as', __DIR__.'/config/locale/translations/as.json'); Locale::setLanguageFromJSON('be', __DIR__.'/config/locale/translations/be.json'); Locale::setLanguageFromJSON('bg', __DIR__.'/config/locale/translations/bg.json'); Locale::setLanguageFromJSON('bn', __DIR__.'/config/locale/translations/bn.json'); From 2672596a1fbd78f8ea11e02bb896da1c52d4aa50 Mon Sep 17 00:00:00 2001 From: Prerak Mathur Date: Thu, 7 Oct 2021 06:06:53 +0530 Subject: [PATCH 153/257] assamese-trans --- app/config/locale/translations/as.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/config/locale/translations/as.json b/app/config/locale/translations/as.json index 4aee32a44e..20bd54a8e9 100644 --- a/app/config/locale/translations/as.json +++ b/app/config/locale/translations/as.json @@ -89,8 +89,8 @@ "countries.fr": "ফ্ৰান্স", "countries.fm": "মাইক্ৰনেচিয়া", "countries.ga": "গেবন", - "দেশ.জিবি": "যুক্তৰাজ্য", - "countries.ge": "জৰ্জিয়া", + "countries.gb": "যুক্তৰাজ্য", + "countries.ge": "ইউনাইটেড কিংদম", "countries.gh": "ঘানা", "countries.gn": "গিনি", "countries.gm": "গাম্বিয়া", @@ -223,10 +223,10 @@ "countries.zm": "জাম্বিয়া", "countries.zw": "জিম্বাবোৱে", "continents.af": "আফ্ৰিকা", - "মহাদেশ।আন": "এণ্টাৰ্কটিকা", + "continents.an": "এণ্টাৰ্কটিকা", "continents.as": "এছিয়া", "continents.eu": "ইউৰোপ", "continents.na": "উত্তৰ আমেৰিকা", - "মহাদেশ.অক": "ওচেনিয়া", + "continents.oc": "ওচেনিয়া", "continents.sa": "দক্ষিণ আমেৰিকা" } \ No newline at end of file From d3052117d5f7f5223d86c2f71e1d92b7341a8b51 Mon Sep 17 00:00:00 2001 From: Giri Date: Thu, 7 Oct 2021 10:36:38 +0530 Subject: [PATCH 154/257] Fixed typo fixes the mistyped 'accepeted' to the correct 'accepted' spelling --- docs/tutorials/add-translations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index 48131f8ad1..fe064c17d5 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -111,7 +111,7 @@ Continue with the rest of the process until you arrive at your dashboard. ![Dashboard](images/dashboard.png) -Your request might be pending, so you can ping us on Discord and we'll make the process faster 😀 . Once your request has been accepeted, you can proceed. +Your request might be pending, so you can ping us on Discord and we'll make the process faster 😀 . Once your request has been accepted, you can proceed. ![Get Started](images/guide.png) From 7542e6652f14b183328aec9703ae8338a2c8df8e Mon Sep 17 00:00:00 2001 From: cristina-sirbu Date: Thu, 7 Oct 2021 08:26:49 +0300 Subject: [PATCH 155/257] Fix punctuation --- app/config/locale/translations/ro.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/ro.json b/app/config/locale/translations/ro.json index 5d8aa437e0..9976359179 100644 --- a/app/config/locale/translations/ro.json +++ b/app/config/locale/translations/ro.json @@ -10,7 +10,7 @@ "emails.verification.thanks": "Mulțumim", "emails.verification.signature": "Echipa {{project}}", "emails.magicSession.subject": "Login", - "emails.magicSession.hello": "Bună ziua", + "emails.magicSession.hello": "Bună ziua,", "emails.magicSession.body": "Urmează acest link pentru logare.", "emails.magicSession.footer": "Dacă nu ai incercat să te loghezi folosing această adresa de email, poți ignora acest mesaj.", "emails.magicSession.thanks": "Mulțumim", From db7e1f5ebb693b152e37e40a69be4f8daa2e4a87 Mon Sep 17 00:00:00 2001 From: waridrox Date: Wed, 6 Oct 2021 13:23:33 +0530 Subject: [PATCH 156/257] Fixed PSR issues in Migration library Signed-off-by: waridrox --- src/Appwrite/Migration/Migration.php | 28 ++++++++++++-------------- src/Appwrite/Migration/Version/V06.php | 4 +--- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/Appwrite/Migration/Migration.php b/src/Appwrite/Migration/Migration.php index 2ab1ce4fd3..aed2da3acb 100644 --- a/src/Appwrite/Migration/Migration.php +++ b/src/Appwrite/Migration/Migration.php @@ -52,7 +52,7 @@ abstract class Migration /** * Migration constructor. - * + * * @param PDO $pdo */ public function __construct(PDO $db) @@ -62,11 +62,11 @@ abstract class Migration /** * Set project for migration. - * + * * @param Document $project * @param Database $projectDB - * - * @return Migration + * + * @return Migration */ public function setProject(Document $project, Database $projectDB): Migration { @@ -78,7 +78,7 @@ abstract class Migration /** * Iterates through every document. - * + * * @param callable $callback */ public function forEachDocument(callable $callback): void @@ -98,7 +98,6 @@ abstract class Migration Console::log('Migrating: ' . $offset . ' / ' . $this->projectDB->getSum()); \Co\run(function () use ($all, $callback) { - foreach ($all as $document) { go(function () use ($document, $callback) { if (empty($document->getId()) || empty($document->getCollection())) { @@ -131,24 +130,23 @@ abstract class Migration } } - public function check_diff_multi($array1, $array2){ + public function check_diff_multi($array1, $array2) + { $result = array(); - foreach($array1 as $key => $val) { - if(is_array($val) && isset($array2[$key])) { + foreach ($array1 as $key => $val) { + if (is_array($val) && isset($array2[$key])) { $tmp = $this->check_diff_multi($val, $array2[$key]); - if($tmp) { + if ($tmp) { $result[$key] = $tmp; } - } - elseif(!isset($array2[$key])) { + } elseif (!isset($array2[$key])) { $result[$key] = null; - } - elseif($val !== $array2[$key]) { + } elseif ($val !== $array2[$key]) { $result[$key] = $array2[$key]; } - if(isset($array2[$key])) { + if (isset($array2[$key])) { unset($array2[$key]); } } diff --git a/src/Appwrite/Migration/Version/V06.php b/src/Appwrite/Migration/Version/V06.php index e4fbc77718..b28ce8ac2f 100644 --- a/src/Appwrite/Migration/Version/V06.php +++ b/src/Appwrite/Migration/Version/V06.php @@ -2,7 +2,6 @@ namespace Appwrite\Migration\Version; - use Utopia\App; use Utopia\CLI\Console; use Appwrite\Database\Database; @@ -35,8 +34,7 @@ class V06 extends Migration case Database::SYSTEM_COLLECTION_KEYS: if ($document->getAttribute('secret', null)) { $json = \json_decode($document->getAttribute('secret'), true); - if (is_array($json)) - { + if (is_array($json)) { Console::log('Secret already encrypted. Skipped: ' . $document->getId()); break; } From b8f84c484378ba9cde3572ef4aeb10922ba2cb73 Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Thu, 7 Oct 2021 11:19:29 -0300 Subject: [PATCH 157/257] Update app/config/locale/translations/esp.json Co-authored-by: Christy Jacob --- app/config/locale/translations/esp.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/translations/esp.json b/app/config/locale/translations/esp.json index a726beebb7..53a32e8912 100644 --- a/app/config/locale/translations/esp.json +++ b/app/config/locale/translations/esp.json @@ -5,7 +5,7 @@ "emails.verification.subject": "Konta Konfirmo", "emails.verification.hello": "Saluton {{name}}", "emails.verification.body": "Alklaku ĉi tiun ligon por kontroli vian retpoŝtan adreson.", - "emails.verification.footer": "Se vi ne petis ĉi tiun konfirmon de ĉi tiu retpoŝto, vi povas ignori ĉi tiun mesaĝon.”, + "emails.verification.footer": "Se vi ne petis ĉi tiun konfirmon de ĉi tiu retpoŝto, vi povas ignori ĉi tiun mesaĝon.", "emails.verification.thanks": "Dankegon.", "emails.verification.signature": "Teamo {{project}}", "emails.magicSession.subject": "Login", From 8e4c12ae5fde447cd58284258b8763a3f6f85c90 Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Thu, 7 Oct 2021 11:21:06 -0300 Subject: [PATCH 158/257] Update and rename esp.json to eo.json --- app/config/locale/translations/{esp.json => eo.json} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename app/config/locale/translations/{esp.json => eo.json} (99%) diff --git a/app/config/locale/translations/esp.json b/app/config/locale/translations/eo.json similarity index 99% rename from app/config/locale/translations/esp.json rename to app/config/locale/translations/eo.json index 53a32e8912..e10dfd5d6e 100644 --- a/app/config/locale/translations/esp.json +++ b/app/config/locale/translations/eo.json @@ -1,5 +1,5 @@ { - "settings.locale": "esp", + "settings.locale": "eo", "settings.direction": "ltr", "emails.sender": "Teamo %s", "emails.verification.subject": "Konta Konfirmo", @@ -10,7 +10,7 @@ "emails.verification.signature": "Teamo {{project}}", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Saluton,", - "emails.magicSession.body": "Alklaku ĉi tiun ligon por eniri.”, + "emails.magicSession.body": "Alklaku ĉi tiun ligon por eniri.", "emails.magicSession.footer": "Se vi ne petis ĉi tiun konfirmon de ĉi tiu retpoŝto, vi povas ignori ĉi tiun mesaĝon.", "emails.magicSession.thanks": "Dankegon", "emails.magicSession.signature": "Teamo {{project}}", From 4f22fffb2189fa234b6a771a5ae36873a29ef72e Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Thu, 7 Oct 2021 11:22:46 -0300 Subject: [PATCH 159/257] Update codes.php --- app/config/locale/codes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index dba9e84fa1..5617ef158a 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -12,8 +12,8 @@ return [ 'da', // Danish 'de', // German 'en', // English + 'eo', // Esperanto 'es', // Spanish - 'esp',// Esperanto 'fa', // Farsi/Persian 'fi', // Finnish 'fo', // Faroese From 8537e140057150f6b53c2e4d607410c1351db08b Mon Sep 17 00:00:00 2001 From: Tatiana <43054051+tacoelho@users.noreply.github.com> Date: Thu, 7 Oct 2021 11:24:20 -0300 Subject: [PATCH 160/257] Update init.php --- app/init.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/init.php b/app/init.php index 579b05f7ec..153f76ce95 100644 --- a/app/init.php +++ b/app/init.php @@ -273,8 +273,8 @@ Locale::setLanguageFromJSON('da', __DIR__.'/config/locale/translations/da.json') Locale::setLanguageFromJSON('de', __DIR__.'/config/locale/translations/de.json'); Locale::setLanguageFromJSON('el', __DIR__.'/config/locale/translations/el.json'); Locale::setLanguageFromJSON('en', __DIR__.'/config/locale/translations/en.json'); +Locale::setLanguageFromJSON('eo', __DIR__.'/config/locale/translations/eo.json'); Locale::setLanguageFromJSON('es', __DIR__.'/config/locale/translations/es.json'); -Locale::setLanguageFromJSON('esp', __DIR__.'/config/locale/translations/esp.json'); Locale::setLanguageFromJSON('fa', __DIR__.'/config/locale/translations/fa.json'); Locale::setLanguageFromJSON('fi', __DIR__.'/config/locale/translations/fi.json'); Locale::setLanguageFromJSON('fo', __DIR__.'/config/locale/translations/fo.json'); From 9e7d205d4152643b4ad16b6773fd274d56fee07c Mon Sep 17 00:00:00 2001 From: Shrey Date: Thu, 7 Oct 2021 22:48:47 +0530 Subject: [PATCH 161/257] Added Sindhi translations --- app/config/locale/codes.php | 1 + app/config/locale/translations/sd.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/sd.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index 935858b569..a85b20bddf 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -50,6 +50,7 @@ return [ 'ro', // Romanian 'ru', // Russian 'sa', //Sanskrit + 'sd', // Sindhi 'si', // Sinhala 'sk', // Slovakia 'sl', // Slovenian diff --git a/app/config/locale/translations/sd.json b/app/config/locale/translations/sd.json new file mode 100644 index 0000000000..c9863badb2 --- /dev/null +++ b/app/config/locale/translations/sd.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"سمجھدار ھجڻ جو فن آھي اھو .اڻڻاڻڻ جو فن جيڪو نظر انداز ڪجي.\"", + "settings.locale": "sd", + "settings.direction": "ltr", + "emails.sender": "%s ٽيم", + "emails.verification.subject": " اڪائونٽ جي تصديق", + "emails.verification.hello": "سلام {{name}}", + "emails.verification.body": "پنھنجي اي ميل ايڊريس جي تصديق ڪرڻ لاءِ ھن لنڪ تي عمل ڪريو.", + "emails.verification.footer": "جيڪڏھن توھان نه پ askيا ھئا ھن ايڊريس جي تصديق ڪرڻ لاءِ ، توھان نظر انداز ڪري سگھوٿا ھن پيغام کي.", + "emails.verification.thanks": "مهرباني", + "emails.verification.signature": "{{project}} ٽيم", + "emails.magicSession.subject": "لاگ ان", + "emails.magicSession.hello": "هي ،", + "emails.magicSession.body": "لاگ ان ٿيڻ لاءِ ھن لنڪ تي عمل ڪريو.", + "emails.magicSession.footer": "جيڪڏھن توھان نه پ پيا ھي لاگ ان استعمال ڪندي اي ميل ، توھان نظر انداز ڪري سگھوٿا ھن پيغام کي.", + "emails.magicSession.thanks": "مهرباني", + "emails.magicSession.signature": "{{project}} ٽيم", + "emails.recovery.subject": "پاسورڊ ري سيٽ", + "emails.recovery.hello": "هيلو {{name}}", + "emails.recovery.body": "ھن لنڪ تي عمل ڪريو پنھنجو {{project}} پاسورڊ ري سيٽ ڪرڻ لاءِ.", + "emails.recovery.footer": "جيڪڏھن توھان نه پ پيو ھو پنھنجي پاسورڊ کي ري سيٽ ڪرڻ لاءِ ، توھان نظر انداز ڪري سگھوٿا ھن پيغام کي.", + "emails.recovery.thanks": "مهرباني", + "emails.recovery.signature": "{{project}} ٽيم", + "emails.invitation.subject": "٪ s ٽيم٪ s تيجي دعوت", + "emails.invitation.hello": "هيلو", + "emails.invitation.body": "ھي اي ميل توھان ڏانھن موڪليو ويو آھي {اڪاڻ ته {{owner}} توھان کي دعوت ڏيڻ چاھي ٿو ته توھان {{team}} ٽيم جو ميمبر بڻجي {{project}} تي.", + "emails.invitation.footer": "جيڪڏھن توھان دلچسپي نٿا رکو ، توھان نظر انداز ڪري سگھوٿا ھن پيغام کي.", + "emails.invitation.thanks": "مهرباني", + "emails.invitation.signature": "{{project}} ٽيم", + "locale.country.unknown": "نامعلوم", + "countries.af": "افغانستان", + "countries.ao": "آنگولا", + "countries.al": "البانيا", + "countries.ad": "اندورا", + "countries.ae": "متحده عرب امارات", + "countries.ar": "ارجنٽينا", + "countries.am": "آرمينيا", + "countries.ag": "انٽيگوا ۽ باربودا", + "countries.au": "آسٽريليا", + "countries.at": "آسٽريا", + "countries.az": "آذربائيجان", + "countries.bi": "برونڊي", + "countries.be": "بيلجيم", + "countries.bj": "بينن", + "countries.bf": "برڪينا فاسو", + "countries.bd": "بنگله ديش", + "countries.bg": "بلغاريا", + "countries.bh": "بحرين", + "countries.bs": "بهاماس", + "countries.ba": "بوسنيا ۽ هرزيگووينا", + "countries.by": "بيلاروس", + "countries.bz": "بيليز", + "countries.bo": "بوليويا", + "countries.br": "برازيل", + "countries.bb": "باربڊوس", + "countries.bn": "برونائي", + "countries.bt": "ڀوٽان", + "countries.bw": "بوٽسوانا", + "countries.cf": "وسطي آفريقي جمهوريه", + "countries.ca": "ڪينيڊا", + "countries.ch": "سئيٽرزلينڊ", + "countries.cl": "چلي", + "countries.cn": "چين", + "countries.ci": "آئيوري ڪوسٽ", + "countries.cm": "ڪيمرون", + "countries.cd": "ڪانگوڊاڪٽر", + "countries.cg": "ڪانگو جي جمهوريه", + "countries.co": "ڪولمبيا", + "countries.km": "ڪوموروس", + "countries.cv": "ڪيپ ورڊي", + "countries.cr": "ڪوسٽا ريڪا", + "countries.cu": "ڪيوبا", + "countries.cy": "ڪپرس", + "countries.cz": "چيڪيا", + "countries.de": "جرمني", + "countries.dj": "ڊجبيوٽي", + "countries.dm": "ڊومينيڪا", + "countries.dk": "ڊينمارڪ", + "countries.do": "ڊومينيڪن جمهوريه", + "countries.dz": "الجيريا", + "countries.ec": "ايڪيوڊار", + "countries.eg": "مصر", + "countries.er": "ايريٽيريا", + "countries.es": "اسپين", + "countries.ee": "ايسٽونيا", + "countries.et": "ايٿوپيا", + "countries.fi": "فنلينڊ", + "countries.fj": "فجي", + "countries.fr": "فرانس", + "countries.fm": "مائڪرونيشيا", + "countries.ga": "گوبان", + "countries.gb": "برطانيه", + "countries.ge": "جارجيا", + "countries.gh": "گانا", + "countries.gn": "گائينا", + "countries.gm": "گامبيا", + "countries.gw": "گائينا - بسيو", + "countries.gq": "ايڪوٽوريل گائينا", + "countries.gr": "گريسي", + "countries.gd": "گرينڊا", + "countries.gt": "گٽيمالا", + "countries.gy": "گيانا", + "countries.hn": "هونڊرس", + "countries.hr": "ڪوريٽيا", + "countries.ht": "هيٽي", + "countries.hu": "هنگري", + "countries.id": "انڊونيشيا", + "countries.in": "انڊيا", + "countries.ie": "آئرلينڊ", + "countries.ir": "ايران", + "countries.iq": "عراق", + "countries.is": "آئس لينڊ", + "countries.il": "اسرائيل", + "countries.it": "اٽلي", + "countries.jm": "جاميڪا", + "countries.jo": "اردن", + "countries.jp": "جاپان", + "countries.kz": "قازقستان", + "countries.ke": "ڪينيا", + "countries.kg": "ڪرغستان", + "countries.kh": "ڪمبوڊيا", + "countries.ki": "ڪرباتي", + "countries.kn": "سينٽ ڪيٽس ۽ نيوس", + "countries.kr": "ڏکڻ ڪوريا", + "countries.kw": "ڪويت", + "countries.la": "لاس", + "countries.lb": "لبنان", + "countries.lr": "لابيريا", + "countries.ly": "ليبيا", + "countries.lc": "سينٽ لوسيا", + "countries.li": "لچي ٽينسٽين", + "countries.lk": "سري لنڪا", + "countries.ls": "ليسوٽو", + "countries.lt": "لٿونيا", + "countries.lu": "ليڪسمبورگ", + "countries.lv": "لاتويا", + "countries.ma": "مراڪش", + "countries.mc": "موناڪو", + "countries.md": "مولڊووا", + "countries.mg": "ماڊاگيسڪر", + "countries.mv": "مالديپ", + "countries.mx": "ميڪسيڪو", + "countries.mh": "مارشل ڀيٽ", + "countries.mk": "مقدونيا", + "countries.ml": "مالي", + "countries.mt": "مالٽا", + "countries.mm": "میانمار", + "countries.me": "مونٽينيگرو", + "countries.mn": "منگوليا", + "countries.mz": "موزمبائيق", + "countries.mr": "ماريٽينيا", + "countries.mu": "موريشس", + "countries.mw": "مالاوي", + "countries.my": "ملائيشيا", + "countries.na": "نيميبيا", + "countries.ne": "نائيگر", + "countries.ng": "نائجيريا", + "countries.ni": "نڪروگا", + "countries.nl": "نيدرليند", + "countries.no": "ناروي", + "countries.np": "نيپال", + "countries.nr": "ناريو", + "countries.nz": "نيو زيلينڊ", + "countries.om": "عمان", + "countries.pk": "پاڪستان", + "countries.pa": "پاناما", + "countries.pe": "پيرو", + "countries.ph": "فلپائن", + "countries.pw": "پوليو", + "countries.pg": "پوپا نيو گائينا", + "countries.pl": "پولينڊ", + "countries.kp": "شمالي ڪوريا", + "countries.pt": "پرتگال", + "countries.py": "پيراگوء", + "countries.qa": "قطر", + "countries.ro": "رومانيا", + "countries.ru": "روس", + "countries.rw": "روانڊا", + "countries.sa": "سعودي عرب", + "countries.sd": "سوڊان", + "countries.sn": "سينيگال", + "countries.sg": "سينگاپور", + "countries.sb": "سولومون ٻيٽ", + "countries.sl": "سيري لون", + "countries.sv": "ايل سلواڊور", + "countries.sm": "سان ميرينو", + "countries.so": "سوماليه", + "countries.rs": "سربيا", + "countries.ss": "ڏکڻ سوڊان", + "countries.st": "سائو ٽوم ۽ پرنسپي", + "countries.sr": "سيري نيم", + "countries.sk": "سلوواڪيا", + "countries.si": "سلووينيا", + "countries.se": "سوئيڊن", + "countries.sz": "سئيزلينڊ", + "countries.sc": "سيليڪاز", + "countries.sy": "شام", + "countries.td": "چاڊ", + "countries.tg": "ٽوگو", + "countries.th": "ٿائيليند", + "countries.tj": "تاجڪستان", + "countries.tm": "ترڪمانستان", + "countries.tl": "تيمور-ليست", + "countries.to": "ٽونگا", + "countries.tt": "ٽرينڊڊ ۽ ٽوباگو", + "countries.tn": "تيونيسيا", + "countries.tr": "ترڪي", + "countries.tv": "توالو", + "countries.tz": "تنزانيه", + "countries.ug": "يوگنڊا", + "countries.ua": "يوڪرائين", + "countries.uy": "يوروگائي", + "countries.us": "گڏيل رياستون", + "countries.uz": "ازبڪستان", + "countries.va": "ويٽڪين سٽي", + "countries.vc": "سينٽ ويڪنٽ ۽ گرينڊنيس", + "countries.ve": "وينزيلا", + "countries.vn": "ويتنام", + "countries.vu": "وينيٽيو", + "countries.ws": "سموئا", + "countries.ye": "يمن", + "countries.za": "ڏکڻ آفريڪا", + "countries.zm": "زمبيا", + "countries.zw": "زمبابوي", + "continents.af": "آفريڪا", + "continents.an": "انٽارڪٽيڪا", + "continents.as": "ايشيا", + "continents.eu": "يورپ", + "continents.na": "اتر آمريڪا", + "continents.oc": "اوشينيا", + "continents.sa": "ڏکڻ آمريڪا" +} \ No newline at end of file diff --git a/app/init.php b/app/init.php index 9a1244057d..2b4615499b 100644 --- a/app/init.php +++ b/app/init.php @@ -309,6 +309,7 @@ Locale::setLanguageFromJSON('pt-pt', __DIR__.'/config/locale/translations/pt-pt. Locale::setLanguageFromJSON('ro', __DIR__.'/config/locale/translations/ro.json'); Locale::setLanguageFromJSON('ru', __DIR__ . '/config/locale/translations/ru.json'); Locale::setLanguageFromJSON('sa', __DIR__ . '/config/locale/translations/sa.json'); +Locale::setLanguageFromJSON('sd', __DIR__ . '/config/locale/translations/sd.json'); Locale::setLanguageFromJSON('si', __DIR__ . '/config/locale/translations/si.json'); Locale::setLanguageFromJSON('sk', __DIR__ . '/config/locale/translations/sk.json'); Locale::setLanguageFromJSON('sl', __DIR__ . '/config/locale/translations/sl.json'); From b0abfedbb9ebabdc4bbc1cbed8f2be0c010da07a Mon Sep 17 00:00:00 2001 From: Natalia Rossini Date: Thu, 7 Oct 2021 21:46:49 +0100 Subject: [PATCH 162/257] fix portuguese-br grammar and misspell --- app/config/locale/translations/pt-br.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/config/locale/translations/pt-br.json b/app/config/locale/translations/pt-br.json index 9640df66c7..67590d3fe0 100644 --- a/app/config/locale/translations/pt-br.json +++ b/app/config/locale/translations/pt-br.json @@ -6,25 +6,25 @@ "emails.verification.subject": "Verificação da Conta", "emails.verification.hello": "Olá {{name}}", "emails.verification.body": "Clique neste link para verificar o seu endereço de e-mail.", - "emails.verification.footer": "Se não você que solicitou essa verificação deste e-mail, você pode ignorar essa mensagem", + "emails.verification.footer": "Se você não solicitou a verificação deste e-mail, ignore essa mensagem.", "emails.verification.thanks": "Muito obrigado", "emails.verification.signature": "Time {{project}}", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Olá,", - "emails.magicSession.body": "Clique neste link para entrar", - "emails.magicSession.footer": "Se não você que solicitou essa verificação deste e-mail, você pode ignorar essa mensagem", + "emails.magicSession.body": "Clique neste link para entrar.", + "emails.magicSession.footer": "Se você não solicitou conectar-se com este e-mail, ignore essa mensagem.", "emails.magicSession.thanks": "Muito obrigado", "emails.magicSession.signature": "Time {{project}}", - "emails.recovery.subject": "Redefinação de senha", + "emails.recovery.subject": "Redefinição de senha", "emails.recovery.hello": "Olá {{name}}", "emails.recovery.body": "Clique neste link para redefinir sua senha do {{project}}.", - "emails.recovery.footer": "Se você não solicitou a redefinição da sua senha, você pode ignorar essa mensagem", + "emails.recovery.footer": "Se você não solicitou a redefinição da sua senha, você pode ignorar essa mensagem.", "emails.recovery.thanks": "Muito obrigado", "emails.recovery.signature": "Time {{project}}", "emails.invitation.subject": "Convite para o Time %s em %s", "emails.invitation.hello": "Olá", - "emails.invitation.body": "Este email foi enviado porque o {{owner}} deseja convidar você a se tornar membro do Time {{team}} em {{project}}.", - "emails.invitation.footer": "Se você não está interessado, você pode ignorar essa mensagem", + "emails.invitation.body": "Este e-mail foi enviado porque {{owner}} deseja convidar você a se tornar membro do Time {{team}} em {{project}}.", + "emails.invitation.footer": "Caso não tenha interesse, ignore essa mensagem.", "emails.invitation.thanks": "Muito obrigado", "emails.invitation.signature": "Time {{project}}", "locale.country.unknown": "Desconhecido", From a01c6a5a57095169b87e0f7b5fbedb4c39b2fe8f Mon Sep 17 00:00:00 2001 From: HelloSeaNation Date: Fri, 8 Oct 2021 18:29:36 +1300 Subject: [PATCH 163/257] Update zh-tw.json --- app/config/locale/translations/zh-tw.json | 48 +++++++++++------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/zh-tw.json b/app/config/locale/translations/zh-tw.json index d116708a12..2edba9f49d 100644 --- a/app/config/locale/translations/zh-tw.json +++ b/app/config/locale/translations/zh-tw.json @@ -3,30 +3,30 @@ "settings.locale": "zh-tw", "settings.direction": "ltr", "emails.sender": "%s 小組", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "帳戶驗證", + "emails.verification.hello": "嗨 {{name}}", + "emails.verification.body": "按照此鏈接驗證您的電子郵件地址。", + "emails.verification.footer": "如果您沒有要求驗證此地址,則可以忽略此消息。", + "emails.verification.thanks": "謝謝", + "emails.verification.signature": "{{project}} 團隊", + "emails.magicSession.subject": "登錄", + "emails.magicSession.hello": "嗨", + "emails.magicSession.body": "點此鏈接登錄。", + "emails.magicSession.footer": "如果您沒有要求使用此電子郵件登錄,則可以忽略此消息。", + "emails.magicSession.thanks": "謝謝", + "emails.magicSession.signature": "{{project}} 團隊", + "emails.recovery.subject": "重設密碼", + "emails.recovery.hello": "你好 {{name}}", + "emails.recovery.body": "按照此鏈接重置您的 {{project}} 密碼.", + "emails.recovery.footer": "如果您沒有要求重置密碼,則可以忽略此消息。", + "emails.recovery.thanks": "謝謝", + "emails.recovery.signature": "{{project}} 團隊", + "emails.invitation.subject": "邀請 %s 團隊在 %s", + "emails.invitation.hello": "你好", + "emails.invitation.body": "這封郵件發送給您是因為 {{owner}} 想邀請您成為 {{team}} 團隊在 {{project}}.", + "emails.invitation.footer": "如果您不感興趣,可以忽略此消息。", + "emails.invitation.thanks": "謝謝", + "emails.invitation.signature": "{{project}} 團隊", "locale.country.unknown": "未知", "countries.af": "阿富汗", "countries.ao": "安哥拉", From ab6f15d698c434b47b7762d7e9727d6383efea55 Mon Sep 17 00:00:00 2001 From: Toir Tuychiev Date: Fri, 8 Oct 2021 12:44:47 +0500 Subject: [PATCH 164/257] typo docker-compose.yml typo docker-compose.yml --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 8bb3885ef9..2a86fc575e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ # WARNING! # This is a development version of THE Appwrite docker-compose.yml file. # Avoid using this file in your production environment. -# We're exposing here sensetive ports and mounting code volumes for rapid development and debugging of the server stack. +# We're exposing here sensitive ports and mounting code volumes for rapid development and debugging of the server stack. version: '3' From e19abf352876b01667ea390d93667e9b244996d8 Mon Sep 17 00:00:00 2001 From: Toir Tuychiev Date: Fri, 8 Oct 2021 13:02:31 +0500 Subject: [PATCH 165/257] typo and blockquote typo and blockquote --- docs/examples/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/README.md b/docs/examples/README.md index edcb3f29fa..57f50ef22a 100644 --- a/docs/examples/README.md +++ b/docs/examples/README.md @@ -1 +1 @@ -All code examples in the version named directories are auto-generated using the Appwrite SDK Generator, Please refer to https://github.com/appwrite/sdk-generator for submmiting any pull-requests. \ No newline at end of file +> All code examples in the version named directories are auto-generated using the Appwrite SDK Generator, Please refer to https://github.com/appwrite/sdk-generator for submitting any pull-requests. From ad99e8bab3be48663b705e4ed048064c23df5a20 Mon Sep 17 00:00:00 2001 From: siw3kosky Date: Fri, 8 Oct 2021 10:47:38 +0200 Subject: [PATCH 166/257] Update add-translations.md fixed typos --- docs/tutorials/add-translations.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/tutorials/add-translations.md b/docs/tutorials/add-translations.md index 48131f8ad1..496bc4a6b1 100644 --- a/docs/tutorials/add-translations.md +++ b/docs/tutorials/add-translations.md @@ -101,7 +101,7 @@ Next, choose a reference language. If English is your reference language, copy t We use [PO Editor](https://poeditor.com/) to manage all our translations in a convenient way. The first step is to join the Appwrite Project on PO Editor using [our invite link](https://poeditor.com/join/project?hash=BNrWbRXyk6). -On the home page, you can see all the languages that we currently support and the progress in each one. You can choose to be help us complete the existing translations or add new ones. +On the home page, you can see all the languages that we currently support and the progress in each one. You can choose to help us complete the existing translations or add new ones. ![Home Page](images/home-page.png) @@ -111,7 +111,7 @@ Continue with the rest of the process until you arrive at your dashboard. ![Dashboard](images/dashboard.png) -Your request might be pending, so you can ping us on Discord and we'll make the process faster 😀 . Once your request has been accepeted, you can proceed. +Your request might be pending, so you can ping us on Discord and we'll make the process faster 😀 . Once your request has been accepted, you can proceed. ![Get Started](images/guide.png) From d219599c84343cd821094094be6dff97feb9f690 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kami=C5=84ski?= Date: Fri, 8 Oct 2021 13:38:43 +0200 Subject: [PATCH 167/257] Modified some translations Hello, I have corrected some Polish translations --- app/config/locale/translations/pl.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/config/locale/translations/pl.json b/app/config/locale/translations/pl.json index 3079f0a311..86c3f73457 100644 --- a/app/config/locale/translations/pl.json +++ b/app/config/locale/translations/pl.json @@ -6,25 +6,25 @@ "emails.verification.subject": "Weryfikacja konta", "emails.verification.hello": "Cześć {{name}}", "emails.verification.body": "Przejdź do tego linku, aby zweryfikować swój adres e-mail.", - "emails.verification.footer": "Jeśli to nie Ty prosiłeś o zweryfikowanie tego adresu, możesz zignorować tę wiadomość.", + "emails.verification.footer": "Jeśli to nie Ty prosiłeś o zweryfikowanie tego adresu, zignoruj tę wiadomość.", "emails.verification.thanks": "Dziękujemy", "emails.verification.signature": "Zespół {{project}}", "emails.magicSession.subject": "Logowanie", "emails.magicSession.hello": "Cześć,", - "emails.magicSession.body": "Przejdź do tego linku, aby zalogować się.", - "emails.magicSession.footer": "Jeśli to nie Ty prosiłeś o logowanie przy użyciu tego adresu e-mail, możesz zignorować tę wiadomość.", + "emails.magicSession.body": "Kliknij w ten link, aby zalogować się.", + "emails.magicSession.footer": "Jeśli to nie Ty prosiłeś o logowanie przy użyciu tego adresu e-mail, zignoruj tę wiadomość.", "emails.magicSession.thanks": "Dziękujemy", "emails.magicSession.signature": "Zespół {{project}}", "emails.recovery.subject": "Resetowanie hasła", "emails.recovery.hello": "Cześć {{name}}", "emails.recovery.body": "Przejdź do tego linku, aby zresetować hasło dla {{project}}.", - "emails.recovery.footer": "Jeśli to nie Ty prosiłeś o zresetowanie swojego hasła, możesz zignorować tę wiadomość.", + "emails.recovery.footer": "Jeśli to nie Ty prosiłeś o zresetowanie swojego hasła, zignoruj tę wiadomość.", "emails.recovery.thanks": "Dziękujemy", "emails.recovery.signature": "Zespół {{project}}", "emails.invitation.subject": "Zaproszenie do zespołu %s w %s", "emails.invitation.hello": "Cześć", "emails.invitation.body": "Otrzymujesz tę wiadomość, ponieważ {{owner}} zaprasza Cię do grona członków zespołu {{team}} w projekcie {{project}}.", - "emails.invitation.footer": "Jeśli nie jesteś zainteresowany, możesz zignorować tę wiadomość.", + "emails.invitation.footer": "Jeśli nie jesteś zainteresowany, zignoruj tę wiadomość.", "emails.invitation.thanks": "Dziękujemy", "emails.invitation.signature": "Zespół {{project}}", "locale.country.unknown": "Nieznany", @@ -135,7 +135,7 @@ "countries.lu": "Luksemburg", "countries.lv": "Łotwa", "countries.ma": "Maroko", - "countries.mc": "Monaco", + "countries.mc": "Monako", "countries.md": "Mołdawia", "countries.mg": "Madagaskar", "countries.mv": "Malediwy", From 6c4cdff8c05bb13fd4b10a73c3568f5b26a414ba Mon Sep 17 00:00:00 2001 From: Patricia Nicole Opetina Date: Sat, 9 Oct 2021 13:19:10 +0800 Subject: [PATCH 168/257] Added Tagalog/Filipino translations --- app/config/locale/translations/tl.json | 176 ++++++++++++------------- 1 file changed, 88 insertions(+), 88 deletions(-) diff --git a/app/config/locale/translations/tl.json b/app/config/locale/translations/tl.json index 829229f7ed..5c88e4cf69 100644 --- a/app/config/locale/translations/tl.json +++ b/app/config/locale/translations/tl.json @@ -3,31 +3,31 @@ "settings.locale": "tl", "settings.direction": "ltr", "emails.sender": "Pangkat ng %s", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", - "locale.country.unknown": "Hindi alam", + "emails.verification.subject": "Pagpapatunay ng account", + "emails.verification.hello": "Kamusta {{name}}", + "emails.verification.body": "Sundin ang link na ito upang ma-verify ang iyong email address.", + "emails.verification.footer": "Kung hindi mo hiningi na i-verify ang address na ito, maaari mong balewalain ang mensahe na ito.", + "emails.verification.thanks": "Salamat", + "emails.verification.signature": "Pangkat ng {{project}}", + "emails.magicSession.subject": "Mag log in", + "emails.magicSession.hello": "Kamusta, ", + "emails.magicSession.body": "Sundin ang link na ito upang mag-login.", + "emails.magicSession.footer": "Kung hindi mo hiningi na mag-login gamit ang email na ito, maaari mong balewalain ang mensahe na ito.", + "emails.magicSession.thanks": "Salamat", + "emails.magicSession.signature": "Pangkat ng {{project}}", + "emails.recovery.subject": "I-reset ang password", + "emails.recovery.hello": "Kamusta {{name}}", + "emails.recovery.body": "Sundin ang link na ito upang i-reset ang password ng iyong {{project}}.", + "emails.recovery.footer": "Kung hindi mo hiningi na i-reset ang iyong password, maaari mong balewalain ang mensahe na ito.", + "emails.recovery.thanks": "Salamat", + "emails.recovery.signature": "Pangkat ng {{project}}", + "emails.invitation.subject": "Imbitasyon para sa Pangkat %s sa %s", + "emails.invitation.hello": "Kamusta", + "emails.invitation.body": "Ipinadala sa iyo ang mail na ito dahil gusto kang imbitahan ni {{owner}} na maging miyembro ng Pangkat {{team}} sa ilalim ng proyektong {{project}}.", + "emails.invitation.footer": "Kung ikaw ay hindi interesado, maaari mong balewalain ang mensaheng ito.", + "emails.invitation.thanks": "Salamat", + "emails.invitation.signature": "Pangkat ng {{project}}", + "locale.country.unknown": "Hindi kilala", "countries.af": "Apganistan", "countries.ao": "Anggola", "countries.al": "Albanya", @@ -40,87 +40,87 @@ "countries.at": "Austria", "countries.az": "Aserbayan", "countries.bi": "Burundi", - "countries.be": "Belhika", + "countries.be": "Belgika", "countries.bj": "Benin", "countries.bf": "Burkina Faso", "countries.bd": "Bangladesh", "countries.bg": "Bulgarya", - "countries.bh": "Barein", + "countries.bh": "Bahrain", "countries.bs": "Bahamas", "countries.ba": "Bosnia at Herzegovina", - "countries.by": "Biyelorusya", - "countries.bz": "Belise", + "countries.by": "Belarus", + "countries.bz": "Belize", "countries.bo": "Bolivia", "countries.br": "Brasil", "countries.bb": "Barbados", - "countries.bn": "Brunay", - "countries.bt": "Butan", + "countries.bn": "Brunei", + "countries.bt": "Bhutan", "countries.bw": "Botswana", "countries.cf": "Republika ng Gitnang Aprika", "countries.ca": "Canada", "countries.ch": "Suwisa", "countries.cl": "Chile", "countries.cn": "Tsina", - "countries.ci": "Baybaying Garing", - "countries.cm": "Kamerun", + "countries.ci": "Baybayin ng Garing", + "countries.cm": "Cameroon", "countries.cd": "Demokratikong Republika ng Konggo", "countries.cg": "Republika ng Konggo", "countries.co": "Colombia", - "countries.km": "Komoros", - "countries.cv": "Kabo Berde", + "countries.km": "Comoros", + "countries.cv": "Cape Verde", "countries.cr": "Costa Rica", - "countries.cu": "Kuba", - "countries.cy": "Tsipre", - "countries.cz": "Republikang Tseko", + "countries.cu": "Cuba", + "countries.cy": "Cyprus", + "countries.cz": "Republika ng Tsek", "countries.de": "Alemanya", - "countries.dj": "Hiboti", + "countries.dj": "Djibouti", "countries.dm": "Dominika", - "countries.dk": "Dinamarka", + "countries.dk": "Denmark", "countries.do": "Republikang Dominikano", - "countries.dz": "Arhelya", + "countries.dz": "Algerya", "countries.ec": "Ekwador", "countries.eg": "Ehipto", "countries.er": "Eritrea", "countries.es": "Espanya", "countries.ee": "Estonia", - "countries.et": "Etiyopiya", + "countries.et": "Etyopya", "countries.fi": "Finland", - "countries.fj": "Piyi", - "countries.fr": "Pransiya", + "countries.fj": "Fiji", + "countries.fr": "Pransya", "countries.fm": "Mikronesya", "countries.ga": "Gabon", - "countries.gb": "Nagkakaisang Kaharian", - "countries.ge": "Heorhiya", + "countries.gb": "United Kingdom", + "countries.ge": "Georgia", "countries.gh": "Ghana", - "countries.gn": "Ginea", - "countries.gm": "Ang Gambiya", + "countries.gn": "Guinea", + "countries.gm": "Gambia", "countries.gw": "Ginea-Bissau", - "countries.gq": "Gineang Ekwatoriyal", + "countries.gq": "Equatorial Guinea", "countries.gr": "Gresya", "countries.gd": "Grenada", "countries.gt": "Guwatemala", "countries.gy": "Guyana", "countries.hn": "Honduras", "countries.hr": "Kroasya", - "countries.ht": "Hayti", + "countries.ht": "Haiti", "countries.hu": "Unggarya", "countries.id": "Indonesya", "countries.in": "Indiya", "countries.ie": "Irlanda", "countries.ir": "Iran", "countries.iq": "Irak", - "countries.is": "Lupangyelo", + "countries.is": "Islandia", "countries.il": "Israel", "countries.it": "Italya", - "countries.jm": "Hamayka", - "countries.jo": "Hordan", + "countries.jm": "Jamaica", + "countries.jo": "Jordan", "countries.jp": "Hapon", "countries.kz": "Kazakhstan", "countries.ke": "Kenya", - "countries.kg": "Kirgistan", + "countries.kg": "Kyrgyzstan", "countries.kh": "Kambodya", "countries.ki": "Kiribati", - "countries.kn": "San Cristobal at Niyebes", + "countries.kn": "Saint Kitts and Nevis", "countries.kr": "Timog Korea", "countries.kw": "Kuwait", "countries.la": "Laos", @@ -133,14 +133,14 @@ "countries.ls": "Lesoto", "countries.lt": "Litwaniya", "countries.lu": "Luxembourg", - "countries.lv": "Latbiya", - "countries.ma": "Maruekos", - "countries.mc": "Monako", - "countries.md": "Moldavia", + "countries.lv": "Latvia", + "countries.ma": "Morocco", + "countries.mc": "Monaco", + "countries.md": "Moldava", "countries.mg": "Madagaskar", "countries.mv": "Maldives", "countries.mx": "Mehiko", - "countries.mh": "Kapuluang Marshall", + "countries.mh": "Marshall Islands", "countries.mk": "Macedonia", "countries.ml": "Mali", "countries.mt": "Malta", @@ -149,15 +149,15 @@ "countries.mn": "Mongolia", "countries.mz": "Mozambique", "countries.mr": "Mauritania", - "countries.mu": "Maurisyo", + "countries.mu": "Mauritius", "countries.mw": "Malawi", - "countries.my": "Malasya", - "countries.na": "Namibya", - "countries.ne": "Niyer", + "countries.my": "Malaysia", + "countries.na": "Namibia", + "countries.ne": "Niger", "countries.ng": "Nigerya", "countries.ni": "Nicaragua", "countries.nl": "Olanda", - "countries.no": "Noruwega", + "countries.no": "Norwega", "countries.np": "Nepal", "countries.nr": "Nauru", "countries.nz": "New Zealand", @@ -166,45 +166,45 @@ "countries.pa": "Panama", "countries.pe": "Peru", "countries.ph": "Pilipinas", - "countries.pw": "Palaw", - "countries.pg": "Papua Bagong Guinea", - "countries.pl": "Polonya", + "countries.pw": "Palau", + "countries.pg": "Papua New Guinea", + "countries.pl": "Poland", "countries.kp": "Hilagang Korea", "countries.pt": "Portugal", "countries.py": "Paraguay", - "countries.qa": "Katar", - "countries.ro": "Rumanya", + "countries.qa": "Qatar", + "countries.ro": "Romania", "countries.ru": "Rusya", - "countries.rw": "Ruwanda", - "countries.sa": "Arabyang Saudi", + "countries.rw": "Rwanda", + "countries.sa": "Saudi Arabya", "countries.sd": "Sudan", "countries.sn": "Senegal", "countries.sg": "Singapore", "countries.sb": "Kapuluang Solomon", - "countries.sl": "Bulubunduking Leona", + "countries.sl": "Sierra Leone", "countries.sv": "El Salvador", "countries.sm": "San Marino", "countries.so": "Somalya", "countries.rs": "Serbya", "countries.ss": "Timog Sudan", - "countries.st": "Santo Tomé at Prinsipe", - "countries.sr": "Surinam", + "countries.st": "São Tomé and Príncipe", + "countries.sr": "Suriname", "countries.sk": "Slovakia", "countries.si": "Slovenia", - "countries.se": "Suwesya", - "countries.sz": "Suwasilandya", - "countries.sc": "Seyshels", + "countries.se": "Sweden", + "countries.sz": "Swaziland", + "countries.sc": "Seychelles", "countries.sy": "Syria", - "countries.td": "Tsad", + "countries.td": "Chad", "countries.tg": "Togo", "countries.th": "Taylandiya", "countries.tj": "Tayikistan", "countries.tm": "Turkmenistan", - "countries.tl": "Silangang Timor", + "countries.tl": "Timor-Leste", "countries.to": "Tonga", "countries.tt": "Trinidad at Tobago", "countries.tn": "Tunisya", - "countries.tr": "Pabo", + "countries.tr": "Turkey", "countries.tv": "Tuvalu", "countries.tz": "Tanzania", "countries.ug": "Uganda", @@ -212,21 +212,21 @@ "countries.uy": "Uruguay", "countries.us": "Estados Unidos", "countries.uz": "Uzbekistan", - "countries.va": "Lungsod ng Vaticano", - "countries.vc": "San Vicente at ang Kagranadinahan", + "countries.va": "Lungsod ng Vatican", + "countries.vc": "Saint Vincent at ang Grenadines", "countries.ve": "Venezuela", - "countries.vn": "Vietnam", + "countries.vn": "Byetnam", "countries.vu": "Vanuatu", "countries.ws": "Samoa", "countries.ye": "Yemen", "countries.za": "Timog Aprika", - "countries.zm": "Sambya", + "countries.zm": "Zambia", "countries.zw": "Simbabwe", "continents.af": "Aprika", "continents.an": "Antartika", "continents.as": "Asya", "continents.eu": "Europa", - "continents.na": "Amerika Norte", - "continents.oc": "Oceanya", - "continents.sa": "Amerika Sur" + "continents.na": "Hilagang Amerika", + "continents.oc": "Oceania", + "continents.sa": "Timog Amerika" } \ No newline at end of file From 702bbb8713da0c2e83d19541d57926e19123c469 Mon Sep 17 00:00:00 2001 From: Toir Tuychiev Date: Sat, 9 Oct 2021 18:13:55 +0500 Subject: [PATCH 169/257] Removed the block quote Removed the block quote --- docs/examples/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/examples/README.md b/docs/examples/README.md index 57f50ef22a..d2bfa5359d 100644 --- a/docs/examples/README.md +++ b/docs/examples/README.md @@ -1 +1 @@ -> All code examples in the version named directories are auto-generated using the Appwrite SDK Generator, Please refer to https://github.com/appwrite/sdk-generator for submitting any pull-requests. +All code examples in the version named directories are auto-generated using the Appwrite SDK Generator, Please refer to https://github.com/appwrite/sdk-generator for submitting any pull-requests. From 2d5b75b2b56d96763227800c42ef10e771bfd4d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kami=C5=84ski?= Date: Sat, 9 Oct 2021 17:44:30 +0200 Subject: [PATCH 170/257] Update currencies.php --- app/config/locale/currencies.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/config/locale/currencies.php b/app/config/locale/currencies.php index 461230f19a..ab40c216b7 100644 --- a/app/config/locale/currencies.php +++ b/app/config/locale/currencies.php @@ -870,13 +870,13 @@ return [ ], [ 'symbol' => 'zł', - 'name' => 'Polish Zloty', + 'name' => 'Polski Złoty', 'symbolNative' => 'zł', 'decimalDigits' => 2, 'rounding' => 0, 'code' => 'PLN', - 'namePlural' => 'Polish zlotys', - 'locations' => [], + 'namePlural' => 'Polish zlotych', + 'locations' => ['PL'], ], [ 'symbol' => '₲', From 9530e49790ba4335291581bb39071ab4fa354f1b Mon Sep 17 00:00:00 2001 From: the_t3o Date: Sat, 9 Oct 2021 19:30:41 +0200 Subject: [PATCH 171/257] Updated it.json for a more accurate translation by a native speaker --- app/config/locale/translations/it.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app/config/locale/translations/it.json b/app/config/locale/translations/it.json index e949225892..06080901bf 100644 --- a/app/config/locale/translations/it.json +++ b/app/config/locale/translations/it.json @@ -1,30 +1,30 @@ { - "settings.inspire": "\"L'arte di essere saggi è l'arte di sapere cosa trascurare.\"", + "settings.inspire": "\"L'arte di essere saggi è l'arte di saper cosa trascurare.\"", "settings.locale": "it", "settings.direction": "ltr", "emails.sender": "Team %s", "emails.verification.subject": "Verifica account", "emails.verification.hello": "Ciao {{name}}", "emails.verification.body": "Clicca questo link per verificare il tuo indirizzo email.", - "emails.verification.footer": "Se non sei stato tu a richiedere la verifica dell’indirizzo email, puoi ignorare questo messaggio.", + "emails.verification.footer": "Se non hai richiesto la verifica dell’indirizzo email, puoi ignorare questo messaggio.", "emails.verification.thanks": "Grazie", "emails.verification.signature": "Il team {{project}}", "emails.magicSession.subject": "Login", "emails.magicSession.hello": "Ciao,", "emails.magicSession.body": "Clicca questo link per accedere.", - "emails.magicSession.footer": "Se non sei stato tu a richiedere di effettuare l’accesso, puoi ignorare questo messaggio.", + "emails.magicSession.footer": "Se non hai richiesto di effettuare l’accesso, puoi ignorare questo messaggio.", "emails.magicSession.thanks": "Grazie", "emails.magicSession.signature": "Il team {{project}}", "emails.recovery.subject": "Reimpostazione password", "emails.recovery.hello": "Ciao {{name}}", "emails.recovery.body": "Clicca questo link per reimpostare la tua password di {{project}}.", - "emails.recovery.footer": "Se non sei stato tu a richiedere la reimpostazione della password, puoi ignorare questo messaggio.", + "emails.recovery.footer": "Se non hai richiesto la reimpostazione della password, puoi ignorare questo messaggio.", "emails.recovery.thanks": "Grazie", "emails.recovery.signature": "Il team {{project}}", "emails.invitation.subject": "Invito al Team %s per %s", "emails.invitation.hello": "Ciao", - "emails.invitation.body": "Ricevi questa email perché {{owner}} ti ha invitato a diventare un membro del team {{team}} di {{project}}.", - "emails.invitation.footer": "Ignora questo messaggio se non sei interessato.", + "emails.invitation.body": "Hai ricevuto questa email perché {{owner}} ti ha invitato a diventare un membro del team {{team}} di {{project}}.", + "emails.invitation.footer": "Ignora questo messaggio se non sei interessatə.", "emails.invitation.thanks": "Grazie", "emails.invitation.signature": "Il team {{project}}", "locale.country.unknown": "Sconosciuto", From f138aeb3a6f9379d32b48106c8e0f93637b4c1eb Mon Sep 17 00:00:00 2001 From: oovk Date: Sat, 9 Oct 2021 19:51:21 +0200 Subject: [PATCH 172/257] fixed PSR issues in the URL library --- src/Appwrite/URL/URL.php | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Appwrite/URL/URL.php b/src/Appwrite/URL/URL.php index 6e32f8dfb1..99edf9cf8b 100644 --- a/src/Appwrite/URL/URL.php +++ b/src/Appwrite/URL/URL.php @@ -13,7 +13,7 @@ class URL * * @return array */ - public static function parse(string $url):array + public static function parse(string $url): array { $default = [ 'scheme' => '', @@ -28,7 +28,7 @@ class URL return \array_merge($default, \parse_url($url)); } - + /** * Un-Parse URL * @@ -39,32 +39,32 @@ class URL * * @return string */ - public static function unparse(array $url, array $ommit = []):string + public static function unparse(array $url, array $ommit = []): string { if (isset($url['path']) && \mb_substr($url['path'], 0, 1) !== '/') { $url['path'] = '/'.$url['path']; } - + $parts = []; - + $parts['scheme'] = isset($url['scheme']) ? $url['scheme'].'://' : ''; - + $parts['host'] = isset($url['host']) ? $url['host'] : ''; - + $parts['port'] = isset($url['port']) ? ':'.$url['port'] : ''; - + $parts['user'] = isset($url['user']) ? $url['user'] : ''; - - $parts['pass'] = isset($url['pass']) ? ':'.$url['pass'] : ''; - + + $parts['pass'] = isset($url['pass']) ? ':'.$url['pass'] : ''; + $parts['pass'] = ($parts['user'] || $parts['pass']) ? $parts['pass'].'@' : ''; - + $parts['path'] = isset($url['path']) ? $url['path'] : ''; - + $parts['query'] = isset($url['query']) && !empty($url['query']) ? '?'.$url['query'] : ''; - + $parts['fragment'] = isset($url['fragment']) ? '#'.$url['fragment'] : ''; - + if ($ommit) { foreach ($ommit as $key) { if (isset($parts[ $key ])) { @@ -72,7 +72,7 @@ class URL } } } - + return $parts['scheme'].$parts['user'].$parts['pass'].$parts['host'].$parts['port'].$parts['path'].$parts['query'].$parts['fragment']; } @@ -85,7 +85,7 @@ class URL * * @return array */ - public static function parseQuery(string $query):array + public static function parseQuery(string $query): array { \parse_str($query, $result); @@ -101,7 +101,7 @@ class URL * * @return string */ - public static function unparseQuery(array $query):string + public static function unparseQuery(array $query): string { return \http_build_query($query); } From a5387a6df27277b56e370aa1f368db81b38c7e8b Mon Sep 17 00:00:00 2001 From: Takuma Yoshida Date: Sun, 10 Oct 2021 20:22:14 +0900 Subject: [PATCH 173/257] Added Japanese translations --- app/config/locale/translations/ja.json | 50 +++++++++++++------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/app/config/locale/translations/ja.json b/app/config/locale/translations/ja.json index 379ceda6af..415c753f19 100644 --- a/app/config/locale/translations/ja.json +++ b/app/config/locale/translations/ja.json @@ -3,30 +3,30 @@ "settings.locale": "ja", "settings.direction": "ltr", "emails.sender": "%s チーム", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "アカウント認証", + "emails.verification.hello": "こんにちは{{name}}さん", + "emails.verification.body": "メールアドレスを有効化するためには下記リンクをクリックして下さい。", + "emails.verification.footer": "このメールに心当たりが無い場合は破棄をお願いいたします。", + "emails.verification.thanks": "ご利用いただきありがとうございます。", + "emails.verification.signature": "{{project}}チーム", + "emails.magicSession.subject": "ログイン", + "emails.magicSession.hello": "こんにちは", + "emails.magicSession.body": "ログインするためには下記リンクをクリックしてください。", + "emails.magicSession.footer": "このメールに心当たりが無い場合は破棄をお願いいたします。", + "emails.magicSession.thanks": "ご利用いただきありがとうございます。", + "emails.magicSession.signature": "{{project}}チーム", + "emails.recovery.subject": "パスワードリセット", + "emails.recovery.hello": "こんにちは{{name}}さん", + "emails.recovery.body": "パスワードをリセットするためには下記リンクをクリックしてください。", + "emails.recovery.footer": "このメールに心当たりが無い場合は破棄をお願いいたします。", + "emails.recovery.thanks": "ご利用いただきありがとうございます。", + "emails.recovery.signature": "{{project}}チーム", + "emails.invitation.subject": "%sチームへの招待が%sから来ました。", + "emails.invitation.hello": "こんにちは", + "emails.invitation.body": "{{owner}}さんが{{project}}の{{team}}チームにあなたを招待しています。", + "emails.invitation.footer": "このメールに心当たりが無い場合は破棄をお願いいたします。", + "emails.invitation.thanks": "ご利用いただきありがとうございます。", + "emails.invitation.signature": "{{project}}チーム", "locale.country.unknown": "不明", "countries.af": "アフガニスタン", "countries.ao": "アンゴラ", @@ -229,4 +229,4 @@ "continents.na": "北米", "continents.oc": "オセアニア", "continents.sa": "南アメリカ" -} \ No newline at end of file +} From e0b6a27e7dc056514774fbee72769ef6c4631f96 Mon Sep 17 00:00:00 2001 From: Conor O'Callaghan Date: Sun, 10 Oct 2021 12:55:45 +0100 Subject: [PATCH 174/257] Irish translation for 1737 --- app/config/locale/codes.php | 1 + app/config/locale/translations/ga.json | 232 +++++++++++++++++++++++++ app/init.php | 1 + 3 files changed, 234 insertions(+) create mode 100644 app/config/locale/translations/ga.json diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index c21671e760..cef945e0bc 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -21,6 +21,7 @@ return [ 'fo', // Faroese 'fr', // French 'el', // Greek + 'ga', // Irish 'gu', // Gujrati 'he', // Hebrew 'hi', // Hindi, diff --git a/app/config/locale/translations/ga.json b/app/config/locale/translations/ga.json new file mode 100644 index 0000000000..9ff3f16bfa --- /dev/null +++ b/app/config/locale/translations/ga.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"Is í ealaín na críonnachta ná rudaí a aithint chun cluas bhodhar a thabhairt dóibh.\"", + "settings.locale": "ga", + "settings.direction": "ltr", + "emails.sender": "%s Foireann", + "emails.verification.subject": "Fíoraithe cuntais", + "emails.verification.hello": "Haigh {{name}}", + "emails.verification.body": "Lean an nasc seo chun do ríomhphost a fhíorú.", + "emails.verification.footer": "Mura ndearna tú iarratas an seoladh seo a fhíoru, déan neamhaird den teachtaireacht seo.", + "emails.verification.thanks": "Go raibh maith agat", + "emails.verification.signature": "{{project}} foireann", + "emails.magicSession.subject": "Logáil isteach", + "emails.magicSession.hello": "Haigh,", + "emails.magicSession.body": "Lean an nasc seo chun logáil isteach.", + "emails.magicSession.footer": "Mura ndearna tú iarratas logáil isteach leis an ríomhphost seo, déan neamhaird den teachtaireacht seo.", + "emails.magicSession.thanks": "Go raibh maith agat", + "emails.magicSession.signature": "{{project}} foireann", + "emails.recovery.subject": "Athshocrú pasfhocail", + "emails.recovery.hello": "Haigh {{name}}", + "emails.recovery.body": "Lean an nasc seo chun do pasfhocal {{project}} a athshocrú.", + "emails.recovery.footer": "Mura ndearna tú iarratas do pasfhocal a athshocrú, déan neamhaird den teachtaireacht seo.", + "emails.recovery.thanks": "Go raibh maith agat", + "emails.recovery.signature": "{{project}} foireann", + "emails.invitation.subject": "Cuireadh do %s foireann ag %s", + "emails.invitation.hello": "Haigh", + "emails.invitation.body": "Seoladh an ríomhphost seo chugat mar ba mhaith le {{owner}} cuireadh a thabhairt duit bheith mar bhall den fhoireann {{team}} ag obair ar {{project}}.", + "emails.invitation.footer": "Is cuma leat? Déan neamhaird den teachtaireacht seo.", + "emails.invitation.thanks": "Go raibh maith agat", + "emails.invitation.signature": "{{project}} foireann", + "locale.country.unknown": "Neamhaithnid", + "countries.af": "Afghanistan", + "countries.ao": "Angola", + "countries.al": "Albania", + "countries.ad": "Andorra", + "countries.ae": "United Arab Emirates", + "countries.ar": "Argentina", + "countries.am": "Armenia", + "countries.ag": "Antigua and Barbuda", + "countries.au": "Australia", + "countries.at": "Austria", + "countries.az": "Azerbaijan", + "countries.bi": "Burundi", + "countries.be": "Belgium", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesh", + "countries.bg": "Bulgaria", + "countries.bh": "Bahrain", + "countries.bs": "Bahamas", + "countries.ba": "Bosnia and Herzegovina", + "countries.by": "Belarus", + "countries.bz": "Belize", + "countries.bo": "Bolivia", + "countries.br": "Brazil", + "countries.bb": "Barbados", + "countries.bn": "Brunei", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Central African Republic", + "countries.ca": "Canada", + "countries.ch": "Switzerland", + "countries.cl": "Chile", + "countries.cn": "China", + "countries.ci": "Ivory Coast", + "countries.cm": "Cameroon", + "countries.cd": "DR Congo", + "countries.cg": "Republic of the Congo", + "countries.co": "Colombia", + "countries.km": "Comoros", + "countries.cv": "Cape Verde", + "countries.cr": "Costa Rica", + "countries.cu": "Cuba", + "countries.cy": "Cyprus", + "countries.cz": "Czechia", + "countries.de": "Germany", + "countries.dj": "Djibouti", + "countries.dm": "Dominica", + "countries.dk": "Denmark", + "countries.do": "Dominican Republic", + "countries.dz": "Algeria", + "countries.ec": "Ecuador", + "countries.eg": "Egypt", + "countries.er": "Eritrea", + "countries.es": "Spain", + "countries.ee": "Estonia", + "countries.et": "Ethiopia", + "countries.fi": "Finland", + "countries.fj": "Fiji", + "countries.fr": "France", + "countries.fm": "Micronesia", + "countries.ga": "Gabon", + "countries.gb": "United Kingdom", + "countries.ge": "Georgia", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Equatorial Guinea", + "countries.gr": "Greece", + "countries.gd": "Grenada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Croatia", + "countries.ht": "Haiti", + "countries.hu": "Hungary", + "countries.id": "Indonesia", + "countries.in": "India", + "countries.ie": "Ireland", + "countries.ir": "Iran", + "countries.iq": "Iraq", + "countries.is": "Iceland", + "countries.il": "Israel", + "countries.it": "Italy", + "countries.jm": "Jamaica", + "countries.jo": "Jordan", + "countries.jp": "Japan", + "countries.kz": "Kazakhstan", + "countries.ke": "Kenya", + "countries.kg": "Kyrgyzstan", + "countries.kh": "Cambodia", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts and Nevis", + "countries.kr": "South Korea", + "countries.kw": "Kuwait", + "countries.la": "Laos", + "countries.lb": "Lebanon", + "countries.lr": "Liberia", + "countries.ly": "Libya", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Lithuania", + "countries.lu": "Luxembourg", + "countries.lv": "Latvia", + "countries.ma": "Morocco", + "countries.mc": "Monaco", + "countries.md": "Moldova", + "countries.mg": "Madagascar", + "countries.mv": "Maldives", + "countries.mx": "Mexico", + "countries.mh": "Marshall Islands", + "countries.mk": "Macedonia", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Myanmar", + "countries.me": "Montenegro", + "countries.mn": "Mongolia", + "countries.mz": "Mozambique", + "countries.mr": "Mauritania", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malaysia", + "countries.na": "Namibia", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nicaragua", + "countries.nl": "Netherlands", + "countries.no": "Norway", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "New Zealand", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Philippines", + "countries.pw": "Palau", + "countries.pg": "Papua New Guinea", + "countries.pl": "Poland", + "countries.kp": "North Korea", + "countries.pt": "Portugal", + "countries.py": "Paraguay", + "countries.qa": "Qatar", + "countries.ro": "Romania", + "countries.ru": "Russia", + "countries.rw": "Rwanda", + "countries.sa": "Saudi Arabia", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapore", + "countries.sb": "Solomon Islands", + "countries.sl": "Sierra Leone", + "countries.sv": "El Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbia", + "countries.ss": "South Sudan", + "countries.st": "São Tomé and Príncipe", + "countries.sr": "Suriname", + "countries.sk": "Slovakia", + "countries.si": "Slovenia", + "countries.se": "Sweden", + "countries.sz": "Swaziland", + "countries.sc": "Seychelles", + "countries.sy": "Syria", + "countries.td": "Chad", + "countries.tg": "Togo", + "countries.th": "Thailand", + "countries.tj": "Tajikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Timor-Leste", + "countries.to": "Tonga", + "countries.tt": "Trinidad and Tobago", + "countries.tn": "Tunisia", + "countries.tr": "Turkey", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzania", + "countries.ug": "Uganda", + "countries.ua": "Ukraine", + "countries.uy": "Uruguay", + "countries.us": "United States", + "countries.uz": "Uzbekistan", + "countries.va": "Vatican City", + "countries.vc": "Saint Vincent and the Grenadines", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Yemen", + "countries.za": "South Africa", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Africa", + "continents.an": "Antarctica", + "continents.as": "Asia", + "continents.eu": "Europe", + "continents.na": "North America", + "continents.oc": "Oceania", + "continents.sa": "South America" +} diff --git a/app/init.php b/app/init.php index c1d43e10c3..65c824afca 100644 --- a/app/init.php +++ b/app/init.php @@ -281,6 +281,7 @@ Locale::setLanguageFromJSON('fa', __DIR__.'/config/locale/translations/fa.json') Locale::setLanguageFromJSON('fi', __DIR__.'/config/locale/translations/fi.json'); Locale::setLanguageFromJSON('fo', __DIR__.'/config/locale/translations/fo.json'); Locale::setLanguageFromJSON('fr', __DIR__.'/config/locale/translations/fr.json'); +Locale::setLanguageFromJSON('ga', __DIR__.'/config/locale/translations/ga.json'); Locale::setLanguageFromJSON('gu', __DIR__.'/config/locale/translations/gu.json'); Locale::setLanguageFromJSON('he', __DIR__.'/config/locale/translations/he.json'); Locale::setLanguageFromJSON('hi', __DIR__.'/config/locale/translations/hi.json'); From 29fa5eff17ae85b119dd8b1219db57083bd4140b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mohammad-Ali=20A=27R=C3=82BI?= Date: Thu, 7 Oct 2021 23:31:20 +0200 Subject: [PATCH 175/257] feat(locale): add Azerbaijani translations of the phrases --- app/config/locale/translations/az.json | 232 +++++++++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 app/config/locale/translations/az.json diff --git a/app/config/locale/translations/az.json b/app/config/locale/translations/az.json new file mode 100644 index 0000000000..c557b079f0 --- /dev/null +++ b/app/config/locale/translations/az.json @@ -0,0 +1,232 @@ +{ + "settings.inspire": "\"Ağıllı olmaq sənəti, nəyi gözdən qaçıracağını bilmək sənətidir.\"", + "settings.locale": "az", + "settings.direction": "ltr", + "emails.sender": "%s Komandası", + "emails.verification.subject": "Hesab Doğrulama", + "emails.verification.hello": "Salam {{name}}", + "emails.verification.body": "E-poçt ünvanınızı təsdiq etmək üçün bu linki izləyin.", + "emails.verification.footer": "Bu ünvanı doğrulamağı xahiş etməmisinizsə, bu mesajı gözardı edə bilərsiniz.", + "emails.verification.thanks": "Təşəkkürlər", + "emails.verification.signature": "{{project}} komandası", + "emails.magicSession.subject": "Daxil Olmaq", + "emails.magicSession.hello": "Salam,", + "emails.magicSession.body": "Daxil olmaq üçün bu linki izləyin.", + "emails.magicSession.footer": "Bu e-poçtdan istifadə edərək giriş istəməmisinizsə, bu mesajı görməməzlikdən gələ bilərsiniz.", + "emails.magicSession.thanks": "Təşəkkürlər", + "emails.magicSession.signature": "{{project}} komandası", + "emails.recovery.subject": "Şifrə Sıfırlanması", + "emails.recovery.hello": "Salam {{name}}", + "emails.recovery.body": "{{project}} şifrənizi sıfırlamaq üçün bu linki izləyin.", + "emails.recovery.footer": "Şifrənizi sıfırlamağı xahiş etməmisinizsə, bu mesajı gözardı edə bilərsiniz.", + "emails.recovery.thanks": "Təşəkkürlər", + "emails.recovery.signature": "{{project}} komandası", + "emails.invitation.subject": "%s Komandasına Dəvət %sdə", + "emails.invitation.hello": "Salam", + "emails.invitation.body": "{{owner}}, {{project}}də {{team}} komandasına üzv olmağa dəvət etmək istədiyi üçün bu məktub sizə göndərildi.", + "emails.invitation.footer": "Əgər maraqlanmırsınızsa, bu mesajı gözardı edə bilərsiniz.", + "emails.invitation.thanks": "Təşəkkürlər", + "emails.invitation.signature": "{{project}} komandası", + "locale.country.unknown": "Naməlum", + "countries.af": "Afghanistan", + "countries.ao": "Angola", + "countries.al": "Albania", + "countries.ad": "Andorra", + "countries.ae": "United Arab Emirates", + "countries.ar": "Argentina", + "countries.am": "Armenia", + "countries.ag": "Antigua and Barbuda", + "countries.au": "Australia", + "countries.at": "Austria", + "countries.az": "Azerbaijan", + "countries.bi": "Burundi", + "countries.be": "Belgium", + "countries.bj": "Benin", + "countries.bf": "Burkina Faso", + "countries.bd": "Bangladesh", + "countries.bg": "Bulgaria", + "countries.bh": "Bahrain", + "countries.bs": "Bahamas", + "countries.ba": "Bosnia and Herzegovina", + "countries.by": "Belarus", + "countries.bz": "Belize", + "countries.bo": "Bolivia", + "countries.br": "Brazil", + "countries.bb": "Barbados", + "countries.bn": "Brunei", + "countries.bt": "Bhutan", + "countries.bw": "Botswana", + "countries.cf": "Central African Republic", + "countries.ca": "Canada", + "countries.ch": "Switzerland", + "countries.cl": "Chile", + "countries.cn": "China", + "countries.ci": "Ivory Coast", + "countries.cm": "Cameroon", + "countries.cd": "DR Congo", + "countries.cg": "Republic of the Congo", + "countries.co": "Colombia", + "countries.km": "Comoros", + "countries.cv": "Cape Verde", + "countries.cr": "Costa Rica", + "countries.cu": "Cuba", + "countries.cy": "Cyprus", + "countries.cz": "Czechia", + "countries.de": "Germany", + "countries.dj": "Djibouti", + "countries.dm": "Dominica", + "countries.dk": "Denmark", + "countries.do": "Dominican Republic", + "countries.dz": "Algeria", + "countries.ec": "Ecuador", + "countries.eg": "Egypt", + "countries.er": "Eritrea", + "countries.es": "Spain", + "countries.ee": "Estonia", + "countries.et": "Ethiopia", + "countries.fi": "Finland", + "countries.fj": "Fiji", + "countries.fr": "France", + "countries.fm": "Micronesia", + "countries.ga": "Gabon", + "countries.gb": "United Kingdom", + "countries.ge": "Georgia", + "countries.gh": "Ghana", + "countries.gn": "Guinea", + "countries.gm": "Gambia", + "countries.gw": "Guinea-Bissau", + "countries.gq": "Equatorial Guinea", + "countries.gr": "Greece", + "countries.gd": "Grenada", + "countries.gt": "Guatemala", + "countries.gy": "Guyana", + "countries.hn": "Honduras", + "countries.hr": "Croatia", + "countries.ht": "Haiti", + "countries.hu": "Hungary", + "countries.id": "Indonesia", + "countries.in": "India", + "countries.ie": "Ireland", + "countries.ir": "Iran", + "countries.iq": "Iraq", + "countries.is": "Iceland", + "countries.il": "Israel", + "countries.it": "Italy", + "countries.jm": "Jamaica", + "countries.jo": "Jordan", + "countries.jp": "Japan", + "countries.kz": "Kazakhstan", + "countries.ke": "Kenya", + "countries.kg": "Kyrgyzstan", + "countries.kh": "Cambodia", + "countries.ki": "Kiribati", + "countries.kn": "Saint Kitts and Nevis", + "countries.kr": "South Korea", + "countries.kw": "Kuwait", + "countries.la": "Laos", + "countries.lb": "Lebanon", + "countries.lr": "Liberia", + "countries.ly": "Libya", + "countries.lc": "Saint Lucia", + "countries.li": "Liechtenstein", + "countries.lk": "Sri Lanka", + "countries.ls": "Lesotho", + "countries.lt": "Lithuania", + "countries.lu": "Luxembourg", + "countries.lv": "Latvia", + "countries.ma": "Morocco", + "countries.mc": "Monaco", + "countries.md": "Moldova", + "countries.mg": "Madagascar", + "countries.mv": "Maldives", + "countries.mx": "Mexico", + "countries.mh": "Marshall Islands", + "countries.mk": "Macedonia", + "countries.ml": "Mali", + "countries.mt": "Malta", + "countries.mm": "Myanmar", + "countries.me": "Montenegro", + "countries.mn": "Mongolia", + "countries.mz": "Mozambique", + "countries.mr": "Mauritania", + "countries.mu": "Mauritius", + "countries.mw": "Malawi", + "countries.my": "Malaysia", + "countries.na": "Namibia", + "countries.ne": "Niger", + "countries.ng": "Nigeria", + "countries.ni": "Nicaragua", + "countries.nl": "Netherlands", + "countries.no": "Norway", + "countries.np": "Nepal", + "countries.nr": "Nauru", + "countries.nz": "New Zealand", + "countries.om": "Oman", + "countries.pk": "Pakistan", + "countries.pa": "Panama", + "countries.pe": "Peru", + "countries.ph": "Philippines", + "countries.pw": "Palau", + "countries.pg": "Papua New Guinea", + "countries.pl": "Poland", + "countries.kp": "North Korea", + "countries.pt": "Portugal", + "countries.py": "Paraguay", + "countries.qa": "Qatar", + "countries.ro": "Romania", + "countries.ru": "Russia", + "countries.rw": "Rwanda", + "countries.sa": "Saudi Arabia", + "countries.sd": "Sudan", + "countries.sn": "Senegal", + "countries.sg": "Singapore", + "countries.sb": "Solomon Islands", + "countries.sl": "Sierra Leone", + "countries.sv": "El Salvador", + "countries.sm": "San Marino", + "countries.so": "Somalia", + "countries.rs": "Serbia", + "countries.ss": "South Sudan", + "countries.st": "São Tomé and Príncipe", + "countries.sr": "Suriname", + "countries.sk": "Slovakia", + "countries.si": "Slovenia", + "countries.se": "Sweden", + "countries.sz": "Swaziland", + "countries.sc": "Seychelles", + "countries.sy": "Syria", + "countries.td": "Chad", + "countries.tg": "Togo", + "countries.th": "Thailand", + "countries.tj": "Tajikistan", + "countries.tm": "Turkmenistan", + "countries.tl": "Timor-Leste", + "countries.to": "Tonga", + "countries.tt": "Trinidad and Tobago", + "countries.tn": "Tunisia", + "countries.tr": "Turkey", + "countries.tv": "Tuvalu", + "countries.tz": "Tanzania", + "countries.ug": "Uganda", + "countries.ua": "Ukraine", + "countries.uy": "Uruguay", + "countries.us": "United States", + "countries.uz": "Uzbekistan", + "countries.va": "Vatican City", + "countries.vc": "Saint Vincent and the Grenadines", + "countries.ve": "Venezuela", + "countries.vn": "Vietnam", + "countries.vu": "Vanuatu", + "countries.ws": "Samoa", + "countries.ye": "Yemen", + "countries.za": "South Africa", + "countries.zm": "Zambia", + "countries.zw": "Zimbabwe", + "continents.af": "Africa", + "continents.an": "Antarctica", + "continents.as": "Asia", + "continents.eu": "Europe", + "continents.na": "North America", + "continents.oc": "Oceania", + "continents.sa": "South America" +} From 38d22c9a64ad806d6cb3939dcc36757123d13d66 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mohammad-Ali=20A=27R=C3=82BI?= Date: Fri, 8 Oct 2021 00:10:00 +0200 Subject: [PATCH 176/257] feat(locale): add Azerbaijani translations of countries --- app/config/locale/translations/az.json | 339 ++++++++++++------------- 1 file changed, 166 insertions(+), 173 deletions(-) diff --git a/app/config/locale/translations/az.json b/app/config/locale/translations/az.json index c557b079f0..dd26ebda8e 100644 --- a/app/config/locale/translations/az.json +++ b/app/config/locale/translations/az.json @@ -28,205 +28,198 @@ "emails.invitation.thanks": "Təşəkkürlər", "emails.invitation.signature": "{{project}} komandası", "locale.country.unknown": "Naməlum", - "countries.af": "Afghanistan", - "countries.ao": "Angola", - "countries.al": "Albania", + "countries.af": "Əfqanıstan", + "countries.ao": "Anqola", + "countries.al": "Albaniya", "countries.ad": "Andorra", - "countries.ae": "United Arab Emirates", + "countries.ae": "Birləşmiş Ərəb Əmirlikləri", "countries.ar": "Argentina", - "countries.am": "Armenia", - "countries.ag": "Antigua and Barbuda", - "countries.au": "Australia", - "countries.at": "Austria", - "countries.az": "Azerbaijan", + "countries.am": "Ermənistan", + "countries.ag": "Antigua və Barbuda", + "countries.au": "Avstraliya", + "countries.at": "Avstriya", + "countries.az": "Azərbaycan", "countries.bi": "Burundi", - "countries.be": "Belgium", + "countries.be": "Belçika", "countries.bj": "Benin", "countries.bf": "Burkina Faso", - "countries.bd": "Bangladesh", - "countries.bg": "Bulgaria", - "countries.bh": "Bahrain", - "countries.bs": "Bahamas", - "countries.ba": "Bosnia and Herzegovina", - "countries.by": "Belarus", - "countries.bz": "Belize", - "countries.bo": "Bolivia", - "countries.br": "Brazil", + "countries.bd": "Banqladeş", + "countries.bg": "Bolqarıstan", + "countries.bh": "Bəhreyn", + "countries.bs": "Bahamalar", + "countries.ba": "Bosniya və Herseqovina", + "countries.by": "Belarusiya", + "countries.bz": "Beliz", + "countries.bo": "Boliviya", + "countries.br": "Braziliya", "countries.bb": "Barbados", - "countries.bn": "Brunei", - "countries.bt": "Bhutan", - "countries.bw": "Botswana", - "countries.cf": "Central African Republic", - "countries.ca": "Canada", - "countries.ch": "Switzerland", - "countries.cl": "Chile", - "countries.cn": "China", - "countries.ci": "Ivory Coast", - "countries.cm": "Cameroon", - "countries.cd": "DR Congo", - "countries.cg": "Republic of the Congo", - "countries.co": "Colombia", - "countries.km": "Comoros", - "countries.cv": "Cape Verde", - "countries.cr": "Costa Rica", - "countries.cu": "Cuba", - "countries.cy": "Cyprus", - "countries.cz": "Czechia", - "countries.de": "Germany", - "countries.dj": "Djibouti", - "countries.dm": "Dominica", - "countries.dk": "Denmark", - "countries.do": "Dominican Republic", - "countries.dz": "Algeria", - "countries.ec": "Ecuador", - "countries.eg": "Egypt", - "countries.er": "Eritrea", - "countries.es": "Spain", - "countries.ee": "Estonia", - "countries.et": "Ethiopia", - "countries.fi": "Finland", - "countries.fj": "Fiji", - "countries.fr": "France", - "countries.fm": "Micronesia", - "countries.ga": "Gabon", - "countries.gb": "United Kingdom", - "countries.ge": "Georgia", - "countries.gh": "Ghana", - "countries.gn": "Guinea", - "countries.gm": "Gambia", - "countries.gw": "Guinea-Bissau", - "countries.gq": "Equatorial Guinea", - "countries.gr": "Greece", - "countries.gd": "Grenada", - "countries.gt": "Guatemala", + "countries.bn": "Bruney", + "countries.bt": "Butan", + "countries.bw": "Botsvana", + "countries.cf": "Mərkəzi Afrika Respublikası", + "countries.ca": "Kanada", + "countries.ch": "İsveçrə", + "countries.cl": "çili", + "countries.cn": "Çin", + "countries.ci": "Fil Dişi Sahili", + "countries.cm": "Kamerun", + "countries.cd": "DR Konqo", + "countries.cg": "Konqo Respublikası", + "countries.co": "Kolumbiya", + "countries.km": "Komorlar", + "countries.cv": "Kabo Verde", + "countries.cr": "Kosta Rika", + "countries.cu": "Kuba", + "countries.cy": "Kipr", + "countries.cz": "Çexiya", + "countries.de": "Almaniya", + "countries.dj": "Cibuti", + "countries.dm": "Dominika", + "countries.dk": "Danimarka", + "countries.do": "Dominik respublikası", + "countries.dz": "Əlcəzair", + "countries.ec": "Ekvador", + "countries.eg": "Misir", + "countries.er": "Eritreya", + "countries.es": "İspaniya", + "countries.ee": "Estoniya", + "countries.et": "Efiopiya", + "countries.fi": "Finlandiya", + "countries.fj": "Fici", + "countries.fr": "Fransa", + "countries.fm": "Mikroneziya", + "countries.ga": "Qabon", + "countries.gb": "Birləşmiş Krallıq", + "countries.ge": "Gürcüstan", + "countries.gh": "Qana", + "countries.gn": "Qvineya", + "countries.gm": "Qambiya", + "countries.gw": "Qvineya-Bisau", + "countries.gq": "Ekvatorial Qvineya", + "countries.gr": "Yunanıstan", + "countries.gd": "Qrenada", + "countries.gt": "Qvatemala", "countries.gy": "Guyana", "countries.hn": "Honduras", - "countries.hr": "Croatia", + "countries.hr": "Xorvatiya", "countries.ht": "Haiti", - "countries.hu": "Hungary", - "countries.id": "Indonesia", - "countries.in": "India", - "countries.ie": "Ireland", - "countries.ir": "Iran", - "countries.iq": "Iraq", - "countries.is": "Iceland", - "countries.il": "Israel", - "countries.it": "Italy", - "countries.jm": "Jamaica", - "countries.jo": "Jordan", - "countries.jp": "Japan", - "countries.kz": "Kazakhstan", - "countries.ke": "Kenya", - "countries.kg": "Kyrgyzstan", - "countries.kh": "Cambodia", + "countries.hu": "Macarıstan", + "countries.id": "İndoneziya", + "countries.in": "Hindistan", + "countries.ie": "İrlandiya", + "countries.ir": "İran", + "countries.iq": "İraq", + "countries.is": "İslandiya", + "countries.il": "İsrail", + "countries.it": "İtaliya", + "countries.jm": "Yamayka", + "countries.jo": "İordaniya", + "countries.jp": "Yaponiya", + "countries.kz": "Qazaxıstan", + "countries.ke": "Keniya", + "countries.kg": "Qırğızıstan", + "countries.kh": "Kamboca", "countries.ki": "Kiribati", - "countries.kn": "Saint Kitts and Nevis", - "countries.kr": "South Korea", - "countries.kw": "Kuwait", + "countries.kn": "Saint Kitts və Nevis", + "countries.kr": "Cənubi Koreya", + "countries.kw": "Küveyt", "countries.la": "Laos", - "countries.lb": "Lebanon", - "countries.lr": "Liberia", - "countries.ly": "Libya", - "countries.lc": "Saint Lucia", - "countries.li": "Liechtenstein", - "countries.lk": "Sri Lanka", - "countries.ls": "Lesotho", - "countries.lt": "Lithuania", - "countries.lu": "Luxembourg", - "countries.lv": "Latvia", - "countries.ma": "Morocco", - "countries.mc": "Monaco", + "countries.lb": "Livan", + "countries.lr": "Liberiya", + "countries.ly": "Liviya", + "countries.lc": "Müqəddəs Lusiya", + "countries.li": "Lixtenşteyn", + "countries.lk": "Şri Lanka", + "countries.ls": "Lesoto", + "countries.lt": "Litva", + "countries.lu": "Lüksemburq", + "countries.lv": "Latviya", + "countries.ma": "Mərakeş", + "countries.mc": "Monako", "countries.md": "Moldova", - "countries.mg": "Madagascar", - "countries.mv": "Maldives", - "countries.mx": "Mexico", - "countries.mh": "Marshall Islands", - "countries.mk": "Macedonia", + "countries.mg": "Madaqaskar", + "countries.mv": "Maldiv adaları", + "countries.mx": "Meksika", + "countries.mh": "Marshall Adaları", + "countries.mk": "Makedoniya", "countries.ml": "Mali", "countries.mt": "Malta", - "countries.mm": "Myanmar", - "countries.me": "Montenegro", - "countries.mn": "Mongolia", - "countries.mz": "Mozambique", - "countries.mr": "Mauritania", - "countries.mu": "Mauritius", - "countries.mw": "Malawi", - "countries.my": "Malaysia", - "countries.na": "Namibia", + "countries.mm": "Myanma", + "countries.me": "Monteneqro", + "countries.mn": "Monqolustan", + "countries.mz": "Mozambik", + "countries.mr": "Mavritaniya", + "countries.mu": "Mavritaniya", + "countries.mw": "Malavi", + "countries.my": "Malayziya", + "countries.na": "Namibiya", "countries.ne": "Niger", - "countries.ng": "Nigeria", - "countries.ni": "Nicaragua", - "countries.nl": "Netherlands", - "countries.no": "Norway", + "countries.ng": "Nigeriya", + "countries.ni": "Nikaraqua", + "countries.nl": "Hollandiya", + "countries.no": "Norveç", "countries.np": "Nepal", "countries.nr": "Nauru", - "countries.nz": "New Zealand", + "countries.nz": "Yeni Zelandiya", "countries.om": "Oman", "countries.pk": "Pakistan", "countries.pa": "Panama", "countries.pe": "Peru", - "countries.ph": "Philippines", + "countries.ph": "Filippin", "countries.pw": "Palau", - "countries.pg": "Papua New Guinea", - "countries.pl": "Poland", - "countries.kp": "North Korea", - "countries.pt": "Portugal", - "countries.py": "Paraguay", - "countries.qa": "Qatar", - "countries.ro": "Romania", - "countries.ru": "Russia", - "countries.rw": "Rwanda", - "countries.sa": "Saudi Arabia", + "countries.pg": "Papua Yeni Qvineya", + "countries.pl": "Polşa", + "countries.kp": "Simali Koreya", + "countries.pt": "Portuqaliya", + "countries.py": "Paraqvay", + "countries.qa": "Qətər", + "countries.ro": "Rumıniya", + "countries.ru": "Rusiya", + "countries.rw": "Ruanda", + "countries.sa": "Səudiyyə Ərəbistanı", "countries.sd": "Sudan", - "countries.sn": "Senegal", - "countries.sg": "Singapore", - "countries.sb": "Solomon Islands", + "countries.sn": "Seneqal", + "countries.sg": "Sinqapur", + "countries.sb": "Solomon Adaları", "countries.sl": "Sierra Leone", - "countries.sv": "El Salvador", + "countries.sv": "Xilaskar", "countries.sm": "San Marino", - "countries.so": "Somalia", - "countries.rs": "Serbia", - "countries.ss": "South Sudan", - "countries.st": "São Tomé and Príncipe", - "countries.sr": "Suriname", - "countries.sk": "Slovakia", - "countries.si": "Slovenia", - "countries.se": "Sweden", - "countries.sz": "Swaziland", - "countries.sc": "Seychelles", - "countries.sy": "Syria", - "countries.td": "Chad", - "countries.tg": "Togo", - "countries.th": "Thailand", - "countries.tj": "Tajikistan", - "countries.tm": "Turkmenistan", - "countries.tl": "Timor-Leste", - "countries.to": "Tonga", - "countries.tt": "Trinidad and Tobago", - "countries.tn": "Tunisia", - "countries.tr": "Turkey", + "countries.so": "Somali", + "countries.rs": "Serbiya", + "countries.ss": "Cənubi Sudan", + "countries.st": "Sao Tome və Principe", + "countries.sr": "Surinam", + "countries.sk": "Slovakiya", + "countries.si": "Sloveniya", + "countries.se": "İsveç", + "countries.sz": "Svazilend", + "countries.sc": "Seyşel adaları", + "countries.sy": "Suriya", + "countries.td": "Çad", + "countries.tg": "Getmək", + "countries.th": "Tayland", + "countries.tj": "Tacikistan", + "countries.tm": "Türkmənistan", + "countries.tl": "Şərqi Timor", + "countries.to": "Tonqa", + "countries.tt": "Trinidad və Tobaqo", + "countries.tn": "Tunis", + "countries.tr": "Türkiyə", "countries.tv": "Tuvalu", - "countries.tz": "Tanzania", - "countries.ug": "Uganda", - "countries.ua": "Ukraine", - "countries.uy": "Uruguay", - "countries.us": "United States", - "countries.uz": "Uzbekistan", - "countries.va": "Vatican City", - "countries.vc": "Saint Vincent and the Grenadines", - "countries.ve": "Venezuela", - "countries.vn": "Vietnam", + "countries.tz": "Tanzaniya", + "countries.ug": "Uqanda", + "countries.ua": "Ukrayna", + "countries.uy": "Uruqvay", + "countries.us": "Amerika Birləşmiş Ştatları", + "countries.uz": "Özbəkistan", + "countries.va": "Vatikan şəhəri", + "countries.vc": "Müqəddəs Vinsent və Qrenadinlər", + "countries.ve": "Venesuela", + "countries.vn": "Vyetnam", "countries.vu": "Vanuatu", "countries.ws": "Samoa", - "countries.ye": "Yemen", - "countries.za": "South Africa", - "countries.zm": "Zambia", - "countries.zw": "Zimbabwe", - "continents.af": "Africa", - "continents.an": "Antarctica", - "continents.as": "Asia", - "continents.eu": "Europe", - "continents.na": "North America", - "continents.oc": "Oceania", - "continents.sa": "South America" + "countries.ye": "Yəmən", + "countries.za": "Cənubi Afrika", + "countries.zm": "Zambiya", + "countries.zw": "Zimbabve" } From 963524914f8dd70ec5ccf2c049506509dfa14fa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mohammad-Ali=20A=27R=C3=82BI?= Date: Fri, 8 Oct 2021 00:12:21 +0200 Subject: [PATCH 177/257] feat(locale): add Azerbaijani to PHP code --- app/config/locale/codes.php | 1 + app/init.php | 1 + 2 files changed, 2 insertions(+) diff --git a/app/config/locale/codes.php b/app/config/locale/codes.php index cef945e0bc..06b972f8f9 100644 --- a/app/config/locale/codes.php +++ b/app/config/locale/codes.php @@ -4,6 +4,7 @@ return [ 'af', // Afrikaans 'ar', // Arabic 'as', // Assamese + 'az', // Azerbaijani 'be', // Belarusian 'bg', // Bulgarian 'bh', // Bihari diff --git a/app/init.php b/app/init.php index 65c824afca..8d36b9c926 100644 --- a/app/init.php +++ b/app/init.php @@ -264,6 +264,7 @@ Locale::$exceptions = false; Locale::setLanguageFromJSON('af', __DIR__.'/config/locale/translations/af.json'); Locale::setLanguageFromJSON('ar', __DIR__.'/config/locale/translations/ar.json'); Locale::setLanguageFromJSON('as', __DIR__.'/config/locale/translations/as.json'); +Locale::setLanguageFromJSON('az', __DIR__.'/config/locale/translations/az.json'); Locale::setLanguageFromJSON('be', __DIR__.'/config/locale/translations/be.json'); Locale::setLanguageFromJSON('bg', __DIR__.'/config/locale/translations/bg.json'); Locale::setLanguageFromJSON('bh', __DIR__.'/config/locale/translations/bh.json'); From 76c98cfcf7d86d5bfdcd62b102d62a4e629332f8 Mon Sep 17 00:00:00 2001 From: Shrey Nahar Date: Mon, 11 Oct 2021 23:31:19 +0530 Subject: [PATCH 178/257] Update sd.json updated %s --- app/config/locale/translations/sd.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/config/locale/translations/sd.json b/app/config/locale/translations/sd.json index c9863badb2..c3aee50f5f 100644 --- a/app/config/locale/translations/sd.json +++ b/app/config/locale/translations/sd.json @@ -21,7 +21,7 @@ "emails.recovery.footer": "جيڪڏھن توھان نه پ پيو ھو پنھنجي پاسورڊ کي ري سيٽ ڪرڻ لاءِ ، توھان نظر انداز ڪري سگھوٿا ھن پيغام کي.", "emails.recovery.thanks": "مهرباني", "emails.recovery.signature": "{{project}} ٽيم", - "emails.invitation.subject": "٪ s ٽيم٪ s تيجي دعوت", + "emails.invitation.subject": "%s ٽيم %s تيجي دعوت", "emails.invitation.hello": "هيلو", "emails.invitation.body": "ھي اي ميل توھان ڏانھن موڪليو ويو آھي {اڪاڻ ته {{owner}} توھان کي دعوت ڏيڻ چاھي ٿو ته توھان {{team}} ٽيم جو ميمبر بڻجي {{project}} تي.", "emails.invitation.footer": "جيڪڏھن توھان دلچسپي نٿا رکو ، توھان نظر انداز ڪري سگھوٿا ھن پيغام کي.", @@ -229,4 +229,4 @@ "continents.na": "اتر آمريڪا", "continents.oc": "اوشينيا", "continents.sa": "ڏکڻ آمريڪا" -} \ No newline at end of file +} From 56c745ed74eeb7d4f95835e30039803b6792cad9 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 13 Oct 2021 22:07:12 +1300 Subject: [PATCH 179/257] Update swift server getting started --- docs/sdks/swift-server/CHANGELOG.md | 1 + .../GETTING_STARTED.md | 41 +++++++------------ 2 files changed, 15 insertions(+), 27 deletions(-) create mode 100644 docs/sdks/swift-server/CHANGELOG.md rename docs/sdks/{swift => swift-server}/GETTING_STARTED.md (62%) diff --git a/docs/sdks/swift-server/CHANGELOG.md b/docs/sdks/swift-server/CHANGELOG.md new file mode 100644 index 0000000000..fa4d35e687 --- /dev/null +++ b/docs/sdks/swift-server/CHANGELOG.md @@ -0,0 +1 @@ +# Change Log \ No newline at end of file diff --git a/docs/sdks/swift/GETTING_STARTED.md b/docs/sdks/swift-server/GETTING_STARTED.md similarity index 62% rename from docs/sdks/swift/GETTING_STARTED.md rename to docs/sdks/swift-server/GETTING_STARTED.md index 4063657c7c..737ecc700f 100644 --- a/docs/sdks/swift/GETTING_STARTED.md +++ b/docs/sdks/swift-server/GETTING_STARTED.md @@ -9,9 +9,9 @@ import Appwrite func main() { let client = Client() - .setEndpoint(endPoint: "https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint - .setProject(value: "5df5acd0d48c2") // Your project ID - .setKey(value: "919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key .setSelfSigned() // Use only on dev mode with a self-signed SSL cert } ``` @@ -22,15 +22,10 @@ Once your SDK object is set, create any of the Appwrite service objects and choo ```swift let users = Users(client: client) -users.create( - email: "email@example.com", - password: "password", -) { result in +users.create(email: "email@example.com", password: "password") { result in switch result { - case .failure(let error): - print(error.localizedDescription) - case .success(var response): - let json = response.body!.readString(length: response.body!.readableBytes) + case .failure(let error): print(error.message) + case .success(let user): print(String(describing: user)) } } ``` @@ -42,21 +37,16 @@ import Appwrite func main() { let client = Client() - .setEndpoint(endPoint: "https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint - .setProject(value: "5df5acd0d48c2") // Your project ID - .setKey(value: "919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key .setSelfSigned() // Use only on dev mode with a self-signed SSL cert let users = Users(client: client) - users.create( - email: "email@example.com", - password: "password" - ) { result in + users.create(email: "email@example.com", password: "password") { result in switch result { - case .failure(let error): - print(error.localizedDescription) - case .success(var response): - let json = response.body!.readString(length: response.body!.readableBytes) + case .failure(let error): print(error.message) + case .success(let user): print(String(describing: user)) } } } @@ -72,10 +62,7 @@ import Appwrite func main() { let users = Users(client: client) - users.create( - email: "email@example.com", - password: "password" - ) { result in + users.create(email: "email@example.com", password: "password") { result in switch result { case .failure(let error): print(error.message) @@ -93,4 +80,4 @@ You can use the following resources to learn more and get help - 🚀 [Getting Started Tutorial](https://appwrite.io/docs/getting-started-for-server) - 📜 [Appwrite Docs](https://appwrite.io/docs) - 💬 [Discord Community](https://appwrite.io/discord) -- 🚂 [Appwrite Swift Playground](https://github.com/appwrite/playground-for-swift) +- 🚂 [Appwrite Swift Playground](https://github.com/appwrite/playground-for-swift-server) From cf1abdf1e73b1d8be67d9f891325cb8f7b446fb5 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Wed, 13 Oct 2021 22:07:28 +1300 Subject: [PATCH 180/257] Add swift client getting started --- .../sdks/{swift => swift-client}/CHANGELOG.md | 0 docs/sdks/swift-client/GETTING_STARTED.md | 132 ++++++++++++++++++ 2 files changed, 132 insertions(+) rename docs/sdks/{swift => swift-client}/CHANGELOG.md (100%) create mode 100644 docs/sdks/swift-client/GETTING_STARTED.md diff --git a/docs/sdks/swift/CHANGELOG.md b/docs/sdks/swift-client/CHANGELOG.md similarity index 100% rename from docs/sdks/swift/CHANGELOG.md rename to docs/sdks/swift-client/CHANGELOG.md diff --git a/docs/sdks/swift-client/GETTING_STARTED.md b/docs/sdks/swift-client/GETTING_STARTED.md new file mode 100644 index 0000000000..82c29a72c7 --- /dev/null +++ b/docs/sdks/swift-client/GETTING_STARTED.md @@ -0,0 +1,132 @@ +## Getting Started + +### Add your Apple Platform +To initialize your SDK and start interacting with Appwrite services, you need to add a new Apple platform to your project. To add a new platform, go to your Appwrite console, select your project (create one if you haven't already), and click the 'Add Platform' button on the project Dashboard. + +From the options, choose to add a new **iOS**, **macOS**, **watchOS** or **tvOS** platform and add your app credentials. + +Add your app name and bundle identifier. Your bundle identifier can be found in your Xcode project file or your `Info.plist` file. By registering a new platform, you are allowing your app to communicate with the Appwrite API. + +### Registering URL schemes + +In order to capture the Appwrite OAuth callback url, the following URL scheme needs to be added to project. You can add this from Xcode by selecting your project file, then the target you wish to use OAuth with. From the `Info` tab, expand the `URL types` section and add your Appwrite instance domain for the `Identifier`, and `appwrite-callback-[PROJECT-ID]` for the `URL scheme`. Be sure to replace the **[PROJECT_ID]** string with your actual Appwrite project ID. You can find your Appwrite project ID in your project settings screen in the console. Alternatively, you can add the following block directly to your targets `Info.plist` file: + +```xml +CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + io.appwrite + CFBundleURLSchemes + + appwrite-callback-[PROJECT-ID] + + + +``` + +Next we need to add a hook to save cookies when our app is opened by its callback URL. + +### Registering an OAuth handler view + +> If you're using UIKit, you can skip this section. + +In SwiftUI this is as simple as ensuring `.registerOAuthHanlder()` is called on the `View` you want to invoke an OAuth request from. + +### Updating the SceneDelegate for UIKit + +> If you're using SwiftUI, you can skip this section. + +For UIKit, you need to add the following function to your `SceneDelegate.swift`. If you have already defined this function, you can just add the contents from below. + +```swift + func scene(_ scene: UIScene, openURLContexts URLContexts: Set) { + guard let url = URLContexts.first?.url, + url.absoluteString.contains("appwrite-callback") else { + return + } + WebAuthComponent.handleIncomingCookie(from: url) + } +``` + +### Init your SDK + +Initialize your SDK with your Appwrite server API endpoint and project ID which can be found in your project settings page and your new API secret Key project API keys section. + +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("http://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setSelfSigned() // Use only on dev mode with a self-signed SSL cert +} +``` + +### Make Your First Request + +Once your SDK object is set, create any of the Appwrite service objects and choose any request to send. Full documentation for any service method you would like to use can be found in your SDK documentation or in the [API References](https://appwrite.io/docs) section. + +```swift +let users = Users(client: client) +users.create(email: "email@example.com", password: "password") { result in + switch result { + case .failure(let error): print(error.message) + case .success(let user): print(String(describing: user)) + } +} +``` + +### Full Example + +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setSelfSigned() // Use only on dev mode with a self-signed SSL cert + + let users = Users(client: client) + users.create(email: "email@example.com", password: "password") { result in + switch result { + case .failure(let error): print(error.message) + case .success(let user): print(String(describing: user)) + } + } +} +``` + +### Error Handling + +When an error occurs, the Appwrite Swift SDK responds with a result wrapping an `AppwriteError` object with `message` and `code` properties. You can handle any errors in the result's `.failure` case and present the `message` to the user or handle it yourself based on the provided error information. Below is an example. + +```swift +import Appwrite + +func main() { + let users = Users(client: client) + + users.create(email: "email@example.com", password: "password") { result in + switch result { + case .failure(let error): + print(error.message) + case .success(var response): + ... + } + } +} +``` + +### Learn more + +You can use the following resources to learn more and get help + +- 🚀 [Getting Started Tutorial](https://appwrite.io/docs/getting-started-for-server) +- 📜 [Appwrite Docs](https://appwrite.io/docs) +- 💬 [Discord Community](https://appwrite.io/discord) +- 🚂 [Appwrite Swift Playground](https://github.com/appwrite/playground-for-swift-server) From 48112559d8932297ce0562069627b127fd4017af Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 14 Oct 2021 01:22:04 +1300 Subject: [PATCH 181/257] Add swift client generation to SDK tasks --- app/tasks/sdks.php | 5 ++++ .../account/create-anonymous-session.md | 19 ++++++++++++++ .../examples/account/create-j-w-t.md | 19 ++++++++++++++ .../account/create-magic-u-r-l-session.md | 21 ++++++++++++++++ .../examples/account/create-o-auth2session.md | 21 ++++++++++++++++ .../examples/account/create-recovery.md | 22 ++++++++++++++++ .../examples/account/create-session.md | 22 ++++++++++++++++ .../examples/account/create-verification.md | 21 ++++++++++++++++ .../client-apple/examples/account/create.md | 22 ++++++++++++++++ .../examples/account/delete-session.md | 21 ++++++++++++++++ .../examples/account/delete-sessions.md | 19 ++++++++++++++ .../client-apple/examples/account/delete.md | 19 ++++++++++++++ .../client-apple/examples/account/get-logs.md | 19 ++++++++++++++ .../examples/account/get-prefs.md | 19 ++++++++++++++ .../examples/account/get-session.md | 21 ++++++++++++++++ .../examples/account/get-sessions.md | 19 ++++++++++++++ .../client-apple/examples/account/get.md | 19 ++++++++++++++ .../examples/account/update-email.md | 22 ++++++++++++++++ .../account/update-magic-u-r-l-session.md | 22 ++++++++++++++++ .../examples/account/update-name.md | 21 ++++++++++++++++ .../examples/account/update-password.md | 21 ++++++++++++++++ .../examples/account/update-prefs.md | 21 ++++++++++++++++ .../examples/account/update-recovery.md | 24 ++++++++++++++++++ .../examples/account/update-verification.md | 22 ++++++++++++++++ .../examples/avatars/get-browser.md | 21 ++++++++++++++++ .../examples/avatars/get-credit-card.md | 21 ++++++++++++++++ .../examples/avatars/get-favicon.md | 21 ++++++++++++++++ .../client-apple/examples/avatars/get-flag.md | 21 ++++++++++++++++ .../examples/avatars/get-image.md | 21 ++++++++++++++++ .../examples/avatars/get-initials.md | 19 ++++++++++++++ .../client-apple/examples/avatars/get-q-r.md | 21 ++++++++++++++++ .../examples/database/create-document.md | 22 ++++++++++++++++ .../examples/database/delete-document.md | 22 ++++++++++++++++ .../examples/database/get-document.md | 22 ++++++++++++++++ .../examples/database/list-documents.md | 21 ++++++++++++++++ .../examples/database/update-document.md | 23 +++++++++++++++++ .../examples/functions/create-execution.md | 21 ++++++++++++++++ .../examples/functions/get-execution.md | 22 ++++++++++++++++ .../examples/functions/list-executions.md | 21 ++++++++++++++++ .../examples/locale/get-continents.md | 19 ++++++++++++++ .../examples/locale/get-countries-e-u.md | 19 ++++++++++++++ .../examples/locale/get-countries-phones.md | 19 ++++++++++++++ .../examples/locale/get-countries.md | 19 ++++++++++++++ .../examples/locale/get-currencies.md | 19 ++++++++++++++ .../examples/locale/get-languages.md | 19 ++++++++++++++ .../client-apple/examples/locale/get.md | 19 ++++++++++++++ .../examples/storage/create-file.md | 21 ++++++++++++++++ .../examples/storage/delete-file.md | 21 ++++++++++++++++ .../examples/storage/get-file-download.md | 21 ++++++++++++++++ .../examples/storage/get-file-preview.md | 21 ++++++++++++++++ .../examples/storage/get-file-view.md | 21 ++++++++++++++++ .../client-apple/examples/storage/get-file.md | 21 ++++++++++++++++ .../examples/storage/list-files.md | 19 ++++++++++++++ .../examples/storage/update-file.md | 23 +++++++++++++++++ .../examples/teams/create-membership.md | 24 ++++++++++++++++++ .../client-apple/examples/teams/create.md | 21 ++++++++++++++++ .../examples/teams/delete-membership.md | 22 ++++++++++++++++ .../client-apple/examples/teams/delete.md | 21 ++++++++++++++++ .../examples/teams/get-memberships.md | 21 ++++++++++++++++ .../0.10.x/client-apple/examples/teams/get.md | 21 ++++++++++++++++ .../client-apple/examples/teams/list.md | 19 ++++++++++++++ .../examples/teams/update-membership-roles.md | 23 +++++++++++++++++ .../teams/update-membership-status.md | 24 ++++++++++++++++++ .../client-apple/examples/teams/update.md | 22 ++++++++++++++++ .../examples/account/create-recovery.md | 23 +++++++++++++++++ .../examples/account/create-verification.md | 22 ++++++++++++++++ .../examples/account/delete-session.md | 22 ++++++++++++++++ .../examples/account/delete-sessions.md | 20 +++++++++++++++ .../server-swift/examples/account/delete.md | 20 +++++++++++++++ .../server-swift/examples/account/get-logs.md | 20 +++++++++++++++ .../examples/account/get-prefs.md | 20 +++++++++++++++ .../examples/account/get-session.md | 22 ++++++++++++++++ .../examples/account/get-sessions.md | 20 +++++++++++++++ .../server-swift/examples/account/get.md | 20 +++++++++++++++ .../examples/account/update-email.md | 23 +++++++++++++++++ .../examples/account/update-name.md | 22 ++++++++++++++++ .../examples/account/update-password.md | 22 ++++++++++++++++ .../examples/account/update-prefs.md | 22 ++++++++++++++++ .../examples/account/update-recovery.md | 25 +++++++++++++++++++ .../examples/account/update-verification.md | 23 +++++++++++++++++ .../examples/avatars/get-browser.md | 22 ++++++++++++++++ .../examples/avatars/get-credit-card.md | 22 ++++++++++++++++ .../examples/avatars/get-favicon.md | 22 ++++++++++++++++ .../server-swift/examples/avatars/get-flag.md | 22 ++++++++++++++++ .../examples/avatars/get-image.md | 22 ++++++++++++++++ .../examples/avatars/get-initials.md | 20 +++++++++++++++ .../server-swift/examples/avatars/get-q-r.md | 22 ++++++++++++++++ .../examples/database/create-collection.md | 25 +++++++++++++++++++ .../examples/database/create-document.md | 23 +++++++++++++++++ .../examples/database/delete-collection.md | 22 ++++++++++++++++ .../examples/database/delete-document.md | 23 +++++++++++++++++ .../examples/database/get-collection.md | 22 ++++++++++++++++ .../examples/database/get-document.md | 23 +++++++++++++++++ .../examples/database/list-collections.md | 20 +++++++++++++++ .../examples/database/list-documents.md | 22 ++++++++++++++++ .../examples/database/update-collection.md | 23 +++++++++++++++++ .../examples/database/update-document.md | 24 ++++++++++++++++++ .../examples/functions/create-execution.md | 22 ++++++++++++++++ .../examples/functions/create-tag.md | 24 ++++++++++++++++++ .../server-swift/examples/functions/create.md | 24 ++++++++++++++++++ .../examples/functions/delete-tag.md | 23 +++++++++++++++++ .../server-swift/examples/functions/delete.md | 22 ++++++++++++++++ .../examples/functions/get-execution.md | 23 +++++++++++++++++ .../examples/functions/get-tag.md | 23 +++++++++++++++++ .../server-swift/examples/functions/get.md | 22 ++++++++++++++++ .../examples/functions/list-executions.md | 22 ++++++++++++++++ .../examples/functions/list-tags.md | 22 ++++++++++++++++ .../server-swift/examples/functions/list.md | 20 +++++++++++++++ .../examples/functions/update-tag.md | 23 +++++++++++++++++ .../server-swift/examples/functions/update.md | 24 ++++++++++++++++++ .../examples/health/get-anti-virus.md | 20 +++++++++++++++ .../server-swift/examples/health/get-cache.md | 20 +++++++++++++++ .../server-swift/examples/health/get-d-b.md | 20 +++++++++++++++ .../examples/health/get-queue-certificates.md | 20 +++++++++++++++ .../examples/health/get-queue-functions.md | 20 +++++++++++++++ .../examples/health/get-queue-logs.md | 20 +++++++++++++++ .../examples/health/get-queue-tasks.md | 20 +++++++++++++++ .../examples/health/get-queue-usage.md | 20 +++++++++++++++ .../examples/health/get-queue-webhooks.md | 20 +++++++++++++++ .../examples/health/get-storage-local.md | 20 +++++++++++++++ .../server-swift/examples/health/get-time.md | 20 +++++++++++++++ .../server-swift/examples/health/get.md | 20 +++++++++++++++ .../examples/locale/get-continents.md | 20 +++++++++++++++ .../examples/locale/get-countries-e-u.md | 20 +++++++++++++++ .../examples/locale/get-countries-phones.md | 20 +++++++++++++++ .../examples/locale/get-countries.md | 20 +++++++++++++++ .../examples/locale/get-currencies.md | 20 +++++++++++++++ .../examples/locale/get-languages.md | 20 +++++++++++++++ .../server-swift/examples/locale/get.md | 20 +++++++++++++++ .../examples/storage/create-file.md | 22 ++++++++++++++++ .../examples/storage/delete-file.md | 22 ++++++++++++++++ .../examples/storage/get-file-download.md | 22 ++++++++++++++++ .../examples/storage/get-file-preview.md | 22 ++++++++++++++++ .../examples/storage/get-file-view.md | 22 ++++++++++++++++ .../server-swift/examples/storage/get-file.md | 22 ++++++++++++++++ .../examples/storage/list-files.md | 20 +++++++++++++++ .../examples/storage/update-file.md | 24 ++++++++++++++++++ .../examples/teams/create-membership.md | 25 +++++++++++++++++++ .../server-swift/examples/teams/create.md | 22 ++++++++++++++++ .../examples/teams/delete-membership.md | 23 +++++++++++++++++ .../server-swift/examples/teams/delete.md | 22 ++++++++++++++++ .../examples/teams/get-memberships.md | 22 ++++++++++++++++ .../0.10.x/server-swift/examples/teams/get.md | 22 ++++++++++++++++ .../server-swift/examples/teams/list.md | 20 +++++++++++++++ .../examples/teams/update-membership-roles.md | 24 ++++++++++++++++++ .../teams/update-membership-status.md | 25 +++++++++++++++++++ .../server-swift/examples/teams/update.md | 23 +++++++++++++++++ .../server-swift/examples/users/create.md | 23 +++++++++++++++++ .../examples/users/delete-session.md | 23 +++++++++++++++++ .../examples/users/delete-sessions.md | 22 ++++++++++++++++ .../server-swift/examples/users/delete.md | 22 ++++++++++++++++ .../server-swift/examples/users/get-logs.md | 22 ++++++++++++++++ .../server-swift/examples/users/get-prefs.md | 22 ++++++++++++++++ .../examples/users/get-sessions.md | 22 ++++++++++++++++ .../0.10.x/server-swift/examples/users/get.md | 22 ++++++++++++++++ .../server-swift/examples/users/list.md | 20 +++++++++++++++ .../examples/users/update-email.md | 23 +++++++++++++++++ .../examples/users/update-name.md | 23 +++++++++++++++++ .../examples/users/update-password.md | 23 +++++++++++++++++ .../examples/users/update-prefs.md | 23 +++++++++++++++++ .../examples/users/update-status.md | 23 +++++++++++++++++ .../examples/users/update-verification.md | 23 +++++++++++++++++ 162 files changed, 3458 insertions(+) create mode 100644 docs/examples/0.10.x/client-apple/examples/account/create-anonymous-session.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/create-j-w-t.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/create-magic-u-r-l-session.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/create-o-auth2session.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/create-recovery.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/create-session.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/create-verification.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/create.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/delete-session.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/delete-sessions.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/delete.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/get-logs.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/get-prefs.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/get-session.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/get-sessions.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/get.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/update-email.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/update-magic-u-r-l-session.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/update-name.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/update-password.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/update-prefs.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/update-recovery.md create mode 100644 docs/examples/0.10.x/client-apple/examples/account/update-verification.md create mode 100644 docs/examples/0.10.x/client-apple/examples/avatars/get-browser.md create mode 100644 docs/examples/0.10.x/client-apple/examples/avatars/get-credit-card.md create mode 100644 docs/examples/0.10.x/client-apple/examples/avatars/get-favicon.md create mode 100644 docs/examples/0.10.x/client-apple/examples/avatars/get-flag.md create mode 100644 docs/examples/0.10.x/client-apple/examples/avatars/get-image.md create mode 100644 docs/examples/0.10.x/client-apple/examples/avatars/get-initials.md create mode 100644 docs/examples/0.10.x/client-apple/examples/avatars/get-q-r.md create mode 100644 docs/examples/0.10.x/client-apple/examples/database/create-document.md create mode 100644 docs/examples/0.10.x/client-apple/examples/database/delete-document.md create mode 100644 docs/examples/0.10.x/client-apple/examples/database/get-document.md create mode 100644 docs/examples/0.10.x/client-apple/examples/database/list-documents.md create mode 100644 docs/examples/0.10.x/client-apple/examples/database/update-document.md create mode 100644 docs/examples/0.10.x/client-apple/examples/functions/create-execution.md create mode 100644 docs/examples/0.10.x/client-apple/examples/functions/get-execution.md create mode 100644 docs/examples/0.10.x/client-apple/examples/functions/list-executions.md create mode 100644 docs/examples/0.10.x/client-apple/examples/locale/get-continents.md create mode 100644 docs/examples/0.10.x/client-apple/examples/locale/get-countries-e-u.md create mode 100644 docs/examples/0.10.x/client-apple/examples/locale/get-countries-phones.md create mode 100644 docs/examples/0.10.x/client-apple/examples/locale/get-countries.md create mode 100644 docs/examples/0.10.x/client-apple/examples/locale/get-currencies.md create mode 100644 docs/examples/0.10.x/client-apple/examples/locale/get-languages.md create mode 100644 docs/examples/0.10.x/client-apple/examples/locale/get.md create mode 100644 docs/examples/0.10.x/client-apple/examples/storage/create-file.md create mode 100644 docs/examples/0.10.x/client-apple/examples/storage/delete-file.md create mode 100644 docs/examples/0.10.x/client-apple/examples/storage/get-file-download.md create mode 100644 docs/examples/0.10.x/client-apple/examples/storage/get-file-preview.md create mode 100644 docs/examples/0.10.x/client-apple/examples/storage/get-file-view.md create mode 100644 docs/examples/0.10.x/client-apple/examples/storage/get-file.md create mode 100644 docs/examples/0.10.x/client-apple/examples/storage/list-files.md create mode 100644 docs/examples/0.10.x/client-apple/examples/storage/update-file.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/create-membership.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/create.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/delete-membership.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/delete.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/get-memberships.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/get.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/list.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/update-membership-roles.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/update-membership-status.md create mode 100644 docs/examples/0.10.x/client-apple/examples/teams/update.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/create-recovery.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/create-verification.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/delete-session.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/delete-sessions.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/delete.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/get-logs.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/get-prefs.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/get-session.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/get-sessions.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/get.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/update-email.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/update-name.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/update-password.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/update-prefs.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/update-recovery.md create mode 100644 docs/examples/0.10.x/server-swift/examples/account/update-verification.md create mode 100644 docs/examples/0.10.x/server-swift/examples/avatars/get-browser.md create mode 100644 docs/examples/0.10.x/server-swift/examples/avatars/get-credit-card.md create mode 100644 docs/examples/0.10.x/server-swift/examples/avatars/get-favicon.md create mode 100644 docs/examples/0.10.x/server-swift/examples/avatars/get-flag.md create mode 100644 docs/examples/0.10.x/server-swift/examples/avatars/get-image.md create mode 100644 docs/examples/0.10.x/server-swift/examples/avatars/get-initials.md create mode 100644 docs/examples/0.10.x/server-swift/examples/avatars/get-q-r.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/create-collection.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/create-document.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/delete-collection.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/delete-document.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/get-collection.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/get-document.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/list-collections.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/list-documents.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/update-collection.md create mode 100644 docs/examples/0.10.x/server-swift/examples/database/update-document.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/create-execution.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/create-tag.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/create.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/delete-tag.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/delete.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/get-execution.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/get-tag.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/get.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/list-executions.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/list-tags.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/list.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/update-tag.md create mode 100644 docs/examples/0.10.x/server-swift/examples/functions/update.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-anti-virus.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-cache.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-d-b.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-queue-certificates.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-queue-functions.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-queue-logs.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-queue-tasks.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-queue-usage.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-queue-webhooks.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-storage-local.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get-time.md create mode 100644 docs/examples/0.10.x/server-swift/examples/health/get.md create mode 100644 docs/examples/0.10.x/server-swift/examples/locale/get-continents.md create mode 100644 docs/examples/0.10.x/server-swift/examples/locale/get-countries-e-u.md create mode 100644 docs/examples/0.10.x/server-swift/examples/locale/get-countries-phones.md create mode 100644 docs/examples/0.10.x/server-swift/examples/locale/get-countries.md create mode 100644 docs/examples/0.10.x/server-swift/examples/locale/get-currencies.md create mode 100644 docs/examples/0.10.x/server-swift/examples/locale/get-languages.md create mode 100644 docs/examples/0.10.x/server-swift/examples/locale/get.md create mode 100644 docs/examples/0.10.x/server-swift/examples/storage/create-file.md create mode 100644 docs/examples/0.10.x/server-swift/examples/storage/delete-file.md create mode 100644 docs/examples/0.10.x/server-swift/examples/storage/get-file-download.md create mode 100644 docs/examples/0.10.x/server-swift/examples/storage/get-file-preview.md create mode 100644 docs/examples/0.10.x/server-swift/examples/storage/get-file-view.md create mode 100644 docs/examples/0.10.x/server-swift/examples/storage/get-file.md create mode 100644 docs/examples/0.10.x/server-swift/examples/storage/list-files.md create mode 100644 docs/examples/0.10.x/server-swift/examples/storage/update-file.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/create-membership.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/create.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/delete-membership.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/delete.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/get-memberships.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/get.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/list.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/update-membership-roles.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/update-membership-status.md create mode 100644 docs/examples/0.10.x/server-swift/examples/teams/update.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/create.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/delete-session.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/delete-sessions.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/delete.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/get-logs.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/get-prefs.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/get-sessions.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/get.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/list.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/update-email.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/update-name.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/update-password.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/update-prefs.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/update-status.md create mode 100644 docs/examples/0.10.x/server-swift/examples/users/update-verification.md diff --git a/app/tasks/sdks.php b/app/tasks/sdks.php index 6659c9ead3..05e12f7c39 100644 --- a/app/tasks/sdks.php +++ b/app/tasks/sdks.php @@ -18,6 +18,7 @@ use Appwrite\SDK\Language\Go; use Appwrite\SDK\Language\Kotlin; use Appwrite\SDK\Language\Android; use Appwrite\SDK\Language\Swift; +use Appwrite\SDK\Language\SwiftClient; $cli ->task('sdks') @@ -137,6 +138,10 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND break; case 'swift': $config = new Swift(); + $warning = $warning."\n\n > This is the Swift SDK for integrating with Appwrite from your Swift server-side code. If you're looking for the Apple SDK you should check [appwrite/sdk-for-apple](https://github.com/appwrite/sdk-for-apple)"; + break; + case 'apple': + $config = new SwiftClient(); break; case 'dotnet': $cover = ''; diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-anonymous-session.md b/docs/examples/0.10.x/client-apple/examples/account/create-anonymous-session.md new file mode 100644 index 0000000000..b195ff5465 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/create-anonymous-session.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.createAnonymousSession() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let session): + print(String(describing: session) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-j-w-t.md b/docs/examples/0.10.x/client-apple/examples/account/create-j-w-t.md new file mode 100644 index 0000000000..f2045c6920 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/create-j-w-t.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.createJWT() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let jwt): + print(String(describing: jwt) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-magic-u-r-l-session.md b/docs/examples/0.10.x/client-apple/examples/account/create-magic-u-r-l-session.md new file mode 100644 index 0000000000..ffc60f0498 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/create-magic-u-r-l-session.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.createMagicURLSession( + email: "email@example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let token): + print(String(describing: token) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-o-auth2session.md b/docs/examples/0.10.x/client-apple/examples/account/create-o-auth2session.md new file mode 100644 index 0000000000..2c78244edc --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/create-o-auth2session.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.createOAuth2Session( + provider: "amazon" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let success): + print(String(describing: success) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-recovery.md b/docs/examples/0.10.x/client-apple/examples/account/create-recovery.md new file mode 100644 index 0000000000..a37fb4aa2e --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/create-recovery.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.createRecovery( + email: "email@example.com", + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let token): + print(String(describing: token) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-session.md b/docs/examples/0.10.x/client-apple/examples/account/create-session.md new file mode 100644 index 0000000000..1f2bc46112 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/create-session.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.createSession( + email: "email@example.com", + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let session): + print(String(describing: session) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-verification.md b/docs/examples/0.10.x/client-apple/examples/account/create-verification.md new file mode 100644 index 0000000000..56f12b4bf7 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/create-verification.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.createVerification( + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let token): + print(String(describing: token) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create.md b/docs/examples/0.10.x/client-apple/examples/account/create.md new file mode 100644 index 0000000000..d590e3c8bb --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/create.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.create( + email: "email@example.com", + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/delete-session.md b/docs/examples/0.10.x/client-apple/examples/account/delete-session.md new file mode 100644 index 0000000000..0f41562b72 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/delete-session.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.deleteSession( + sessionId: "[SESSION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/delete-sessions.md b/docs/examples/0.10.x/client-apple/examples/account/delete-sessions.md new file mode 100644 index 0000000000..878b3be227 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/delete-sessions.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.deleteSessions() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/delete.md b/docs/examples/0.10.x/client-apple/examples/account/delete.md new file mode 100644 index 0000000000..e3cb689aa9 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/delete.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.delete() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get-logs.md b/docs/examples/0.10.x/client-apple/examples/account/get-logs.md new file mode 100644 index 0000000000..e0716878ba --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/get-logs.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.getLogs() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let logList): + print(String(describing: logList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get-prefs.md b/docs/examples/0.10.x/client-apple/examples/account/get-prefs.md new file mode 100644 index 0000000000..afec734062 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/get-prefs.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.getPrefs() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let preferences): + print(String(describing: preferences) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get-session.md b/docs/examples/0.10.x/client-apple/examples/account/get-session.md new file mode 100644 index 0000000000..3c64502272 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/get-session.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.getSession( + sessionId: "[SESSION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let session): + print(String(describing: session) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get-sessions.md b/docs/examples/0.10.x/client-apple/examples/account/get-sessions.md new file mode 100644 index 0000000000..deed06b0e8 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/get-sessions.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.getSessions() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let sessionList): + print(String(describing: sessionList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get.md b/docs/examples/0.10.x/client-apple/examples/account/get.md new file mode 100644 index 0000000000..5063a840e9 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/get.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.get() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-email.md b/docs/examples/0.10.x/client-apple/examples/account/update-email.md new file mode 100644 index 0000000000..4dc415c75d --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/update-email.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.updateEmail( + email: "email@example.com", + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-magic-u-r-l-session.md b/docs/examples/0.10.x/client-apple/examples/account/update-magic-u-r-l-session.md new file mode 100644 index 0000000000..27dad25a28 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/update-magic-u-r-l-session.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.updateMagicURLSession( + userId: "[USER_ID]", + secret: "[SECRET]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let session): + print(String(describing: session) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-name.md b/docs/examples/0.10.x/client-apple/examples/account/update-name.md new file mode 100644 index 0000000000..0f1c8b8c4a --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/update-name.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.updateName( + name: "[NAME]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-password.md b/docs/examples/0.10.x/client-apple/examples/account/update-password.md new file mode 100644 index 0000000000..6294f5c625 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/update-password.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.updatePassword( + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-prefs.md b/docs/examples/0.10.x/client-apple/examples/account/update-prefs.md new file mode 100644 index 0000000000..3f8e43c0b0 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/update-prefs.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.updatePrefs( + prefs: + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-recovery.md b/docs/examples/0.10.x/client-apple/examples/account/update-recovery.md new file mode 100644 index 0000000000..dbe5e0dfba --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/update-recovery.md @@ -0,0 +1,24 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.updateRecovery( + userId: "[USER_ID]", + secret: "[SECRET]", + password: "password", + passwordAgain: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let token): + print(String(describing: token) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-verification.md b/docs/examples/0.10.x/client-apple/examples/account/update-verification.md new file mode 100644 index 0000000000..7c787cdad5 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/account/update-verification.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let account = Account(client: client) + account.updateVerification( + userId: "[USER_ID]", + secret: "[SECRET]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let token): + print(String(describing: token) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-browser.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-browser.md new file mode 100644 index 0000000000..26acade54c --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-browser.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let avatars = Avatars(client: client) + avatars.getBrowser( + code: "aa" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-credit-card.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-credit-card.md new file mode 100644 index 0000000000..3be70f7ceb --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-credit-card.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let avatars = Avatars(client: client) + avatars.getCreditCard( + code: "amex" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-favicon.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-favicon.md new file mode 100644 index 0000000000..71f4353f47 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-favicon.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let avatars = Avatars(client: client) + avatars.getFavicon( + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-flag.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-flag.md new file mode 100644 index 0000000000..edad0e40f0 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-flag.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let avatars = Avatars(client: client) + avatars.getFlag( + code: "af" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-image.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-image.md new file mode 100644 index 0000000000..142ef65559 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-image.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let avatars = Avatars(client: client) + avatars.getImage( + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-initials.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-initials.md new file mode 100644 index 0000000000..ee6b54b08c --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-initials.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let avatars = Avatars(client: client) + avatars.getInitials() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-q-r.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-q-r.md new file mode 100644 index 0000000000..c32d234e31 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-q-r.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let avatars = Avatars(client: client) + avatars.getQR( + text: "[TEXT]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/create-document.md b/docs/examples/0.10.x/client-apple/examples/database/create-document.md new file mode 100644 index 0000000000..471b5a6a09 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/database/create-document.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let database = Database(client: client) + database.createDocument( + collectionId: "[COLLECTION_ID]", + data: + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let document): + print(String(describing: document) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/delete-document.md b/docs/examples/0.10.x/client-apple/examples/database/delete-document.md new file mode 100644 index 0000000000..ee02e98873 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/database/delete-document.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let database = Database(client: client) + database.deleteDocument( + collectionId: "[COLLECTION_ID]", + documentId: "[DOCUMENT_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/get-document.md b/docs/examples/0.10.x/client-apple/examples/database/get-document.md new file mode 100644 index 0000000000..42d129633e --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/database/get-document.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let database = Database(client: client) + database.getDocument( + collectionId: "[COLLECTION_ID]", + documentId: "[DOCUMENT_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let document): + print(String(describing: document) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/list-documents.md b/docs/examples/0.10.x/client-apple/examples/database/list-documents.md new file mode 100644 index 0000000000..2844ac6d5e --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/database/list-documents.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let database = Database(client: client) + database.listDocuments( + collectionId: "[COLLECTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let documentList): + print(String(describing: documentList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/update-document.md b/docs/examples/0.10.x/client-apple/examples/database/update-document.md new file mode 100644 index 0000000000..cb8583cf1b --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/database/update-document.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let database = Database(client: client) + database.updateDocument( + collectionId: "[COLLECTION_ID]", + documentId: "[DOCUMENT_ID]", + data: + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let document): + print(String(describing: document) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/functions/create-execution.md b/docs/examples/0.10.x/client-apple/examples/functions/create-execution.md new file mode 100644 index 0000000000..e0c801a83f --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/functions/create-execution.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let functions = Functions(client: client) + functions.createExecution( + functionId: "[FUNCTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let execution): + print(String(describing: execution) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/functions/get-execution.md b/docs/examples/0.10.x/client-apple/examples/functions/get-execution.md new file mode 100644 index 0000000000..b62309123d --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/functions/get-execution.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let functions = Functions(client: client) + functions.getExecution( + functionId: "[FUNCTION_ID]", + executionId: "[EXECUTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let execution): + print(String(describing: execution) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/functions/list-executions.md b/docs/examples/0.10.x/client-apple/examples/functions/list-executions.md new file mode 100644 index 0000000000..cef794c4ad --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/functions/list-executions.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let functions = Functions(client: client) + functions.listExecutions( + functionId: "[FUNCTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let executionList): + print(String(describing: executionList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-continents.md b/docs/examples/0.10.x/client-apple/examples/locale/get-continents.md new file mode 100644 index 0000000000..5faa4536b8 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-continents.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let locale = Locale(client: client) + locale.getContinents() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let continentList): + print(String(describing: continentList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-countries-e-u.md b/docs/examples/0.10.x/client-apple/examples/locale/get-countries-e-u.md new file mode 100644 index 0000000000..aa87e5690f --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-countries-e-u.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let locale = Locale(client: client) + locale.getCountriesEU() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let countryList): + print(String(describing: countryList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-countries-phones.md b/docs/examples/0.10.x/client-apple/examples/locale/get-countries-phones.md new file mode 100644 index 0000000000..024f3ec44a --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-countries-phones.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let locale = Locale(client: client) + locale.getCountriesPhones() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let phoneList): + print(String(describing: phoneList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-countries.md b/docs/examples/0.10.x/client-apple/examples/locale/get-countries.md new file mode 100644 index 0000000000..906c61d1c0 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-countries.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let locale = Locale(client: client) + locale.getCountries() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let countryList): + print(String(describing: countryList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-currencies.md b/docs/examples/0.10.x/client-apple/examples/locale/get-currencies.md new file mode 100644 index 0000000000..d231042e43 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-currencies.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let locale = Locale(client: client) + locale.getCurrencies() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let currencyList): + print(String(describing: currencyList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-languages.md b/docs/examples/0.10.x/client-apple/examples/locale/get-languages.md new file mode 100644 index 0000000000..38905e4e34 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-languages.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let locale = Locale(client: client) + locale.getLanguages() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let languageList): + print(String(describing: languageList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get.md b/docs/examples/0.10.x/client-apple/examples/locale/get.md new file mode 100644 index 0000000000..0fd923c400 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/locale/get.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let locale = Locale(client: client) + locale.get() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let locale): + print(String(describing: locale) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/create-file.md b/docs/examples/0.10.x/client-apple/examples/storage/create-file.md new file mode 100644 index 0000000000..be023e0c33 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/storage/create-file.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let storage = Storage(client: client) + storage.createFile( + file: File(name: "image.jpg", buffer: yourByteBuffer) + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let file): + print(String(describing: file) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/delete-file.md b/docs/examples/0.10.x/client-apple/examples/storage/delete-file.md new file mode 100644 index 0000000000..634b278221 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/storage/delete-file.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let storage = Storage(client: client) + storage.deleteFile( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/get-file-download.md b/docs/examples/0.10.x/client-apple/examples/storage/get-file-download.md new file mode 100644 index 0000000000..a32f8898be --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/storage/get-file-download.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let storage = Storage(client: client) + storage.getFileDownload( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/get-file-preview.md b/docs/examples/0.10.x/client-apple/examples/storage/get-file-preview.md new file mode 100644 index 0000000000..c2d33d7ea2 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/storage/get-file-preview.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let storage = Storage(client: client) + storage.getFilePreview( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/get-file-view.md b/docs/examples/0.10.x/client-apple/examples/storage/get-file-view.md new file mode 100644 index 0000000000..69cf9c3b70 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/storage/get-file-view.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let storage = Storage(client: client) + storage.getFileView( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/get-file.md b/docs/examples/0.10.x/client-apple/examples/storage/get-file.md new file mode 100644 index 0000000000..79c8f55cc2 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/storage/get-file.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let storage = Storage(client: client) + storage.getFile( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let file): + print(String(describing: file) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/list-files.md b/docs/examples/0.10.x/client-apple/examples/storage/list-files.md new file mode 100644 index 0000000000..2c44313f08 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/storage/list-files.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let storage = Storage(client: client) + storage.listFiles() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let fileList): + print(String(describing: fileList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/update-file.md b/docs/examples/0.10.x/client-apple/examples/storage/update-file.md new file mode 100644 index 0000000000..d2472e4d11 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/storage/update-file.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let storage = Storage(client: client) + storage.updateFile( + fileId: "[FILE_ID]", + read: [], + write: [] + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let file): + print(String(describing: file) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/create-membership.md b/docs/examples/0.10.x/client-apple/examples/teams/create-membership.md new file mode 100644 index 0000000000..9170336c80 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/create-membership.md @@ -0,0 +1,24 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.createMembership( + teamId: "[TEAM_ID]", + email: "email@example.com", + roles: [], + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let membership): + print(String(describing: membership) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/create.md b/docs/examples/0.10.x/client-apple/examples/teams/create.md new file mode 100644 index 0000000000..28e1d0d805 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/create.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.create( + name: "[NAME]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let team): + print(String(describing: team) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/delete-membership.md b/docs/examples/0.10.x/client-apple/examples/teams/delete-membership.md new file mode 100644 index 0000000000..e76a1959ce --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/delete-membership.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.deleteMembership( + teamId: "[TEAM_ID]", + membershipId: "[MEMBERSHIP_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/delete.md b/docs/examples/0.10.x/client-apple/examples/teams/delete.md new file mode 100644 index 0000000000..d9f7af401a --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/delete.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.delete( + teamId: "[TEAM_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/get-memberships.md b/docs/examples/0.10.x/client-apple/examples/teams/get-memberships.md new file mode 100644 index 0000000000..00926983d6 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/get-memberships.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.getMemberships( + teamId: "[TEAM_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let membershipList): + print(String(describing: membershipList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/get.md b/docs/examples/0.10.x/client-apple/examples/teams/get.md new file mode 100644 index 0000000000..5d59911950 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/get.md @@ -0,0 +1,21 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.get( + teamId: "[TEAM_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let team): + print(String(describing: team) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/list.md b/docs/examples/0.10.x/client-apple/examples/teams/list.md new file mode 100644 index 0000000000..b6f89b328b --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/list.md @@ -0,0 +1,19 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.list() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let teamList): + print(String(describing: teamList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/update-membership-roles.md b/docs/examples/0.10.x/client-apple/examples/teams/update-membership-roles.md new file mode 100644 index 0000000000..422b6b9e5a --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/update-membership-roles.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.updateMembershipRoles( + teamId: "[TEAM_ID]", + membershipId: "[MEMBERSHIP_ID]", + roles: [] + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let membership): + print(String(describing: membership) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/update-membership-status.md b/docs/examples/0.10.x/client-apple/examples/teams/update-membership-status.md new file mode 100644 index 0000000000..0cdcc773f4 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/update-membership-status.md @@ -0,0 +1,24 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.updateMembershipStatus( + teamId: "[TEAM_ID]", + membershipId: "[MEMBERSHIP_ID]", + userId: "[USER_ID]", + secret: "[SECRET]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let membership): + print(String(describing: membership) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/update.md b/docs/examples/0.10.x/client-apple/examples/teams/update.md new file mode 100644 index 0000000000..70daab7f44 --- /dev/null +++ b/docs/examples/0.10.x/client-apple/examples/teams/update.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + + let teams = Teams(client: client) + teams.update( + teamId: "[TEAM_ID]", + name: "[NAME]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let team): + print(String(describing: team) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/create-recovery.md b/docs/examples/0.10.x/server-swift/examples/account/create-recovery.md new file mode 100644 index 0000000000..8f00b75b4c --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/create-recovery.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.createRecovery( + email: "email@example.com", + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let token): + print(String(describing: token) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/create-verification.md b/docs/examples/0.10.x/server-swift/examples/account/create-verification.md new file mode 100644 index 0000000000..48938c41d0 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/create-verification.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.createVerification( + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let token): + print(String(describing: token) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/delete-session.md b/docs/examples/0.10.x/server-swift/examples/account/delete-session.md new file mode 100644 index 0000000000..a5aefd5467 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/delete-session.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.deleteSession( + sessionId: "[SESSION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/delete-sessions.md b/docs/examples/0.10.x/server-swift/examples/account/delete-sessions.md new file mode 100644 index 0000000000..81bbd3839b --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/delete-sessions.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.deleteSessions() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/delete.md b/docs/examples/0.10.x/server-swift/examples/account/delete.md new file mode 100644 index 0000000000..9b130164e6 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/delete.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.delete() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get-logs.md b/docs/examples/0.10.x/server-swift/examples/account/get-logs.md new file mode 100644 index 0000000000..1aacb4614f --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/get-logs.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.getLogs() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let logList): + print(String(describing: logList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get-prefs.md b/docs/examples/0.10.x/server-swift/examples/account/get-prefs.md new file mode 100644 index 0000000000..4a377893c1 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/get-prefs.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.getPrefs() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let preferences): + print(String(describing: preferences) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get-session.md b/docs/examples/0.10.x/server-swift/examples/account/get-session.md new file mode 100644 index 0000000000..966736f899 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/get-session.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.getSession( + sessionId: "[SESSION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let session): + print(String(describing: session) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get-sessions.md b/docs/examples/0.10.x/server-swift/examples/account/get-sessions.md new file mode 100644 index 0000000000..2285f2f8de --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/get-sessions.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.getSessions() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let sessionList): + print(String(describing: sessionList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get.md b/docs/examples/0.10.x/server-swift/examples/account/get.md new file mode 100644 index 0000000000..58f05bfee1 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/get.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.get() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-email.md b/docs/examples/0.10.x/server-swift/examples/account/update-email.md new file mode 100644 index 0000000000..cbf2df19c9 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/update-email.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.updateEmail( + email: "email@example.com", + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-name.md b/docs/examples/0.10.x/server-swift/examples/account/update-name.md new file mode 100644 index 0000000000..9bd42f4461 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/update-name.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.updateName( + name: "[NAME]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-password.md b/docs/examples/0.10.x/server-swift/examples/account/update-password.md new file mode 100644 index 0000000000..c84d228aba --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/update-password.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.updatePassword( + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-prefs.md b/docs/examples/0.10.x/server-swift/examples/account/update-prefs.md new file mode 100644 index 0000000000..91f6d3b79c --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/update-prefs.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.updatePrefs( + prefs: + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-recovery.md b/docs/examples/0.10.x/server-swift/examples/account/update-recovery.md new file mode 100644 index 0000000000..b897b20087 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/update-recovery.md @@ -0,0 +1,25 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.updateRecovery( + userId: "[USER_ID]", + secret: "[SECRET]", + password: "password", + passwordAgain: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let token): + print(String(describing: token) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-verification.md b/docs/examples/0.10.x/server-swift/examples/account/update-verification.md new file mode 100644 index 0000000000..4267ca6c0a --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/account/update-verification.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let account = Account(client: client) + account.updateVerification( + userId: "[USER_ID]", + secret: "[SECRET]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let token): + print(String(describing: token) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-browser.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-browser.md new file mode 100644 index 0000000000..f466fa062b --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-browser.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let avatars = Avatars(client: client) + avatars.getBrowser( + code: "aa" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-credit-card.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-credit-card.md new file mode 100644 index 0000000000..69c65353ed --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-credit-card.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let avatars = Avatars(client: client) + avatars.getCreditCard( + code: "amex" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-favicon.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-favicon.md new file mode 100644 index 0000000000..4b2bac24b9 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-favicon.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let avatars = Avatars(client: client) + avatars.getFavicon( + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-flag.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-flag.md new file mode 100644 index 0000000000..d04d1e268d --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-flag.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let avatars = Avatars(client: client) + avatars.getFlag( + code: "af" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-image.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-image.md new file mode 100644 index 0000000000..da9d972483 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-image.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let avatars = Avatars(client: client) + avatars.getImage( + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-initials.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-initials.md new file mode 100644 index 0000000000..7565920709 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-initials.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let avatars = Avatars(client: client) + avatars.getInitials() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-q-r.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-q-r.md new file mode 100644 index 0000000000..b4fccf161b --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-q-r.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let avatars = Avatars(client: client) + avatars.getQR( + text: "[TEXT]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/create-collection.md b/docs/examples/0.10.x/server-swift/examples/database/create-collection.md new file mode 100644 index 0000000000..8fca779f95 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/create-collection.md @@ -0,0 +1,25 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.createCollection( + name: "[NAME]", + read: [], + write: [], + rules: [] + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let collection): + print(String(describing: collection) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/create-document.md b/docs/examples/0.10.x/server-swift/examples/database/create-document.md new file mode 100644 index 0000000000..0d1edc299e --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/create-document.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.createDocument( + collectionId: "[COLLECTION_ID]", + data: + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let document): + print(String(describing: document) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/delete-collection.md b/docs/examples/0.10.x/server-swift/examples/database/delete-collection.md new file mode 100644 index 0000000000..31d73cfc7f --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/delete-collection.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.deleteCollection( + collectionId: "[COLLECTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/delete-document.md b/docs/examples/0.10.x/server-swift/examples/database/delete-document.md new file mode 100644 index 0000000000..f18d6d4f7c --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/delete-document.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.deleteDocument( + collectionId: "[COLLECTION_ID]", + documentId: "[DOCUMENT_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/get-collection.md b/docs/examples/0.10.x/server-swift/examples/database/get-collection.md new file mode 100644 index 0000000000..0ef7d054a0 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/get-collection.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.getCollection( + collectionId: "[COLLECTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let collection): + print(String(describing: collection) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/get-document.md b/docs/examples/0.10.x/server-swift/examples/database/get-document.md new file mode 100644 index 0000000000..1ddf7356f3 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/get-document.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.getDocument( + collectionId: "[COLLECTION_ID]", + documentId: "[DOCUMENT_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let document): + print(String(describing: document) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/list-collections.md b/docs/examples/0.10.x/server-swift/examples/database/list-collections.md new file mode 100644 index 0000000000..1a2a2a92f3 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/list-collections.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.listCollections() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let collectionList): + print(String(describing: collectionList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/list-documents.md b/docs/examples/0.10.x/server-swift/examples/database/list-documents.md new file mode 100644 index 0000000000..88a3153e0d --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/list-documents.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.listDocuments( + collectionId: "[COLLECTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let documentList): + print(String(describing: documentList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/update-collection.md b/docs/examples/0.10.x/server-swift/examples/database/update-collection.md new file mode 100644 index 0000000000..9b730cea56 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/update-collection.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.updateCollection( + collectionId: "[COLLECTION_ID]", + name: "[NAME]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let collection): + print(String(describing: collection) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/update-document.md b/docs/examples/0.10.x/server-swift/examples/database/update-document.md new file mode 100644 index 0000000000..0b5941e4b4 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/database/update-document.md @@ -0,0 +1,24 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let database = Database(client: client) + database.updateDocument( + collectionId: "[COLLECTION_ID]", + documentId: "[DOCUMENT_ID]", + data: + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let document): + print(String(describing: document) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/create-execution.md b/docs/examples/0.10.x/server-swift/examples/functions/create-execution.md new file mode 100644 index 0000000000..9638e7ba7f --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/create-execution.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.createExecution( + functionId: "[FUNCTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let execution): + print(String(describing: execution) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/create-tag.md b/docs/examples/0.10.x/server-swift/examples/functions/create-tag.md new file mode 100644 index 0000000000..69fe51365d --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/create-tag.md @@ -0,0 +1,24 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.createTag( + functionId: "[FUNCTION_ID]", + command: "[COMMAND]", + code: File(name: "image.jpg", buffer: yourByteBuffer) + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let tag): + print(String(describing: tag) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/create.md b/docs/examples/0.10.x/server-swift/examples/functions/create.md new file mode 100644 index 0000000000..74919ae29e --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/create.md @@ -0,0 +1,24 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.create( + name: "[NAME]", + execute: [], + runtime: "dotnet-5.0" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let function): + print(String(describing: function) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/delete-tag.md b/docs/examples/0.10.x/server-swift/examples/functions/delete-tag.md new file mode 100644 index 0000000000..9af5649555 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/delete-tag.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.deleteTag( + functionId: "[FUNCTION_ID]", + tagId: "[TAG_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/delete.md b/docs/examples/0.10.x/server-swift/examples/functions/delete.md new file mode 100644 index 0000000000..e9bbe4eb0c --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/delete.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.delete( + functionId: "[FUNCTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/get-execution.md b/docs/examples/0.10.x/server-swift/examples/functions/get-execution.md new file mode 100644 index 0000000000..01914b8e02 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/get-execution.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.getExecution( + functionId: "[FUNCTION_ID]", + executionId: "[EXECUTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let execution): + print(String(describing: execution) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/get-tag.md b/docs/examples/0.10.x/server-swift/examples/functions/get-tag.md new file mode 100644 index 0000000000..c8cf35cec4 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/get-tag.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.getTag( + functionId: "[FUNCTION_ID]", + tagId: "[TAG_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let tag): + print(String(describing: tag) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/get.md b/docs/examples/0.10.x/server-swift/examples/functions/get.md new file mode 100644 index 0000000000..7229d82ce7 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/get.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.get( + functionId: "[FUNCTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let function): + print(String(describing: function) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/list-executions.md b/docs/examples/0.10.x/server-swift/examples/functions/list-executions.md new file mode 100644 index 0000000000..d0583fa0e4 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/list-executions.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.listExecutions( + functionId: "[FUNCTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let executionList): + print(String(describing: executionList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/list-tags.md b/docs/examples/0.10.x/server-swift/examples/functions/list-tags.md new file mode 100644 index 0000000000..a5feda8e63 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/list-tags.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.listTags( + functionId: "[FUNCTION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let tagList): + print(String(describing: tagList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/list.md b/docs/examples/0.10.x/server-swift/examples/functions/list.md new file mode 100644 index 0000000000..c8dc1bc3f6 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/list.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.list() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let functionList): + print(String(describing: functionList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/update-tag.md b/docs/examples/0.10.x/server-swift/examples/functions/update-tag.md new file mode 100644 index 0000000000..9a8ad9d44c --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/update-tag.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.updateTag( + functionId: "[FUNCTION_ID]", + tag: "[TAG]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let function): + print(String(describing: function) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/update.md b/docs/examples/0.10.x/server-swift/examples/functions/update.md new file mode 100644 index 0000000000..4d8c275891 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/functions/update.md @@ -0,0 +1,24 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let functions = Functions(client: client) + functions.update( + functionId: "[FUNCTION_ID]", + name: "[NAME]", + execute: [] + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let function): + print(String(describing: function) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-anti-virus.md b/docs/examples/0.10.x/server-swift/examples/health/get-anti-virus.md new file mode 100644 index 0000000000..794df35dc8 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-anti-virus.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getAntiVirus() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-cache.md b/docs/examples/0.10.x/server-swift/examples/health/get-cache.md new file mode 100644 index 0000000000..c7437e32d0 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-cache.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getCache() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-d-b.md b/docs/examples/0.10.x/server-swift/examples/health/get-d-b.md new file mode 100644 index 0000000000..1c18c075de --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-d-b.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getDB() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-certificates.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-certificates.md new file mode 100644 index 0000000000..1ddf43296b --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-certificates.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getQueueCertificates() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-functions.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-functions.md new file mode 100644 index 0000000000..923684b6ae --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-functions.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getQueueFunctions() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-logs.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-logs.md new file mode 100644 index 0000000000..2d12723956 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-logs.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getQueueLogs() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-tasks.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-tasks.md new file mode 100644 index 0000000000..861324f4c9 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-tasks.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getQueueTasks() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-usage.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-usage.md new file mode 100644 index 0000000000..6189a6da98 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-usage.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getQueueUsage() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-webhooks.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-webhooks.md new file mode 100644 index 0000000000..6e2a82e93c --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-webhooks.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getQueueWebhooks() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-storage-local.md b/docs/examples/0.10.x/server-swift/examples/health/get-storage-local.md new file mode 100644 index 0000000000..0cb123ae61 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-storage-local.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getStorageLocal() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-time.md b/docs/examples/0.10.x/server-swift/examples/health/get-time.md new file mode 100644 index 0000000000..80498ab519 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get-time.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.getTime() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get.md b/docs/examples/0.10.x/server-swift/examples/health/get.md new file mode 100644 index 0000000000..97d23ac712 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/health/get.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let health = Health(client: client) + health.get() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-continents.md b/docs/examples/0.10.x/server-swift/examples/locale/get-continents.md new file mode 100644 index 0000000000..f3f643be9f --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-continents.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let locale = Locale(client: client) + locale.getContinents() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let continentList): + print(String(describing: continentList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-countries-e-u.md b/docs/examples/0.10.x/server-swift/examples/locale/get-countries-e-u.md new file mode 100644 index 0000000000..7dd15cb866 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-countries-e-u.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let locale = Locale(client: client) + locale.getCountriesEU() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let countryList): + print(String(describing: countryList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-countries-phones.md b/docs/examples/0.10.x/server-swift/examples/locale/get-countries-phones.md new file mode 100644 index 0000000000..425d141538 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-countries-phones.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let locale = Locale(client: client) + locale.getCountriesPhones() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let phoneList): + print(String(describing: phoneList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-countries.md b/docs/examples/0.10.x/server-swift/examples/locale/get-countries.md new file mode 100644 index 0000000000..cc44295c52 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-countries.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let locale = Locale(client: client) + locale.getCountries() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let countryList): + print(String(describing: countryList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-currencies.md b/docs/examples/0.10.x/server-swift/examples/locale/get-currencies.md new file mode 100644 index 0000000000..65754aa1f6 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-currencies.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let locale = Locale(client: client) + locale.getCurrencies() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let currencyList): + print(String(describing: currencyList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-languages.md b/docs/examples/0.10.x/server-swift/examples/locale/get-languages.md new file mode 100644 index 0000000000..439c38f095 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-languages.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let locale = Locale(client: client) + locale.getLanguages() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let languageList): + print(String(describing: languageList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get.md b/docs/examples/0.10.x/server-swift/examples/locale/get.md new file mode 100644 index 0000000000..3bf8838b55 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/locale/get.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let locale = Locale(client: client) + locale.get() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let locale): + print(String(describing: locale) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/create-file.md b/docs/examples/0.10.x/server-swift/examples/storage/create-file.md new file mode 100644 index 0000000000..46c6ad0331 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/storage/create-file.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let storage = Storage(client: client) + storage.createFile( + file: File(name: "image.jpg", buffer: yourByteBuffer) + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let file): + print(String(describing: file) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/delete-file.md b/docs/examples/0.10.x/server-swift/examples/storage/delete-file.md new file mode 100644 index 0000000000..0d76d6e76c --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/storage/delete-file.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let storage = Storage(client: client) + storage.deleteFile( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/get-file-download.md b/docs/examples/0.10.x/server-swift/examples/storage/get-file-download.md new file mode 100644 index 0000000000..0523808e9e --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/storage/get-file-download.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let storage = Storage(client: client) + storage.getFileDownload( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/get-file-preview.md b/docs/examples/0.10.x/server-swift/examples/storage/get-file-preview.md new file mode 100644 index 0000000000..e41077daa8 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/storage/get-file-preview.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let storage = Storage(client: client) + storage.getFilePreview( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/get-file-view.md b/docs/examples/0.10.x/server-swift/examples/storage/get-file-view.md new file mode 100644 index 0000000000..8d77db23a1 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/storage/get-file-view.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let storage = Storage(client: client) + storage.getFileView( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let byteBuffer): + print(String(describing: byteBuffer) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/get-file.md b/docs/examples/0.10.x/server-swift/examples/storage/get-file.md new file mode 100644 index 0000000000..04afe51f57 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/storage/get-file.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let storage = Storage(client: client) + storage.getFile( + fileId: "[FILE_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let file): + print(String(describing: file) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/list-files.md b/docs/examples/0.10.x/server-swift/examples/storage/list-files.md new file mode 100644 index 0000000000..63a8088ea9 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/storage/list-files.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let storage = Storage(client: client) + storage.listFiles() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let fileList): + print(String(describing: fileList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/update-file.md b/docs/examples/0.10.x/server-swift/examples/storage/update-file.md new file mode 100644 index 0000000000..faa46061f8 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/storage/update-file.md @@ -0,0 +1,24 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let storage = Storage(client: client) + storage.updateFile( + fileId: "[FILE_ID]", + read: [], + write: [] + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let file): + print(String(describing: file) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/create-membership.md b/docs/examples/0.10.x/server-swift/examples/teams/create-membership.md new file mode 100644 index 0000000000..5960c859fe --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/create-membership.md @@ -0,0 +1,25 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let teams = Teams(client: client) + teams.createMembership( + teamId: "[TEAM_ID]", + email: "email@example.com", + roles: [], + url: "https://example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let membership): + print(String(describing: membership) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/create.md b/docs/examples/0.10.x/server-swift/examples/teams/create.md new file mode 100644 index 0000000000..28dbeaec81 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/create.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let teams = Teams(client: client) + teams.create( + name: "[NAME]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let team): + print(String(describing: team) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/delete-membership.md b/docs/examples/0.10.x/server-swift/examples/teams/delete-membership.md new file mode 100644 index 0000000000..839698aa71 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/delete-membership.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let teams = Teams(client: client) + teams.deleteMembership( + teamId: "[TEAM_ID]", + membershipId: "[MEMBERSHIP_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/delete.md b/docs/examples/0.10.x/server-swift/examples/teams/delete.md new file mode 100644 index 0000000000..b9128c0f5f --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/delete.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let teams = Teams(client: client) + teams.delete( + teamId: "[TEAM_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/get-memberships.md b/docs/examples/0.10.x/server-swift/examples/teams/get-memberships.md new file mode 100644 index 0000000000..d1cdac1578 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/get-memberships.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let teams = Teams(client: client) + teams.getMemberships( + teamId: "[TEAM_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let membershipList): + print(String(describing: membershipList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/get.md b/docs/examples/0.10.x/server-swift/examples/teams/get.md new file mode 100644 index 0000000000..1378234512 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/get.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let teams = Teams(client: client) + teams.get( + teamId: "[TEAM_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let team): + print(String(describing: team) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/list.md b/docs/examples/0.10.x/server-swift/examples/teams/list.md new file mode 100644 index 0000000000..3dd872d6ad --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/list.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let teams = Teams(client: client) + teams.list() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let teamList): + print(String(describing: teamList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/update-membership-roles.md b/docs/examples/0.10.x/server-swift/examples/teams/update-membership-roles.md new file mode 100644 index 0000000000..db84f3bbd7 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/update-membership-roles.md @@ -0,0 +1,24 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let teams = Teams(client: client) + teams.updateMembershipRoles( + teamId: "[TEAM_ID]", + membershipId: "[MEMBERSHIP_ID]", + roles: [] + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let membership): + print(String(describing: membership) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/update-membership-status.md b/docs/examples/0.10.x/server-swift/examples/teams/update-membership-status.md new file mode 100644 index 0000000000..ffd775bda4 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/update-membership-status.md @@ -0,0 +1,25 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token + + let teams = Teams(client: client) + teams.updateMembershipStatus( + teamId: "[TEAM_ID]", + membershipId: "[MEMBERSHIP_ID]", + userId: "[USER_ID]", + secret: "[SECRET]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let membership): + print(String(describing: membership) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/update.md b/docs/examples/0.10.x/server-swift/examples/teams/update.md new file mode 100644 index 0000000000..0b2e226deb --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/teams/update.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let teams = Teams(client: client) + teams.update( + teamId: "[TEAM_ID]", + name: "[NAME]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let team): + print(String(describing: team) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/create.md b/docs/examples/0.10.x/server-swift/examples/users/create.md new file mode 100644 index 0000000000..2dbd66d012 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/create.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.create( + email: "email@example.com", + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/delete-session.md b/docs/examples/0.10.x/server-swift/examples/users/delete-session.md new file mode 100644 index 0000000000..50b414bc5e --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/delete-session.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.deleteSession( + userId: "[USER_ID]", + sessionId: "[SESSION_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/delete-sessions.md b/docs/examples/0.10.x/server-swift/examples/users/delete-sessions.md new file mode 100644 index 0000000000..c3d4d6863f --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/delete-sessions.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.deleteSessions( + userId: "[USER_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/delete.md b/docs/examples/0.10.x/server-swift/examples/users/delete.md new file mode 100644 index 0000000000..03d7e1438a --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/delete.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.delete( + userId: "[USER_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let ): + print(String(describing: ) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/get-logs.md b/docs/examples/0.10.x/server-swift/examples/users/get-logs.md new file mode 100644 index 0000000000..d870a25b52 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/get-logs.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.getLogs( + userId: "[USER_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let logList): + print(String(describing: logList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/get-prefs.md b/docs/examples/0.10.x/server-swift/examples/users/get-prefs.md new file mode 100644 index 0000000000..eb43e9b978 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/get-prefs.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.getPrefs( + userId: "[USER_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let preferences): + print(String(describing: preferences) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/get-sessions.md b/docs/examples/0.10.x/server-swift/examples/users/get-sessions.md new file mode 100644 index 0000000000..35c6498dab --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/get-sessions.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.getSessions( + userId: "[USER_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let sessionList): + print(String(describing: sessionList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/get.md b/docs/examples/0.10.x/server-swift/examples/users/get.md new file mode 100644 index 0000000000..f4309240d0 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/get.md @@ -0,0 +1,22 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.get( + userId: "[USER_ID]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/list.md b/docs/examples/0.10.x/server-swift/examples/users/list.md new file mode 100644 index 0000000000..2c64ab356b --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/list.md @@ -0,0 +1,20 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.list() { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let userList): + print(String(describing: userList) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-email.md b/docs/examples/0.10.x/server-swift/examples/users/update-email.md new file mode 100644 index 0000000000..28f517eedb --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/update-email.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.updateEmail( + userId: "[USER_ID]", + email: "email@example.com" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-name.md b/docs/examples/0.10.x/server-swift/examples/users/update-name.md new file mode 100644 index 0000000000..bf41f858e0 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/update-name.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.updateName( + userId: "[USER_ID]", + name: "[NAME]" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-password.md b/docs/examples/0.10.x/server-swift/examples/users/update-password.md new file mode 100644 index 0000000000..d23b7985c9 --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/update-password.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.updatePassword( + userId: "[USER_ID]", + password: "password" + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-prefs.md b/docs/examples/0.10.x/server-swift/examples/users/update-prefs.md new file mode 100644 index 0000000000..fd68e297af --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/update-prefs.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.updatePrefs( + userId: "[USER_ID]", + prefs: + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let preferences): + print(String(describing: preferences) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-status.md b/docs/examples/0.10.x/server-swift/examples/users/update-status.md new file mode 100644 index 0000000000..df844bcc1d --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/update-status.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.updateStatus( + userId: "[USER_ID]", + status: 1 + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-verification.md b/docs/examples/0.10.x/server-swift/examples/users/update-verification.md new file mode 100644 index 0000000000..dd1640612a --- /dev/null +++ b/docs/examples/0.10.x/server-swift/examples/users/update-verification.md @@ -0,0 +1,23 @@ +```swift +import Appwrite + +func main() { + let client = Client() + .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint + .setProject("5df5acd0d48c2") // Your project ID + .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key + + let users = Users(client: client) + users.updateVerification( + userId: "[USER_ID]", + emailVerification: xfalse + ) { result in + switch result { + case .failure(let error): + print(error.message) + case .success(let user): + print(String(describing: user) + } + } +} +``` \ No newline at end of file From f975156a283862f52114aae225a8e0beee80f698 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 14 Oct 2021 01:22:42 +1300 Subject: [PATCH 182/257] Prefix apple platforms --- app/config/platforms.php | 54 ++---------------- app/controllers/api/projects.php | 2 +- app/views/console/home/index.phtml | 32 +++++++---- .../images/clients/{ios.png => apple-ios.png} | Bin .../clients/{macos.png => apple-macos.png} | Bin .../clients/{tvos.png => apple-tvos.png} | Bin .../{watchos.png => apple-watchos.png} | Bin 7 files changed, 25 insertions(+), 63 deletions(-) rename public/images/clients/{ios.png => apple-ios.png} (100%) rename public/images/clients/{macos.png => apple-macos.png} (100%) rename public/images/clients/{tvos.png => apple-tvos.png} (100%) rename public/images/clients/{watchos.png => apple-watchos.png} (100%) diff --git a/app/config/platforms.php b/app/config/platforms.php index 219b00a70a..1ae2c7c2de 100644 --- a/app/config/platforms.php +++ b/app/config/platforms.php @@ -77,56 +77,9 @@ return [ 'gitUserName' => 'appwrite', ], [ - 'key' => 'ios', - 'name' => 'iOS', - 'url' => 'https://github.com/appwrite/sdk-for-apple', - 'package' => 'https://github.com/appwrite/sdk-for-apple', - 'enabled' => true, - 'beta' => false, - 'dev' => true, - 'hidden' => false, - 'family' => APP_PLATFORM_CLIENT, - 'prism' => 'swift', - 'source' => \realpath(__DIR__ . '/../sdks/client-apple'), - 'gitUrl' => 'git@github.com:appwrite/sdk-for-apple.git', - 'gitRepoName' => 'sdk-for-apple', - 'gitUserName' => 'appwrite', - ], - [ - 'key' => 'macos', - 'name' => 'macOS', - 'url' => 'https://github.com/appwrite/sdk-for-apple', - 'package' => 'https://github.com/appwrite/sdk-for-apple', - 'enabled' => true, - 'beta' => false, - 'dev' => true, - 'hidden' => false, - 'family' => APP_PLATFORM_CLIENT, - 'prism' => 'swift', - 'source' => \realpath(__DIR__ . '/../sdks/client-apple'), - 'gitUrl' => 'git@github.com:appwrite/sdk-for-apple.git', - 'gitRepoName' => 'sdk-for-apple', - 'gitUserName' => 'appwrite', - ], - [ - 'key' => 'watchos', - 'name' => 'watchOS', - 'url' => 'https://github.com/appwrite/sdk-for-apple', - 'package' => 'https://github.com/appwrite/sdk-for-apple', - 'enabled' => true, - 'beta' => false, - 'dev' => true, - 'hidden' => false, - 'family' => APP_PLATFORM_CLIENT, - 'prism' => 'swift', - 'source' => \realpath(__DIR__ . '/../sdks/client-apple'), - 'gitUrl' => 'git@github.com:appwrite/sdk-for-apple.git', - 'gitRepoName' => 'sdk-for-apple', - 'gitUserName' => 'appwrite', - ], - [ - 'key' => 'tvos', - 'name' => 'tvOS', + 'key' => 'apple', + 'name' => 'Apple', + 'version' => '0.0.1', 'url' => 'https://github.com/appwrite/sdk-for-apple', 'package' => 'https://github.com/appwrite/sdk-for-apple', 'enabled' => true, @@ -422,6 +375,7 @@ return [ [ 'key' => 'swift', 'name' => 'Swift', + 'version' => '0.0.1', 'url' => 'https://github.com/appwrite/sdk-for-swift', 'package' => 'https://github.com/appwrite/sdk-for-swift', 'enabled' => true, diff --git a/app/controllers/api/projects.php b/app/controllers/api/projects.php index 996c999674..ba21081031 100644 --- a/app/controllers/api/projects.php +++ b/app/controllers/api/projects.php @@ -1314,7 +1314,7 @@ App::post('/v1/projects/:projectId/platforms') ->label('sdk.response.type', Response::CONTENT_TYPE_JSON) ->label('sdk.response.model', Response::MODEL_PLATFORM) ->param('projectId', null, new UID(), 'Project unique ID.') - ->param('type', null, new WhiteList(['web', 'flutter-ios', 'flutter-android', 'flutter-linux', 'flutter-macos', 'flutter-windows', 'ios', 'macos', 'watchos', 'tvos', 'android', 'unity'], true), 'Platform type.') + ->param('type', null, new WhiteList(['web', 'flutter-ios', 'flutter-android', 'flutter-linux', 'flutter-macos', 'flutter-windows', 'apple-ios', 'apple-macos', 'apple-watchos', 'apple-tvos', 'android', 'unity'], true), 'Platform type.') ->param('name', null, new Text(128), 'Platform name. Max length: 128 chars.') ->param('key', '', new Text(256), 'Package name for Android or bundle ID for iOS or macOS. Max length: 256 chars.', true) ->param('store', '', new Text(256), 'App store or Google Play store ID. Max length: 256 chars.', true) diff --git a/app/views/console/home/index.phtml b/app/views/console/home/index.phtml index d9e047293c..aa2cfc9877 100644 --- a/app/views/console/home/index.phtml +++ b/app/views/console/home/index.phtml @@ -243,16 +243,16 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true);
  • - +
  • - +
  • - +
  • - +
  • @@ -395,7 +395,7 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true); data-failure-param-alert-classname="error"> - + @@ -431,7 +431,7 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true); data-failure-param-alert-classname="error"> - + @@ -467,7 +467,7 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true); data-failure-param-alert-classname="error"> - + @@ -503,7 +503,7 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true); data-failure-param-alert-classname="error"> - + @@ -745,7 +745,7 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true); - + @@ -787,7 +787,7 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true); - - \ No newline at end of file + + + + + diff --git a/public/images/clients/ios.png b/public/images/clients/apple-ios.png similarity index 100% rename from public/images/clients/ios.png rename to public/images/clients/apple-ios.png diff --git a/public/images/clients/macos.png b/public/images/clients/apple-macos.png similarity index 100% rename from public/images/clients/macos.png rename to public/images/clients/apple-macos.png diff --git a/public/images/clients/tvos.png b/public/images/clients/apple-tvos.png similarity index 100% rename from public/images/clients/tvos.png rename to public/images/clients/apple-tvos.png diff --git a/public/images/clients/watchos.png b/public/images/clients/apple-watchos.png similarity index 100% rename from public/images/clients/watchos.png rename to public/images/clients/apple-watchos.png From 1dab8b203c9890949fe6770d60f881c42cde0f62 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 14 Oct 2021 01:23:03 +1300 Subject: [PATCH 183/257] Temp update to swift template sdk-generator --- composer.json | 2 +- composer.lock | 20 +++++++++++--------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 8a7b1570f5..4490c0fc4c 100644 --- a/composer.json +++ b/composer.json @@ -64,7 +64,7 @@ "slickdeals/statsd": "3.1.0" }, "require-dev": { - "appwrite/sdk-generator": "0.15.2", + "appwrite/sdk-generator": "dev-feat-swift-templates", "phpunit/phpunit": "9.5.6", "swoole/ide-helper": "4.6.7", "textalk/websocket": "1.5.2", diff --git a/composer.lock b/composer.lock index 9d2ef6169b..106fb17a8a 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "984640c83bc02c3253a0f38b5f772011", + "content-hash": "609f18987802844104dc4fe1bed1b4e7", "packages": [ { "name": "adhocore/jwt", @@ -2516,16 +2516,16 @@ }, { "name": "appwrite/sdk-generator", - "version": "0.15.2", + "version": "dev-feat-swift-templates", "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "f42e70737d3b63fb8440111022c9509529a16479" + "reference": "d6f07d956f1ebfc8c582454be851c79afe76b3f0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/f42e70737d3b63fb8440111022c9509529a16479", - "reference": "f42e70737d3b63fb8440111022c9509529a16479", + "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/d6f07d956f1ebfc8c582454be851c79afe76b3f0", + "reference": "d6f07d956f1ebfc8c582454be851c79afe76b3f0", "shasum": "" }, "require": { @@ -2559,9 +2559,9 @@ "description": "Appwrite PHP library for generating API SDKs for multiple programming languages and platforms", "support": { "issues": "https://github.com/appwrite/sdk-generator/issues", - "source": "https://github.com/appwrite/sdk-generator/tree/0.15.2" + "source": "https://github.com/appwrite/sdk-generator/tree/feat-swift-templates" }, - "time": "2021-09-24T16:14:17+00:00" + "time": "2021-10-13T10:56:04+00:00" }, { "name": "composer/package-versions-deprecated", @@ -6230,7 +6230,9 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": { + "appwrite/sdk-generator": 20 + }, "prefer-stable": false, "prefer-lowest": false, "platform": { @@ -6252,5 +6254,5 @@ "platform-overrides": { "php": "8.0" }, - "plugin-api-version": "2.0.0" + "plugin-api-version": "2.1.0" } From 90904ab67647f4006355a94b68501268363e3a36 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 14 Oct 2021 02:44:52 +1300 Subject: [PATCH 184/257] Add e2e Apple platform tests --- .../Projects/ProjectsConsoleClientTest.php | 304 +++++++++++++++++- 1 file changed, 302 insertions(+), 2 deletions(-) diff --git a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php index 07042f8b78..32099b1791 100644 --- a/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php +++ b/tests/e2e/Services/Projects/ProjectsConsoleClientTest.php @@ -1399,6 +1399,90 @@ class ProjectsConsoleClientTest extends Scope $data = array_merge($data, ['platformFultterAndroidId' => $response['body']['$id']]); + $response = $this->client->call(Client::METHOD_POST, '/projects/'.$id.'/platforms', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'type' => 'apple-ios', + 'name' => 'iOS App', + 'key' => 'com.example.ios', + 'store' => '', + 'hostname' => '', + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals('apple-ios', $response['body']['type']); + $this->assertEquals('iOS App', $response['body']['name']); + $this->assertEquals('com.example.ios', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $data = array_merge($data, ['platformAppleIosId' => $response['body']['$id']]); + + $response = $this->client->call(Client::METHOD_POST, '/projects/'.$id.'/platforms', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'type' => 'apple-macos', + 'name' => 'macOS App', + 'key' => 'com.example.macos', + 'store' => '', + 'hostname' => '', + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals('apple-macos', $response['body']['type']); + $this->assertEquals('macOS App', $response['body']['name']); + $this->assertEquals('com.example.macos', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $data = array_merge($data, ['platformAppleMacOsId' => $response['body']['$id']]); + + $response = $this->client->call(Client::METHOD_POST, '/projects/'.$id.'/platforms', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'type' => 'apple-watchos', + 'name' => 'watchOS App', + 'key' => 'com.example.watchos', + 'store' => '', + 'hostname' => '', + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals('apple-watchos', $response['body']['type']); + $this->assertEquals('watchOS App', $response['body']['name']); + $this->assertEquals('com.example.watchos', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $data = array_merge($data, ['platformAppleWatchOsId' => $response['body']['$id']]); + + $response = $this->client->call(Client::METHOD_POST, '/projects/'.$id.'/platforms', array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'type' => 'apple-tvos', + 'name' => 'tvOS App', + 'key' => 'com.example.tvos', + 'store' => '', + 'hostname' => '', + ]); + + $this->assertEquals(201, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals('apple-tvos', $response['body']['type']); + $this->assertEquals('tvOS App', $response['body']['name']); + $this->assertEquals('com.example.tvos', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $data = array_merge($data, ['platformAppleTvOsId' => $response['body']['$id']]); + /** * Test for FAILURE */ @@ -1444,7 +1528,7 @@ class ProjectsConsoleClientTest extends Scope ], $this->getHeaders()), []); $this->assertEquals(200, $response['headers']['status-code']); - $this->assertEquals(3, $response['body']['sum']); + $this->assertEquals(7, $response['body']['sum']); /** * Test for FAILURE @@ -1507,7 +1591,71 @@ class ProjectsConsoleClientTest extends Scope $this->assertEquals('com.example.android', $response['body']['key']); $this->assertEquals('', $response['body']['store']); $this->assertEquals('', $response['body']['hostname']); - + + $platformAppleIosId = $data['platformAppleIosId'] ?? ''; + + $response = $this->client->call(Client::METHOD_GET, '/projects/'.$id.'/platforms/'.$platformAppleIosId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals($platformAppleIosId, $response['body']['$id']); + $this->assertEquals('apple-ios', $response['body']['type']); + $this->assertEquals('iOS App', $response['body']['name']); + $this->assertEquals('com.example.ios', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $platformAppleMacOsId = $data['platformAppleMacOsId'] ?? ''; + + $response = $this->client->call(Client::METHOD_GET, '/projects/'.$id.'/platforms/'.$platformAppleMacOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals($platformAppleMacOsId, $response['body']['$id']); + $this->assertEquals('apple-macos', $response['body']['type']); + $this->assertEquals('macOS App', $response['body']['name']); + $this->assertEquals('com.example.macos', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $platformAppleWatchOsId = $data['platformAppleWatchOsId'] ?? ''; + + $response = $this->client->call(Client::METHOD_GET, '/projects/'.$id.'/platforms/'.$platformAppleWatchOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals($platformAppleWatchOsId, $response['body']['$id']); + $this->assertEquals('apple-watchos', $response['body']['type']); + $this->assertEquals('watchOS App', $response['body']['name']); + $this->assertEquals('com.example.watchos', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $platformAppleTvOsId = $data['platformAppleTvOsId'] ?? ''; + + $response = $this->client->call(Client::METHOD_GET, '/projects/'.$id.'/platforms/'.$platformAppleTvOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals($platformAppleTvOsId, $response['body']['$id']); + $this->assertEquals('apple-tvos', $response['body']['type']); + $this->assertEquals('tvOS App', $response['body']['name']); + $this->assertEquals('com.example.tvos', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + /** * Test for FAILURE */ @@ -1591,6 +1739,90 @@ class ProjectsConsoleClientTest extends Scope $this->assertEquals('', $response['body']['store']); $this->assertEquals('', $response['body']['hostname']); + $platformAppleIosId = $data['platformAppleIosId'] ?? ''; + + $response = $this->client->call(Client::METHOD_PUT, '/projects/'.$id.'/platforms/'.$platformAppleIosId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'name' => 'iOS App 2', + 'key' => 'com.example.ios2', + 'store' => '', + 'hostname' => '', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals($platformAppleIosId, $response['body']['$id']); + $this->assertEquals('apple-ios', $response['body']['type']); + $this->assertEquals('iOS App 2', $response['body']['name']); + $this->assertEquals('com.example.ios2', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $platformAppleMacOsId = $data['platformAppleMacOsId'] ?? ''; + + $response = $this->client->call(Client::METHOD_PUT, '/projects/'.$id.'/platforms/'.$platformAppleMacOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'name' => 'macOS App 2', + 'key' => 'com.example.macos2', + 'store' => '', + 'hostname' => '', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals($platformAppleMacOsId, $response['body']['$id']); + $this->assertEquals('apple-macos', $response['body']['type']); + $this->assertEquals('macOS App 2', $response['body']['name']); + $this->assertEquals('com.example.macos2', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $platformAppleWatchOsId = $data['platformAppleWatchOsId'] ?? ''; + + $response = $this->client->call(Client::METHOD_PUT, '/projects/'.$id.'/platforms/'.$platformAppleWatchOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'name' => 'watchOS App 2', + 'key' => 'com.example.watchos2', + 'store' => '', + 'hostname' => '', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals($platformAppleWatchOsId, $response['body']['$id']); + $this->assertEquals('apple-watchos', $response['body']['type']); + $this->assertEquals('watchOS App 2', $response['body']['name']); + $this->assertEquals('com.example.watchos2', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + + $platformAppleTvOsId = $data['platformAppleTvOsId'] ?? ''; + + $response = $this->client->call(Client::METHOD_PUT, '/projects/'.$id.'/platforms/'.$platformAppleTvOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), [ + 'name' => 'tvOS App 2', + 'key' => 'com.example.tvos2', + 'store' => '', + 'hostname' => '', + ]); + + $this->assertEquals(200, $response['headers']['status-code']); + $this->assertNotEmpty($response['body']['$id']); + $this->assertEquals($platformAppleTvOsId, $response['body']['$id']); + $this->assertEquals('apple-tvos', $response['body']['type']); + $this->assertEquals('tvOS App 2', $response['body']['name']); + $this->assertEquals('com.example.tvos2', $response['body']['key']); + $this->assertEquals('', $response['body']['store']); + $this->assertEquals('', $response['body']['hostname']); + /** * Test for FAILURE */ @@ -1656,6 +1888,74 @@ class ProjectsConsoleClientTest extends Scope $this->assertEquals(404, $response['headers']['status-code']); + $platformAppleIosId = $data['platformAppleIosId'] ?? ''; + + $response = $this->client->call(Client::METHOD_DELETE, '/projects/'.$id.'/platforms/'.$platformAppleIosId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/projects/'.$id.'/platforms/'.$platformAppleIosId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(404, $response['headers']['status-code']); + + $platformAppleMacOsId = $data['platformAppleMacOsId'] ?? ''; + + $response = $this->client->call(Client::METHOD_DELETE, '/projects/'.$id.'/platforms/'.$platformAppleMacOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/projects/'.$id.'/platforms/'.$platformAppleMacOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(404, $response['headers']['status-code']); + + $platformAppleWatchOsId = $data['platformAppleWatchOsId'] ?? ''; + + $response = $this->client->call(Client::METHOD_DELETE, '/projects/'.$id.'/platforms/'.$platformAppleWatchOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/projects/'.$id.'/platforms/'.$platformAppleWatchOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(404, $response['headers']['status-code']); + + $platformAppleTvOsId = $data['platformAppleTvOsId'] ?? ''; + + $response = $this->client->call(Client::METHOD_DELETE, '/projects/'.$id.'/platforms/'.$platformAppleTvOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(204, $response['headers']['status-code']); + $this->assertEmpty($response['body']); + + $response = $this->client->call(Client::METHOD_GET, '/projects/'.$id.'/platforms/'.$platformAppleTvOsId, array_merge([ + 'content-type' => 'application/json', + 'x-appwrite-project' => $this->getProject()['$id'], + ], $this->getHeaders()), []); + + $this->assertEquals(404, $response['headers']['status-code']); + /** * Test for FAILURE */ From a066e08c9b03ec1d7118eb8425bd47fa5015eda0 Mon Sep 17 00:00:00 2001 From: Jessica Erasmus Date: Wed, 13 Oct 2021 15:09:39 +0000 Subject: [PATCH 185/257] Translate missing Afrikaans terms --- app/config/locale/translations/af.json | 48 +++++++++++++------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/app/config/locale/translations/af.json b/app/config/locale/translations/af.json index 6d8f5273db..d3bccdadae 100644 --- a/app/config/locale/translations/af.json +++ b/app/config/locale/translations/af.json @@ -3,30 +3,30 @@ "settings.locale": "af", "settings.direction": "ltr", "emails.sender": "%s span", - "emails.verification.subject": "", - "emails.verification.hello": "", - "emails.verification.body": "", - "emails.verification.footer": "", - "emails.verification.thanks": "", - "emails.verification.signature": "", - "emails.magicSession.subject": "", - "emails.magicSession.hello": "", - "emails.magicSession.body": "", - "emails.magicSession.footer": "", - "emails.magicSession.thanks": "", - "emails.magicSession.signature": "", - "emails.recovery.subject": "", - "emails.recovery.hello": "", - "emails.recovery.body": "", - "emails.recovery.footer": "", - "emails.recovery.thanks": "", - "emails.recovery.signature": "", - "emails.invitation.subject": "", - "emails.invitation.hello": "", - "emails.invitation.body": "", - "emails.invitation.footer": "", - "emails.invitation.thanks": "", - "emails.invitation.signature": "", + "emails.verification.subject": "Rekening Bevestiging", + "emails.verification.hello": "Goeie dag {{name}}", + "emails.verification.body": "Volg hierdie skakel om u e-pos adres te bevestig.", + "emails.verification.footer": "Ignoreer gerus hierdie boodskap as u nie die versoek gestuur het om u adres te bevestig nie.", + "emails.verification.thanks": "Baie dankie", + "emails.verification.signature": "Die {{project}} span", + "emails.magicSession.subject": "Teken aan", + "emails.magicSession.hello": "Goeie dag,", + "emails.magicSession.body": "Volg hierdie skakel om in te teken.", + "emails.magicSession.footer": "Ignoreer gerus hierdie boodskap as u nie die versoek gestuur het om met die' adres in te teken nie.", + "emails.magicSession.thanks": "Baie dankie", + "emails.magicSession.signature": "Die {{project}} span", + "emails.recovery.subject": "Herstel Wagwoord", + "emails.recovery.hello": "Goeie dag {{name}}", + "emails.recovery.body": "Volg hierdie skakel om u {{project}} wagwoord te herstel.", + "emails.recovery.footer": "Ignoreer gerus hierdie boodskap as u nie die versoek gestuur het om u wagwoord te herstel nie.", + "emails.recovery.thanks": "Baie dankie", + "emails.recovery.signature": "Die {{project}} span", + "emails.invitation.subject": "Uitnodiging om by die %s span aan te sluit by %s", + "emails.invitation.hello": "Goeie dag,", + "emails.invitation.body": "Hierdie boodskap is aan u gestuur omdat {{owner}} u uitnooi om 'n lid van die {{team}} groep by die {{project}} projek te wees.", + "emails.invitation.footer": "As u nie belang stel nie, kan u gerus hierdie boodskap ignoreer.", + "emails.invitation.thanks": "Baie dankie", + "emails.invitation.signature": "Die {{project}} span", "locale.country.unknown": "Onbekend", "countries.af": "Afghanistan", "countries.ao": "Angola", From e94130dd27bbe4bd0374537612c6948d97760189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?MishManners=C2=AE=E2=84=A2?= <36594527+mishmanners@users.noreply.github.com> Date: Thu, 14 Oct 2021 12:33:14 +1100 Subject: [PATCH 186/257] Email add MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updated email to include the full email path, as well as direct link that will open in the users' default mail software. This makes it easier/quicker to contact you 😄 --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 945229c51c..01aa3d2ede 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -395,7 +395,7 @@ Pull requests are great, but there are many other areas where you can help Appwr ### Blogging & Speaking -Blogging, speaking about, or creating tutorials about one of Appwrite’s many features. Mention [@appwrite_io](https://twitter.com/appwrite_io) on Twitter and/or email team [at] appwrite [dot] io so we can give pointers and tips and help you spread the word by promoting your content on the different Appwrite communication channels. Please add your blog posts and videos of talks to our [Awesome Appwrite](https://github.com/appwrite/awesome-appwrite) repo on GitHub. +Blogging, speaking about, or creating tutorials about one of Appwrite’s many features. Mention [@appwrite_io](https://twitter.com/appwrite_io) on Twitter and/or [email team@appwrite.io](mailto:team@appwrite.io) so we can give pointers and tips and help you spread the word by promoting your content on the different Appwrite communication channels. Please add your blog posts and videos of talks to our [Awesome Appwrite](https://github.com/appwrite/awesome-appwrite) repo on GitHub. ### Presenting at Meetups From e5ba26274213ef30ebc922433c869cb02c18397a Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 14 Oct 2021 23:07:14 +1300 Subject: [PATCH 187/257] Update Apple + Swift examples --- composer.lock | 4 ++-- .../client-apple/examples/account/create-anonymous-session.md | 4 +--- .../0.10.x/client-apple/examples/account/create-j-w-t.md | 4 +--- .../examples/account/create-magic-u-r-l-session.md | 4 +--- .../client-apple/examples/account/create-o-auth2session.md | 4 +--- .../0.10.x/client-apple/examples/account/create-recovery.md | 4 +--- .../0.10.x/client-apple/examples/account/create-session.md | 4 +--- .../client-apple/examples/account/create-verification.md | 4 +--- docs/examples/0.10.x/client-apple/examples/account/create.md | 4 +--- .../0.10.x/client-apple/examples/account/delete-session.md | 4 +--- .../0.10.x/client-apple/examples/account/delete-sessions.md | 4 +--- docs/examples/0.10.x/client-apple/examples/account/delete.md | 4 +--- .../examples/0.10.x/client-apple/examples/account/get-logs.md | 4 +--- .../0.10.x/client-apple/examples/account/get-prefs.md | 4 +--- .../0.10.x/client-apple/examples/account/get-session.md | 4 +--- .../0.10.x/client-apple/examples/account/get-sessions.md | 4 +--- docs/examples/0.10.x/client-apple/examples/account/get.md | 4 +--- .../0.10.x/client-apple/examples/account/update-email.md | 4 +--- .../examples/account/update-magic-u-r-l-session.md | 4 +--- .../0.10.x/client-apple/examples/account/update-name.md | 4 +--- .../0.10.x/client-apple/examples/account/update-password.md | 4 +--- .../0.10.x/client-apple/examples/account/update-prefs.md | 4 +--- .../0.10.x/client-apple/examples/account/update-recovery.md | 4 +--- .../client-apple/examples/account/update-verification.md | 4 +--- .../0.10.x/client-apple/examples/avatars/get-browser.md | 4 +--- .../0.10.x/client-apple/examples/avatars/get-credit-card.md | 4 +--- .../0.10.x/client-apple/examples/avatars/get-favicon.md | 4 +--- .../examples/0.10.x/client-apple/examples/avatars/get-flag.md | 4 +--- .../0.10.x/client-apple/examples/avatars/get-image.md | 4 +--- .../0.10.x/client-apple/examples/avatars/get-initials.md | 4 +--- docs/examples/0.10.x/client-apple/examples/avatars/get-q-r.md | 4 +--- .../0.10.x/client-apple/examples/database/create-document.md | 4 +--- .../0.10.x/client-apple/examples/database/delete-document.md | 4 +--- .../0.10.x/client-apple/examples/database/get-document.md | 4 +--- .../0.10.x/client-apple/examples/database/list-documents.md | 4 +--- .../0.10.x/client-apple/examples/database/update-document.md | 4 +--- .../client-apple/examples/functions/create-execution.md | 4 +--- .../0.10.x/client-apple/examples/functions/get-execution.md | 4 +--- .../0.10.x/client-apple/examples/functions/list-executions.md | 4 +--- .../0.10.x/client-apple/examples/locale/get-continents.md | 4 +--- .../0.10.x/client-apple/examples/locale/get-countries-e-u.md | 4 +--- .../client-apple/examples/locale/get-countries-phones.md | 4 +--- .../0.10.x/client-apple/examples/locale/get-countries.md | 4 +--- .../0.10.x/client-apple/examples/locale/get-currencies.md | 4 +--- .../0.10.x/client-apple/examples/locale/get-languages.md | 4 +--- docs/examples/0.10.x/client-apple/examples/locale/get.md | 4 +--- .../0.10.x/client-apple/examples/storage/create-file.md | 4 +--- .../0.10.x/client-apple/examples/storage/delete-file.md | 4 +--- .../0.10.x/client-apple/examples/storage/get-file-download.md | 4 +--- .../0.10.x/client-apple/examples/storage/get-file-preview.md | 4 +--- .../0.10.x/client-apple/examples/storage/get-file-view.md | 4 +--- .../examples/0.10.x/client-apple/examples/storage/get-file.md | 4 +--- .../0.10.x/client-apple/examples/storage/list-files.md | 4 +--- .../0.10.x/client-apple/examples/storage/update-file.md | 4 +--- .../0.10.x/client-apple/examples/teams/create-membership.md | 4 +--- docs/examples/0.10.x/client-apple/examples/teams/create.md | 4 +--- .../0.10.x/client-apple/examples/teams/delete-membership.md | 4 +--- docs/examples/0.10.x/client-apple/examples/teams/delete.md | 4 +--- .../0.10.x/client-apple/examples/teams/get-memberships.md | 4 +--- docs/examples/0.10.x/client-apple/examples/teams/get.md | 4 +--- docs/examples/0.10.x/client-apple/examples/teams/list.md | 4 +--- .../client-apple/examples/teams/update-membership-roles.md | 4 +--- .../client-apple/examples/teams/update-membership-status.md | 4 +--- docs/examples/0.10.x/client-apple/examples/teams/update.md | 4 +--- .../0.10.x/server-swift/examples/account/create-recovery.md | 4 +--- .../server-swift/examples/account/create-verification.md | 4 +--- .../0.10.x/server-swift/examples/account/delete-session.md | 4 +--- .../0.10.x/server-swift/examples/account/delete-sessions.md | 4 +--- docs/examples/0.10.x/server-swift/examples/account/delete.md | 4 +--- .../examples/0.10.x/server-swift/examples/account/get-logs.md | 4 +--- .../0.10.x/server-swift/examples/account/get-prefs.md | 4 +--- .../0.10.x/server-swift/examples/account/get-session.md | 4 +--- .../0.10.x/server-swift/examples/account/get-sessions.md | 4 +--- docs/examples/0.10.x/server-swift/examples/account/get.md | 4 +--- .../0.10.x/server-swift/examples/account/update-email.md | 4 +--- .../0.10.x/server-swift/examples/account/update-name.md | 4 +--- .../0.10.x/server-swift/examples/account/update-password.md | 4 +--- .../0.10.x/server-swift/examples/account/update-prefs.md | 4 +--- .../0.10.x/server-swift/examples/account/update-recovery.md | 4 +--- .../server-swift/examples/account/update-verification.md | 4 +--- .../0.10.x/server-swift/examples/avatars/get-browser.md | 4 +--- .../0.10.x/server-swift/examples/avatars/get-credit-card.md | 4 +--- .../0.10.x/server-swift/examples/avatars/get-favicon.md | 4 +--- .../examples/0.10.x/server-swift/examples/avatars/get-flag.md | 4 +--- .../0.10.x/server-swift/examples/avatars/get-image.md | 4 +--- .../0.10.x/server-swift/examples/avatars/get-initials.md | 4 +--- docs/examples/0.10.x/server-swift/examples/avatars/get-q-r.md | 4 +--- .../server-swift/examples/database/create-collection.md | 4 +--- .../0.10.x/server-swift/examples/database/create-document.md | 4 +--- .../server-swift/examples/database/delete-collection.md | 4 +--- .../0.10.x/server-swift/examples/database/delete-document.md | 4 +--- .../0.10.x/server-swift/examples/database/get-collection.md | 4 +--- .../0.10.x/server-swift/examples/database/get-document.md | 4 +--- .../0.10.x/server-swift/examples/database/list-collections.md | 4 +--- .../0.10.x/server-swift/examples/database/list-documents.md | 4 +--- .../server-swift/examples/database/update-collection.md | 4 +--- .../0.10.x/server-swift/examples/database/update-document.md | 4 +--- .../server-swift/examples/functions/create-execution.md | 4 +--- .../0.10.x/server-swift/examples/functions/create-tag.md | 4 +--- .../examples/0.10.x/server-swift/examples/functions/create.md | 4 +--- .../0.10.x/server-swift/examples/functions/delete-tag.md | 4 +--- .../examples/0.10.x/server-swift/examples/functions/delete.md | 4 +--- .../0.10.x/server-swift/examples/functions/get-execution.md | 4 +--- .../0.10.x/server-swift/examples/functions/get-tag.md | 4 +--- docs/examples/0.10.x/server-swift/examples/functions/get.md | 4 +--- .../0.10.x/server-swift/examples/functions/list-executions.md | 4 +--- .../0.10.x/server-swift/examples/functions/list-tags.md | 4 +--- docs/examples/0.10.x/server-swift/examples/functions/list.md | 4 +--- .../0.10.x/server-swift/examples/functions/update-tag.md | 4 +--- .../examples/0.10.x/server-swift/examples/functions/update.md | 4 +--- .../0.10.x/server-swift/examples/health/get-anti-virus.md | 4 +--- .../examples/0.10.x/server-swift/examples/health/get-cache.md | 4 +--- docs/examples/0.10.x/server-swift/examples/health/get-d-b.md | 4 +--- .../server-swift/examples/health/get-queue-certificates.md | 4 +--- .../server-swift/examples/health/get-queue-functions.md | 4 +--- .../0.10.x/server-swift/examples/health/get-queue-logs.md | 4 +--- .../0.10.x/server-swift/examples/health/get-queue-tasks.md | 4 +--- .../0.10.x/server-swift/examples/health/get-queue-usage.md | 4 +--- .../0.10.x/server-swift/examples/health/get-queue-webhooks.md | 4 +--- .../0.10.x/server-swift/examples/health/get-storage-local.md | 4 +--- docs/examples/0.10.x/server-swift/examples/health/get-time.md | 4 +--- docs/examples/0.10.x/server-swift/examples/health/get.md | 4 +--- .../0.10.x/server-swift/examples/locale/get-continents.md | 4 +--- .../0.10.x/server-swift/examples/locale/get-countries-e-u.md | 4 +--- .../server-swift/examples/locale/get-countries-phones.md | 4 +--- .../0.10.x/server-swift/examples/locale/get-countries.md | 4 +--- .../0.10.x/server-swift/examples/locale/get-currencies.md | 4 +--- .../0.10.x/server-swift/examples/locale/get-languages.md | 4 +--- docs/examples/0.10.x/server-swift/examples/locale/get.md | 4 +--- .../0.10.x/server-swift/examples/storage/create-file.md | 4 +--- .../0.10.x/server-swift/examples/storage/delete-file.md | 4 +--- .../0.10.x/server-swift/examples/storage/get-file-download.md | 4 +--- .../0.10.x/server-swift/examples/storage/get-file-preview.md | 4 +--- .../0.10.x/server-swift/examples/storage/get-file-view.md | 4 +--- .../examples/0.10.x/server-swift/examples/storage/get-file.md | 4 +--- .../0.10.x/server-swift/examples/storage/list-files.md | 4 +--- .../0.10.x/server-swift/examples/storage/update-file.md | 4 +--- .../0.10.x/server-swift/examples/teams/create-membership.md | 4 +--- docs/examples/0.10.x/server-swift/examples/teams/create.md | 4 +--- .../0.10.x/server-swift/examples/teams/delete-membership.md | 4 +--- docs/examples/0.10.x/server-swift/examples/teams/delete.md | 4 +--- .../0.10.x/server-swift/examples/teams/get-memberships.md | 4 +--- docs/examples/0.10.x/server-swift/examples/teams/get.md | 4 +--- docs/examples/0.10.x/server-swift/examples/teams/list.md | 4 +--- .../server-swift/examples/teams/update-membership-roles.md | 4 +--- .../server-swift/examples/teams/update-membership-status.md | 4 +--- docs/examples/0.10.x/server-swift/examples/teams/update.md | 4 +--- docs/examples/0.10.x/server-swift/examples/users/create.md | 4 +--- .../0.10.x/server-swift/examples/users/delete-session.md | 4 +--- .../0.10.x/server-swift/examples/users/delete-sessions.md | 4 +--- docs/examples/0.10.x/server-swift/examples/users/delete.md | 4 +--- docs/examples/0.10.x/server-swift/examples/users/get-logs.md | 4 +--- docs/examples/0.10.x/server-swift/examples/users/get-prefs.md | 4 +--- .../0.10.x/server-swift/examples/users/get-sessions.md | 4 +--- docs/examples/0.10.x/server-swift/examples/users/get.md | 4 +--- docs/examples/0.10.x/server-swift/examples/users/list.md | 4 +--- .../0.10.x/server-swift/examples/users/update-email.md | 4 +--- .../0.10.x/server-swift/examples/users/update-name.md | 4 +--- .../0.10.x/server-swift/examples/users/update-password.md | 4 +--- .../0.10.x/server-swift/examples/users/update-prefs.md | 4 +--- .../0.10.x/server-swift/examples/users/update-status.md | 4 +--- .../0.10.x/server-swift/examples/users/update-verification.md | 4 +--- 162 files changed, 163 insertions(+), 485 deletions(-) diff --git a/composer.lock b/composer.lock index 106fb17a8a..c6bbaf336a 100644 --- a/composer.lock +++ b/composer.lock @@ -2520,12 +2520,12 @@ "source": { "type": "git", "url": "https://github.com/appwrite/sdk-generator.git", - "reference": "d6f07d956f1ebfc8c582454be851c79afe76b3f0" + "reference": "fc9d0a9125590871f233ebd5cf0441f1b3e387bd" }, "dist": { "type": "zip", "url": "https://api.github.com/repos/appwrite/sdk-generator/zipball/d6f07d956f1ebfc8c582454be851c79afe76b3f0", - "reference": "d6f07d956f1ebfc8c582454be851c79afe76b3f0", + "reference": "fc9d0a9125590871f233ebd5cf0441f1b3e387bd", "shasum": "" }, "require": { diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-anonymous-session.md b/docs/examples/0.10.x/client-apple/examples/account/create-anonymous-session.md index b195ff5465..d6bb1918c4 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/create-anonymous-session.md +++ b/docs/examples/0.10.x/client-apple/examples/account/create-anonymous-session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.createAnonymousSession() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-j-w-t.md b/docs/examples/0.10.x/client-apple/examples/account/create-j-w-t.md index f2045c6920..b2797e7d14 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/create-j-w-t.md +++ b/docs/examples/0.10.x/client-apple/examples/account/create-j-w-t.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.createJWT() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-magic-u-r-l-session.md b/docs/examples/0.10.x/client-apple/examples/account/create-magic-u-r-l-session.md index ffc60f0498..8ca61dd94c 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/create-magic-u-r-l-session.md +++ b/docs/examples/0.10.x/client-apple/examples/account/create-magic-u-r-l-session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.createMagicURLSession( email: "email@example.com" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-o-auth2session.md b/docs/examples/0.10.x/client-apple/examples/account/create-o-auth2session.md index 2c78244edc..cb1e4e30a7 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/create-o-auth2session.md +++ b/docs/examples/0.10.x/client-apple/examples/account/create-o-auth2session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.createOAuth2Session( provider: "amazon" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-recovery.md b/docs/examples/0.10.x/client-apple/examples/account/create-recovery.md index a37fb4aa2e..dcdfa51937 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/create-recovery.md +++ b/docs/examples/0.10.x/client-apple/examples/account/create-recovery.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.createRecovery( email: "email@example.com", url: "https://example.com" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-session.md b/docs/examples/0.10.x/client-apple/examples/account/create-session.md index 1f2bc46112..a0d6d114a1 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/create-session.md +++ b/docs/examples/0.10.x/client-apple/examples/account/create-session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.createSession( email: "email@example.com", password: "password" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create-verification.md b/docs/examples/0.10.x/client-apple/examples/account/create-verification.md index 56f12b4bf7..b144e943bd 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/create-verification.md +++ b/docs/examples/0.10.x/client-apple/examples/account/create-verification.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.createVerification( url: "https://example.com" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/create.md b/docs/examples/0.10.x/client-apple/examples/account/create.md index d590e3c8bb..360d59c69a 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/create.md +++ b/docs/examples/0.10.x/client-apple/examples/account/create.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.create( email: "email@example.com", password: "password" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/delete-session.md b/docs/examples/0.10.x/client-apple/examples/account/delete-session.md index 0f41562b72..3d3da9fdff 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/delete-session.md +++ b/docs/examples/0.10.x/client-apple/examples/account/delete-session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.deleteSession( sessionId: "[SESSION_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/delete-sessions.md b/docs/examples/0.10.x/client-apple/examples/account/delete-sessions.md index 878b3be227..937e27069a 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/delete-sessions.md +++ b/docs/examples/0.10.x/client-apple/examples/account/delete-sessions.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.deleteSessions() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/delete.md b/docs/examples/0.10.x/client-apple/examples/account/delete.md index e3cb689aa9..e43e10c2b7 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/delete.md +++ b/docs/examples/0.10.x/client-apple/examples/account/delete.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.delete() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get-logs.md b/docs/examples/0.10.x/client-apple/examples/account/get-logs.md index e0716878ba..531b30ac91 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/get-logs.md +++ b/docs/examples/0.10.x/client-apple/examples/account/get-logs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.getLogs() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get-prefs.md b/docs/examples/0.10.x/client-apple/examples/account/get-prefs.md index afec734062..d39f79d2f6 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/get-prefs.md +++ b/docs/examples/0.10.x/client-apple/examples/account/get-prefs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.getPrefs() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get-session.md b/docs/examples/0.10.x/client-apple/examples/account/get-session.md index 3c64502272..57244db4f5 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/get-session.md +++ b/docs/examples/0.10.x/client-apple/examples/account/get-session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.getSession( sessionId: "[SESSION_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get-sessions.md b/docs/examples/0.10.x/client-apple/examples/account/get-sessions.md index deed06b0e8..af03882ad5 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/get-sessions.md +++ b/docs/examples/0.10.x/client-apple/examples/account/get-sessions.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.getSessions() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/get.md b/docs/examples/0.10.x/client-apple/examples/account/get.md index 5063a840e9..21bd299d00 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/get.md +++ b/docs/examples/0.10.x/client-apple/examples/account/get.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.get() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-email.md b/docs/examples/0.10.x/client-apple/examples/account/update-email.md index 4dc415c75d..7e338bec6b 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/update-email.md +++ b/docs/examples/0.10.x/client-apple/examples/account/update-email.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.updateEmail( email: "email@example.com", password: "password" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-magic-u-r-l-session.md b/docs/examples/0.10.x/client-apple/examples/account/update-magic-u-r-l-session.md index 27dad25a28..1ea5db9041 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/update-magic-u-r-l-session.md +++ b/docs/examples/0.10.x/client-apple/examples/account/update-magic-u-r-l-session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.updateMagicURLSession( userId: "[USER_ID]", secret: "[SECRET]" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-name.md b/docs/examples/0.10.x/client-apple/examples/account/update-name.md index 0f1c8b8c4a..6eb8e3836d 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/update-name.md +++ b/docs/examples/0.10.x/client-apple/examples/account/update-name.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.updateName( name: "[NAME]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-password.md b/docs/examples/0.10.x/client-apple/examples/account/update-password.md index 6294f5c625..bc5046eb46 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/update-password.md +++ b/docs/examples/0.10.x/client-apple/examples/account/update-password.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.updatePassword( password: "password" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-prefs.md b/docs/examples/0.10.x/client-apple/examples/account/update-prefs.md index 3f8e43c0b0..0b82ed6ed8 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/update-prefs.md +++ b/docs/examples/0.10.x/client-apple/examples/account/update-prefs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.updatePrefs( prefs: ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-recovery.md b/docs/examples/0.10.x/client-apple/examples/account/update-recovery.md index dbe5e0dfba..1fc3e8fe92 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/update-recovery.md +++ b/docs/examples/0.10.x/client-apple/examples/account/update-recovery.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.updateRecovery( userId: "[USER_ID]", secret: "[SECRET]", @@ -21,4 +20,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/account/update-verification.md b/docs/examples/0.10.x/client-apple/examples/account/update-verification.md index 7c787cdad5..228517d65d 100644 --- a/docs/examples/0.10.x/client-apple/examples/account/update-verification.md +++ b/docs/examples/0.10.x/client-apple/examples/account/update-verification.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let account = Account(client: client) + let account = Account(client) account.updateVerification( userId: "[USER_ID]", secret: "[SECRET]" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-browser.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-browser.md index 26acade54c..6be1cad9f5 100644 --- a/docs/examples/0.10.x/client-apple/examples/avatars/get-browser.md +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-browser.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getBrowser( code: "aa" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-credit-card.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-credit-card.md index 3be70f7ceb..71bc427c02 100644 --- a/docs/examples/0.10.x/client-apple/examples/avatars/get-credit-card.md +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-credit-card.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getCreditCard( code: "amex" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-favicon.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-favicon.md index 71f4353f47..fb2b907258 100644 --- a/docs/examples/0.10.x/client-apple/examples/avatars/get-favicon.md +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-favicon.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getFavicon( url: "https://example.com" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-flag.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-flag.md index edad0e40f0..b642171989 100644 --- a/docs/examples/0.10.x/client-apple/examples/avatars/get-flag.md +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-flag.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getFlag( code: "af" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-image.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-image.md index 142ef65559..811a33bdc4 100644 --- a/docs/examples/0.10.x/client-apple/examples/avatars/get-image.md +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-image.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getImage( url: "https://example.com" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-initials.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-initials.md index ee6b54b08c..f58c397b64 100644 --- a/docs/examples/0.10.x/client-apple/examples/avatars/get-initials.md +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-initials.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getInitials() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/avatars/get-q-r.md b/docs/examples/0.10.x/client-apple/examples/avatars/get-q-r.md index c32d234e31..f5a35ec754 100644 --- a/docs/examples/0.10.x/client-apple/examples/avatars/get-q-r.md +++ b/docs/examples/0.10.x/client-apple/examples/avatars/get-q-r.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getQR( text: "[TEXT]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/create-document.md b/docs/examples/0.10.x/client-apple/examples/database/create-document.md index 471b5a6a09..5471c9dacc 100644 --- a/docs/examples/0.10.x/client-apple/examples/database/create-document.md +++ b/docs/examples/0.10.x/client-apple/examples/database/create-document.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let database = Database(client: client) + let database = Database(client) database.createDocument( collectionId: "[COLLECTION_ID]", data: @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/delete-document.md b/docs/examples/0.10.x/client-apple/examples/database/delete-document.md index ee02e98873..e81e068575 100644 --- a/docs/examples/0.10.x/client-apple/examples/database/delete-document.md +++ b/docs/examples/0.10.x/client-apple/examples/database/delete-document.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let database = Database(client: client) + let database = Database(client) database.deleteDocument( collectionId: "[COLLECTION_ID]", documentId: "[DOCUMENT_ID]" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/get-document.md b/docs/examples/0.10.x/client-apple/examples/database/get-document.md index 42d129633e..0f02176068 100644 --- a/docs/examples/0.10.x/client-apple/examples/database/get-document.md +++ b/docs/examples/0.10.x/client-apple/examples/database/get-document.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let database = Database(client: client) + let database = Database(client) database.getDocument( collectionId: "[COLLECTION_ID]", documentId: "[DOCUMENT_ID]" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/list-documents.md b/docs/examples/0.10.x/client-apple/examples/database/list-documents.md index 2844ac6d5e..e6f663c5cf 100644 --- a/docs/examples/0.10.x/client-apple/examples/database/list-documents.md +++ b/docs/examples/0.10.x/client-apple/examples/database/list-documents.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let database = Database(client: client) + let database = Database(client) database.listDocuments( collectionId: "[COLLECTION_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/database/update-document.md b/docs/examples/0.10.x/client-apple/examples/database/update-document.md index cb8583cf1b..5399ddb150 100644 --- a/docs/examples/0.10.x/client-apple/examples/database/update-document.md +++ b/docs/examples/0.10.x/client-apple/examples/database/update-document.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let database = Database(client: client) + let database = Database(client) database.updateDocument( collectionId: "[COLLECTION_ID]", documentId: "[DOCUMENT_ID]", @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/functions/create-execution.md b/docs/examples/0.10.x/client-apple/examples/functions/create-execution.md index e0c801a83f..004aa4dd04 100644 --- a/docs/examples/0.10.x/client-apple/examples/functions/create-execution.md +++ b/docs/examples/0.10.x/client-apple/examples/functions/create-execution.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let functions = Functions(client: client) + let functions = Functions(client) functions.createExecution( functionId: "[FUNCTION_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/functions/get-execution.md b/docs/examples/0.10.x/client-apple/examples/functions/get-execution.md index b62309123d..c46bb4096f 100644 --- a/docs/examples/0.10.x/client-apple/examples/functions/get-execution.md +++ b/docs/examples/0.10.x/client-apple/examples/functions/get-execution.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let functions = Functions(client: client) + let functions = Functions(client) functions.getExecution( functionId: "[FUNCTION_ID]", executionId: "[EXECUTION_ID]" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/functions/list-executions.md b/docs/examples/0.10.x/client-apple/examples/functions/list-executions.md index cef794c4ad..04c212bd95 100644 --- a/docs/examples/0.10.x/client-apple/examples/functions/list-executions.md +++ b/docs/examples/0.10.x/client-apple/examples/functions/list-executions.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let functions = Functions(client: client) + let functions = Functions(client) functions.listExecutions( functionId: "[FUNCTION_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-continents.md b/docs/examples/0.10.x/client-apple/examples/locale/get-continents.md index 5faa4536b8..a07fb10f0f 100644 --- a/docs/examples/0.10.x/client-apple/examples/locale/get-continents.md +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-continents.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let locale = Locale(client: client) + let locale = Locale(client) locale.getContinents() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-countries-e-u.md b/docs/examples/0.10.x/client-apple/examples/locale/get-countries-e-u.md index aa87e5690f..58517a0244 100644 --- a/docs/examples/0.10.x/client-apple/examples/locale/get-countries-e-u.md +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-countries-e-u.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let locale = Locale(client: client) + let locale = Locale(client) locale.getCountriesEU() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-countries-phones.md b/docs/examples/0.10.x/client-apple/examples/locale/get-countries-phones.md index 024f3ec44a..cc28ba46d4 100644 --- a/docs/examples/0.10.x/client-apple/examples/locale/get-countries-phones.md +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-countries-phones.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let locale = Locale(client: client) + let locale = Locale(client) locale.getCountriesPhones() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-countries.md b/docs/examples/0.10.x/client-apple/examples/locale/get-countries.md index 906c61d1c0..b37cb0d0df 100644 --- a/docs/examples/0.10.x/client-apple/examples/locale/get-countries.md +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-countries.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let locale = Locale(client: client) + let locale = Locale(client) locale.getCountries() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-currencies.md b/docs/examples/0.10.x/client-apple/examples/locale/get-currencies.md index d231042e43..a97e93e15c 100644 --- a/docs/examples/0.10.x/client-apple/examples/locale/get-currencies.md +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-currencies.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let locale = Locale(client: client) + let locale = Locale(client) locale.getCurrencies() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get-languages.md b/docs/examples/0.10.x/client-apple/examples/locale/get-languages.md index 38905e4e34..a236afcf74 100644 --- a/docs/examples/0.10.x/client-apple/examples/locale/get-languages.md +++ b/docs/examples/0.10.x/client-apple/examples/locale/get-languages.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let locale = Locale(client: client) + let locale = Locale(client) locale.getLanguages() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/locale/get.md b/docs/examples/0.10.x/client-apple/examples/locale/get.md index 0fd923c400..0d93de1a70 100644 --- a/docs/examples/0.10.x/client-apple/examples/locale/get.md +++ b/docs/examples/0.10.x/client-apple/examples/locale/get.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let locale = Locale(client: client) + let locale = Locale(client) locale.get() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/create-file.md b/docs/examples/0.10.x/client-apple/examples/storage/create-file.md index be023e0c33..de85d891ba 100644 --- a/docs/examples/0.10.x/client-apple/examples/storage/create-file.md +++ b/docs/examples/0.10.x/client-apple/examples/storage/create-file.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let storage = Storage(client: client) + let storage = Storage(client) storage.createFile( file: File(name: "image.jpg", buffer: yourByteBuffer) ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/delete-file.md b/docs/examples/0.10.x/client-apple/examples/storage/delete-file.md index 634b278221..27f2ba5e40 100644 --- a/docs/examples/0.10.x/client-apple/examples/storage/delete-file.md +++ b/docs/examples/0.10.x/client-apple/examples/storage/delete-file.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let storage = Storage(client: client) + let storage = Storage(client) storage.deleteFile( fileId: "[FILE_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/get-file-download.md b/docs/examples/0.10.x/client-apple/examples/storage/get-file-download.md index a32f8898be..4474c3d794 100644 --- a/docs/examples/0.10.x/client-apple/examples/storage/get-file-download.md +++ b/docs/examples/0.10.x/client-apple/examples/storage/get-file-download.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let storage = Storage(client: client) + let storage = Storage(client) storage.getFileDownload( fileId: "[FILE_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/get-file-preview.md b/docs/examples/0.10.x/client-apple/examples/storage/get-file-preview.md index c2d33d7ea2..ac1afa28dc 100644 --- a/docs/examples/0.10.x/client-apple/examples/storage/get-file-preview.md +++ b/docs/examples/0.10.x/client-apple/examples/storage/get-file-preview.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let storage = Storage(client: client) + let storage = Storage(client) storage.getFilePreview( fileId: "[FILE_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/get-file-view.md b/docs/examples/0.10.x/client-apple/examples/storage/get-file-view.md index 69cf9c3b70..b04b203eff 100644 --- a/docs/examples/0.10.x/client-apple/examples/storage/get-file-view.md +++ b/docs/examples/0.10.x/client-apple/examples/storage/get-file-view.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let storage = Storage(client: client) + let storage = Storage(client) storage.getFileView( fileId: "[FILE_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/get-file.md b/docs/examples/0.10.x/client-apple/examples/storage/get-file.md index 79c8f55cc2..cd9441da2a 100644 --- a/docs/examples/0.10.x/client-apple/examples/storage/get-file.md +++ b/docs/examples/0.10.x/client-apple/examples/storage/get-file.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let storage = Storage(client: client) + let storage = Storage(client) storage.getFile( fileId: "[FILE_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/list-files.md b/docs/examples/0.10.x/client-apple/examples/storage/list-files.md index 2c44313f08..934856df2d 100644 --- a/docs/examples/0.10.x/client-apple/examples/storage/list-files.md +++ b/docs/examples/0.10.x/client-apple/examples/storage/list-files.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let storage = Storage(client: client) + let storage = Storage(client) storage.listFiles() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/storage/update-file.md b/docs/examples/0.10.x/client-apple/examples/storage/update-file.md index d2472e4d11..75f66e5974 100644 --- a/docs/examples/0.10.x/client-apple/examples/storage/update-file.md +++ b/docs/examples/0.10.x/client-apple/examples/storage/update-file.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let storage = Storage(client: client) + let storage = Storage(client) storage.updateFile( fileId: "[FILE_ID]", read: [], @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/create-membership.md b/docs/examples/0.10.x/client-apple/examples/teams/create-membership.md index 9170336c80..01b3e507f1 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/create-membership.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/create-membership.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.createMembership( teamId: "[TEAM_ID]", email: "email@example.com", @@ -21,4 +20,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/create.md b/docs/examples/0.10.x/client-apple/examples/teams/create.md index 28e1d0d805..5c5360c4d9 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/create.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/create.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.create( name: "[NAME]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/delete-membership.md b/docs/examples/0.10.x/client-apple/examples/teams/delete-membership.md index e76a1959ce..9f3086b549 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/delete-membership.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/delete-membership.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.deleteMembership( teamId: "[TEAM_ID]", membershipId: "[MEMBERSHIP_ID]" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/delete.md b/docs/examples/0.10.x/client-apple/examples/teams/delete.md index d9f7af401a..49f1155cbf 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/delete.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/delete.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.delete( teamId: "[TEAM_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/get-memberships.md b/docs/examples/0.10.x/client-apple/examples/teams/get-memberships.md index 00926983d6..3597ce1a47 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/get-memberships.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/get-memberships.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.getMemberships( teamId: "[TEAM_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/get.md b/docs/examples/0.10.x/client-apple/examples/teams/get.md index 5d59911950..93b0f77379 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/get.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/get.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.get( teamId: "[TEAM_ID]" ) { result in @@ -18,4 +17,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/list.md b/docs/examples/0.10.x/client-apple/examples/teams/list.md index b6f89b328b..2131371af3 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/list.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/list.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.list() { result in switch result { case .failure(let error): @@ -16,4 +15,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/update-membership-roles.md b/docs/examples/0.10.x/client-apple/examples/teams/update-membership-roles.md index 422b6b9e5a..43d0db9aca 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/update-membership-roles.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/update-membership-roles.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.updateMembershipRoles( teamId: "[TEAM_ID]", membershipId: "[MEMBERSHIP_ID]", @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/update-membership-status.md b/docs/examples/0.10.x/client-apple/examples/teams/update-membership-status.md index 0cdcc773f4..dc82da705a 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/update-membership-status.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/update-membership-status.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.updateMembershipStatus( teamId: "[TEAM_ID]", membershipId: "[MEMBERSHIP_ID]", @@ -21,4 +20,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/client-apple/examples/teams/update.md b/docs/examples/0.10.x/client-apple/examples/teams/update.md index 70daab7f44..a0822e814b 100644 --- a/docs/examples/0.10.x/client-apple/examples/teams/update.md +++ b/docs/examples/0.10.x/client-apple/examples/teams/update.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -6,7 +5,7 @@ func main() { .setEndpoint("https://[HOSTNAME_OR_IP]/v1") // Your API Endpoint .setProject("5df5acd0d48c2") // Your project ID - let teams = Teams(client: client) + let teams = Teams(client) teams.update( teamId: "[TEAM_ID]", name: "[NAME]" @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/create-recovery.md b/docs/examples/0.10.x/server-swift/examples/account/create-recovery.md index 8f00b75b4c..a3644ee15e 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/create-recovery.md +++ b/docs/examples/0.10.x/server-swift/examples/account/create-recovery.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.createRecovery( email: "email@example.com", url: "https://example.com" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/create-verification.md b/docs/examples/0.10.x/server-swift/examples/account/create-verification.md index 48938c41d0..1fbf8dd567 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/create-verification.md +++ b/docs/examples/0.10.x/server-swift/examples/account/create-verification.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.createVerification( url: "https://example.com" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/delete-session.md b/docs/examples/0.10.x/server-swift/examples/account/delete-session.md index a5aefd5467..b45a95eabd 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/delete-session.md +++ b/docs/examples/0.10.x/server-swift/examples/account/delete-session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.deleteSession( sessionId: "[SESSION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/delete-sessions.md b/docs/examples/0.10.x/server-swift/examples/account/delete-sessions.md index 81bbd3839b..4e3aad5207 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/delete-sessions.md +++ b/docs/examples/0.10.x/server-swift/examples/account/delete-sessions.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.deleteSessions() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/delete.md b/docs/examples/0.10.x/server-swift/examples/account/delete.md index 9b130164e6..fd1711b15b 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/delete.md +++ b/docs/examples/0.10.x/server-swift/examples/account/delete.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.delete() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get-logs.md b/docs/examples/0.10.x/server-swift/examples/account/get-logs.md index 1aacb4614f..0d039edaf0 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/get-logs.md +++ b/docs/examples/0.10.x/server-swift/examples/account/get-logs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.getLogs() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get-prefs.md b/docs/examples/0.10.x/server-swift/examples/account/get-prefs.md index 4a377893c1..5039b7895d 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/get-prefs.md +++ b/docs/examples/0.10.x/server-swift/examples/account/get-prefs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.getPrefs() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get-session.md b/docs/examples/0.10.x/server-swift/examples/account/get-session.md index 966736f899..7234217239 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/get-session.md +++ b/docs/examples/0.10.x/server-swift/examples/account/get-session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.getSession( sessionId: "[SESSION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get-sessions.md b/docs/examples/0.10.x/server-swift/examples/account/get-sessions.md index 2285f2f8de..01a7c4614c 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/get-sessions.md +++ b/docs/examples/0.10.x/server-swift/examples/account/get-sessions.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.getSessions() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/get.md b/docs/examples/0.10.x/server-swift/examples/account/get.md index 58f05bfee1..38eddbb405 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/get.md +++ b/docs/examples/0.10.x/server-swift/examples/account/get.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.get() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-email.md b/docs/examples/0.10.x/server-swift/examples/account/update-email.md index cbf2df19c9..e8cfd482f8 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/update-email.md +++ b/docs/examples/0.10.x/server-swift/examples/account/update-email.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.updateEmail( email: "email@example.com", password: "password" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-name.md b/docs/examples/0.10.x/server-swift/examples/account/update-name.md index 9bd42f4461..88e321d090 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/update-name.md +++ b/docs/examples/0.10.x/server-swift/examples/account/update-name.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.updateName( name: "[NAME]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-password.md b/docs/examples/0.10.x/server-swift/examples/account/update-password.md index c84d228aba..c6f3108dbd 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/update-password.md +++ b/docs/examples/0.10.x/server-swift/examples/account/update-password.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.updatePassword( password: "password" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-prefs.md b/docs/examples/0.10.x/server-swift/examples/account/update-prefs.md index 91f6d3b79c..62398d73ce 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/update-prefs.md +++ b/docs/examples/0.10.x/server-swift/examples/account/update-prefs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.updatePrefs( prefs: ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-recovery.md b/docs/examples/0.10.x/server-swift/examples/account/update-recovery.md index b897b20087..4ae4d4813e 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/update-recovery.md +++ b/docs/examples/0.10.x/server-swift/examples/account/update-recovery.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.updateRecovery( userId: "[USER_ID]", secret: "[SECRET]", @@ -22,4 +21,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/account/update-verification.md b/docs/examples/0.10.x/server-swift/examples/account/update-verification.md index 4267ca6c0a..6d0a9d1e68 100644 --- a/docs/examples/0.10.x/server-swift/examples/account/update-verification.md +++ b/docs/examples/0.10.x/server-swift/examples/account/update-verification.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let account = Account(client: client) + let account = Account(client) account.updateVerification( userId: "[USER_ID]", secret: "[SECRET]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-browser.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-browser.md index f466fa062b..cc8cd69898 100644 --- a/docs/examples/0.10.x/server-swift/examples/avatars/get-browser.md +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-browser.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getBrowser( code: "aa" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-credit-card.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-credit-card.md index 69c65353ed..c655bee31f 100644 --- a/docs/examples/0.10.x/server-swift/examples/avatars/get-credit-card.md +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-credit-card.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getCreditCard( code: "amex" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-favicon.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-favicon.md index 4b2bac24b9..e1f0b8d027 100644 --- a/docs/examples/0.10.x/server-swift/examples/avatars/get-favicon.md +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-favicon.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getFavicon( url: "https://example.com" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-flag.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-flag.md index d04d1e268d..5d584e532f 100644 --- a/docs/examples/0.10.x/server-swift/examples/avatars/get-flag.md +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-flag.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getFlag( code: "af" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-image.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-image.md index da9d972483..009d11ec4d 100644 --- a/docs/examples/0.10.x/server-swift/examples/avatars/get-image.md +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-image.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getImage( url: "https://example.com" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-initials.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-initials.md index 7565920709..029afa5f5f 100644 --- a/docs/examples/0.10.x/server-swift/examples/avatars/get-initials.md +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-initials.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getInitials() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/avatars/get-q-r.md b/docs/examples/0.10.x/server-swift/examples/avatars/get-q-r.md index b4fccf161b..992abfdfa7 100644 --- a/docs/examples/0.10.x/server-swift/examples/avatars/get-q-r.md +++ b/docs/examples/0.10.x/server-swift/examples/avatars/get-q-r.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let avatars = Avatars(client: client) + let avatars = Avatars(client) avatars.getQR( text: "[TEXT]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/create-collection.md b/docs/examples/0.10.x/server-swift/examples/database/create-collection.md index 8fca779f95..9ecc5b20b6 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/create-collection.md +++ b/docs/examples/0.10.x/server-swift/examples/database/create-collection.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.createCollection( name: "[NAME]", read: [], @@ -22,4 +21,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/create-document.md b/docs/examples/0.10.x/server-swift/examples/database/create-document.md index 0d1edc299e..5da47bf040 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/create-document.md +++ b/docs/examples/0.10.x/server-swift/examples/database/create-document.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.createDocument( collectionId: "[COLLECTION_ID]", data: @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/delete-collection.md b/docs/examples/0.10.x/server-swift/examples/database/delete-collection.md index 31d73cfc7f..f400c5f549 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/delete-collection.md +++ b/docs/examples/0.10.x/server-swift/examples/database/delete-collection.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.deleteCollection( collectionId: "[COLLECTION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/delete-document.md b/docs/examples/0.10.x/server-swift/examples/database/delete-document.md index f18d6d4f7c..cf6e1f4e5f 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/delete-document.md +++ b/docs/examples/0.10.x/server-swift/examples/database/delete-document.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.deleteDocument( collectionId: "[COLLECTION_ID]", documentId: "[DOCUMENT_ID]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/get-collection.md b/docs/examples/0.10.x/server-swift/examples/database/get-collection.md index 0ef7d054a0..b337aa56c4 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/get-collection.md +++ b/docs/examples/0.10.x/server-swift/examples/database/get-collection.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.getCollection( collectionId: "[COLLECTION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/get-document.md b/docs/examples/0.10.x/server-swift/examples/database/get-document.md index 1ddf7356f3..215a0cd092 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/get-document.md +++ b/docs/examples/0.10.x/server-swift/examples/database/get-document.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.getDocument( collectionId: "[COLLECTION_ID]", documentId: "[DOCUMENT_ID]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/list-collections.md b/docs/examples/0.10.x/server-swift/examples/database/list-collections.md index 1a2a2a92f3..1422793dc1 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/list-collections.md +++ b/docs/examples/0.10.x/server-swift/examples/database/list-collections.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.listCollections() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/list-documents.md b/docs/examples/0.10.x/server-swift/examples/database/list-documents.md index 88a3153e0d..f4bd05391d 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/list-documents.md +++ b/docs/examples/0.10.x/server-swift/examples/database/list-documents.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.listDocuments( collectionId: "[COLLECTION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/update-collection.md b/docs/examples/0.10.x/server-swift/examples/database/update-collection.md index 9b730cea56..68cd67c1f3 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/update-collection.md +++ b/docs/examples/0.10.x/server-swift/examples/database/update-collection.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.updateCollection( collectionId: "[COLLECTION_ID]", name: "[NAME]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/database/update-document.md b/docs/examples/0.10.x/server-swift/examples/database/update-document.md index 0b5941e4b4..39eb92cd13 100644 --- a/docs/examples/0.10.x/server-swift/examples/database/update-document.md +++ b/docs/examples/0.10.x/server-swift/examples/database/update-document.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let database = Database(client: client) + let database = Database(client) database.updateDocument( collectionId: "[COLLECTION_ID]", documentId: "[DOCUMENT_ID]", @@ -21,4 +20,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/create-execution.md b/docs/examples/0.10.x/server-swift/examples/functions/create-execution.md index 9638e7ba7f..1bb3c99834 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/create-execution.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/create-execution.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.createExecution( functionId: "[FUNCTION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/create-tag.md b/docs/examples/0.10.x/server-swift/examples/functions/create-tag.md index 69fe51365d..f98c66a4f2 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/create-tag.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/create-tag.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.createTag( functionId: "[FUNCTION_ID]", command: "[COMMAND]", @@ -21,4 +20,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/create.md b/docs/examples/0.10.x/server-swift/examples/functions/create.md index 74919ae29e..89ad4a16c7 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/create.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/create.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.create( name: "[NAME]", execute: [], @@ -21,4 +20,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/delete-tag.md b/docs/examples/0.10.x/server-swift/examples/functions/delete-tag.md index 9af5649555..016bd118c5 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/delete-tag.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/delete-tag.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.deleteTag( functionId: "[FUNCTION_ID]", tagId: "[TAG_ID]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/delete.md b/docs/examples/0.10.x/server-swift/examples/functions/delete.md index e9bbe4eb0c..37ff9e5035 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/delete.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/delete.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.delete( functionId: "[FUNCTION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/get-execution.md b/docs/examples/0.10.x/server-swift/examples/functions/get-execution.md index 01914b8e02..9991e127c0 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/get-execution.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/get-execution.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.getExecution( functionId: "[FUNCTION_ID]", executionId: "[EXECUTION_ID]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/get-tag.md b/docs/examples/0.10.x/server-swift/examples/functions/get-tag.md index c8cf35cec4..149736c91e 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/get-tag.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/get-tag.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.getTag( functionId: "[FUNCTION_ID]", tagId: "[TAG_ID]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/get.md b/docs/examples/0.10.x/server-swift/examples/functions/get.md index 7229d82ce7..600f27eebb 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/get.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/get.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.get( functionId: "[FUNCTION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/list-executions.md b/docs/examples/0.10.x/server-swift/examples/functions/list-executions.md index d0583fa0e4..872cfcb218 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/list-executions.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/list-executions.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.listExecutions( functionId: "[FUNCTION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/list-tags.md b/docs/examples/0.10.x/server-swift/examples/functions/list-tags.md index a5feda8e63..419a1bba8c 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/list-tags.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/list-tags.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.listTags( functionId: "[FUNCTION_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/list.md b/docs/examples/0.10.x/server-swift/examples/functions/list.md index c8dc1bc3f6..0c1bd2e450 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/list.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/list.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.list() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/update-tag.md b/docs/examples/0.10.x/server-swift/examples/functions/update-tag.md index 9a8ad9d44c..519f4afa87 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/update-tag.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/update-tag.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.updateTag( functionId: "[FUNCTION_ID]", tag: "[TAG]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/functions/update.md b/docs/examples/0.10.x/server-swift/examples/functions/update.md index 4d8c275891..d3e296358f 100644 --- a/docs/examples/0.10.x/server-swift/examples/functions/update.md +++ b/docs/examples/0.10.x/server-swift/examples/functions/update.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let functions = Functions(client: client) + let functions = Functions(client) functions.update( functionId: "[FUNCTION_ID]", name: "[NAME]", @@ -21,4 +20,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-anti-virus.md b/docs/examples/0.10.x/server-swift/examples/health/get-anti-virus.md index 794df35dc8..04b42ed1fe 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-anti-virus.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-anti-virus.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getAntiVirus() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-cache.md b/docs/examples/0.10.x/server-swift/examples/health/get-cache.md index c7437e32d0..29af81c600 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-cache.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-cache.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getCache() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-d-b.md b/docs/examples/0.10.x/server-swift/examples/health/get-d-b.md index 1c18c075de..a6492a822c 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-d-b.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-d-b.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getDB() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-certificates.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-certificates.md index 1ddf43296b..d90a8ef57d 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-queue-certificates.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-certificates.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getQueueCertificates() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-functions.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-functions.md index 923684b6ae..c907fd0975 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-queue-functions.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-functions.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getQueueFunctions() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-logs.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-logs.md index 2d12723956..c3f3217dc8 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-queue-logs.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-logs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getQueueLogs() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-tasks.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-tasks.md index 861324f4c9..e484f4f060 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-queue-tasks.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-tasks.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getQueueTasks() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-usage.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-usage.md index 6189a6da98..75a0df3e81 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-queue-usage.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-usage.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getQueueUsage() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-queue-webhooks.md b/docs/examples/0.10.x/server-swift/examples/health/get-queue-webhooks.md index 6e2a82e93c..6523262fe0 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-queue-webhooks.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-queue-webhooks.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getQueueWebhooks() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-storage-local.md b/docs/examples/0.10.x/server-swift/examples/health/get-storage-local.md index 0cb123ae61..9e07c1f8c8 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-storage-local.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-storage-local.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getStorageLocal() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get-time.md b/docs/examples/0.10.x/server-swift/examples/health/get-time.md index 80498ab519..6807436a98 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get-time.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get-time.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.getTime() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/health/get.md b/docs/examples/0.10.x/server-swift/examples/health/get.md index 97d23ac712..6fd1e8f704 100644 --- a/docs/examples/0.10.x/server-swift/examples/health/get.md +++ b/docs/examples/0.10.x/server-swift/examples/health/get.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let health = Health(client: client) + let health = Health(client) health.get() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-continents.md b/docs/examples/0.10.x/server-swift/examples/locale/get-continents.md index f3f643be9f..c6f4f3247c 100644 --- a/docs/examples/0.10.x/server-swift/examples/locale/get-continents.md +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-continents.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let locale = Locale(client: client) + let locale = Locale(client) locale.getContinents() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-countries-e-u.md b/docs/examples/0.10.x/server-swift/examples/locale/get-countries-e-u.md index 7dd15cb866..ee36c4b2d0 100644 --- a/docs/examples/0.10.x/server-swift/examples/locale/get-countries-e-u.md +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-countries-e-u.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let locale = Locale(client: client) + let locale = Locale(client) locale.getCountriesEU() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-countries-phones.md b/docs/examples/0.10.x/server-swift/examples/locale/get-countries-phones.md index 425d141538..3cd368884c 100644 --- a/docs/examples/0.10.x/server-swift/examples/locale/get-countries-phones.md +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-countries-phones.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let locale = Locale(client: client) + let locale = Locale(client) locale.getCountriesPhones() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-countries.md b/docs/examples/0.10.x/server-swift/examples/locale/get-countries.md index cc44295c52..b19fab3e6e 100644 --- a/docs/examples/0.10.x/server-swift/examples/locale/get-countries.md +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-countries.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let locale = Locale(client: client) + let locale = Locale(client) locale.getCountries() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-currencies.md b/docs/examples/0.10.x/server-swift/examples/locale/get-currencies.md index 65754aa1f6..adc43dd46e 100644 --- a/docs/examples/0.10.x/server-swift/examples/locale/get-currencies.md +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-currencies.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let locale = Locale(client: client) + let locale = Locale(client) locale.getCurrencies() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get-languages.md b/docs/examples/0.10.x/server-swift/examples/locale/get-languages.md index 439c38f095..935e493cd5 100644 --- a/docs/examples/0.10.x/server-swift/examples/locale/get-languages.md +++ b/docs/examples/0.10.x/server-swift/examples/locale/get-languages.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let locale = Locale(client: client) + let locale = Locale(client) locale.getLanguages() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/locale/get.md b/docs/examples/0.10.x/server-swift/examples/locale/get.md index 3bf8838b55..c624adf984 100644 --- a/docs/examples/0.10.x/server-swift/examples/locale/get.md +++ b/docs/examples/0.10.x/server-swift/examples/locale/get.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let locale = Locale(client: client) + let locale = Locale(client) locale.get() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/create-file.md b/docs/examples/0.10.x/server-swift/examples/storage/create-file.md index 46c6ad0331..f64c4666e8 100644 --- a/docs/examples/0.10.x/server-swift/examples/storage/create-file.md +++ b/docs/examples/0.10.x/server-swift/examples/storage/create-file.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let storage = Storage(client: client) + let storage = Storage(client) storage.createFile( file: File(name: "image.jpg", buffer: yourByteBuffer) ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/delete-file.md b/docs/examples/0.10.x/server-swift/examples/storage/delete-file.md index 0d76d6e76c..0273b2bbde 100644 --- a/docs/examples/0.10.x/server-swift/examples/storage/delete-file.md +++ b/docs/examples/0.10.x/server-swift/examples/storage/delete-file.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let storage = Storage(client: client) + let storage = Storage(client) storage.deleteFile( fileId: "[FILE_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/get-file-download.md b/docs/examples/0.10.x/server-swift/examples/storage/get-file-download.md index 0523808e9e..138988a0a1 100644 --- a/docs/examples/0.10.x/server-swift/examples/storage/get-file-download.md +++ b/docs/examples/0.10.x/server-swift/examples/storage/get-file-download.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let storage = Storage(client: client) + let storage = Storage(client) storage.getFileDownload( fileId: "[FILE_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/get-file-preview.md b/docs/examples/0.10.x/server-swift/examples/storage/get-file-preview.md index e41077daa8..463e4ae06a 100644 --- a/docs/examples/0.10.x/server-swift/examples/storage/get-file-preview.md +++ b/docs/examples/0.10.x/server-swift/examples/storage/get-file-preview.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let storage = Storage(client: client) + let storage = Storage(client) storage.getFilePreview( fileId: "[FILE_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/get-file-view.md b/docs/examples/0.10.x/server-swift/examples/storage/get-file-view.md index 8d77db23a1..f56f4ed857 100644 --- a/docs/examples/0.10.x/server-swift/examples/storage/get-file-view.md +++ b/docs/examples/0.10.x/server-swift/examples/storage/get-file-view.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let storage = Storage(client: client) + let storage = Storage(client) storage.getFileView( fileId: "[FILE_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/get-file.md b/docs/examples/0.10.x/server-swift/examples/storage/get-file.md index 04afe51f57..9e88405fdf 100644 --- a/docs/examples/0.10.x/server-swift/examples/storage/get-file.md +++ b/docs/examples/0.10.x/server-swift/examples/storage/get-file.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let storage = Storage(client: client) + let storage = Storage(client) storage.getFile( fileId: "[FILE_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/list-files.md b/docs/examples/0.10.x/server-swift/examples/storage/list-files.md index 63a8088ea9..8cb902baa3 100644 --- a/docs/examples/0.10.x/server-swift/examples/storage/list-files.md +++ b/docs/examples/0.10.x/server-swift/examples/storage/list-files.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let storage = Storage(client: client) + let storage = Storage(client) storage.listFiles() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/storage/update-file.md b/docs/examples/0.10.x/server-swift/examples/storage/update-file.md index faa46061f8..2f23ff3318 100644 --- a/docs/examples/0.10.x/server-swift/examples/storage/update-file.md +++ b/docs/examples/0.10.x/server-swift/examples/storage/update-file.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let storage = Storage(client: client) + let storage = Storage(client) storage.updateFile( fileId: "[FILE_ID]", read: [], @@ -21,4 +20,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/create-membership.md b/docs/examples/0.10.x/server-swift/examples/teams/create-membership.md index 5960c859fe..3d69b095b1 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/create-membership.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/create-membership.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let teams = Teams(client: client) + let teams = Teams(client) teams.createMembership( teamId: "[TEAM_ID]", email: "email@example.com", @@ -22,4 +21,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/create.md b/docs/examples/0.10.x/server-swift/examples/teams/create.md index 28dbeaec81..ede3e18a3e 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/create.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/create.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let teams = Teams(client: client) + let teams = Teams(client) teams.create( name: "[NAME]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/delete-membership.md b/docs/examples/0.10.x/server-swift/examples/teams/delete-membership.md index 839698aa71..99f0d30d9a 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/delete-membership.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/delete-membership.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let teams = Teams(client: client) + let teams = Teams(client) teams.deleteMembership( teamId: "[TEAM_ID]", membershipId: "[MEMBERSHIP_ID]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/delete.md b/docs/examples/0.10.x/server-swift/examples/teams/delete.md index b9128c0f5f..6d75bc83cb 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/delete.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/delete.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let teams = Teams(client: client) + let teams = Teams(client) teams.delete( teamId: "[TEAM_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/get-memberships.md b/docs/examples/0.10.x/server-swift/examples/teams/get-memberships.md index d1cdac1578..f265b6c3aa 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/get-memberships.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/get-memberships.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let teams = Teams(client: client) + let teams = Teams(client) teams.getMemberships( teamId: "[TEAM_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/get.md b/docs/examples/0.10.x/server-swift/examples/teams/get.md index 1378234512..be1f9c5c1c 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/get.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/get.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let teams = Teams(client: client) + let teams = Teams(client) teams.get( teamId: "[TEAM_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/list.md b/docs/examples/0.10.x/server-swift/examples/teams/list.md index 3dd872d6ad..4b46984932 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/list.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/list.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let teams = Teams(client: client) + let teams = Teams(client) teams.list() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/update-membership-roles.md b/docs/examples/0.10.x/server-swift/examples/teams/update-membership-roles.md index db84f3bbd7..c0d5f08a49 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/update-membership-roles.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/update-membership-roles.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let teams = Teams(client: client) + let teams = Teams(client) teams.updateMembershipRoles( teamId: "[TEAM_ID]", membershipId: "[MEMBERSHIP_ID]", @@ -21,4 +20,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/update-membership-status.md b/docs/examples/0.10.x/server-swift/examples/teams/update-membership-status.md index ffd775bda4..7c229da6ad 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/update-membership-status.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/update-membership-status.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setJWT("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ...") // Your secret JSON Web Token - let teams = Teams(client: client) + let teams = Teams(client) teams.updateMembershipStatus( teamId: "[TEAM_ID]", membershipId: "[MEMBERSHIP_ID]", @@ -22,4 +21,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/teams/update.md b/docs/examples/0.10.x/server-swift/examples/teams/update.md index 0b2e226deb..d9e98baab8 100644 --- a/docs/examples/0.10.x/server-swift/examples/teams/update.md +++ b/docs/examples/0.10.x/server-swift/examples/teams/update.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let teams = Teams(client: client) + let teams = Teams(client) teams.update( teamId: "[TEAM_ID]", name: "[NAME]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/create.md b/docs/examples/0.10.x/server-swift/examples/users/create.md index 2dbd66d012..53655ad4f5 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/create.md +++ b/docs/examples/0.10.x/server-swift/examples/users/create.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.create( email: "email@example.com", password: "password" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/delete-session.md b/docs/examples/0.10.x/server-swift/examples/users/delete-session.md index 50b414bc5e..9bc0adb41c 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/delete-session.md +++ b/docs/examples/0.10.x/server-swift/examples/users/delete-session.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.deleteSession( userId: "[USER_ID]", sessionId: "[SESSION_ID]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/delete-sessions.md b/docs/examples/0.10.x/server-swift/examples/users/delete-sessions.md index c3d4d6863f..041058f2a5 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/delete-sessions.md +++ b/docs/examples/0.10.x/server-swift/examples/users/delete-sessions.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.deleteSessions( userId: "[USER_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/delete.md b/docs/examples/0.10.x/server-swift/examples/users/delete.md index 03d7e1438a..7575269eb6 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/delete.md +++ b/docs/examples/0.10.x/server-swift/examples/users/delete.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.delete( userId: "[USER_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/get-logs.md b/docs/examples/0.10.x/server-swift/examples/users/get-logs.md index d870a25b52..c5ad92275b 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/get-logs.md +++ b/docs/examples/0.10.x/server-swift/examples/users/get-logs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.getLogs( userId: "[USER_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/get-prefs.md b/docs/examples/0.10.x/server-swift/examples/users/get-prefs.md index eb43e9b978..dcbbf263ef 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/get-prefs.md +++ b/docs/examples/0.10.x/server-swift/examples/users/get-prefs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.getPrefs( userId: "[USER_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/get-sessions.md b/docs/examples/0.10.x/server-swift/examples/users/get-sessions.md index 35c6498dab..1762ca9438 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/get-sessions.md +++ b/docs/examples/0.10.x/server-swift/examples/users/get-sessions.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.getSessions( userId: "[USER_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/get.md b/docs/examples/0.10.x/server-swift/examples/users/get.md index f4309240d0..92bd108d11 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/get.md +++ b/docs/examples/0.10.x/server-swift/examples/users/get.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.get( userId: "[USER_ID]" ) { result in @@ -19,4 +18,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/list.md b/docs/examples/0.10.x/server-swift/examples/users/list.md index 2c64ab356b..0e77d85803 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/list.md +++ b/docs/examples/0.10.x/server-swift/examples/users/list.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.list() { result in switch result { case .failure(let error): @@ -17,4 +16,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-email.md b/docs/examples/0.10.x/server-swift/examples/users/update-email.md index 28f517eedb..93571e217a 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/update-email.md +++ b/docs/examples/0.10.x/server-swift/examples/users/update-email.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.updateEmail( userId: "[USER_ID]", email: "email@example.com" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-name.md b/docs/examples/0.10.x/server-swift/examples/users/update-name.md index bf41f858e0..f085f9eb45 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/update-name.md +++ b/docs/examples/0.10.x/server-swift/examples/users/update-name.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.updateName( userId: "[USER_ID]", name: "[NAME]" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-password.md b/docs/examples/0.10.x/server-swift/examples/users/update-password.md index d23b7985c9..8b19c67df6 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/update-password.md +++ b/docs/examples/0.10.x/server-swift/examples/users/update-password.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.updatePassword( userId: "[USER_ID]", password: "password" @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-prefs.md b/docs/examples/0.10.x/server-swift/examples/users/update-prefs.md index fd68e297af..39245979e5 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/update-prefs.md +++ b/docs/examples/0.10.x/server-swift/examples/users/update-prefs.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.updatePrefs( userId: "[USER_ID]", prefs: @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-status.md b/docs/examples/0.10.x/server-swift/examples/users/update-status.md index df844bcc1d..5215b5d0bc 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/update-status.md +++ b/docs/examples/0.10.x/server-swift/examples/users/update-status.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.updateStatus( userId: "[USER_ID]", status: 1 @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file diff --git a/docs/examples/0.10.x/server-swift/examples/users/update-verification.md b/docs/examples/0.10.x/server-swift/examples/users/update-verification.md index dd1640612a..7e3f8b485e 100644 --- a/docs/examples/0.10.x/server-swift/examples/users/update-verification.md +++ b/docs/examples/0.10.x/server-swift/examples/users/update-verification.md @@ -1,4 +1,3 @@ -```swift import Appwrite func main() { @@ -7,7 +6,7 @@ func main() { .setProject("5df5acd0d48c2") // Your project ID .setKey("919c2d18fb5d4...a2ae413da83346ad2") // Your secret API key - let users = Users(client: client) + let users = Users(client) users.updateVerification( userId: "[USER_ID]", emailVerification: xfalse @@ -20,4 +19,3 @@ func main() { } } } -``` \ No newline at end of file From 09ec6c24f4f3f52f0abfbccf38bb2465bd351cd4 Mon Sep 17 00:00:00 2001 From: Christy Jacob Date: Thu, 14 Oct 2021 16:20:52 +0530 Subject: [PATCH 188/257] feat: update runtimes version --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 8a7b1570f5..ae292d7dd4 100644 --- a/composer.json +++ b/composer.json @@ -36,7 +36,7 @@ "ext-sockets": "*", "appwrite/php-clamav": "1.1.*", - "appwrite/php-runtimes": "0.4.*", + "appwrite/php-runtimes": "0.6.*", "utopia-php/framework": "0.18.*", "utopia-php/abuse": "0.5.*", From dd299007ff9d46cc947de7756b334f6057e5923d Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Fri, 15 Oct 2021 02:49:40 +1300 Subject: [PATCH 189/257] Merge Apple platform creation into tabbed dialog --- app/views/console/home/index.phtml | 317 +++++++++++++++-------------- composer.lock | 4 +- public/images/clients/apple.png | Bin 0 -> 48182 bytes 3 files changed, 163 insertions(+), 158 deletions(-) create mode 100644 public/images/clients/apple.png diff --git a/app/views/console/home/index.phtml b/app/views/console/home/index.phtml index aa2cfc9877..1b7fd76099 100644 --- a/app/views/console/home/index.phtml +++ b/app/views/console/home/index.phtml @@ -201,6 +201,22 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true);
    Windows Logo
    + +
    + iOS Logo +
    + +
    + macOS Logo +
    + +
    + watchOS Logo +
    + +
    + tvOS Logo +
    @@ -239,21 +255,12 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true);
  • +
  • + +
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • @@ -373,150 +380,6 @@ $usageStatsEnabled = $this->getParam('usageStatsEnabled',true); - - - - - - - - + +