From 590877baa5376d52fc23f7e88f21ba52f0664087 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 23 Oct 2024 16:29:25 -0700 Subject: [PATCH 01/27] Added command_line.py, default language file, setup file, and basic functionality --- .../core/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes .../core/__pycache__/settings.cpython-310.pyc | Bin 0 -> 2269 bytes core/core/__pycache__/urls.cpython-310.pyc | Bin 0 -> 994 bytes core/core/__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 549 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes .../__pycache__/urls.cpython-310.pyc | Bin 0 -> 311 bytes .../__pycache__/views.cpython-310.pyc | Bin 0 -> 999 bytes i18ilize.egg-info/PKG-INFO | 4 ++ i18ilize.egg-info/SOURCES.txt | 7 +++ i18ilize.egg-info/dependency_links.txt | 1 + i18ilize.egg-info/entry_points.txt | 2 + i18ilize.egg-info/top_level.txt | 1 + .../__pycache__/command_line.cpython-310.pyc | Bin 0 -> 1724 bytes .../src/internationalize/command_line.py | 55 ++++++++++++++++++ i18nilize/src/internationalize/helpers.py | 10 ++++ .../internationalize/resources/languages.json | 1 + setup.py | 12 ++++ 17 files changed, 93 insertions(+) create mode 100644 core/core/__pycache__/__init__.cpython-310.pyc create mode 100644 core/core/__pycache__/settings.cpython-310.pyc create mode 100644 core/core/__pycache__/urls.cpython-310.pyc create mode 100644 core/core/__pycache__/wsgi.cpython-310.pyc create mode 100644 core/i18nilize/__pycache__/__init__.cpython-310.pyc create mode 100644 core/i18nilize/__pycache__/urls.cpython-310.pyc create mode 100644 core/i18nilize/__pycache__/views.cpython-310.pyc create mode 100644 i18ilize.egg-info/PKG-INFO create mode 100644 i18ilize.egg-info/SOURCES.txt create mode 100644 i18ilize.egg-info/dependency_links.txt create mode 100644 i18ilize.egg-info/entry_points.txt create mode 100644 i18ilize.egg-info/top_level.txt create mode 100644 i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc create mode 100644 i18nilize/src/internationalize/command_line.py create mode 100644 i18nilize/src/internationalize/resources/languages.json create mode 100644 setup.py diff --git a/core/core/__pycache__/__init__.cpython-310.pyc b/core/core/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9afb2d4f43744cd4571e356e673007cf8d33e1c6 GIT binary patch literal 152 zcmd1j<>g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpd;R;8}#{1yr(E5NMEyGF{~zPk40UtvKNADq68GqAI$Gi|EoV4z0cw2yb6Pm(d#7 zTt@5pcqJdN5`G}stLU128C|#6Alf?ISI`anD*DL2hHjc%?Uq~PIj*7&-Ea^|6f;J` z0hRhuEO}9krBNIWvB%^}We0~ib{R%e??}3ba)%8U1tgRxb7MBMyeEw*Ku9yhC-Np- zmC7~%1{oj;0XuLRi9!kfY@a|h;^R*tIIiq7HlklD3W_``Ph%Ws;6;IgLj?d87LABU zmE&xcDLmW9Qh)6Gl20g;qW+z>$^Ok(M^>yI)0Ke1xmp9}N{>?~K~Q?cW+{bXy# z0tqSh#xdR)9Nrxbqo;R7&wPJE*3L|?_$YRoyb5fJ_Md=tK-dYf5E;wZDXoP8UeL+bvr9kspMF0wS03J6N zJs50^mu&~Fm6DB_HXsQ3c;d!b&euuUk!)rQhDqy0mponsn}wI>{LQIs&Z~Ad2<&ta zg>pTA{D&!x`*IzIR|HSyOg~@9#Rc-_^HAX(cq3k3h;xpMi#Vog-nliUZ_ewp4=lnb z-oeoI4xkz2@3vz%z{V)6dOGK~ob{MIj(wUaGYE!*kq>Pq_rMp2=(r7JE$=vMrl$5< zzV~mK0}bLqMo~;_Vsd{G=B$;BaBn1 zfWxt_CZ?q=wf<6XYqqF0c1^pib~;WrOG`$_Y8Y)Zxtg;zp#vhjqY?0%Z(dqLxbKdA zc2do#cS;^T^a;a{k_rfC^O}$r_4ZDqt*2sJZRv3ddOCTrkab=$BbU-i6e9=D4TAD; za+l&*Wm%(+88%5kd^c-^S5u29PM)0?sYOB(jDsc)2W`Rz~Tvrdnzi)=Y1xUF(I@QB8Bt*wvg@YO?`K18T0?RNFgUbw_vV zhNc5xqoq5x0VPxJLc)#BFWPA_n^`twZUJ&Vi=M7&`nK9_S`Hu^&UQm@YQJ&uZD1iE z{`yME%7-ewn7AQuaG+?I9>DiZ@gol^D9LL~$qIcs9Dn2F(NS9d8h9W3_!)e$Ir=RO zBDb=#x+IpwB~d6B%FAL!5CvY~%YyJ;{9Al4t_mfAFY@9)Ft374oV))N*F`Xgt5`1l E3osN2YXATM literal 0 HcmV?d00001 diff --git a/core/core/__pycache__/urls.cpython-310.pyc b/core/core/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e63f600a1a5a4d46cb8eac0553296d689d17e08 GIT binary patch literal 994 zcmb7DU5gVj6wOShAI^4{{Rw$%2kL|hq7;=Cb#Xy_Q1_)T-E@++=}wX%N!6|3OMi`j zXzcDmLEMjpP z$#@z^{@f~CGMOf_J#9ybCoJLdy0h-?VmP;Xn{{^4E?&md9_zkGS&x2+5lXM$y}^Z6 z3$ff7>V#H!p$$X~$Cc4*Ubs9>Kdd;u*_g7T&T*sc4K9Us*yxSp76XLEPUDY)f3i8g zg!|Ip7Yd-{9<(YswH#Z{Cn<)ta;~xyLYOXW&el{d^`Ts$CEj295mr?4rvrZ;Wa*2NT6=#E!q^e&-&kn3;>Hun1LFgo*MRjuY9O=u;^_DqZ)D^ZFq z4*+kodv$jXV~}e?!K{GF{!j#h?*?4jY|u}SiOSE z7kNJR1il;Xz!AR$vaM!PvP%hsIl@Sz`L%@C64oHenpx4N6l;K!`J5ReMa8_(YCey6 zpCd(+D1?e^O`9NEMR4KBLP&T;96-MG-nb8xa$UKCub8U!|DGz{P*C(;@s=+2jn|Ze zk@~g)<>`&91GVPT+ZG^+&>G5QAR!&dO&&QL|wETKDy!djm>8Gm~ z4!jqtc7tB%m1X2F%Yd~DFScD2ZBfFsII@HusI{4gL9=w(z%8D_8O5Zsm5hDu#ADK@PhG;wTQA}Y*nIQY1g`BVG^$R)roI(YI7KgT)# E2Z|Y~r~m)} literal 0 HcmV?d00001 diff --git a/core/i18nilize/__pycache__/__init__.cpython-310.pyc b/core/i18nilize/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1f27b1d1d423ee2cd3923e3579f1828ad03b491 GIT binary patch literal 157 zcmd1j<>g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpdwBw+vm literal 0 HcmV?d00001 diff --git a/core/i18nilize/__pycache__/urls.cpython-310.pyc b/core/i18nilize/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d902cc5ec802f772b11cfdaece320806d40b6633 GIT binary patch literal 311 zcmYjLy-ve05Vqr_iAb~X7FlY+#89Ckv9KVd3WhAm)TiLqKarjCH^39{4lwdcUOV*_ zSl}!cPP*^(-F@HPxu!WF7>ifhzhT`a@;?eB3(RngAc>@!7}`-vWG0!;4C@#rKxGbW zoqrUcL>6-L&U)HSWVs}5wMQRmY0L*P-tXxjDIOF&hDc(etc0gDw!*+=TgFvixM%6)pl=LlW16lTzHc6D)s{#c4|n-;|y#khV1Z^IYybuuLQp7ZMfKJYuQgdK$6 z@N)>8(G6U?mC))%jLKQQavr!kI@dO1D-snfw)AB2@pUJbD50O%`&_5vvl`B*eqV; z>I0bg0=&{(J^2bA)T&vCtg$Cu{Y_VORefJ~+3B}@Rbqr9e?f*4nJEkbsvl% zf@UPAA*F~}#&RpP8f;}ew?n(ZJack4bSZg5ge{zFA{=Rbwn9(1N5uDjKqlhT+EKC) zQUP+e58i%AP3C7RxWI) z<FvYR55ZuHlwNT|rrgjW6V?|7N%&sv=2Gi;ASbO|dAVjz zrIPCk&-<3b6v_b;F76&5A4JbKHlqD^zFl)Ivy<9Y@~o2D)I3%LT|1+TX5}I_@eNU3 zIQa8r@Lo%$gO4hWi*c+*L0{^TDaS!pCUKTdVw09dkd#UW>E`nyg)JGJgJQZjzO1c* zG#=#9*ac_&ch{OM&++a-#2oh~5~3UKPXSEnkX&&=r(Cda?8-KDY8y5LId3(XJnlos zYf2_EJ(prlS4je*oK#tMx$ZNC4b+`GcZBq23USo|*FBk*Ze`kxULWpkAMf;iM=f9o zzC^W%rj2G9Ob8ig?_rh^%=3 zsBT43UWzJ1+>WBND$ZsewS*;B(EKgdAgridFgP2nJ>t=})9mf}3-yv1#>JrQ>C;k~ zq%vCJa|>62f{9KP6uv0csMp+^ve5PDAJ-k(My;?r?`+5xb@7M31 zAN^h-1qv_Wn1Q9eQgR-XsDwy!@kpUB2_~<=R5moeD@>4?LyGJ^~pIArw zLu$LTkE6G{?x5-4AhH(?$>D#>er(OCp>vkg1)Z^5*oosm^(eVTa<)gV68+o>rHD?+ zXK1CC6XQ)^DYb?Rb_x&UeM_OIhyHY%k{Kdo71%s$%V87HeeIoCpUU*3GmjcPc<%j7 zesM8Y{Z2^7?-x{M%^OiH+evEL2k9gc+0*aseb8_3%3&&^WYoT{RI0M7>)vX2ss&HS zGAa0>P9fto6vc*(&`-?`yWTk#{#Zqc8MJIH7fP1;+Vwj_IW|$6boiilfOY%h(0oyF zJ1n>eO;}L*fT#x2_|M0^n_4Q}yRD)y8Hehqw=4CLNyoi79fom~g*H+zx_T{%Fq1v4 zhCS>nRpKnxMfQg2@o|`l{WwZwcRVeEku>}E_}~Z8S0ET|um){B7O8s1)a`lPUj%gh%DHQ8TLInpu!XUUXZh0ataT< zBmDa$qBAdNb1(N67DSLluq^_}sHlKC%^5fTypq$LFPNpqBl08xh;wa~IHoG9mI{LG z5sZW7xKrzAZ~jk$l+@`&4W;hIVKSP8BdNO%-iA?OqGOj!{n*WI8ClxDVQ>Bd#5W-P z=XG~;oMA!llOy&C2>m5atYF>O3Thrubpa6^1yDvex@&PHn7^;-&1;xgyf-Fjg`Y)6&-M z1P)lWVR!bzWLi|hF(@vSg;m+jLCneVSXD9X_~l`3y{i_)ppnRv^Fyhc)m!qaXRL77 zX{;XmS*Z0zh=4ZeMK54=5Us(Qbn_ud$kZj6hG^%XJ%ByQ4x0WH!jMA>im)H(3`sx4 znWZmid`=HjdqkT~(9bSEQ9TZNJPfM6 zLInW0CZry!$W?MtJ*zP2IrJv87k+h#lgn4udN=tB*YJ{TJvS_}eMw4Ti zm=En#4VpG#dUD%Yl^)dXyqpv+nON!ki@MY9W3H9uic4RKkVA_Xm2%ynz7nss1Y{YM zy8sS0Cmd|vFpgffNw@68^FZq!uwr#!1)MHJ2{Kr8lr4agL>4_~Dmm~(#9-?<6_Z%v S0Y_MC3;=%M1slOez4afBTczj# literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/command_line.py b/i18nilize/src/internationalize/command_line.py new file mode 100644 index 0000000..09ba409 --- /dev/null +++ b/i18nilize/src/internationalize/command_line.py @@ -0,0 +1,55 @@ +#from src.internationalize.helpers import add_language +import json +import argparse + +# Function to parse json file, given its path +def get_json(file_path): + try: + # open file and parse + with open(file_path, 'r') as file: + data = json.load(file) + except FileNotFoundError: + print("File not found") + raise FileNotFoundError + except json.JSONDecodeError as e: + print("JSON Decoding Error") + raise e + except Exception as e: + print(f"Error: {e}") + raise e + return data + +# Get rid of the hard coded path +def add_language(language): + data = get_json('i18nilize/src/internationalize/resources/languages.json') + translations = data.get('translations', []) + + # Check if the language already exists in the translations list + if not any(t.get('language') == language for t in translations): + # Add new language as a dictionary in the list + new_language = {"language": language} + translations.append(new_language) + data['translations'] = translations + + with open('i18nilize/src/internationalize/resources/languages.json', 'w') as file: + json.dump(data, file) + print("Language added!") + else: + print("Language is already added.") + +def cli(): + parser = argparse.ArgumentParser(description="internationalization for translation") + subparsers = parser.add_subparsers(dest='command') + + # sub parser for add_language + add_lang_parser = subparsers.add_parser('add-language') + add_lang_parser.add_argument('language') + + args = parser.parse_args() + + if args.command == 'add-language': + add_language(args.language) + else: + print("Invalid command") + +cli() \ No newline at end of file diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index b836004..e5ea12d 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -17,6 +17,16 @@ def get_json(file_path): raise e return data +# Get rid of the hard coded path +def add_language(language): + data = get_json('resources/languages.json') + if language not in data['translations']: + data['translations'][language] = {} + json.dump(data, 'resources/languages.json') + print("Language added!") + else: + print("Language is already added.") + # Input: # - file_path: path of json file # Output: Token in json file diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json new file mode 100644 index 0000000..6d65ec9 --- /dev/null +++ b/i18nilize/src/internationalize/resources/languages.json @@ -0,0 +1 @@ +{"Token": "85124f79-0829-4b80-8b5c-d52700d86e46", "translations": [{"language": "French", "hello": "bonjour", "No": "Non", "Why": "pourquoi"}, {"language": "Spanish", "hello": "Hola"}, {"language": "Korean"}]} \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..d39076d --- /dev/null +++ b/setup.py @@ -0,0 +1,12 @@ +import setuptools +from setuptools import find_packages + +setuptools.setup( + name='i18nilize', + version='1.0', + packages=find_packages(), + author='Brian Park', + entry_points = { + 'console_scripts': ['i18nilize=i18nilize.src.internationalize.command_line:cli'], + }, +) \ No newline at end of file From 9cf43deaa716ead8d54df30b99a9d87ce7c25fa0 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Wed, 23 Oct 2024 16:34:54 -0700 Subject: [PATCH 02/27] fixed pathing error --- .../__pycache__/command_line.cpython-310.pyc | Bin 1724 -> 1794 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 1159 -> 1790 bytes .../src/internationalize/command_line.py | 1 + i18nilize/src/internationalize/helpers.py | 16 ++++++++++++---- .../internationalize/resources/languages.json | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc index 5fcc66cc4b2ba4ddb60097b25d9cd86b203360a6..38f9c6fd5687a82d862b5a217eede0d7a2524f03 100644 GIT binary patch delta 519 zcmYLFu};G<5Y5?1>b7axAgBNpCWO?bs0(7KI>5$&gqWIvDyppzl)91As=!hS7+4|V zLl7$)8(Y`@0bc><6j4ilcYb%i_w0|#z3YxDm6Cz0_Oun!!n50$9pi}`9Ad*?M(_d8 zBql@Z)1m2`U~tOKN5iMw;x>x>mjUm8!pIzh&M4 delta 400 zcmZ8cJxc>Y5WTtG`$%$k$w5FoLTnV0M$y75+&|DJRjvt#vmDBOu`#Hv5qsU<{}8MM z!QWtejkUd4ySqXJcVT9B=FNL=Z-ZAqsC>U|$n$i+oxRu(!5}`8FEkKxBl*pc0Gded zjKoBWmdpfgbY!NCt_+aasWEmx70v1TF$M6%7tA`1o3YFJ#iA;0F*Oe$cwU(^hlo|f4%%@}W~zSirjN{f0a;s&uL-slcQ;)A|R^|h6EA_df>ju_d8eZBo> unVjY4BT?AH6HA-nLxtCt_2%wI@!z65DJop%ECz{KsG$q;5;t_icJ~M9`BL2g diff --git a/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc index 4e4d4dc69631c740e062ff9d36edaf5844ae5fee..667c9b4005ac54871484c61f3a4b1d4344bb0a86 100644 GIT binary patch delta 819 zcmYjOQEL-H5Z;-+TsFz2O=GR36q{M6oDxbkC3)FLC!uZMcw1 z3hjd;<-q6mMd+jWV}$z!`s6=QXD_C>%X~MtGvCa7y9c@7#j$p=m}j(p98?<1*`u); zxP5f}Mlml7`)ng4q0U_A>+>x3Gn6FAIGO%T5Hbk^=s^U>AhE$tu!kWYuvZ|twDv`W z_t=0k^nIB*WKHPt2#-`ydq+0V$rtjrDQU$VOK^CRCatatCkzhJhneBItwo4#IZc|l{_YxughrQ1Q` zgvtwa%L|+BKyLzR87(BoB3mZY7YW|8h`q?CBB|2}9J1H=gu1`Q^lC5>quT4Iknn~d zx|m??W&&aV6jYf?s4)ZM1W9hS;RpV^j#`_hUu`e+4{4@*~61y2lKM1?ykNyd(QUPDib*Ik`nz~>0TFUq2?l4$$g(?wUO%f#B3w9IR z>va4;D)Xeuluj(U{idU`T`*oM&-q`*`6`|3DFOiw zOmTsEAP>th^T$C4RW+{T3T(t5utN9+s}rta*eOGR1!^w-j*rLF?!#fuQ7nGQuR=Li z{90wnP*zuVPy Date: Wed, 23 Oct 2024 16:46:46 -0700 Subject: [PATCH 03/27] commented code, cleaned up code, added skeleton for tests --- .../__pycache__/command_line.cpython-310.pyc | Bin 1794 -> 737 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 1790 -> 1784 bytes .../src/internationalize/command_line.py | 41 ++-------------- i18nilize/src/internationalize/helpers.py | 13 +++--- .../internationalize/resources/languages.json | 22 ++++++++- i18nilize/tests/test_cli.py | 44 ++++++++++++++++++ setup.py | 12 ++++- 7 files changed, 88 insertions(+), 44 deletions(-) create mode 100644 i18nilize/tests/test_cli.py diff --git a/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc index 38f9c6fd5687a82d862b5a217eede0d7a2524f03..0f77021989f5490f6e8b4ddbef0db5607e23a564 100644 GIT binary patch delta 192 zcmZqTd&tU{&&$ij00h4}B-8&gP2`hd)SIX+tHa2U!kog=!Vtxh%F@gLOx9-8 zo&13@R`(Wja!w{lqF4Y(@G$W(axrr;aWo V`4pQPAIPN~j2w(Sj2ui{!T{v7D)RsU literal 1794 zcmah}QEwYX5Z>L}v(JueCq+~R1u#+-=_IhJc%VX21SG9ggbX4;;UpAYy&LzE^WCw# zCiUrz3PB<-2#MDUDSkofU%FSG_yGus2g=M|?7Dg3PCL6hJ3G5O-#3$9xzZ%?t)IO# za_WTqfs@sb!Q?$?`U4Px2pW^1>S;h>&SExp0%yzvPKj^?|B(caa77JzF6zRA-j(ht zfmOOs{KlW)hYWmHdLwBLj&z!otx$-AI7~*9a3qHm4K6+oJ>G8@n*JR`{+b~Lcsgaj zbY|4hb5_tfow0jxCl3FqL&-f-uzhlq=<6qx!nu@u1+CI@Vw~w4mDX^D5w5d%$y|8G21uvY(lCH;s7>3pXaCwg&tdMuUJsgsj(!DU5N|r8 z1wE&NjmVtMm|;JWLu&cv6>N{3f`#4{?iq>b%qiHpQ#fzcI+)`JdP*sndxXO5I;DTlXrq8x!^#3&;-Y4`M9$qg)Plk}stNa)sV!57@sbs$@r*6L zH^^^X$`^|`lmgXVVF2K^CZry!$mVWYzsM=jbI_X{i{qOMm~EKy&fVl&NI=nD*fvWq zR3k`ZEz9=%YBU+k#C(EN6|@mvJ-KgJl@6LXuO?ODg`L*EY+CIB%(dEt*x2w@z*vxY zS*!L1%@uzg^oRFbIOW!XMav3HK4%z5J_a4pg{nZC4q(NafED0$1C)NvvO*#6gRNz9 z^`P+dE(KEd9>_R@@>OvR0ktkFid;I`+a9N45=$uUa6B%0KoTfKjuKA;eMh()27S@7#Ss@f!TIq!pp)E=T!@}7vjp-&#wy2O$ zAqDG=BJ%?6BlrS7ffu58eFHDOD_*E)HqdlozjJoZH^2F2|N0lc-}C(fqvzy9EnfNT z*Eg2w0~tb>wHWdipg?)dS{xm8sS3=YqAD?u1*#6tphwk3*k*zM%d)oqn5tO*(g^{I z<{P|(oLS-zpln|7`ty%uNLdPF7{L%uIYP|N_=u{%@*?Y)YU3Hr({<0x%slY3+uxFm{j67;-z z=ImB%!b#v8)CE%e=Bv{vP5;#dWqv!g+CxjYMk1jE1!5@R?})Tu8t&#%wx8?9B{17L zO;XH~=r9>{!*suwJhC)S;(=bI66CU9sp}SCZ>Q(1%v)KoVog`BHzlj)K@V>qcB2&_ ROO{YEDU?uURZ*^&{|^LVj&T40 delta 747 zcmYjOPiqrF6rVRUyV)eWZ5m^W(L$eU!oA>AUe)HzHcjzM(fvi9Wi)1C1uuRrM*kQi=%kXTUe+vNSbdkRWso(Q8 zsOYbJ>CG3)r9?Y{F=TKG$Rl>f$2{f7>>Z#$dE{jLIh#;L@&c_-tP5k2@l%nBGXR$H zjCxuul?Z50_~*)4rq-^lJ@M#v0gDr=LAJxv0+#;!etG-gWU#Kc#BQTX^VOVzd4h{# zD+=TA<4|oh^bfHLRn6st!-K}FAdW^s6gIm_Gw7)>!2M=`7~-n$sETQ?nRXGx`xkaF z9ELF}VZzdcC64+-RUp^5R6fx)xdoGR}(cU2bj~Nxo3#3zeDGw$i~~7*DCMJvR!|PM-0pD6t6~qLZMO z^_KOzY7|Zd-yqMI%GKxAy@#`<&8TYqU@z>XDu|O_kah=grymU0^rf{3E4psKJj@xm zx_d>L_s$6Bb1k#}bt+6afeY%snQrIHoNl{G0kv#k#em6Qd)tiEY4ry<>V+F%{wFc3 OaF`>U1*hiNZt*YAV3~pd diff --git a/i18nilize/src/internationalize/command_line.py b/i18nilize/src/internationalize/command_line.py index 2c22465..90a866f 100644 --- a/i18nilize/src/internationalize/command_line.py +++ b/i18nilize/src/internationalize/command_line.py @@ -1,44 +1,10 @@ #from src.internationalize.helpers import add_language import json import argparse -from i18nilize.src.internationalize.helpers import get_json, add_language - -# Function to parse json file, given its path -def get_json(file_path): - try: - # open file and parse - with open(file_path, 'r') as file: - data = json.load(file) - except FileNotFoundError: - print("File not found") - raise FileNotFoundError - except json.JSONDecodeError as e: - print("JSON Decoding Error") - raise e - except Exception as e: - print(f"Error: {e}") - raise e - return data - -# Get rid of the hard coded path -def add_language(language): - data = get_json('i18nilize/src/internationalize/resources/languages.json') - translations = data.get('translations', []) - - # Check if the language already exists in the translations list - if not any(t.get('language') == language for t in translations): - # Add new language as a dictionary in the list - new_language = {"language": language} - translations.append(new_language) - data['translations'] = translations - - with open('i18nilize/src/internationalize/resources/languages.json', 'w') as file: - json.dump(data, file) - print("Language added!") - else: - print("Language is already added.") +from i18nilize.src.internationalize.helpers import add_language def cli(): + # initialize the parser parser = argparse.ArgumentParser(description="internationalization for translation") subparsers = parser.add_subparsers(dest='command') @@ -46,8 +12,11 @@ def cli(): add_lang_parser = subparsers.add_parser('add-language') add_lang_parser.add_argument('language') + # the subparser is used because different CLIs use a different amount of inputs + args = parser.parse_args() + # depending on the command, do different things if args.command == 'add-language': add_language(args.language) else: diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index ad927b0..583159c 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -1,5 +1,8 @@ import json +# Should this be removed? +DEFAULT_PATH = 'i18nilize/src/internationalize/resources/languages.json' + # Function to parse json file, given its path def get_json(file_path): try: @@ -17,9 +20,9 @@ def get_json(file_path): raise e return data -# Get rid of the hard coded path +# Adds a language to the default JSON file def add_language(language): - data = get_json('i18nilize/src/internationalize/resources/languages.json') + data = get_json(DEFAULT_PATH) translations = data.get('translations', []) # Check if the language already exists in the translations list @@ -29,11 +32,9 @@ def add_language(language): translations.append(new_language) data['translations'] = translations - with open('i18nilize/src/internationalize/resources/languages.json', 'w') as file: + # open and write + with open(DEFAULT_PATH, 'w') as file: json.dump(data, file, indent=4) - print("Language added!") - else: - print("Language is already added.") # Input: # - file_path: path of json file diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json index f235629..4d32946 100644 --- a/i18nilize/src/internationalize/resources/languages.json +++ b/i18nilize/src/internationalize/resources/languages.json @@ -1 +1,21 @@ -{"Token": "85124f79-0829-4b80-8b5c-d52700d86e46", "translations": [{"language": "French", "hello": "bonjour", "No": "Non", "Why": "pourquoi"}, {"language": "Spanish", "hello": "Hola"}, {"language": "Korean"}, {"language": "Japanese"}, {"language": "Japanese2"}]} \ No newline at end of file +{ + "Token": "85124f79-0829-4b80-8b5c-d52700d86e46", + "translations": [ + { + "language": "French", + "hello": "bonjour", + "No": "Non", + "Why": "pourquoi" + }, + { + "language": "Spanish", + "hello": "Hola" + }, + { + "language": "Japanese" + }, + { + "language": "Mandarin" + } + ] +} \ No newline at end of file diff --git a/i18nilize/tests/test_cli.py b/i18nilize/tests/test_cli.py new file mode 100644 index 0000000..343cf06 --- /dev/null +++ b/i18nilize/tests/test_cli.py @@ -0,0 +1,44 @@ +import unittest, os, json, timeit +from src.internationalize.helpers import get_json, make_translation_map, get_translation, add_language + +# Create your tests here. +class TestCLI(unittest.TestCase): + def setUp(self): + current_dir = os.path.dirname(__file__) + self.test_path = os.path.join(current_dir, 'resources/test_json.json') + + def test_add_language(self): + data = get_json(self.test_path) + + self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") + self.assertEqual(len(data['translations']), 2) + + french_translation = data['translations'][0] + self.assertEqual(french_translation['language'], "French") + self.assertEqual(french_translation['hello'], "bonjour") + self.assertEqual(french_translation['No'], "Non") + self.assertEqual(french_translation['Why'], "pourquoi") + + spanish_translation = data['translations'][1] + self.assertEqual(spanish_translation['language'], "Spanish") + self.assertEqual(spanish_translation['hello'], "Hola") + + self = add_language("Korean") + self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") + self.assertEqual(len(data['translations']), 3) + + french_translation = data['translations'][0] + self.assertEqual(french_translation['language'], "French") + self.assertEqual(french_translation['hello'], "bonjour") + self.assertEqual(french_translation['No'], "Non") + self.assertEqual(french_translation['Why'], "pourquoi") + + spanish_translation = data['translations'][1] + self.assertEqual(spanish_translation['language'], "Spanish") + self.assertEqual(spanish_translation['hello'], "Hola") + + spanish_translation = data['translations'][2] + self.assertEqual(spanish_translation['language'], "Korean") + +if __name__ == '__main__': + unittest.main() diff --git a/setup.py b/setup.py index d39076d..4182ca5 100644 --- a/setup.py +++ b/setup.py @@ -1,11 +1,21 @@ import setuptools from setuptools import find_packages +# setup file for the command line +# before testing, do the following command: +# pip install -e +# within the virtual environment, this will enable you to use i18nilize CLI setuptools.setup( + # package name name='i18nilize', + + # arbitrary version # version='1.0', + + # downloads the necessary packages (ex. json) packages=find_packages(), - author='Brian Park', + + # directs the script towards the function located in that file entry_points = { 'console_scripts': ['i18nilize=i18nilize.src.internationalize.command_line:cli'], }, From b2f2c36ab08ed29a94e136806ed6faaf42395c9c Mon Sep 17 00:00:00 2001 From: Stephanie Feng Date: Thu, 24 Oct 2024 00:34:38 -0700 Subject: [PATCH 04/27] implemented cli for add and update --- .../src/internationalize/command_line.py | 16 +++++++++++++- i18nilize/src/internationalize/helpers.py | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/i18nilize/src/internationalize/command_line.py b/i18nilize/src/internationalize/command_line.py index 90a866f..12626f3 100644 --- a/i18nilize/src/internationalize/command_line.py +++ b/i18nilize/src/internationalize/command_line.py @@ -1,7 +1,7 @@ #from src.internationalize.helpers import add_language import json import argparse -from i18nilize.src.internationalize.helpers import add_language +from i18nilize.src.internationalize.helpers import add_language, add_update_translated_word def cli(): # initialize the parser @@ -12,6 +12,18 @@ def cli(): add_lang_parser = subparsers.add_parser('add-language') add_lang_parser.add_argument('language') + # sub parser for add + add_parser = subparsers.add_parser('add') + add_parser.add_argument('language') + add_parser.add_argument('original_word') + add_parser.add_argument('translated_word') + + # sub parser for update + update_parser = subparsers.add_parser('update') + update_parser.add_argument('language') + update_parser.add_argument('original_word') + update_parser.add_argument('translated_word') + # the subparser is used because different CLIs use a different amount of inputs args = parser.parse_args() @@ -19,6 +31,8 @@ def cli(): # depending on the command, do different things if args.command == 'add-language': add_language(args.language) + elif args.command == 'add' or args.command == 'update': + add_update_translated_word(args.language, args.original_word, args.translated_word) else: print("Invalid command") diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index 583159c..fd13e20 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -1,4 +1,5 @@ import json +import sys # Should this be removed? DEFAULT_PATH = 'i18nilize/src/internationalize/resources/languages.json' @@ -36,6 +37,26 @@ def add_language(language): with open(DEFAULT_PATH, 'w') as file: json.dump(data, file, indent=4) +# Adds/updates a translated word under the given language in the default JSON file +def add_update_translated_word(language, original_word, translated_word): + data = get_json(DEFAULT_PATH) + translations = data.get('translations', []) + + language_exists = False + for translation in translations: + if translation.get('language') == language: + language_exists = True + translation[original_word] = translated_word + + with open(DEFAULT_PATH, 'w') as file: + json.dump(data, file, indent=4) + + break + + if not language_exists: + print(f"Error: Language '{language}' does not exist. Add the language before adding a translation.") + sys.exit(1) + # Input: # - file_path: path of json file # Output: Token in json file From c9f9dbe46e3b862bcfc56bc6559b8c24b810d6f2 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Thu, 24 Oct 2024 15:57:36 -0700 Subject: [PATCH 05/27] tests --- .../__pycache__/helpers.cpython-310.pyc | Bin 1784 -> 1749 bytes .../__pycache__/localize.cpython-310.pyc | Bin 0 -> 560 bytes .../internationalize/resources/languages.json | 6 --- .../__pycache__/test_cli.cpython-310.pyc | Bin 0 -> 2053 bytes .../test_parse_json.cpython-310.pyc | Bin 4784 -> 4784 bytes .../test_read_file.cpython-310.pyc | Bin 0 -> 1384 bytes i18nilize/tests/test_cli.py | 41 ++++++++++++++++-- 7 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc create mode 100644 i18nilize/tests/__pycache__/test_cli.cpython-310.pyc create mode 100644 i18nilize/tests/__pycache__/test_read_file.cpython-310.pyc diff --git a/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc index 83b385c8e4b77ec380b8c6a9580d555bde8daed5..1f637328015f472e7dc035bc608c6b1014002aa2 100644 GIT binary patch delta 544 zcmYjN%Ps^#6s_A;)iXmkW5^&uCPqldBe4^Y#R!5}NQ?*@>7+UnubxS1nUEF>o3TKo zHthHW8(TYmfK9J$`~fTKwh6jYr*EG+r_SyBVZYjT*|r;qexA=dOQ|c{g`@lO4M3Ah z85fXN*G4zg)PphPP778eTX0N6R zWQ_>I^g7kGAS+~)>`zp+7uUMp$l-R9YJu)FW^^mE387g%(y0^tj-dL^^xJ{R-13Fz z2ToF^@xYpyohz&^6*rd)#d+C=6m|W>$aE_e&li$vMxr%h;$W}ha2elkA>E>3!}7iA z=C13P4&0I_8arsz*vWDX&Z(2szke=XJRFJ|92r}Apw delta 603 zcmYjN&ubGw6rMLbv)QD(B#l}WT4`EqS&cX;1hJjO_(~aJZ_(5$nQ%lkzVjbxr|T%2QDAm?ct4<&OBL+JQ*i zH>DI(p-Rg8=m6VciV3_Uw6(Xy2FpXNr27(I;;HfoeZ{u&7gnBUeqtg$*o~5IPY+%L ziNj-GIa?Dq&@fekn*HiLIm~^Ieg?zu0{;*)x2sjGllRrlNO$(5PCOea6{|*AHj~8k zpRKN~Y;QK(FIJlC<`#vVNWaV6sNavZGStRM3JbNr*Eb%Tp)~oZfO2(&mapSsdtRKUWe&lJ{MP}Vb8>)hb`Icy^VDUxzx}x z6V#2Swq!z?>lwucJb4%9?4sPRlcZ~fH_-}(3G7(T*Z!@msJN6%uwZ}4_350)&HUfO loKetr+}Y*()Top%!psnhmS-9Sa|8ELGfTfaKXbemmR!$kRX_I5Q3LQSvuRD&A5~9vAdVx(tFak z2mw9%N{u&9zC!R|^{6mdO?^duRb7AP;9ws}_P*a=oil(R$r%c9@RHO$B9I`lg)5vR zf@CuL409&=8C3aCib934SSi1F?~Gn%iTNudvN`E1Qumg?Lx4}X%R(mc2u|SLlN}FS zvLgt%W_B9*7Yytx?(&dJAm*ve0=ogp1Kz+bXMk`9A^&4P6ci<1=C>IQGdi7@-U{tn z;Txk}ELx#g8?jP%INcsjC))VQh1qC1Y4l_}9uO6?Y2ldB8r3N7T{Nv)bi!ZSv`*yL z#>&X0@FI=}E#`$**NYVV1~%RE?sfgfDeLNU+X&qWyRJ`^TYJ;htyzk;+4iH=&9mpa zAy3uLF6%~nWpy7(De7OYnsp!JVY=*~XF+Y;1A+oediz-5LsIsu%xy{ZX_dvtRCV@$ k)!C(LJDRQEv`_6v9>AEs$Ku76k(*W>V`{_+N+|FB2JEekj{pDw literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json index 4d32946..9a4373a 100644 --- a/i18nilize/src/internationalize/resources/languages.json +++ b/i18nilize/src/internationalize/resources/languages.json @@ -10,12 +10,6 @@ { "language": "Spanish", "hello": "Hola" - }, - { - "language": "Japanese" - }, - { - "language": "Mandarin" } ] } \ No newline at end of file diff --git a/i18nilize/tests/__pycache__/test_cli.cpython-310.pyc b/i18nilize/tests/__pycache__/test_cli.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d3e5f277dd43392fbab196edfd4f49540d8e6567 GIT binary patch literal 2053 zcmdT_&uMOn(#OdWH92 zk8yEQ%=>IVO^k^VxR8y(!A^R+FVZYM;E|G}C>14_!f1gSr{t=b%Mn-6sQ^^hXvce8 zOu6`Qv%h_Nb8BzsZl~AZyxZ9t_IsWFaC_8Y+nYPR9_!!XTX%F=k&`+>#Yj|u4o*q6 z|4?!Mx&eO>Y9n8S@Y+j@%=I^!L85OCTX!n;Qqp|;6 zAvqN%4p1Mv5|_~{R4FdYpPtQWrk#uniBdauwX1lxr(H%%8aMaM;#JYd>uSMWbsiJ> zE&Th#kI@q#RnbtURLrQHMi01}mc=Z}iV>chIl$=C(Uu^46(J_0EbY!-=rvZQ{Ode>^#94T##iLoe_9JnE;R=Soqv=; zvIci81B4|6{9KrUan17QuJiLj2afp8Jw62fH!6zKx4LQh{l(*=K? zsxlShvufUjadive>qQ5GyKzo%=ZFVwPX|dNXwH*FFDFS}uz804Fi9{O7bEgJ4D}kq zr=U#_BbPn^HiZz7pcY;?KBUfRDw3pKkAt~LOWdNi3l+OqonpUCbDoy*6}Xb_=S8gx zHD(6+Ybu1qY9a9(WGaIW%-$&EH?AqK185i5`ci;8_{IC4@1lS F<0GKX;f??R literal 0 HcmV?d00001 diff --git a/i18nilize/tests/__pycache__/test_parse_json.cpython-310.pyc b/i18nilize/tests/__pycache__/test_parse_json.cpython-310.pyc index d135271fe5ac957cfd4baa33f18002ce43ade305..e77a5da46701d5d8af5878e869bb0b7c06915fc0 100644 GIT binary patch delta 20 acmdm>xx(c5Vn*(IZl^f5RQ5RiVkk ziHN;e`BH~|97GaS`BW913fV!c$zi}|52k(#LJ&qdVFstnOq3dm52c249N3uiV;(r6ZVbuFD^)d)ff6xnZ zO=6IJ23lVYJ3?nwx9u8{O@lYNNTnQ{8Ac8`Wlevs2}p>)VY6Z*GZ=t%{k< z`dSMWe>fZYp)%pxB;O4};SK$`S1}Sxi?GY)#rL7;#DaSrYtbSduN+VC zs!f?bVuZYGm?@*Luz29ZDK{=nZX%;cS_`zf|Fkw}ohhxG-jKhiJkv_-0|kZAOL9FC zhEd|QBiV;EGNTnSvlU5Ze(9YvcL=((Q4}!eXz0s8_n7rD3jJGC<=~MDQ>*aZw^TW} zM!K2E!zw9G#Qad4dLF)MG%W(9B3-8A*UyofIQ2ZR23++B%~QajkpPW-55Z}vSvaTW zK#W(*cL2&I8O5b;G?Kg&$Wlg$IR`4mr3z@gRKD9z7%PlPEuffUkhV!yHEpPzi6+&r zz&x#%ltK9!2Ggfn6(?~$Px=GldC83D4I(~*!uOJb=V3QwU(&oNEJ*bN#p2_)rLV*! zDJ)k^o<>_2D%Uk!t6-=4ip$)Q3}Vb9Th*#l3uG*mO#37K8>roNj7W=ttvqQ1MK*+f p%i7e%IQM;MK=hng13!=x(C#0WxbL#acCkC|URR(6`qC;a{RN~eTFU?c literal 0 HcmV?d00001 diff --git a/i18nilize/tests/test_cli.py b/i18nilize/tests/test_cli.py index 343cf06..c8a0458 100644 --- a/i18nilize/tests/test_cli.py +++ b/i18nilize/tests/test_cli.py @@ -2,13 +2,16 @@ from src.internationalize.helpers import get_json, make_translation_map, get_translation, add_language # Create your tests here. +# TEST CASES NEED WORK WITH REGARDS TO PATH FOR JSON FILE class TestCLI(unittest.TestCase): - def setUp(self): - current_dir = os.path.dirname(__file__) - self.test_path = os.path.join(current_dir, 'resources/test_json.json') +# def setUp(self): +# current_dir = os.path.dirname(__file__) +# print(current_dir) +# self.test_path = os.path.join(current_dir, 'src/internationalize/resources/languages.json') +# print(self.test_path) def test_add_language(self): - data = get_json(self.test_path) + data = get_json('i18nilize/src/internationalize/resources/languages.json') self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") self.assertEqual(len(data['translations']), 2) @@ -40,5 +43,35 @@ def test_add_language(self): spanish_translation = data['translations'][2] self.assertEqual(spanish_translation['language'], "Korean") + def test_add_existing_language(self): + data = get_json('src/internationalize/resources/languages.json') + + self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") + self.assertEqual(len(data['translations']), 2) + + french_translation = data['translations'][0] + self.assertEqual(french_translation['language'], "French") + self.assertEqual(french_translation['hello'], "bonjour") + self.assertEqual(french_translation['No'], "Non") + self.assertEqual(french_translation['Why'], "pourquoi") + + spanish_translation = data['translations'][1] + self.assertEqual(spanish_translation['language'], "Spanish") + self.assertEqual(spanish_translation['hello'], "Hola") + + self = add_language("Spanish") + self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") + self.assertEqual(len(data['translations']), 2) + + french_translation = data['translations'][0] + self.assertEqual(french_translation['language'], "French") + self.assertEqual(french_translation['hello'], "bonjour") + self.assertEqual(french_translation['No'], "Non") + self.assertEqual(french_translation['Why'], "pourquoi") + + spanish_translation = data['translations'][1] + self.assertEqual(spanish_translation['language'], "Spanish") + self.assertEqual(spanish_translation['hello'], "Hola") + if __name__ == '__main__': unittest.main() From dec7d3da8536c10512dfbf6e5b6f2c8fafb3e25a Mon Sep 17 00:00:00 2001 From: Brian Park Date: Fri, 25 Oct 2024 01:18:25 -0700 Subject: [PATCH 06/27] merged --- i18ilize.egg-info/PKG-INFO | 2 +- i18ilize.egg-info/SOURCES.txt | 10 +++++----- .../__pycache__/command_line.cpython-310.pyc | Bin 737 -> 996 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 1749 -> 2301 bytes i18nilize/src/internationalize/helpers.py | 3 +++ .../internationalize/resources/languages.json | 3 +++ 6 files changed, 12 insertions(+), 6 deletions(-) diff --git a/i18ilize.egg-info/PKG-INFO b/i18ilize.egg-info/PKG-INFO index 8391d70..c4dd000 100644 --- a/i18ilize.egg-info/PKG-INFO +++ b/i18ilize.egg-info/PKG-INFO @@ -1,4 +1,4 @@ Metadata-Version: 2.1 -Name: i18ilize +Name: i18nilize Version: 1.0 Author: Brian Park diff --git a/i18ilize.egg-info/SOURCES.txt b/i18ilize.egg-info/SOURCES.txt index 748b84d..e6f9b1b 100644 --- a/i18ilize.egg-info/SOURCES.txt +++ b/i18ilize.egg-info/SOURCES.txt @@ -1,7 +1,7 @@ README.md setup.py -i18ilize.egg-info/PKG-INFO -i18ilize.egg-info/SOURCES.txt -i18ilize.egg-info/dependency_links.txt -i18ilize.egg-info/entry_points.txt -i18ilize.egg-info/top_level.txt \ No newline at end of file +i18nilize.egg-info/PKG-INFO +i18nilize.egg-info/SOURCES.txt +i18nilize.egg-info/dependency_links.txt +i18nilize.egg-info/entry_points.txt +i18nilize.egg-info/top_level.txt \ No newline at end of file diff --git a/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc index 0f77021989f5490f6e8b4ddbef0db5607e23a564..9c1354af1eb35c6cf7697753c66aeedc6de60976 100644 GIT binary patch delta 557 zcmZ9Jzfaph6vyw~4?8h-=#Vl*v;qkbhJ~`QB6aGLB})~FMyFh41rj?t8;~G~AuOG$ z$p1hx@@KGgMvS*r>QadjcHY?q1SfsJ{@&B)e0uNxh`(+v2?CGcdbn*w2Vz=VhTZA* zr)bFA9Ef6yUy-)xi3!0Sv`8raS-Kfg<4dJF0~trhGU}Oz-5rmV%zB+n%QziiQk~O8 ztFArqyc`T1^%a%gO@HlN!i*_*4i{|9W?VUQ08*sNOR5&havpMg%wIU0O3tQ|BQr54 z7h)_99VL#aZe}j#$^`$bNQ)G8_lTz7i{x!0(#@(CL3yZ!2`kaeR}0U_LVtSS**6T^ zG(n>KQ9qW0qCKh$YTs<&}4lH zQt7A3c#9`7B_%#5F)zI|F+DXIBnks8Kn61qI|FfX#KiRmx(o|g7c$f`*DzlMwJANC=2;4-%2&;)*PzHEvdynb^}I8fIA~ z-bLmpfdo(96#s;Oz{}zv@GJ;9Xsn(jVh{aQO?6dub#;F$|E^b}a=E~0+*+IJZWP{C zrdMv$A2NhKYadBy1M)UUf$|M&3v|#WDKUqNq=R`ZkaV$#C6YNTV}+zbSY@s1=k-GX z^<|xR0A|v!VhKK`LcShO&@S;9LCF$~3&jhdpd=b__D~+^8CrNO2q#04lBao%X1qr* z%)kx|L?ZS$LYM9HfkZxV5_z3HTpYNGOLnmj346x%GD=$EiJQPOGr|B?ogMzRHpm(I z)Ja5=OY3567^({_zPJUz>~}w72+u2t6R#K-Rl?pg%8|a&$bK-lPcY)Spk3jbgk}Ifyw0F-N4VXTZf*;6y%^Lsc+4O_F1nu;@oFM*^ zUj3>KcC%nbVY-zzoy5^ivZSA!xe5DtV_S=a8Wgg`{1y4lr$3#$a_-3Obo#)pE#I@Q yoKOO7Yob18Jv&GGQ8Tl)+NY>zEm{`y77OXFdw$$rv!YW-p@gcdQ)*nfrTkxD=e3yt delta 310 zcmW-Zu}T9$5I}csH@kC}yO2ALk+h~s5(%F7$NVNVPp#hRkbfiy#-bJ!)IgHdQq%!8 zNV6pwLbjriB6fqC6tgwKg{YF}#Tvl8EP^Y5ZTBfppmH1PVW-PiXPXR!7`7w^5%5c9 zu)9{@ws3EH2rKuib7t2R>4ER{e~+NR_T8DeOIFRf9ZhEA(foEgao5;!U#62E`nJVT z(1wU>gy5ccN|)d{?72(aKRWhJz=**PSe3DgWqTfNkHVwxQF;vAE0&qRib6@0m|})H G4*vkNPB{7i diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index fd13e20..ab71e0c 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -23,6 +23,9 @@ def get_json(file_path): # Adds a language to the default JSON file def add_language(language): + # filename = f"{language.lower()}.json" + # file_path = os.path.join('i18nilize/src/internationalize/resources', filename) + data = get_json(DEFAULT_PATH) translations = data.get('translations', []) diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json index 9a4373a..102602d 100644 --- a/i18nilize/src/internationalize/resources/languages.json +++ b/i18nilize/src/internationalize/resources/languages.json @@ -10,6 +10,9 @@ { "language": "Spanish", "hello": "Hola" + }, + { + "language": "Mandarin" } ] } \ No newline at end of file From 8b36bd81f577ff2716ef9be631beff0380e7ab62 Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sat, 26 Oct 2024 10:35:52 -0700 Subject: [PATCH 07/27] feat: cli for delete --- .../src/internationalize/command_line.py | 10 ++++++- i18nilize/src/internationalize/helpers.py | 26 ++++++++++++++++--- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/i18nilize/src/internationalize/command_line.py b/i18nilize/src/internationalize/command_line.py index 12626f3..e2c4124 100644 --- a/i18nilize/src/internationalize/command_line.py +++ b/i18nilize/src/internationalize/command_line.py @@ -1,7 +1,7 @@ #from src.internationalize.helpers import add_language import json import argparse -from i18nilize.src.internationalize.helpers import add_language, add_update_translated_word +from i18nilize.src.internationalize.helpers import add_language, add_update_translated_word, delete_translation def cli(): # initialize the parser @@ -24,6 +24,12 @@ def cli(): update_parser.add_argument('original_word') update_parser.add_argument('translated_word') + # sub parser for delete + delete_parser = subparsers.add_parser('delete') + delete_parser.add_argument('language') + delete_parser.add_argument('original_word') + delete_parser.add_argument('translated_word') + # the subparser is used because different CLIs use a different amount of inputs args = parser.parse_args() @@ -33,6 +39,8 @@ def cli(): add_language(args.language) elif args.command == 'add' or args.command == 'update': add_update_translated_word(args.language, args.original_word, args.translated_word) + elif args.command == 'delete': + delete_translation(args.language, args.original_word, args.translated_word) else: print("Invalid command") diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index 1e12c20..986a50b 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -42,7 +42,7 @@ def add_language(language): # Adds/updates a translated word under the given language in the default JSON file def add_update_translated_word(language, original_word, translated_word): - data = get_json(DEFAULT_PATH) + data = get_json(DEFAULT_PATH) translations = data.get('translations', []) language_exists = False @@ -58,7 +58,28 @@ def add_update_translated_word(language, original_word, translated_word): if not language_exists: print(f"Error: Language '{language}' does not exist. Add the language before adding a translation.") - sys.exit(1) + sys.exit(1) + +# Deletes a translated word +def delete_translation(language, original_word, translated_word): + data = get_json(DEFAULT_PATH) + translations = data.get('translations', []) + + language_exists = False + for translation in translations: + if translation.get('language') == language: + language_exists = True + if original_word in translation and translation[original_word] == translated_word: + del translation[original_word] + + with open(DEFAULT_PATH, 'w') as file: + json.dump(data, file, indent=4) + + break + + if not language_exists: + print(f"Error: Language '{language}' does not exist.") + sys.exit(1) # Input: # - file_path: path of json file @@ -109,4 +130,3 @@ def make_translation_map(data): # get translations from hashmap given the language def get_translation(translations_map, language): return translations_map.get(language, "Translation not found") - From de8dcfc1b4899c0038d31bdbd750a01015a43f24 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Thu, 31 Oct 2024 00:38:01 -0700 Subject: [PATCH 08/27] fixed pathing issue with tests --- .../__pycache__/command_line.cpython-310.pyc | Bin 996 -> 996 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 2301 -> 2893 bytes i18nilize/src/internationalize/helpers.py | 2 +- .../internationalize/resources/languages.json | 2 +- .../__pycache__/test_cli.cpython-310.pyc | Bin 2053 -> 2223 bytes i18nilize/tests/test_cli.py | 26 ++++++++++-------- 6 files changed, 17 insertions(+), 13 deletions(-) diff --git a/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc index 9c1354af1eb35c6cf7697753c66aeedc6de60976..01073552d3dda7dc1ec984926f045e6c45f50a40 100644 GIT binary patch delta 20 acmaFD{)C-7pO=@50SG>YNN?o6$qWEFrv+{R delta 20 acmaFD{)C-7pO=@50SLZaklM(7lNkU!m<8(q diff --git a/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc index 3bc242d911c04e69e598b42e8fedd49f6dc55227..6811494061dd7986f194ee45a0d068f3caba2ca7 100644 GIT binary patch delta 761 zcmX|9-D(p-6y7tt*-U=hv^3DFC?evjX@2^bdM84uy@*0DY8NCVJJV)EoT;-LilHS! zy%I!9F1*QwUVG&u_yE2@-oPgiM62h-;yIk}oc-pT-8pCWci~$xuXDMyh4y27<51 zK!_~?f}OGV`BON7k8omr0u`x{&$0m%W$0iwCYU*}Z2C<*i{rCWP zn>=d%!3?Q0fsw6PHc7jKMC2l5AqzMEm=cx&#($$eU2AyRXdR!ZO<@a1B!oM5L{e~( z8nZ(t(qndtW9VY*A|tZz*eS&91kSMCX`8vm;8uODT3bEX*eq4*wawCMyIv{P+iO8d ztkpIu6;WT8tLwhIWuyu^ezL7qSNDx?4;xzf{0QrpeI0s^nZtuj5*^v=X`eN;Z|`+p z`N`d*mI|Ye?`-Q{3x`80vy6bXM|FW delta 159 zcmX>r_E(TEpO=@50SMefq|*zyCi2NJdQ8;z;AISE(Byv!lJKiCpX|jXzj0|C8)MXD z7IrU2&B@)It0g^va>aZ=f`w6lk&BUqk%N(`frYV1d$K>5Kcm*<`CJ-8fgm+ZK!S&{ wNC!x1a!$UjEqahXAh*B~j@3a9GdWi^ju8r$Z2gWFo5fvtKpiL;P zVg)aeGfnkrA_;v<)4qWwQczp-dMMIBWafm(LY(P~ILG>`P zf<4m^e;I!De29tud+I+AJ@NXdVNrV>(wdNrsY#hiwlYb78IuUIM{330pV1HF#zx<+ zpSVY-o_}ob_S(-~X?L3TzI6Pc<%C|x54NIj+Jj2JJd-_^u77lLL1XLp?f&{qv)6Te zFSsab=+$R^Yu^n*yXypjE2=d^YH&+pqbof>j8n+U@X^bj(~9+$>r1>xH6vz$+iJ#4 zIH42gn`(eYI3F^OzUYPGVg9ruUB_QM`AB3X`l=s1%;II-0^pQuIa&a;Xm0XM_gv$^ z6sQG?@iX2bTG0#kozm#3@qSGvz({h0Bm#Z`GKD~+yXKwkRoK>;iY7})UqMh=m|VmC zRfICaIznXzcJ#)q(A&`m^VQ8NvKzCb1rc&40ImRm6P~oLMF)w-&LPJ)TzBA2;)&b@ mh*{h5{Dr?!UN)Za?RH1>TJAmgP)T3`*rZ7FjPF>K{rU}y+tzvj delta 411 zcmY+9Jxjw-6o&6jZa%b4sck_LO>IY!wsuiBm7=4A6~r#(LZSv@s`tjFq<$cdig5mb zf=gXQa29`pt{I&CA9`0!kH)kE>!fIRiu{;H z0YB`_WyS>T^Lea!bGN#t%7QH7gBS_=W&aQ bN2SB60x3D7LG)+WXjU0+Ojp~?V)F9~-4I)h diff --git a/i18nilize/tests/test_cli.py b/i18nilize/tests/test_cli.py index c8a0458..650d28f 100644 --- a/i18nilize/tests/test_cli.py +++ b/i18nilize/tests/test_cli.py @@ -2,31 +2,34 @@ from src.internationalize.helpers import get_json, make_translation_map, get_translation, add_language # Create your tests here. -# TEST CASES NEED WORK WITH REGARDS TO PATH FOR JSON FILE class TestCLI(unittest.TestCase): -# def setUp(self): -# current_dir = os.path.dirname(__file__) -# print(current_dir) -# self.test_path = os.path.join(current_dir, 'src/internationalize/resources/languages.json') -# print(self.test_path) +# To test: +# In i18nilize directory, run +# python -m tests.test_cli +# UNTIL THE REFACTORING IS COMPLETED TO MAP INDIVIDUAL LANGUAGES TO FILE, TEST MUST BE MANUALLY COMPLETED BY REMOVING THE KOREAN +# LANGUAGE EVERY TIME YOU RUN THE TEST IN LANGUAGES.json def test_add_language(self): - data = get_json('i18nilize/src/internationalize/resources/languages.json') + data = get_json('src/internationalize/resources/languages.json') + print("Checking Number of Translations:") self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") self.assertEqual(len(data['translations']), 2) + print("Checking French Translations:") french_translation = data['translations'][0] self.assertEqual(french_translation['language'], "French") self.assertEqual(french_translation['hello'], "bonjour") self.assertEqual(french_translation['No'], "Non") self.assertEqual(french_translation['Why'], "pourquoi") + print("Checking Spanish Translations:") spanish_translation = data['translations'][1] self.assertEqual(spanish_translation['language'], "Spanish") self.assertEqual(spanish_translation['hello'], "Hola") - self = add_language("Korean") + add_language("Korean") + data = get_json('src/internationalize/resources/languages.json') self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") self.assertEqual(len(data['translations']), 3) @@ -40,8 +43,9 @@ def test_add_language(self): self.assertEqual(spanish_translation['language'], "Spanish") self.assertEqual(spanish_translation['hello'], "Hola") - spanish_translation = data['translations'][2] - self.assertEqual(spanish_translation['language'], "Korean") + korean_translation = data['translations'][2] + self.assertEqual(korean_translation['language'], "Korean") + print("Test passed!") def test_add_existing_language(self): data = get_json('src/internationalize/resources/languages.json') @@ -59,7 +63,7 @@ def test_add_existing_language(self): self.assertEqual(spanish_translation['language'], "Spanish") self.assertEqual(spanish_translation['hello'], "Hola") - self = add_language("Spanish") + add_language("Spanish") self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") self.assertEqual(len(data['translations']), 2) From 0f970455e527f3207f178090ba714d863f7754d0 Mon Sep 17 00:00:00 2001 From: Stephanie Feng Date: Thu, 31 Oct 2024 01:11:50 -0700 Subject: [PATCH 09/27] add setup/teardown and test for add_word --- .../internationalize/resources/languages.json | 3 -- i18nilize/tests/test_cli.py | 53 +++++++++++++++---- 2 files changed, 43 insertions(+), 13 deletions(-) diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json index 1cc631a..9a4373a 100644 --- a/i18nilize/src/internationalize/resources/languages.json +++ b/i18nilize/src/internationalize/resources/languages.json @@ -10,9 +10,6 @@ { "language": "Spanish", "hello": "Hola" - }, - { - "language": "Korean" } ] } \ No newline at end of file diff --git a/i18nilize/tests/test_cli.py b/i18nilize/tests/test_cli.py index 650d28f..ec70572 100644 --- a/i18nilize/tests/test_cli.py +++ b/i18nilize/tests/test_cli.py @@ -1,16 +1,23 @@ import unittest, os, json, timeit -from src.internationalize.helpers import get_json, make_translation_map, get_translation, add_language +from unittest.mock import patch +from src.internationalize.helpers import get_json, make_translation_map, get_translation, add_language, add_update_translated_word -# Create your tests here. -class TestCLI(unittest.TestCase): +# Create your tests here. # To test: -# In i18nilize directory, run -# python -m tests.test_cli +# In i18nilize directory, run python -m tests.test_cli + +class TestCLI(unittest.TestCase): + def setUp(self): + self.TEST_JSON_PATH = 'src/internationalize/resources/languages.json' + with open(self.TEST_JSON_PATH, 'r') as file: + self.original_json = json.load(file) + + def tearDown(self): + with open(self.TEST_JSON_PATH, 'w') as file: + json.dump(self.original_json, file, indent=4) -# UNTIL THE REFACTORING IS COMPLETED TO MAP INDIVIDUAL LANGUAGES TO FILE, TEST MUST BE MANUALLY COMPLETED BY REMOVING THE KOREAN -# LANGUAGE EVERY TIME YOU RUN THE TEST IN LANGUAGES.json def test_add_language(self): - data = get_json('src/internationalize/resources/languages.json') + data = get_json(self.TEST_JSON_PATH) print("Checking Number of Translations:") self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") @@ -29,7 +36,7 @@ def test_add_language(self): self.assertEqual(spanish_translation['hello'], "Hola") add_language("Korean") - data = get_json('src/internationalize/resources/languages.json') + data = get_json(self.TEST_JSON_PATH) self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") self.assertEqual(len(data['translations']), 3) @@ -48,7 +55,7 @@ def test_add_language(self): print("Test passed!") def test_add_existing_language(self): - data = get_json('src/internationalize/resources/languages.json') + data = get_json(self.TEST_JSON_PATH) self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") self.assertEqual(len(data['translations']), 2) @@ -64,6 +71,7 @@ def test_add_existing_language(self): self.assertEqual(spanish_translation['hello'], "Hola") add_language("Spanish") + data = get_json(self.TEST_JSON_PATH) self.assertEqual(data['Token'], "85124f79-0829-4b80-8b5c-d52700d86e46") self.assertEqual(len(data['translations']), 2) @@ -76,6 +84,31 @@ def test_add_existing_language(self): spanish_translation = data['translations'][1] self.assertEqual(spanish_translation['language'], "Spanish") self.assertEqual(spanish_translation['hello'], "Hola") + + def test_add_word_language_exists(self): + data = get_json(self.TEST_JSON_PATH) + french_translation = data['translations'][0] + self.assertEqual(len(french_translation), 4) + + add_update_translated_word("French", "good", "bien") + + data = get_json(self.TEST_JSON_PATH) + french_translation = data['translations'][0] + self.assertEqual(len(french_translation), 5) + self.assertEqual(french_translation['good'], "bien") + + @patch('sys.exit') + @patch('builtins.print') + def test_add_word_language_does_not_exist(self, mock_print, mock_exit): + data = get_json(self.TEST_JSON_PATH) + self.assertEqual(len(data['translations']), 2) + + add_update_translated_word("Italian", "hello", "ciao") + + mock_exit.assert_called_once_with(1) + mock_print.assert_called_once_with("Error: Language 'Italian' does not exist. Add the language before adding a translation.") + data = get_json(self.TEST_JSON_PATH) + self.assertEqual(len(data['translations']), 2) if __name__ == '__main__': unittest.main() From 9251c39b9f896636e5f984f81af101b45ec43171 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Thu, 31 Oct 2024 01:20:20 -0700 Subject: [PATCH 10/27] fix differences --- .../__pycache__/command_line.cpython-310.pyc | Bin 996 -> 1137 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 2893 -> 3268 bytes .../internationalize/resources/languages.json | 3 --- i18nilize/src/localization.egg-info/PKG-INFO | 25 ++++++++++++++++++ .../src/localization.egg-info/SOURCES.txt | 19 +++++++++++++ .../dependency_links.txt | 1 + .../src/localization.egg-info/top_level.txt | 1 + 7 files changed, 46 insertions(+), 3 deletions(-) create mode 100644 i18nilize/src/localization.egg-info/PKG-INFO create mode 100644 i18nilize/src/localization.egg-info/SOURCES.txt create mode 100644 i18nilize/src/localization.egg-info/dependency_links.txt create mode 100644 i18nilize/src/localization.egg-info/top_level.txt diff --git a/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc index 01073552d3dda7dc1ec984926f045e6c45f50a40..b6425e40f6441fc53a716237b3f7467d23e6981c 100644 GIT binary patch delta 504 zcmZWlyGjF55WRDE_wHsNA%qx3EPSA_#v&l35V5fpLDHp>HFpU~HV^J@5FsH&L>rs1 ztwmDW`4xV|Hfd}u{R8K2j0z5%!I1f1DQfA0vCnw*MOE;rK_wZI6iIS# z!jdFMOtijeb|Y7hpXtF-4l6Zh(B~d*r|*f-7d7X5S<5t0J<$kXh$zMjTF;m9fK6>M z6>|xQFO;n{6N+F{v4LGzPt;b}>xyiAr&Lbln`vDXrTV3HOcUd@)8m7{KLgA{`BMW7 JD1bpt_X|KMYqtOZ delta 357 zcmey!@r0c(pO=@50SG>YNTsWhTzrXP;)(ijh6St(8ERQ;ShLttShJam{7Tq?Y>s9| zpkWNb3}A8gY^LG}FpCSQBDsVUqymV!fS9|P8KSa;CxsiPOOt2vGsYg_Dt^zrvc#Os z6ousc+}y;x6iwdAy-a~>tU&9Fm_P(Oh+qa0oFD?^#apZeMVWaenrxFfnbl diff --git a/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc index 6811494061dd7986f194ee45a0d068f3caba2ca7..11bb451e49b78a24333ff8ba8ef8d40dd452e92c 100644 GIT binary patch delta 522 zcmX|-&ubGw6vy{XX2;p>X5BQ2Z6JmG(AF4T8`~x)Z7)4}$iYKXFSWQ!DJ==kE-Gb% zf*u4<<()iPZ+f&h?_LE#Q1H_Kp{L@(`d+}!z~_DW^4@nI^X)})c53E-C^P9kiKlsibz$ZMlZxb8pBee00oP%ThC2L`CtTJ^Z zqTC0_tUY1YBRRG+$kbEI%x5Ztij@iSC;BcH?QrJaGXRV4=7d9d;%9cUfdhN(g=x@A z2Ze=NG>VhjaFo{K=etQ7nkMX#xk+u0fq*~MUSWeL)nroBj0v%S>1ScE9dwbd z4$fU%1*i6>2s-H9;0@m$$K5^Nd*>sKuES8(IKCdYuO?v?Z9-Y~OAjt;rujOHJ-DG~ zuLMKi-T|BYbI9ljr^zudO??Id!3CSs0+-3@e^-NsonKqfOXCv<+%=9hbf>yd(35Jx zKD}{$PAk=eA^oUZ*rPSQPF2wET*{G%aUll9#}S-+equz6;0z9VE<2gXjKgTKV@@Wp rE+^X)wuD&d3Ym}#g)kIG!k8ZP?ncTb@;BT%)-k~*rikccTQ~jy-mo+E diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json index 1cc631a..9a4373a 100644 --- a/i18nilize/src/internationalize/resources/languages.json +++ b/i18nilize/src/internationalize/resources/languages.json @@ -10,9 +10,6 @@ { "language": "Spanish", "hello": "Hola" - }, - { - "language": "Korean" } ] } \ No newline at end of file diff --git a/i18nilize/src/localization.egg-info/PKG-INFO b/i18nilize/src/localization.egg-info/PKG-INFO new file mode 100644 index 0000000..dd59d81 --- /dev/null +++ b/i18nilize/src/localization.egg-info/PKG-INFO @@ -0,0 +1,25 @@ +Metadata-Version: 2.1 +Name: localization +Version: 1.0.0 +Summary: A localization package for microservices +Author: UBC Launchpad +Author-email: strategy@ubclaunchpad.com +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Requires-Python: >=3.6 +Description-Content-Type: text/markdown +License-File: LICENSE.txt + +### L10n +A simple, lightweight interface for Python-based applications handle anything l10n/i18n +MIT License + +Copyright (c) [2024] [UBC Launchpad] + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/i18nilize/src/localization.egg-info/SOURCES.txt b/i18nilize/src/localization.egg-info/SOURCES.txt new file mode 100644 index 0000000..5cb9de1 --- /dev/null +++ b/i18nilize/src/localization.egg-info/SOURCES.txt @@ -0,0 +1,19 @@ +LICENSE.txt +README.md +pyproject.toml +setup.cfg +src/internationalize/__init__.py +src/internationalize/command_line.py +src/internationalize/globals.py +src/internationalize/helpers.py +src/internationalize/internationalize.py +src/internationalize/localize.py +src/localization.egg-info/PKG-INFO +src/localization.egg-info/SOURCES.txt +src/localization.egg-info/dependency_links.txt +src/localization.egg-info/top_level.txt +tests/test.py +tests/test_cli.py +tests/test_generate_file.py +tests/test_parse_json.py +tests/test_read_file.py \ No newline at end of file diff --git a/i18nilize/src/localization.egg-info/dependency_links.txt b/i18nilize/src/localization.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/i18nilize/src/localization.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/i18nilize/src/localization.egg-info/top_level.txt b/i18nilize/src/localization.egg-info/top_level.txt new file mode 100644 index 0000000..1d2fe09 --- /dev/null +++ b/i18nilize/src/localization.egg-info/top_level.txt @@ -0,0 +1 @@ +internationalize From b37d7189331a95db6d3cf8fa412284aec5be83fe Mon Sep 17 00:00:00 2001 From: Brian Park Date: Sun, 3 Nov 2024 14:29:58 -0800 Subject: [PATCH 11/27] added init files --- i18nilize/__init__.py | 0 .../build/lib/internationalize/__init__.py | 0 .../lib/internationalize/command_line.py | 47 +++++++ .../build/lib/internationalize/globals.py | 0 .../build/lib/internationalize/helpers.py | 132 ++++++++++++++++++ .../lib/internationalize/internationalize.py | 0 .../build/lib/internationalize/localize.py | 16 +++ i18nilize/src/__init__.py | 0 .../internationalize/resources/languages.json | 3 + .../__pycache__/test_cli.cpython-310.pyc | Bin 2223 -> 3664 bytes 10 files changed, 198 insertions(+) create mode 100644 i18nilize/__init__.py create mode 100644 i18nilize/build/lib/internationalize/__init__.py create mode 100644 i18nilize/build/lib/internationalize/command_line.py create mode 100644 i18nilize/build/lib/internationalize/globals.py create mode 100644 i18nilize/build/lib/internationalize/helpers.py create mode 100644 i18nilize/build/lib/internationalize/internationalize.py create mode 100644 i18nilize/build/lib/internationalize/localize.py create mode 100644 i18nilize/src/__init__.py diff --git a/i18nilize/__init__.py b/i18nilize/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/i18nilize/build/lib/internationalize/__init__.py b/i18nilize/build/lib/internationalize/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/i18nilize/build/lib/internationalize/command_line.py b/i18nilize/build/lib/internationalize/command_line.py new file mode 100644 index 0000000..e2c4124 --- /dev/null +++ b/i18nilize/build/lib/internationalize/command_line.py @@ -0,0 +1,47 @@ +#from src.internationalize.helpers import add_language +import json +import argparse +from i18nilize.src.internationalize.helpers import add_language, add_update_translated_word, delete_translation + +def cli(): + # initialize the parser + parser = argparse.ArgumentParser(description="internationalization for translation") + subparsers = parser.add_subparsers(dest='command') + + # sub parser for add_language + add_lang_parser = subparsers.add_parser('add-language') + add_lang_parser.add_argument('language') + + # sub parser for add + add_parser = subparsers.add_parser('add') + add_parser.add_argument('language') + add_parser.add_argument('original_word') + add_parser.add_argument('translated_word') + + # sub parser for update + update_parser = subparsers.add_parser('update') + update_parser.add_argument('language') + update_parser.add_argument('original_word') + update_parser.add_argument('translated_word') + + # sub parser for delete + delete_parser = subparsers.add_parser('delete') + delete_parser.add_argument('language') + delete_parser.add_argument('original_word') + delete_parser.add_argument('translated_word') + + # the subparser is used because different CLIs use a different amount of inputs + + args = parser.parse_args() + + # depending on the command, do different things + if args.command == 'add-language': + add_language(args.language) + elif args.command == 'add' or args.command == 'update': + add_update_translated_word(args.language, args.original_word, args.translated_word) + elif args.command == 'delete': + delete_translation(args.language, args.original_word, args.translated_word) + else: + print("Invalid command") + +cli() \ No newline at end of file diff --git a/i18nilize/build/lib/internationalize/globals.py b/i18nilize/build/lib/internationalize/globals.py new file mode 100644 index 0000000..e69de29 diff --git a/i18nilize/build/lib/internationalize/helpers.py b/i18nilize/build/lib/internationalize/helpers.py new file mode 100644 index 0000000..fca2d33 --- /dev/null +++ b/i18nilize/build/lib/internationalize/helpers.py @@ -0,0 +1,132 @@ +import json +import sys + +# Should this be removed? +DEFAULT_PATH = 'src/internationalize/resources/languages.json' + +# Function to parse json file, given its path +def get_json(file_path): + try: + # open file and parse + with open(file_path, 'r') as file: + data = json.load(file) + except FileNotFoundError: + print("File not found") + raise FileNotFoundError + except json.JSONDecodeError as e: + print("JSON Decoding Error") + raise e + except Exception as e: + print(f"Error: {e}") + raise e + return data + +# Adds a language to the default JSON file +def add_language(language): + # filename = f"{language.lower()}.json" + # file_path = os.path.join('i18nilize/src/internationalize/resources', filename) + + data = get_json(DEFAULT_PATH) + translations = data.get('translations', []) + + # Check if the language already exists in the translations list + if not any(t.get('language') == language for t in translations): + # Add new language as a dictionary in the list + new_language = {"language": language} + translations.append(new_language) + data['translations'] = translations + + # open and write + with open(DEFAULT_PATH, 'w') as file: + json.dump(data, file, indent=4) + +# Adds/updates a translated word under the given language in the default JSON file +def add_update_translated_word(language, original_word, translated_word): + data = get_json(DEFAULT_PATH) + translations = data.get('translations', []) + + language_exists = False + for translation in translations: + if translation.get('language') == language: + language_exists = True + translation[original_word] = translated_word + + with open(DEFAULT_PATH, 'w') as file: + json.dump(data, file, indent=4) + + break + + if not language_exists: + print(f"Error: Language '{language}' does not exist. Add the language before adding a translation.") + sys.exit(1) + +# Deletes a translated word +def delete_translation(language, original_word, translated_word): + data = get_json(DEFAULT_PATH) + translations = data.get('translations', []) + + language_exists = False + for translation in translations: + if translation.get('language') == language: + language_exists = True + if original_word in translation and translation[original_word] == translated_word: + del translation[original_word] + + with open(DEFAULT_PATH, 'w') as file: + json.dump(data, file, indent=4) + + break + + if not language_exists: + print(f"Error: Language '{language}' does not exist.") + sys.exit(1) + +# Input: +# - file_path: path of json file +# Output: Token in json file +def get_token(file_path): + data = get_json(file_path) + token = data["Token"] + return token + + +# Input: a JSON object +# Output: None, but creates a local JSON file containing the object +def create_json(json_object): + with open("src/internationalize/jsonFile/translations.json", "w") as outfile: + outfile.write(json_object) + +# Input: None (for now) +# Output: None, but creates a local JSON file containing translations +def generate_file(): + file_content = { + "Token": "85124f79-0829-4b80-8b5c-d52700d86e46", + "translations" : [{ + "language": "French", + "hello": "bonjour", + "No": "Non", + "Why": "pourquoi", + }, + { + "language": "Spanish", + "hello": "Hola", + }, + ] + } + + # transforms the dictionary object above into a JSON object + json_object = json.dumps(file_content, indent=4) + create_json(json_object) + +# make hashmap from translations +def make_translation_map(data): + translations_map = {} + for translation in data.get('translations', []): + language = translation.get('language') + if language: + translations_map[language] = translation + return translations_map + +# get translations from hashmap given the language +def get_translation(translations_map, language): + return translations_map.get(language, "Translation not found") diff --git a/i18nilize/build/lib/internationalize/internationalize.py b/i18nilize/build/lib/internationalize/internationalize.py new file mode 100644 index 0000000..e69de29 diff --git a/i18nilize/build/lib/internationalize/localize.py b/i18nilize/build/lib/internationalize/localize.py new file mode 100644 index 0000000..7aca8ac --- /dev/null +++ b/i18nilize/build/lib/internationalize/localize.py @@ -0,0 +1,16 @@ +from src.internationalize.helpers import get_json + +# Input: +# - file_path: path of json file +# - language: chosen language to translate to +# - word: chosen word to translate +# Output: translated word based on chosen language +def get_translation(file_path, language, word): + data = get_json(file_path) + for translation in data["translations"]: + if translation["language"] == language: + new_word = translation.get(word) + if (new_word == None): + return f"'{word}' not found in {language}" + return new_word + return f"'{language}' not found" \ No newline at end of file diff --git a/i18nilize/src/__init__.py b/i18nilize/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json index 9a4373a..102602d 100644 --- a/i18nilize/src/internationalize/resources/languages.json +++ b/i18nilize/src/internationalize/resources/languages.json @@ -10,6 +10,9 @@ { "language": "Spanish", "hello": "Hola" + }, + { + "language": "Mandarin" } ] } \ No newline at end of file diff --git a/i18nilize/tests/__pycache__/test_cli.cpython-310.pyc b/i18nilize/tests/__pycache__/test_cli.cpython-310.pyc index a9a10d3a0fd69e845f4f087f7d203707ce7ce5ac..2fd943ba278bac8d453bc8a416e3e49f641ee367 100644 GIT binary patch literal 3664 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 From 24f35bd932e0ff4546827fc2c2fac79c62dab19c Mon Sep 17 00:00:00 2001 From: Stephanie Feng Date: Sun, 3 Nov 2024 22:33:28 -0800 Subject: [PATCH 12/27] add test for update --- .../internationalize/resources/languages.json | 3 --- i18nilize/tests/test_cli.py | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json index 102602d..9a4373a 100644 --- a/i18nilize/src/internationalize/resources/languages.json +++ b/i18nilize/src/internationalize/resources/languages.json @@ -10,9 +10,6 @@ { "language": "Spanish", "hello": "Hola" - }, - { - "language": "Mandarin" } ] } \ No newline at end of file diff --git a/i18nilize/tests/test_cli.py b/i18nilize/tests/test_cli.py index ec70572..ec150a0 100644 --- a/i18nilize/tests/test_cli.py +++ b/i18nilize/tests/test_cli.py @@ -97,6 +97,23 @@ def test_add_word_language_exists(self): self.assertEqual(len(french_translation), 5) self.assertEqual(french_translation['good'], "bien") + def test_update_word_language_exists(self): + data = get_json(self.TEST_JSON_PATH) + french_translation = data['translations'][0] + self.assertEqual(len(french_translation), 4) + + add_update_translated_word("French", "good", "bie") + data = get_json(self.TEST_JSON_PATH) + french_translation = data['translations'][0] + self.assertEqual(len(french_translation), 5) + self.assertEqual(french_translation['good'], "bie") + + add_update_translated_word("French", "good", "bien") + data = get_json(self.TEST_JSON_PATH) + french_translation = data['translations'][0] + self.assertEqual(len(french_translation), 5) + self.assertEqual(french_translation['good'], "bien") + @patch('sys.exit') @patch('builtins.print') def test_add_word_language_does_not_exist(self, mock_print, mock_exit): From 536d4d030f1532d84a17aa83cea47182bb1412b2 Mon Sep 17 00:00:00 2001 From: Brian Park Date: Fri, 15 Nov 2024 19:09:21 -0800 Subject: [PATCH 13/27] refactored add-language, added test --- .../__pycache__/command_line.cpython-310.pyc | Bin 1137 -> 1137 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 3268 -> 3394 bytes i18nilize/src/internationalize/helpers.py | 40 ++++---- .../internationalize/languages/japanese.json | 1 + .../internationalize/languages/korean.json | 1 + .../internationalize/resources/languages.json | 15 --- .../__pycache__/test_cli.cpython-310.pyc | Bin 3664 -> 2595 bytes i18nilize/tests/test_cli.py | 94 +++--------------- 8 files changed, 32 insertions(+), 119 deletions(-) create mode 100644 i18nilize/src/internationalize/languages/japanese.json create mode 100644 i18nilize/src/internationalize/languages/korean.json diff --git a/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc index b6425e40f6441fc53a716237b3f7467d23e6981c..fa7ac023eb36b5e611481ef8a8012d4c65a96a41 100644 GIT binary patch delta 171 zcmey!@sWc&pO=@50SH<@nQ!D~VPcG$EWjiVBsG}wf#eJ(ZTBdi#FUiy#G>@l+|<01 zD6WFUqT*B#zqp7MsIiC%M6iJfW)Q&vA~-<=3y`?QT2PdkSE9)tHJOW9m63O{0kamP mz~pG=8GJ%OX`nbuR&jn_5zk~s7Hd(EP>}#CAvigZMF9Y~kR+S{ delta 171 zcmey!@sWc&pO=@50SN9JD{tgxVPd>BS%66#NNOry*6N}PIb5rw5 zZgCYP78R$0_{BwRK#fIAAc6x#FoOt?X+_*1f(1z2Vl61j%q!7kzcrbQS(Q;>vH`Oe nquAtV<{5kvKxv>jOIC4yUJ>79Miy&PkWi5rDj_~OkVOFi{Us;a diff --git a/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc index 11bb451e49b78a24333ff8ba8ef8d40dd452e92c..db3791bcebf4f9f713cd1bc1bc605ba46e16d7cd 100644 GIT binary patch literal 3394 zcmb7GTW=f372eq!m*P#5E!Rnmgh^YwY!lHz(Z)3#H)d`}iGt%z5bK?z;27qpt2V=FsnV_)mI$M|%hF zPI|S^-9vb2?~e@qY$rIl%bXEL7>0P~(YqY)IQo9??UPS<@ac(15gvZ-ed#>2W6b*P zJB^@am>gE`B|TA3GhKg_4N^Y5^qcihTJ=@Y&3KY-)z_rVLFnDiIdzUYcR#lPX3;v;<5>BoB8_;hQ09_!dJ zaqP$%!uaBo<^v_9YHrFTPW!RkZLSKntFwNymvsq1i)1r-|5ln z?&cm3c=*(^yIq~zDnJ`JY zNcFIG|AgxGm~+9G8ztjr%0zqduHcDOrgDF!_3?w1kJr{atH1u#_!ES7vLrP@FWVQ= zgmxAsX=E9|0J_0mUs6N>Y&6XiSwcs%k&u`JTVXs$CR;{&h)!C z(4!V%s_ZHN@|h2i7TL9zWmmq9?yd(jy=c-R{uYWcZZy*5kd3_D8v~Fn2Z2Wtje^`? zbv|1jg?Wg6?}+8jt}E|wA8*_opxi-{X~qK!MM3*JLGI-RQlbA21#?pNxS9v5r9&R& z1bOk9O-@}HL%EJlV6sq^TBfXJoT{EBu(~JfSoVgz3@ew&T!DG9aFTSVc-Z*!68 zOob4+$RKfu+Q_A%*Kk`V*vNK8+F+K64bKXN<&6n6y*aq4eI$Z!Y=_MijRk)QkHLhexh z&X#Y=W5{uH7EPPme#;c6q*wA1rnhO`h~!neCuNh@U`zp8o5p*>6yi-~B{u4GY(?zY zG&I4!OtfeOrbHF1lWp#ZuAU@dv>7YW!2lD1Eo1{tU!D(IsVfEL5qN`;t^2o|lPbTR zDSi9a&6_uyaX)EJB>_ZLHWsppWj0(B;(QSADO1=MF-N(7{uTNq@zJnl69_uSoM|i0 zF_9FH2SRBjZ@{TtQaaWHg&KvgDGrmm7EoPNHd27FPW?2Y@dmOdZ_(q=VA>c=^|2(; zE?WqvmF}nHaW3a7TOt*ba3NO#4@H@R69<0tY|g#LaPL;VDw7}K#VZL$6_@@NA)-D` z5GZ70AVq}^1+GF#hG!S_MhTQlz>4MG9p`bB(}CD)SsAf=Ic9eA4S$k)^RvldJS?&7vxQKm*u({E+VGAShoaL+3nu z!muSolD=7iu>`Pa*v;6%W^lE^nTNB9?(AiJ&=WYLW9m0yA}drlQQ{aAdC@{tjh3SC KM072bi{AiDQ2rwT literal 3268 zcmbtWTW=f36`q-0E|(WwE$7y>VUsil+lZ7M%T^M_iBnk!f`BP%r9ue=?20p@R-$+5 z*;Qo`%fP7u#4ka9Kpa4N382^foPEhdpZo)gHb!9gJ3~^WRJB0RC3a?b_RN`c`R1Gx zPE6z(o*&+LrS&`#i?el>h}-Nki=Nx#oYC*kc>7eF#n%4oeQIn=aR83k`WpwGZ)f&z zaMpu_u7htDeM|67g7%rUM?B8{9|s&caM+3U4g1!}80Xt#L-!XQFTN6 zUeNLMPIW~^J8{^lw!Ie!z$1%Ph{sTxNipnVuax+u4LCwsd6n zD}$F2b|f>%d3zi=M5DLt*3x3Ey&!5E??k86rn^OOeS_5g6^73N)KBw9ZEQc{57>_Q z6M%RZMnITI-68O6$2_&*KhQ*FA?5Kg*RzmdLZzp$N^{FC6{ve1edE_8pAHiDU&M9r zq-+f3RF+Nfq8pVHZX+k2YQZ9vbFZS_@(hN0F;IIa=j#H|319kI8jR+}aSfjbIih1+yU3rh zT#*MLiqqCaT4bbQAUsleuqAa)`5s zuFMn6P9RdK8NaL=Kdou9SHD2RFEBiw8Qk@c1{tq(sr&Awk_=U3vV^+lM{%WeQ_51j zrAouFmNwL8s8tD$q_p9c#xPiUMCtN4XTqs}NhgteM}gBN`kTd&TG4)#+BhUWcKf)P z2({nxk&qjEp_b{?P_UAQpht0@8Y&^3O`D=_-S!ilSxHr5|+?a`4h%~1!<9`$H$wOw68;qGtSdfttjTkjy4^0aua}PyJ$oxam zgA=x4I5lEl33NcHZ`7w4BPVLzSCr7LgFU)@+*m|xmhY|hKYE7unm zq|?sl-eyBqptyPqC1sPFBtE^1-jTHo5QXK#1B zz>l`-_6K3xgKJEYx&oE4p2uWz-zeV!4yJZwsCGog^0KHGO>fc+(GUi)UZ8Dfz&t^< zPLl(PRe>X-94hGH^s|2wS&UD_W9P}_bdl?;_}3y=V>P(Dnj$C1*w<8}0JLGJUNF=XzJw=>Fq zKo+rg!5tAJwL^JogSfbFbA1h@CV^r2(E7v%I-2yScIK#m_qrF?M$O2m&D2I&p%<~^ zT&+qc*7I} lclk~zciRg6HO_htgNti#Tdw8KxEI_x_gU9<9rt1}_iyK<$2tH2 diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index 8451717..18d9e03 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -1,13 +1,10 @@ import json -<<<<<<< HEAD import sys - -# Should this be removed? -DEFAULT_PATH = 'src/internationalize/resources/languages.json' -======= import os import requests ->>>>>>> main + +DEFAULT_PATH = 'src/internationalize/resources/languages.json' +LANGUAGES_DIR = 'src/internationalize/languages' # Function to parse json file, given its path def get_json(file_path): @@ -26,25 +23,20 @@ def get_json(file_path): raise e return data -# Adds a language to the default JSON file +# Adds a json file corresponding to the added language def add_language(language): - # filename = f"{language.lower()}.json" - # file_path = os.path.join('i18nilize/src/internationalize/resources', filename) - - data = get_json(DEFAULT_PATH) - translations = data.get('translations', []) + os.makedirs(LANGUAGES_DIR, exist_ok=True) + file_path = os.path.join(LANGUAGES_DIR, f"{language.lower()}.json") - # Check if the language already exists in the translations list - if not any(t.get('language') == language for t in translations): - # Add new language as a dictionary in the list - new_language = {"language": language} - translations.append(new_language) - data['translations'] = translations - - # open and write - with open(DEFAULT_PATH, 'w') as file: - json.dump(data, file, indent=4) + if os.path.exists(file_path): + return + + initial_content = {} + with open(file_path, 'w') as file: + json.dump(initial_content, file, indent=4) + print(f"Language added.") +# // MUST BE REFACTORED # Adds/updates a translated word under the given language in the default JSON file def add_update_translated_word(language, original_word, translated_word): data = get_json(DEFAULT_PATH) @@ -65,6 +57,7 @@ def add_update_translated_word(language, original_word, translated_word): print(f"Error: Language '{language}' does not exist. Add the language before adding a translation.") sys.exit(1) +# // MUST BE REFACTORED # Deletes a translated word def delete_translation(language, original_word, translated_word): data = get_json(DEFAULT_PATH) @@ -116,7 +109,7 @@ def generate_file(language, token): return file_content = response.json() - + # transforms the dictionary object above into a JSON object json_object = json.dumps(file_content, indent=4) create_json(json_object, language) @@ -133,3 +126,4 @@ def make_translation_map(data): # get translations from hashmap given the language def get_translation(translations_map, language): return translations_map.get(language, "Translation not found") + diff --git a/i18nilize/src/internationalize/languages/japanese.json b/i18nilize/src/internationalize/languages/japanese.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/i18nilize/src/internationalize/languages/japanese.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/i18nilize/src/internationalize/languages/korean.json b/i18nilize/src/internationalize/languages/korean.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/i18nilize/src/internationalize/languages/korean.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json index 9a4373a..e69de29 100644 --- a/i18nilize/src/internationalize/resources/languages.json +++ b/i18nilize/src/internationalize/resources/languages.json @@ -1,15 +0,0 @@ -{ - "Token": "85124f79-0829-4b80-8b5c-d52700d86e46", - "translations": [ - { - "language": "French", - "hello": "bonjour", - "No": "Non", - "Why": "pourquoi" - }, - { - "language": "Spanish", - "hello": "Hola" - } - ] -} \ No newline at end of file diff --git a/i18nilize/tests/__pycache__/test_cli.cpython-310.pyc b/i18nilize/tests/__pycache__/test_cli.cpython-310.pyc index 2fd943ba278bac8d453bc8a416e3e49f641ee367..bd5b023a7b129d4487fa59c3e6060872abe5e83f 100644 GIT binary patch delta 1254 zcmZuw&u`pB6!x>nyR%+<^Mj;Rp^)^KR8we`L#1A;wm?f25Lr>-i#5$mHclLSJLA<> zE2n!{#0_znBOqnP2_b>{2XN+u#Mu&mK#u$c;f=RVmkL|+`T5OzZ{~gT&0iOOTIu9L z;92nWn58UD8TN^BHVIg;G^r4bFH*vnqn4+)ds6>Oq5foO5^x60 z*)|S0&4)rp9#cxlqALfYYSgEom0@_Lo@*jYp@Ky?ZbuBMSJw_OPSu7&(nXlF2k?- zpVk2_2q)a-RA2ILjp-RHt*y#0B+FDY-cYby*%fU^CS@`uJIGJ zGHlT?kwzHqi0mXRKLP!B zJ875}NS@1H^F+dmY`hKzXV@ik7(TuL)Doi86s5VkfAQ$EUZ81 Lth={-AgBKVr4~BO literal 3664 zcmd5<%W@M(6rG-z#qsE^Rh4Th|24puD*t6z*mpVj^$Yd+Zd7EDR_mB<2juPZ=zH5 zik(Ssl4w6@)TGvPjap3GF6|j!nN3lV@YbLve8CfH!`Gq(>cH2g6SN550(0o(9syh0BeYDX zo@;w#k9ZSwdR?o`$ifB_>Dq()O_G~YhqMFl8oc5T7)o|EUrWJm1GszopVQAss=qLH z$xEy;9|6!NJbMO0zOF54;`9z703p$SMIfQ9V$}N!f;VenoH8COq=G2yvl?e2>G38L zwIMvBs*oidfS%g8yT0N7xc+n9|K;|^J!vLg7E4n#Fry@(vYha6D~y9k?Z+!!nu0}} z(%cLq_DbWk;K1wKwTFUnQETuph`RxA*X}UUPLpmeN}9L~wVqnIv>JzMQ7PaeYH0mt z6jr-Wr6pMUu!}?$2#!sr;JNUoUmieMRrT)&GSvV=LJ2@Pix6%bkT-W>FRAedfcH^A znsrHb_K_7pNIQ%vi_?n5C!v7j@^}f1G-_fpUDDf(#61NW$fWzg1E zZB;2P%xlkd)la7m^qUy=+tq0i@{_rI3G(G!ehTu_gE41vV;+Ms0bN*&p~jpY^)b|# z$5kJT&S9SeFFvsPPt+*?;i@xS=tr$~(AEOaOtnr^c{Vrj{selWq;|62ch_31*$(3^ zx8CbC7Duz}x0?Z)CF zUA@khugg*{l!<)|5dE{G8NTN%ZnnmU=NM3=GgP#+vqsWtu_#Jpp^?Pfpn9p-6KT{T zj2e$xPo>j^vM0SH?0+^IeZ3pRp*S@Bz8bzTsFUWsBnmwHr-ZX0-ZyZ0CFHT&4TNCy ze8uKisN?}LoI?zflUT*myH9#SB#ns098~~9n!%Nu5SjxyyQy3o3*^T|wxE2WH``WI z=gST&?wATD`BMOeC~ko%5=Wl_`8j%t%nY7k+R=+pGDk|#B73qF+7ju{AIKF#Retm_ z-D0#D>GtuMZh=WUFpGeW^nph76cubJy_y5YLyjWzP^UWR(uRCt*dFqE-C})Sx0pZB zts0qvZk0ZD&?k3C#s|1d{1TN%nT~&5{0vBeXj*^cerp0p#Es&KH5nMce`RhTH<~>2OY{vm-U} zjs|B1oQ)ssk!K??mD9Pa?SfK|p}pbueu zc7!qB;YRrS3KsDgh7cH6ilAB0tzJ}02OuvW0rGAA`;K@jsxVgCpKA2N2=-7^RTyg` zvcun)%725>5oUN2qN)wlIiRbQ4(P(|ky?oEuKogWeu?Kdfm8ug@9#Z^EOOi{+)v>u z6~v0&p4kk8L{Yi_=q~38zvVs{Tz}oGgO*oanlRzUN$M(~s_tz{-L%Er;lbfH*d~Nl z7a|)TW`UbKh^qOpo>K;Hn0GP@?>^k_BDh&6ag+HwVcM!>l7W8#Nwe)M4B=k^rV-vu zNr(3K@;mkx*Y3mGvrVQjtHAqK(Lf;;A#NARr=-8|fgK(nrCupY$M@r)!+c*BeZP~? zUWDnA@8eOG)$lo(h|i;0M6-nED>QgE^JO##UZ@nFHXLuR6YvTwax{lHmSZ|soO5=` z24bpuoWB!IFE6Gd Date: Sat, 16 Nov 2024 02:03:51 -0800 Subject: [PATCH 14/27] refactor add_word, update tests --- i18nilize/src/internationalize/helpers.py | 26 +++--- .../internationalize/languages/japanese.json | 1 - i18nilize/tests/test_cli.py | 81 +++++++++++-------- 3 files changed, 58 insertions(+), 50 deletions(-) delete mode 100644 i18nilize/src/internationalize/languages/japanese.json diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index 18d9e03..c8b15c5 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -3,7 +3,7 @@ import os import requests -DEFAULT_PATH = 'src/internationalize/resources/languages.json' +DEFAULT_PATH = 'src/internationalize/resources/languages.json' # to be removed after refactoring LANGUAGES_DIR = 'src/internationalize/languages' # Function to parse json file, given its path @@ -36,26 +36,20 @@ def add_language(language): json.dump(initial_content, file, indent=4) print(f"Language added.") -# // MUST BE REFACTORED # Adds/updates a translated word under the given language in the default JSON file def add_update_translated_word(language, original_word, translated_word): - data = get_json(DEFAULT_PATH) - translations = data.get('translations', []) - - language_exists = False - for translation in translations: - if translation.get('language') == language: - language_exists = True - translation[original_word] = translated_word - - with open(DEFAULT_PATH, 'w') as file: - json.dump(data, file, indent=4) - - break + file_path = os.path.join(LANGUAGES_DIR, f"{language.lower()}.json") - if not language_exists: + if not os.path.exists(file_path): print(f"Error: Language '{language}' does not exist. Add the language before adding a translation.") sys.exit(1) + + data = get_json(file_path) + + data[original_word] = translated_word + with open(file_path, 'w') as file: + json.dump(data, file, indent=4) + print(f"{original_word}: {translated_word} added to translations.") # // MUST BE REFACTORED # Deletes a translated word diff --git a/i18nilize/src/internationalize/languages/japanese.json b/i18nilize/src/internationalize/languages/japanese.json deleted file mode 100644 index 9e26dfe..0000000 --- a/i18nilize/src/internationalize/languages/japanese.json +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/i18nilize/tests/test_cli.py b/i18nilize/tests/test_cli.py index 7bf8a54..5a03969 100644 --- a/i18nilize/tests/test_cli.py +++ b/i18nilize/tests/test_cli.py @@ -8,56 +8,71 @@ class TestCLI(unittest.TestCase): def setUp(self): - self.TEST_JSON_PATH = 'src/internationalize/resources/languages.json' - self.languages_dir = 'src/internationalize/languages' + self.languages_dir = "src/internationalize/languages" os.makedirs(self.languages_dir, exist_ok=True) - # with open(self.TEST_JSON_PATH, 'r') as file: - # self.original_json = json.load(file) - - def tearDown(self): - with open(self.TEST_JSON_PATH, 'w') as file: - json.dump(self.original_json, file, indent=4) - def test_add_new_language(self): new_language = "Japanese" add_language(new_language) new_language_path = os.path.join(self.languages_dir, f"{new_language.lower()}.json") self.assertTrue(os.path.exists(new_language_path)) - with open(new_language_path, 'r') as file: + with open(new_language_path, "r") as file: data = json.load(file) self.assertEqual(data, {}) - def test_update_word_language_exists(self): - data = get_json(self.TEST_JSON_PATH) - french_translation = data['translations'][0] - self.assertEqual(len(french_translation), 4) + # clean up test + os.remove(new_language_path) + + def test_add_word_language_exists(self): + existing_language = "French" + file_path = os.path.join(self.languages_dir, f"{existing_language.lower()}.json") + self.assertTrue(os.path.exists(file_path)) - add_update_translated_word("French", "good", "bie") - data = get_json(self.TEST_JSON_PATH) - french_translation = data['translations'][0] - self.assertEqual(len(french_translation), 5) - self.assertEqual(french_translation['good'], "bie") + # save original state + with open(file_path, "r") as file: + original_translations = json.load(file) + + data = get_json(file_path) + self.assertEqual(len(data), 2) add_update_translated_word("French", "good", "bien") - data = get_json(self.TEST_JSON_PATH) - french_translation = data['translations'][0] - self.assertEqual(len(french_translation), 5) - self.assertEqual(french_translation['good'], "bien") + data = get_json(file_path) + self.assertEqual(len(data), 3) + self.assertEqual(data["good"], "bien") - @patch('sys.exit') - @patch('builtins.print') - def test_add_word_language_does_not_exist(self, mock_print, mock_exit): - data = get_json(self.TEST_JSON_PATH) - self.assertEqual(len(data['translations']), 2) + # clean up test + with open(file_path, 'w') as file: + json.dump(original_translations, file, indent=4) + + def test_update_word_language_exists(self): + existing_language = "French" + file_path = os.path.join(self.languages_dir, f"{existing_language.lower()}.json") + self.assertTrue(os.path.exists(file_path)) + + # save original state + with open(file_path, "r") as file: + original_translations = json.load(file) + + data = get_json(file_path) + self.assertEqual(len(data), 2) - add_update_translated_word("Italian", "hello", "ciao") + add_update_translated_word("French", "thanks", "merc") + data = get_json(file_path) + self.assertEqual(len(data), 2) + self.assertEqual(data["thanks"], "merc") + + # clean up test + with open(file_path, 'w') as file: + json.dump(original_translations, file, indent=4) + + @patch('builtins.print') + def test_add_word_language_does_not_exist(self, mock_print): + with self.assertRaises(SystemExit) as context: + add_update_translated_word("NonExistentLanguage", "hello", "ciao") + self.assertTrue(context.exception.code, 1) - mock_exit.assert_called_once_with(1) - mock_print.assert_called_once_with("Error: Language 'Italian' does not exist. Add the language before adding a translation.") - data = get_json(self.TEST_JSON_PATH) - self.assertEqual(len(data['translations']), 2) + mock_print.assert_called_once_with("Error: Language 'NonExistentLanguage' does not exist. Add the language before adding a translation.") if __name__ == '__main__': unittest.main() From abb20ec2fb53f5537cfe505f7524f724049f6cef Mon Sep 17 00:00:00 2001 From: Stephanie Feng Date: Sat, 16 Nov 2024 02:07:37 -0800 Subject: [PATCH 15/27] edit add/update word tests --- i18nilize/tests/test_cli.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/i18nilize/tests/test_cli.py b/i18nilize/tests/test_cli.py index 5a03969..72deb69 100644 --- a/i18nilize/tests/test_cli.py +++ b/i18nilize/tests/test_cli.py @@ -27,7 +27,6 @@ def test_add_new_language(self): def test_add_word_language_exists(self): existing_language = "French" file_path = os.path.join(self.languages_dir, f"{existing_language.lower()}.json") - self.assertTrue(os.path.exists(file_path)) # save original state with open(file_path, "r") as file: @@ -48,7 +47,6 @@ def test_add_word_language_exists(self): def test_update_word_language_exists(self): existing_language = "French" file_path = os.path.join(self.languages_dir, f"{existing_language.lower()}.json") - self.assertTrue(os.path.exists(file_path)) # save original state with open(file_path, "r") as file: @@ -69,7 +67,7 @@ def test_update_word_language_exists(self): @patch('builtins.print') def test_add_word_language_does_not_exist(self, mock_print): with self.assertRaises(SystemExit) as context: - add_update_translated_word("NonExistentLanguage", "hello", "ciao") + add_update_translated_word("NonExistentLanguage", "a", "b") self.assertTrue(context.exception.code, 1) mock_print.assert_called_once_with("Error: Language 'NonExistentLanguage' does not exist. Add the language before adding a translation.") From 55a099362e0d2fd249d95f303f4ea90fa80facbc Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sat, 16 Nov 2024 09:15:27 -0800 Subject: [PATCH 16/27] gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1b71c7e..65833dd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ env/ -**/__pycache__ \ No newline at end of file +**/__pycache__ +myenv +venv \ No newline at end of file From 7462306019c83b47c8d8fcbcb8f58a576a1e4d9c Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sat, 16 Nov 2024 09:25:01 -0800 Subject: [PATCH 17/27] refactor delete translation --- i18nilize/src/internationalize/helpers.py | 37 ++++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index c8b15c5..23b1134 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -51,28 +51,29 @@ def add_update_translated_word(language, original_word, translated_word): json.dump(data, file, indent=4) print(f"{original_word}: {translated_word} added to translations.") -# // MUST BE REFACTORED -# Deletes a translated word +# Deletes a translated word for the given language def delete_translation(language, original_word, translated_word): - data = get_json(DEFAULT_PATH) - translations = data.get('translations', []) - - language_exists = False - for translation in translations: - if translation.get('language') == language: - language_exists = True - if original_word in translation and translation[original_word] == translated_word: - del translation[original_word] - - with open(DEFAULT_PATH, 'w') as file: - json.dump(data, file, indent=4) - - break - - if not language_exists: + file_path = os.path.join(LANGUAGES_DIR, f"{language.lower()}.json") + + if not os.path.exists(file_path): print(f"Error: Language '{language}' does not exist.") sys.exit(1) + data = get_json(file_path) + + if original_word not in data: + print(f"Error: Original word '{original_word}' does not exist in language '{language}'.") + sys.exit(1) + + if data[original_word] != translated_word: + print(f"Error: Translated word for '{original_word}' does not match '{translated_word}'.") + sys.exit(1) + + del data[original_word] + with open(file_path, 'w') as file: + json.dump(data, file, indent=4) + print(f"Translation for '{original_word}' deleted successfully from language '{language}'.") + # Input: # - file_path: path of json file # Output: Token in json file From ee14131191d81d6981e234e065e72917144a4b32 Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sat, 16 Nov 2024 09:27:47 -0800 Subject: [PATCH 18/27] add tests for delete --- .github/workflows/django.yml | 3 +- i18nilize/tests/test_cli.py | 87 +++++++++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 2 deletions(-) diff --git a/.github/workflows/django.yml b/.github/workflows/django.yml index 5cf262c..a86bc5a 100644 --- a/.github/workflows/django.yml +++ b/.github/workflows/django.yml @@ -34,4 +34,5 @@ jobs: run: | cd i18nilize python3 -m tests.test_read_file - python3 -m tests.test_parse_json \ No newline at end of file + python3 -m tests.test_parse_json + python3 -m tests.test_cli \ No newline at end of file diff --git a/i18nilize/tests/test_cli.py b/i18nilize/tests/test_cli.py index 72deb69..f742f86 100644 --- a/i18nilize/tests/test_cli.py +++ b/i18nilize/tests/test_cli.py @@ -1,6 +1,6 @@ import unittest, os, json, timeit from unittest.mock import patch -from src.internationalize.helpers import get_json, make_translation_map, get_translation, add_language, add_update_translated_word +from src.internationalize.helpers import delete_translation, get_json, make_translation_map, get_translation, add_language, add_update_translated_word # Create your tests here. # To test: @@ -72,5 +72,90 @@ def test_add_word_language_does_not_exist(self, mock_print): mock_print.assert_called_once_with("Error: Language 'NonExistentLanguage' does not exist. Add the language before adding a translation.") + def test_delete_translation_success(self): + language = "German" + add_language(language) + file_path = os.path.join(self.languages_dir, f"{language.lower()}.json") + + initial_translations = { + "goodbye": "auf Wiedersehen", + "thank you": "danke" + } + with open(file_path, "w") as file: + json.dump(initial_translations, file, indent=4) + + data = get_json(file_path) + self.assertIn("goodbye", data) + self.assertEqual(data["goodbye"], "auf Wiedersehen") + + delete_translation(language, "goodbye", "auf Wiedersehen") + + # verify deletion + data = get_json(file_path) + self.assertNotIn("goodbye", data) + self.assertIn("thank you", data) + + @patch('builtins.print') + def test_delete_translation_language_does_not_exist(self, mock_print): + language = "Russian" + original_word = "hello" + translated_word = "привет" + + with self.assertRaises(SystemExit) as context: + delete_translation(language, original_word, translated_word) + self.assertEqual(context.exception.code, 1) + + mock_print.assert_called_once_with(f"Error: Language '{language}' does not exist.") + + def test_delete_translation_word_does_not_exist(self): + language = "Chinese" + add_language(language) + file_path = os.path.join(self.languages_dir, f"{language.lower()}.json") + + initial_translations = { + "thank you": "谢谢" + } + with open(file_path, "w") as file: + json.dump(initial_translations, file, indent=4) + + data = get_json(file_path) + self.assertIn("thank you", data) + self.assertNotIn("good morning", data) + + with patch('builtins.print') as mock_print, self.assertRaises(SystemExit) as context: + delete_translation(language, "good morning", "早上好") + self.assertEqual(context.exception.code, 1) + mock_print.assert_called_once_with(f"Error: Original word 'good morning' does not exist in language '{language}'.") + + # ensure existing translations remain unchanged + data = get_json(file_path) + self.assertIn("thank you", data) + self.assertEqual(data["thank you"], "谢谢") + + def test_delete_translation_word_mismatch(self): + language = "Korean" + add_language(language) + file_path = os.path.join(self.languages_dir, f"{language.lower()}.json") + + initial_translations = { + "welcome": "환영합니다" + } + with open(file_path, "w") as file: + json.dump(initial_translations, file, indent=4) + + data = get_json(file_path) + self.assertIn("welcome", data) + self.assertEqual(data["welcome"], "환영합니다") + + with patch('builtins.print') as mock_print, self.assertRaises(SystemExit) as context: + delete_translation(language, "welcome", "환영해요") + self.assertEqual(context.exception.code, 1) + mock_print.assert_called_once_with(f"Error: Translated word for 'welcome' does not match '환영해요'.") + + # ensure existing translations remain unchanged + data = get_json(file_path) + self.assertIn("welcome", data) + self.assertEqual(data["welcome"], "환영합니다") + if __name__ == '__main__': unittest.main() From fe1c049f17a2bd2f5b031203139bde95c67613e8 Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sat, 16 Nov 2024 09:31:59 -0800 Subject: [PATCH 19/27] delete pycache --- core/core/__pycache__/__init__.cpython-310.pyc | Bin 152 -> 0 bytes core/core/__pycache__/settings.cpython-310.pyc | Bin 2269 -> 0 bytes core/core/__pycache__/urls.cpython-310.pyc | Bin 994 -> 0 bytes core/core/__pycache__/wsgi.cpython-310.pyc | Bin 549 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 157 -> 0 bytes core/i18nilize/__pycache__/urls.cpython-310.pyc | Bin 311 -> 0 bytes core/i18nilize/__pycache__/views.cpython-310.pyc | Bin 999 -> 0 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 173 -> 0 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 214 -> 0 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 180 -> 0 bytes .../__pycache__/command_line.cpython-310.pyc | Bin 1137 -> 0 bytes .../__pycache__/generateFile.cpython-311.pyc | Bin 1062 -> 0 bytes .../__pycache__/generate_file.cpython-311.pyc | Bin 850 -> 0 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 3394 -> 0 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 2860 -> 0 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 1662 -> 0 bytes .../__pycache__/internationalize.cpython-310.pyc | Bin 181 -> 0 bytes .../__pycache__/localize.cpython-310.pyc | Bin 560 -> 0 bytes .../__pycache__/localize.cpython-312.pyc | Bin 710 -> 0 bytes .../__pycache__/parser.cpython-310.pyc | Bin 393 -> 0 bytes .../__pycache__/test.cpython-310.pyc | Bin 1797 -> 0 bytes .../__pycache__/test_parse_json.cpython-310.pyc | Bin 1808 -> 0 bytes .../tests/__pycache__/__init__.cpython-310.pyc | Bin 158 -> 0 bytes .../tests/__pycache__/__init__.cpython-311.pyc | Bin 199 -> 0 bytes .../tests/__pycache__/__init__.cpython-312.pyc | Bin 165 -> 0 bytes i18nilize/tests/__pycache__/test.cpython-310.pyc | Bin 174 -> 0 bytes .../tests/__pycache__/test_cli.cpython-310.pyc | Bin 2595 -> 0 bytes .../test_generate_file.cpython-311.pyc | Bin 2190 -> 0 bytes .../__pycache__/test_parse_json.cpython-310.pyc | Bin 4784 -> 0 bytes .../__pycache__/test_parse_json.cpython-312.pyc | Bin 8955 -> 0 bytes .../__pycache__/test_read_file.cpython-310.pyc | Bin 1384 -> 0 bytes .../__pycache__/test_read_file.cpython-312.pyc | Bin 2065 -> 0 bytes 32 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 core/core/__pycache__/__init__.cpython-310.pyc delete mode 100644 core/core/__pycache__/settings.cpython-310.pyc delete mode 100644 core/core/__pycache__/urls.cpython-310.pyc delete mode 100644 core/core/__pycache__/wsgi.cpython-310.pyc delete mode 100644 core/i18nilize/__pycache__/__init__.cpython-310.pyc delete mode 100644 core/i18nilize/__pycache__/urls.cpython-310.pyc delete mode 100644 core/i18nilize/__pycache__/views.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/__init__.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/__init__.cpython-311.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/__init__.cpython-312.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/generateFile.cpython-311.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/generate_file.cpython-311.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/helpers.cpython-311.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/helpers.cpython-312.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/internationalize.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/localize.cpython-312.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/parser.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/test.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/test_parse_json.cpython-310.pyc delete mode 100644 i18nilize/tests/__pycache__/__init__.cpython-310.pyc delete mode 100644 i18nilize/tests/__pycache__/__init__.cpython-311.pyc delete mode 100644 i18nilize/tests/__pycache__/__init__.cpython-312.pyc delete mode 100644 i18nilize/tests/__pycache__/test.cpython-310.pyc delete mode 100644 i18nilize/tests/__pycache__/test_cli.cpython-310.pyc delete mode 100644 i18nilize/tests/__pycache__/test_generate_file.cpython-311.pyc delete mode 100644 i18nilize/tests/__pycache__/test_parse_json.cpython-310.pyc delete mode 100644 i18nilize/tests/__pycache__/test_parse_json.cpython-312.pyc delete mode 100644 i18nilize/tests/__pycache__/test_read_file.cpython-310.pyc delete mode 100644 i18nilize/tests/__pycache__/test_read_file.cpython-312.pyc diff --git a/core/core/__pycache__/__init__.cpython-310.pyc b/core/core/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 9afb2d4f43744cd4571e356e673007cf8d33e1c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmd1j<>g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpd;R;8}#{1yr(E5NMEyGF{~zPk40UtvKNADq68GqAI$Gi|EoV4z0cw2yb6Pm(d#7 zTt@5pcqJdN5`G}stLU128C|#6Alf?ISI`anD*DL2hHjc%?Uq~PIj*7&-Ea^|6f;J` z0hRhuEO}9krBNIWvB%^}We0~ib{R%e??}3ba)%8U1tgRxb7MBMyeEw*Ku9yhC-Np- zmC7~%1{oj;0XuLRi9!kfY@a|h;^R*tIIiq7HlklD3W_``Ph%Ws;6;IgLj?d87LABU zmE&xcDLmW9Qh)6Gl20g;qW+z>$^Ok(M^>yI)0Ke1xmp9}N{>?~K~Q?cW+{bXy# z0tqSh#xdR)9Nrxbqo;R7&wPJE*3L|?_$YRoyb5fJ_Md=tK-dYf5E;wZDXoP8UeL+bvr9kspMF0wS03J6N zJs50^mu&~Fm6DB_HXsQ3c;d!b&euuUk!)rQhDqy0mponsn}wI>{LQIs&Z~Ad2<&ta zg>pTA{D&!x`*IzIR|HSyOg~@9#Rc-_^HAX(cq3k3h;xpMi#Vog-nliUZ_ewp4=lnb z-oeoI4xkz2@3vz%z{V)6dOGK~ob{MIj(wUaGYE!*kq>Pq_rMp2=(r7JE$=vMrl$5< zzV~mK0}bLqMo~;_Vsd{G=B$;BaBn1 zfWxt_CZ?q=wf<6XYqqF0c1^pib~;WrOG`$_Y8Y)Zxtg;zp#vhjqY?0%Z(dqLxbKdA zc2do#cS;^T^a;a{k_rfC^O}$r_4ZDqt*2sJZRv3ddOCTrkab=$BbU-i6e9=D4TAD; za+l&*Wm%(+88%5kd^c-^S5u29PM)0?sYOB(jDsc)2W`Rz~Tvrdnzi)=Y1xUF(I@QB8Bt*wvg@YO?`K18T0?RNFgUbw_vV zhNc5xqoq5x0VPxJLc)#BFWPA_n^`twZUJ&Vi=M7&`nK9_S`Hu^&UQm@YQJ&uZD1iE z{`yME%7-ewn7AQuaG+?I9>DiZ@gol^D9LL~$qIcs9Dn2F(NS9d8h9W3_!)e$Ir=RO zBDb=#x+IpwB~d6B%FAL!5CvY~%YyJ;{9Al4t_mfAFY@9)Ft374oV))N*F`Xgt5`1l E3osN2YXATM diff --git a/core/core/__pycache__/urls.cpython-310.pyc b/core/core/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index 8e63f600a1a5a4d46cb8eac0553296d689d17e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmb7DU5gVj6wOShAI^4{{Rw$%2kL|hq7;=Cb#Xy_Q1_)T-E@++=}wX%N!6|3OMi`j zXzcDmLEMjpP z$#@z^{@f~CGMOf_J#9ybCoJLdy0h-?VmP;Xn{{^4E?&md9_zkGS&x2+5lXM$y}^Z6 z3$ff7>V#H!p$$X~$Cc4*Ubs9>Kdd;u*_g7T&T*sc4K9Us*yxSp76XLEPUDY)f3i8g zg!|Ip7Yd-{9<(YswH#Z{Cn<)ta;~xyLYOXW&el{d^`Ts$CEj295mr?4rvrZ;Wa*2NT6=#E!q^e&-&kn3;>Hun1LFgo*MRjuY9O=u;^_DqZ)D^ZFq z4*+kodv$jXV~}e?!K{GF{!j#h?*?4jY|u}SiOSE z7kNJR1il;Xz!AR$vaM!PvP%hsIl@Sz`L%@C64oHenpx4N6l;K!`J5ReMa8_(YCey6 zpCd(+D1?e^O`9NEMR4KBLP&T;96-MG-nb8xa$UKCub8U!|DGz{P*C(;@s=+2jn|Ze zk@~g)<>`&91GVPT+ZG^+&>G5QAR!&dO&&QL|wETKDy!djm>8Gm~ z4!jqtc7tB%m1X2F%Yd~DFScD2ZBfFsII@HusI{4gL9=w(z%8D_8O5Zsm5hDu#ADK@PhG;wTQA}Y*nIQY1g`BVG^$R)roI(YI7KgT)# E2Z|Y~r~m)} diff --git a/core/i18nilize/__pycache__/__init__.cpython-310.pyc b/core/i18nilize/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index e1f27b1d1d423ee2cd3923e3579f1828ad03b491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmd1j<>g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpdwBw+vm diff --git a/core/i18nilize/__pycache__/urls.cpython-310.pyc b/core/i18nilize/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index d902cc5ec802f772b11cfdaece320806d40b6633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 zcmYjLy-ve05Vqr_iAb~X7FlY+#89Ckv9KVd3WhAm)TiLqKarjCH^39{4lwdcUOV*_ zSl}!cPP*^(-F@HPxu!WF7>ifhzhT`a@;?eB3(RngAc>@!7}`-vWG0!;4C@#rKxGbW zoqrUcL>6-L&U)HSWVs}5wMQRmY0L*P-tXxjDIOF&hDc(etc0gDw!*+=TgFvixM%6)pl=LlW16lTzHc6D)s{#c4|n-;|y#khV1Z^IYybuuLQp7ZMfKJYuQgdK$6 z@N)>8(G6U?mC))%jLKQQavr!kI@dO1D-snfw)AB2@pUJbD50O%`&_5vvl`B*eqV; z>I0bg0=&{(J^2bA)T&vCtg$Cu{Y_VORefJ~+3B}@Rbqr9e?f*4nJEkbsvl% zf@UPAA*F~}#&RpP8f;}ew?n(ZJack4bSZg5ge{zFA{=Rbwn9(1N5uDjKqlhT+EKC) zQUP+e58i%AP3C7RxWI) z<FvYR55ZuHlwNT|rrgjW6V?|7N%&sv=2Gi;ASbO|dAVjz zrIPCk&-<3b6v_b;F76&5A4JbKHlqD^zFl)Ivy<9Y@~o2D)I3%LT|1+TX5}I_@eNU3 zIQa8r@Lo%$gO4hWi*c+*L0{^TDaS!pCUKTdVw09dkd#UW>E`nyg)JGJgJQZjzO1c* zG#=#9*ac_&ch{OM&++a-#2oh~5~3UKPXSEnkX&&=r(Cda?8-KDY8y5LId3(XJnlos zYf2_EJ(prlS4je*oK#tMx$ZNC4b+`GcZBq23USo|*FBk*Ze`kxULWpkAMf;iM=f9o zzC^W%rj2G9Ob8ig?_rh^%=3 zsBT43UWzJ1+>WBND$ZsewS*;B(EKgdAgridFgP2nJ>t=})9mf}3-yv1#>JrQ>C;k~ zq%vCJa|>62f{9KP6uv0csMp+^ve5PDAJ-k(My;?r?`g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpdpgfKPQ z;+{-^nYZN1-kSXmO$<cUX<1_OzOXB183Mzkb*yQG?l;)(`6|n;CUe7CmYCd3EN)REm@q#RZcBSZK%*CAWc`A(`FBD=Dhv{q?&SZ6l z+AO{y`9@(QTonn;3>Hsi7UV`W|N=QNGR8V1jqia%!Im8`WPa%wN4Zp(9lXO?EmL)7pPUGsXtvr4PwA!>Mt z8XnnNJF>P*du|JBVW`WZ1K8QXodmfcwY{@2bX+4B7*|CX86Yl5Z^Mq5J@9`my#M(N zUwDV8BmaDLH%bes(y)L!hHihKIs~V?=pRNIg|ij=ZWf&5|Tc1=vln7b|Sv z{kDBhix}7|KU2{xg6K^H2Zz9ij@nJ9E4%6JYVbP!2v-rqLzaH!gld+DN=x2(6zE)I22B>g3%_5;pX7h#SO=&vT_Bb z8Fje5kLF%y;RDQquiU3nJ{;lxeq{Ft{QaahYGq>P??l}K>Yum4JGi|LE>#q!Kv)E? zq+S$R9>m$S?L!bfe3C}c6&YwX4Q{kb2Kxd{;wY8l{8PoIafA=j4`A~QkGjllg#P<= zOqccP9eN7BQ|cM&1P;M_&AHA}<$=QQwfV=8e|$6l_=Ajdctummx`A?)ppmrXV^=j@)* zkU$D68!ZGaQdlXXg_X5-78VJlIHn4Sh22RMf|YL;lNdwZu;09S-+OPqx9q;Q?KA>2 zj%O-G4WX~#uXm8IZaqFjz|IIG-=-CGnC1uNVqHv z+{ouF{B9@?%Y@GeWzl>-6kgtE5fv;>a07py=BGo>M*V>1|1CYEq7u)6AR~57Qk$)Y z(%@CN#hep|HFT(ty;e+;KW85M3s z)hK7G52d{om{cmnQBa|jgmr)=wB9EgC diff --git a/i18nilize/src/internationalize/__pycache__/generate_file.cpython-311.pyc b/i18nilize/src/internationalize/__pycache__/generate_file.cpython-311.pyc deleted file mode 100644 index b2e53ec10de4f063aa8dfa73c2c2db01f6c15a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 850 zcmZWn&ubGw6rR~1X`1a?o2acdLIf`((n1emKqz?XZJ~JS$u|qBRNu~i@4cDt&3wF>ueO~-U?1kJ7S|B^ zrIL|Bp4wRn+-F1(!68~#UJG$oTh}lm`g^pl6TF7X#;GDV%2-;ypk7QjIuU2SnjBdM z0v-M{1^^pkq7j`K#3Y$LgN%_Z8Q;@d8p-WxyC}w^GK4x8@eU%^_lbRwb}*8Mc5!U} z{smfJg-L?8f%p`r<;(*<4!T79oYrP-!o$fefcQh(jvl4ENZ!!i>vLRnnarJ=eeP15i7BB7cEl@psm zNH=`WV&F(iF*bO!L;W~XO(>Pl+3G#_RYXPPdW;C_K4&duz%S@1hD`;wVXcrPwH(*AAotrfh)4rBT5WwKs?-D9Z zf13N^{ z@*5I2fi9*2&a?Nsob*HbKolWW4<=dxNOX+x5Ltut8zSfM@<_6Id^d`}iGt%z5bK?z;27qpt2V=FsnV_)mI$M|%hF zPI|S^-9vb2?~e@qY$rIl%bXEL7>0P~(YqY)IQo9??UPS<@ac(15gvZ-ed#>2W6b*P zJB^@am>gE`B|TA3GhKg_4N^Y5^qcihTJ=@Y&3KY-)z_rVLFnDiIdzUYcR#lPX3;v;<5>BoB8_;hQ09_!dJ zaqP$%!uaBo<^v_9YHrFTPW!RkZLSKntFwNymvsq1i)1r-|5ln z?&cm3c=*(^yIq~zDnJ`JY zNcFIG|AgxGm~+9G8ztjr%0zqduHcDOrgDF!_3?w1kJr{atH1u#_!ES7vLrP@FWVQ= zgmxAsX=E9|0J_0mUs6N>Y&6XiSwcs%k&u`JTVXs$CR;{&h)!C z(4!V%s_ZHN@|h2i7TL9zWmmq9?yd(jy=c-R{uYWcZZy*5kd3_D8v~Fn2Z2Wtje^`? zbv|1jg?Wg6?}+8jt}E|wA8*_opxi-{X~qK!MM3*JLGI-RQlbA21#?pNxS9v5r9&R& z1bOk9O-@}HL%EJlV6sq^TBfXJoT{EBu(~JfSoVgz3@ew&T!DG9aFTSVc-Z*!68 zOob4+$RKfu+Q_A%*Kk`V*vNK8+F+K64bKXN<&6n6y*aq4eI$Z!Y=_MijRk)QkHLhexh z&X#Y=W5{uH7EPPme#;c6q*wA1rnhO`h~!neCuNh@U`zp8o5p*>6yi-~B{u4GY(?zY zG&I4!OtfeOrbHF1lWp#ZuAU@dv>7YW!2lD1Eo1{tU!D(IsVfEL5qN`;t^2o|lPbTR zDSi9a&6_uyaX)EJB>_ZLHWsppWj0(B;(QSADO1=MF-N(7{uTNq@zJnl69_uSoM|i0 zF_9FH2SRBjZ@{TtQaaWHg&KvgDGrmm7EoPNHd27FPW?2Y@dmOdZ_(q=VA>c=^|2(; zE?WqvmF}nHaW3a7TOt*ba3NO#4@H@R69<0tY|g#LaPL;VDw7}K#VZL$6_@@NA)-D` z5GZ70AVq}^1+GF#hG!S_MhTQlz>4MG9p`bB(}CD)SsAf=Ic9eA4S$k)^RvldJS?&7vxQKm*u({E+VGAShoaL+3nu z!muSolD=7iu>`Pa*v;6%W^lE^nTNB9?(AiJ&=WYLW9m0yA}drlQQ{aAdC@{tjh3SC KM072bi{AiDQ2rwT diff --git a/i18nilize/src/internationalize/__pycache__/helpers.cpython-311.pyc b/i18nilize/src/internationalize/__pycache__/helpers.cpython-311.pyc deleted file mode 100644 index 67816824ac66dff3152701dcf06ed1bc1ee0370e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2860 zcmaJ@&1)M+6rb4-X_b{^*|H;2JC+?AH%f^@uuU2hY~t8~HmMS77aF71Y_%I%wzR9x zu4~uGMT8zi35^?4WJm)#C4}@4=%J8OO7a&-MNqNeQ^_GWm9$`T>YI`EWxJi#zMY-- zF>l|;Z}iCHIfCf;H54C}5c-q7>=AD7`Fa{Ad88s0C(%Ofi5DH38-ZNW%ux-Bf52GFFTsCFl{5HYOFRG$gjVwxm$%kH4Im?^Ec?wVbXX=y8A z=pn&&-2}bGv|=sU0-f4|s#uDRHB*4^9Dwm=>C!~>BU2-0RMAzUMX%}F3`u;UMK8t_ zRZAseX7p0c&+Eik)?$_!O&T#Jnb=V1Ceg&%cl89kX;G8JqTrH7bjG0~T69TEronhP z{iQ9%HEWT66zPP`Y4Xe?P%v3k<=mq0rKfW%v^`hy43<5ERfJtbh4~$S;NJP|`R}Ig zP32~)JghMWBY#nmzbR?19X8wD-93EyrQBCVoH)=VJCdj9?Jr5evJ@;z!5uH7az|MX zQXyZHFv+2kG+dU3i_&n#+mUm^M!P$5cTu!@g?Ty1P}taQ1EEzTP&njXR|Um>2*-XLBe zwrEj~Nq2x6B0jq2qUmMpqzB%qLGw6}EZUL%Tknoy_jTi^iffp_md1T8JYQb8K;qBrFX&Po|7T<1^YZwp3SPA+(*w zsztl8(S)@C$}yrTmR4&K8o5EZ&F_I^QNwO{tV9hWDU*!GuP$IGtcP~YNE zAyAPz?s&fOY^{`}6J_Z{Q91!FBhvQRBhWG;ZJE}!CU@Vg);IqnYI?x4{Lu;inK0>m zj`5_ktpX{)unPQ?ia{P#PUThM2Of@)mK-fN=1_&=kB;`7Le3jdj!=e!JVLEB4>4X|jg`B`vR8J5jxBln(P}j_(WD4Em&>HhAHnFs$r9V`)PX5yFl$`~~3O4rb^-2|i-GEu!dV zk^#NRLi`xpJRm?ws3C-}RbVltq;0ung=y?7|L&BsqAj)vQ7v)?wxwH}*MUGE1dbJj z?nFhcKb(^)vL9;OHC_pg72SOh zVfV;xMeZ#My|v)BqEDl0!?0Z*{a0WqVzyTzgoTT2^vpNI(me3VJ75eD;xs&JUrx8I z<7NlL&88kX3rt!+CWTP=WV!bbIrzIAEJ(#u7fbSVS)MKm)6Dmft5&%Z(LP_*Ov|)6 z!(?#HFqoAxD@qneX8AGvBLce&a^6T6Qii&k)F#O|tkG69?*IYZz_@~XiiiCw$dzSR vRq|pu6B}fN$DNRaI`Q!su%|)1o%ro4YLJr-499PSbYXl6LzWJu%;A3l6_9}I diff --git a/i18nilize/src/internationalize/__pycache__/helpers.cpython-312.pyc b/i18nilize/src/internationalize/__pycache__/helpers.cpython-312.pyc deleted file mode 100644 index 945a4fe8c11389ee5379916dd21967bac7ab9c85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1662 zcmZt`OK2NMbY^GQT6b6SI@#T`{|^ z9kFVK>A{6iWO|UH6ntn8Ay5jv6xvI2?M1CkE4IG1m)?Y32soF%8F?kSWR`jR=Kbe= z=9g&n1qAEcpD$%^iwOP24&f5ckdtvhs>nnp&ZE1?6h1?Du}J_5rU;Oj5)nPy3VSl|nFG4h2) zG={Dq7jFs}-9Z?>Pl2{Y?x0OPhCCJpU*m{gz{u+k&!!Ms1!_xb8++mH(JIeSDBreH zA{|yp+lo)Nv589L6S9dtHPi#Y{pU19pL~VB?(p8Jw|N%1E~NuZi?Lg|yp^;aFL}?| zu+3up?Zx-g$$2Z|m^nL}T%gpU#R&i1Na~S5bPARoh^wvxFz*;<(90~O9q$&?=YoM$ zpgG$MdYCP4%4*WP7q&81!OJ2&$z09qp~?dy9wBm-d&A;)&|@-RpZxU(W2zKP4!3 zxiNrLt^Cf@L>qthZyc$^$4HQpM{=|l8#$Cmk7A=WfJ)CF%IL4kC}V1zId&+I*JC|9 zk!MFrUr4S*_Hf1BSwEDAn!JVt@~7@qh-zD%Mqdm}l5gZ`^qq7q@&lPhKf?a$)wzE1 z_~q#A6nQ+Q0{#SPa~gS~Nr0c55!Uy7MkWBMo|}-cuS(d*CcX&#lEAuM7t(>W!Kp82|*Hx{O`24-{ zLS50y@16h`oePvzf(N<^NEPK^XnnNW8fYfpTqe%8#&aHhG}sLLxst6BC=s8y_(8%K zeC(5(VCccHhg`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpdh0un3?07Eh^mjD0& diff --git a/i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc deleted file mode 100644 index ec1fe08ab3e828051014fda28ec3a64d9c40d171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmZ8d&1w`u5U%R!Str>ELGfTfaKXbemmR!$kRX_I5Q3LQSvuRD&A5~9vAdVx(tFak z2mw9%N{u&9zC!R|^{6mdO?^duRb7AP;9ws}_P*a=oil(R$r%c9@RHO$B9I`lg)5vR zf@CuL409&=8C3aCib934SSi1F?~Gn%iTNudvN`E1Qumg?Lx4}X%R(mc2u|SLlN}FS zvLgt%W_B9*7Yytx?(&dJAm*ve0=ogp1Kz+bXMk`9A^&4P6ci<1=C>IQGdi7@-U{tn z;Txk}ELx#g8?jP%INcsjC))VQh1qC1Y4l_}9uO6?Y2ldB8r3N7T{Nv)bi!ZSv`*yL z#>&X0@FI=}E#`$**NYVV1~%RE?sfgfDeLNU+X&qWyRJ`^TYJ;htyzk;+4iH=&9mpa zAy3uLF6%~nWpy7(De7OYnsp!JVY=*~XF+Y;1A+oediz-5LsIsu%xy{ZX_dvtRCV@$ k)!C(LJDRQEv`_6v9>AEs$Ku76k(*W>V`{_+N+|FB2JEekj{pDw diff --git a/i18nilize/src/internationalize/__pycache__/localize.cpython-312.pyc b/i18nilize/src/internationalize/__pycache__/localize.cpython-312.pyc deleted file mode 100644 index 1f7338747845efe8886925048b13d4b9d1dd642e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 710 zcmZ8fziZn-6n-bkMveRn3~_#xVnW(PG*|>Wlu$Z(Xcu=dT>{0ZzKg9yKADr;G(sU6 zI+)VIooomJFNKya{R8?RbaCSjLbOw-ZU%3jdM78v^ufKS@4fHd`|eKP(&;7O_TlSV zi;8mW-iA%W(da@FwJZ4hYHa*LsZlu~KZFI~AnV~H| zyH%u)S3Gb!6c;U8^tFYAE-|4flKHXqWOVDmvPrFNdQFxTY30~qI8w0bnUS_IB2p6c*WReRpYr!m}?x7R~Ge~T!T?|>YWy$o@>}n-Lx$~R%lqe52?iwFax?hUhF)Q|qCuy>W)3-jx5pG`Da*_osu zlkL9l9uBmTwmDKZr+gGtbUC`s^_KqETWS)!%?}=5WvuTLupHmPGThD7M=b|;Z1R}p XITXK(o91pJBZPjz?lhyKyD|MQjikKo diff --git a/i18nilize/src/internationalize/__pycache__/parser.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/parser.cpython-310.pyc deleted file mode 100644 index 7a85641450bc944f69e766c974907f6be411a6d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393 zcmYjNy-ou$47PI_j&h|8h)X5 zWfr+@brboGw}iEoD#cnEt|PxRwT@iLAm6}k(7NwRoO$iMxNt@`t#os7s{K6JR@8PT zYx5|Bv5hdp{l<`|g?BSynxI|NWm1V2)JRkI+J`vk%xPLaP1|_-SV2&*0(-xlZU1oQ hHYrdtmy(^`y=4v3sbhY4Yt>z?kJ7<>s?DLu{s543SnL1* diff --git a/i18nilize/src/internationalize/__pycache__/test.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/test.cpython-310.pyc deleted file mode 100644 index 30e0d93c9b5dab8261280ab47bc1ba35aa6e4bcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1797 zcmaJ>OK;mo5Z>iOq9jU@lQgaRN>L;S0kLHpcA@}95g>_E1ceIJ3DWL`ptLKCGR;+X zS8XHMC*|J1U>(z+#A{Ff1qFIZXO?wJ$8AaMkh42Gk8d8b*{lK=K_qvQ$UF85v&?g=vWmoBS_D)$c^bz6|rU_~hC z*te@&IRl+!(4~2BAWSsXG8^Ge`Eh`G088HiA_&?9dz3q`33Cfe%;P?<0PpiE58zwj zwSCg9=Z$AVno8-Yhngyvh@m#YZ9!qG+6?B8qZvDw8a)*-I$%#>qV`(lKj{=1Pgo zL~!Q~Q6ZTB^V{BYEtKvJRT5{jSRM8r34Lhfte47BoF}K z{#~(imxV^fnNBTm`V4D9VR7U^8fORd_&~7A9wcZqVg5v8FoV69bD5msbynS<#aW^!%=<>Bao1B;a}6~&Vh!mvk6+H?Gx!D#~zJRX~v zT^(CU8(!|?MTU_U@gMF-T0IAcqbDf4xn-(wrK?QWm6>#C^g-XC! z0$8>;`tSoeAcn5!uT4q}wBC|Z@&b_e;9a^!4z`H?;Ahy!_eX5;zk8<5rO;5Oza&tZ zwrkuxEWr3aPPEYZ+8(saK$<-{&-i1dq_VhmsRii$h_6|{ZHHyjL}R@4G5Dyl*h5;U zU%p-3ycFj}`3uovj^0K412F$L2>^+TsZImHq6JvgphNusK;!nmp>e}{pJYElyYkW` zsVi(hh5e^65LHEjZYeAu^&t?LCopu_m8bjP4IYV+e1Zh$T8Uu6Di;Vw zX}t(YKm#vmho0R>Lq~CvMNzlLf_au044^;;Q_QN+j58RLwm$Lz9e)@@TcJ|*DUjU5 f`z4#!1=}gXSB2+aV|8oX{|HdH>IOGM>b?C7v>U9t diff --git a/i18nilize/src/internationalize/__pycache__/test_parse_json.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/test_parse_json.cpython-310.pyc deleted file mode 100644 index 0a2e243c38901d42e468dfc0f449abff5a9f08ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1808 zcmaJ>OK;mo5Z>iOq9jU@lQgaRN)aRn0d-^>cA@}95g>_Edz=BY5xP%(x37Y{1Mz#hTUUjZ>>LeCuIF6k+?|K17Zbm^Rs$max?M?W4-IkGo?gk zBDnL0s1VHmwcmT8h0?tPmBiUJR!68sq=!n~MPFis3Oq}Su;X^ff^yI9S&sW1atiQ)yu&LXU%ikAJ^;Q};_JXSN_+@>v!ts9 zx?HQvwYsjnmvybKHu5%2YlGZ>E{{Yuzun*2+}a-9f3UvM-+HjVebC=n?;q?8*ZI!Y z{f!OYzbCfuvCybE)2YQ!pJQ1ltdl%QLUI7{@HdEd!2?t02&``0z zCfXDYqb(?8;fjpC~1j#jQ&%Kp#eY&H8PdEt4i1;iXT(M~%fE z(mK8Mc7F3xoU8IH(PEC?NBbi%|2Gr>iHfOC0>GjLSk$0H{Qp4X&cC5?!+M`&KSSs8 z(om@@Y(Itlr!WvzMS^ZAEFbkT5Ev~mf7q30d*2Tpi=pJ=AFvdr{zItNE*bk0q%?|# zP#7&5B3NHs0;}xapj*Y^hC>d9TRn=7C7;Yb&!091V>znV8JRE z2u5kW2uMH!FKCCJ-A6;mags$*x5k25mKY46Kn7FHs?dy6n3uLb@&Fxw6hm8~QuR5I h+{61No7M%}DZw{|=ig#=Yux_?P`K&_H$&>Z{Tmz;v0?xK diff --git a/i18nilize/tests/__pycache__/__init__.cpython-310.pyc b/i18nilize/tests/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 2dda11fb85410fde7ee80eb20539036cffb08bae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 158 zcmd1j<>g`k0*412=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vJKeRZts8~O# zC^IpyAh9T0-zBv;yClCrKPNvqF(CBr6{v3HO4VHF(oxOGr2g%IX@*cFI^#^C_gJTxuiHICqFqcC$lQC zBr`uRCezR&FB8a1jVVbj21>@qXXa&=#K-FuRQ}?y$<0qG%}KQ@Vg*_Sa!fHlkodsN O$jJDC0Y(%t1H}NE05l)~ diff --git a/i18nilize/tests/__pycache__/__init__.cpython-312.pyc b/i18nilize/tests/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 92ab8343071b94eb46dd76390c2a2819d7fe3493..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 165 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 diff --git a/i18nilize/tests/__pycache__/test_read_file.cpython-310.pyc b/i18nilize/tests/__pycache__/test_read_file.cpython-310.pyc deleted file mode 100644 index e44393c6bec47341035d218013885f91903da804..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1384 zcmZ{k%}(1u5P)}W$95n(c5Vn*(IZl^f5RQ5RiVkk ziHN;e`BH~|97GaS`BW913fV!c$zi}|52k(#LJ&qdVFstnOq3dm52c249N3uiV;(r6ZVbuFD^)d)ff6xnZ zO=6IJ23lVYJ3?nwx9u8{O@lYNNTnQ{8Ac8`Wlevs2}p>)VY6Z*GZ=t%{k< z`dSMWe>fZYp)%pxB;O4};SK$`S1}Sxi?GY)#rL7;#DaSrYtbSduN+VC zs!f?bVuZYGm?@*Luz29ZDK{=nZX%;cS_`zf|Fkw}ohhxG-jKhiJkv_-0|kZAOL9FC zhEd|QBiV;EGNTnSvlU5Ze(9YvcL=((Q4}!eXz0s8_n7rD3jJGC<=~MDQ>*aZw^TW} zM!K2E!zw9G#Qad4dLF)MG%W(9B3-8A*UyofIQ2ZR23++B%~QajkpPW-55Z}vSvaTW zK#W(*cL2&I8O5b;G?Kg&$Wlg$IR`4mr3z@gRKD9z7%PlPEuffUkhV!yHEpPzi6+&r zz&x#%ltK9!2Ggfn6(?~$Px=GldC83D4I(~*!uOJb=V3QwU(&oNEJ*bN#p2_)rLV*! zDJ)k^o<>_2D%Uk!t6-=4ip$)Q3}Vb9Th*#l3uG*mO#37K8>roNj7W=ttvqQ1MK*+f p%i7e%IQM;MK=hng13!=x(C#0WxbL#acCkC|URR(6`qC;a{RN~eTFU?c diff --git a/i18nilize/tests/__pycache__/test_read_file.cpython-312.pyc b/i18nilize/tests/__pycache__/test_read_file.cpython-312.pyc deleted file mode 100644 index 6c479b7731a0bc265bd8f5f861942cea5d32118f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2065 zcmd5-O>7%Q6rR~1dlHSOKhnD_P41)d$UzYXmINo%<>&~nz zVihS!L2%@j3x{$*5aj?z4jg)n#HE!JH5$|tCvH{UQ%}5EZ(=7nm%@QLyqS6L&3ilF z`{wQMBO}8I#t*+uEPbXS^rzhH4Lw?P8n9SLHnOpc%5qj*Tvy5pmTT2j>sndENI@5n zt*s$jr)W8hx)-QBZ>rt798(Z@j2^Vg-Daf1Xa#3tf5}}bgGF+Q21dY4kGp2z_#UW+ zLY04$dRBBMoN%=1yatPP$Wq2ODl0ZFtG2R+%9^c$)a6%}V=HIo zHls6l@TStW!QD|tDYd4GbEoo!>iojYY%#wuQ>YYYXNr|MYsQ|-&(F@<#nZHKI-`mg zOwK6_-n-Q_T_!V#p{nCjqhSWMj3P8n-KrR+pEsx#P}>M3W?be! zqz6xfSVg<3cfT3kC5eY*`~eyNE_Ju?0UvY#`#2~k`-J zz}?2Svd2eT?P34i(X{<&`hO5DwjVA2ucMK^n-2A&0n3ITYA{(2HUwe=v#_$VB59TY zDPHcYeD4YK*6T;nqt8jU2!0y`uw<;OcgQs+^AG0UU9kL5xTo3rK3if3>KiYyWAL5q zB@nHX(@|}w)1DustA5k7(~g&p2oOKdLME^mrSsTywC!_dDH&@51n(Idq z6WXC65{4mrWY-e1m5s<7y&}aVhz%4*2x-e=QY(dQH(XwQ4ecI#d-c*2P0`QcCq&b) z<4!`+Dej(Z&w+GvdTRA9#xmXv^JhP9%tD zP3Y4ygV5@x<1zVr>wWAqa;AIBMfMgLWOaBB#A6j>{0B-tLJN;j{wYafioY#B9GiMD YHuV(A-QzbA9$h70k9;}uRWc0tH=upXCIA2c From e1a2e89a0406e3a80bfb9a9beee4eea988971fb7 Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sat, 16 Nov 2024 09:32:57 -0800 Subject: [PATCH 20/27] Revert "delete pycache" This reverts commit fe1c049f17a2bd2f5b031203139bde95c67613e8. --- core/core/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 152 bytes core/core/__pycache__/settings.cpython-310.pyc | Bin 0 -> 2269 bytes core/core/__pycache__/urls.cpython-310.pyc | Bin 0 -> 994 bytes core/core/__pycache__/wsgi.cpython-310.pyc | Bin 0 -> 549 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 157 bytes core/i18nilize/__pycache__/urls.cpython-310.pyc | Bin 0 -> 311 bytes core/i18nilize/__pycache__/views.cpython-310.pyc | Bin 0 -> 999 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 173 bytes .../__pycache__/__init__.cpython-311.pyc | Bin 0 -> 214 bytes .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 180 bytes .../__pycache__/command_line.cpython-310.pyc | Bin 0 -> 1137 bytes .../__pycache__/generateFile.cpython-311.pyc | Bin 0 -> 1062 bytes .../__pycache__/generate_file.cpython-311.pyc | Bin 0 -> 850 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 0 -> 3394 bytes .../__pycache__/helpers.cpython-311.pyc | Bin 0 -> 2860 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 1662 bytes .../__pycache__/internationalize.cpython-310.pyc | Bin 0 -> 181 bytes .../__pycache__/localize.cpython-310.pyc | Bin 0 -> 560 bytes .../__pycache__/localize.cpython-312.pyc | Bin 0 -> 710 bytes .../__pycache__/parser.cpython-310.pyc | Bin 0 -> 393 bytes .../__pycache__/test.cpython-310.pyc | Bin 0 -> 1797 bytes .../__pycache__/test_parse_json.cpython-310.pyc | Bin 0 -> 1808 bytes .../tests/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 158 bytes .../tests/__pycache__/__init__.cpython-311.pyc | Bin 0 -> 199 bytes .../tests/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 165 bytes i18nilize/tests/__pycache__/test.cpython-310.pyc | Bin 0 -> 174 bytes .../tests/__pycache__/test_cli.cpython-310.pyc | Bin 0 -> 2595 bytes .../test_generate_file.cpython-311.pyc | Bin 0 -> 2190 bytes .../__pycache__/test_parse_json.cpython-310.pyc | Bin 0 -> 4784 bytes .../__pycache__/test_parse_json.cpython-312.pyc | Bin 0 -> 8955 bytes .../__pycache__/test_read_file.cpython-310.pyc | Bin 0 -> 1384 bytes .../__pycache__/test_read_file.cpython-312.pyc | Bin 0 -> 2065 bytes 32 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 core/core/__pycache__/__init__.cpython-310.pyc create mode 100644 core/core/__pycache__/settings.cpython-310.pyc create mode 100644 core/core/__pycache__/urls.cpython-310.pyc create mode 100644 core/core/__pycache__/wsgi.cpython-310.pyc create mode 100644 core/i18nilize/__pycache__/__init__.cpython-310.pyc create mode 100644 core/i18nilize/__pycache__/urls.cpython-310.pyc create mode 100644 core/i18nilize/__pycache__/views.cpython-310.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/__init__.cpython-310.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/__init__.cpython-311.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/__init__.cpython-312.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/generateFile.cpython-311.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/generate_file.cpython-311.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/helpers.cpython-311.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/helpers.cpython-312.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/internationalize.cpython-310.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/localize.cpython-312.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/parser.cpython-310.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/test.cpython-310.pyc create mode 100644 i18nilize/src/internationalize/__pycache__/test_parse_json.cpython-310.pyc create mode 100644 i18nilize/tests/__pycache__/__init__.cpython-310.pyc create mode 100644 i18nilize/tests/__pycache__/__init__.cpython-311.pyc create mode 100644 i18nilize/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 i18nilize/tests/__pycache__/test.cpython-310.pyc create mode 100644 i18nilize/tests/__pycache__/test_cli.cpython-310.pyc create mode 100644 i18nilize/tests/__pycache__/test_generate_file.cpython-311.pyc create mode 100644 i18nilize/tests/__pycache__/test_parse_json.cpython-310.pyc create mode 100644 i18nilize/tests/__pycache__/test_parse_json.cpython-312.pyc create mode 100644 i18nilize/tests/__pycache__/test_read_file.cpython-310.pyc create mode 100644 i18nilize/tests/__pycache__/test_read_file.cpython-312.pyc diff --git a/core/core/__pycache__/__init__.cpython-310.pyc b/core/core/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9afb2d4f43744cd4571e356e673007cf8d33e1c6 GIT binary patch literal 152 zcmd1j<>g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpd;R;8}#{1yr(E5NMEyGF{~zPk40UtvKNADq68GqAI$Gi|EoV4z0cw2yb6Pm(d#7 zTt@5pcqJdN5`G}stLU128C|#6Alf?ISI`anD*DL2hHjc%?Uq~PIj*7&-Ea^|6f;J` z0hRhuEO}9krBNIWvB%^}We0~ib{R%e??}3ba)%8U1tgRxb7MBMyeEw*Ku9yhC-Np- zmC7~%1{oj;0XuLRi9!kfY@a|h;^R*tIIiq7HlklD3W_``Ph%Ws;6;IgLj?d87LABU zmE&xcDLmW9Qh)6Gl20g;qW+z>$^Ok(M^>yI)0Ke1xmp9}N{>?~K~Q?cW+{bXy# z0tqSh#xdR)9Nrxbqo;R7&wPJE*3L|?_$YRoyb5fJ_Md=tK-dYf5E;wZDXoP8UeL+bvr9kspMF0wS03J6N zJs50^mu&~Fm6DB_HXsQ3c;d!b&euuUk!)rQhDqy0mponsn}wI>{LQIs&Z~Ad2<&ta zg>pTA{D&!x`*IzIR|HSyOg~@9#Rc-_^HAX(cq3k3h;xpMi#Vog-nliUZ_ewp4=lnb z-oeoI4xkz2@3vz%z{V)6dOGK~ob{MIj(wUaGYE!*kq>Pq_rMp2=(r7JE$=vMrl$5< zzV~mK0}bLqMo~;_Vsd{G=B$;BaBn1 zfWxt_CZ?q=wf<6XYqqF0c1^pib~;WrOG`$_Y8Y)Zxtg;zp#vhjqY?0%Z(dqLxbKdA zc2do#cS;^T^a;a{k_rfC^O}$r_4ZDqt*2sJZRv3ddOCTrkab=$BbU-i6e9=D4TAD; za+l&*Wm%(+88%5kd^c-^S5u29PM)0?sYOB(jDsc)2W`Rz~Tvrdnzi)=Y1xUF(I@QB8Bt*wvg@YO?`K18T0?RNFgUbw_vV zhNc5xqoq5x0VPxJLc)#BFWPA_n^`twZUJ&Vi=M7&`nK9_S`Hu^&UQm@YQJ&uZD1iE z{`yME%7-ewn7AQuaG+?I9>DiZ@gol^D9LL~$qIcs9Dn2F(NS9d8h9W3_!)e$Ir=RO zBDb=#x+IpwB~d6B%FAL!5CvY~%YyJ;{9Al4t_mfAFY@9)Ft374oV))N*F`Xgt5`1l E3osN2YXATM literal 0 HcmV?d00001 diff --git a/core/core/__pycache__/urls.cpython-310.pyc b/core/core/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e63f600a1a5a4d46cb8eac0553296d689d17e08 GIT binary patch literal 994 zcmb7DU5gVj6wOShAI^4{{Rw$%2kL|hq7;=Cb#Xy_Q1_)T-E@++=}wX%N!6|3OMi`j zXzcDmLEMjpP z$#@z^{@f~CGMOf_J#9ybCoJLdy0h-?VmP;Xn{{^4E?&md9_zkGS&x2+5lXM$y}^Z6 z3$ff7>V#H!p$$X~$Cc4*Ubs9>Kdd;u*_g7T&T*sc4K9Us*yxSp76XLEPUDY)f3i8g zg!|Ip7Yd-{9<(YswH#Z{Cn<)ta;~xyLYOXW&el{d^`Ts$CEj295mr?4rvrZ;Wa*2NT6=#E!q^e&-&kn3;>Hun1LFgo*MRjuY9O=u;^_DqZ)D^ZFq z4*+kodv$jXV~}e?!K{GF{!j#h?*?4jY|u}SiOSE z7kNJR1il;Xz!AR$vaM!PvP%hsIl@Sz`L%@C64oHenpx4N6l;K!`J5ReMa8_(YCey6 zpCd(+D1?e^O`9NEMR4KBLP&T;96-MG-nb8xa$UKCub8U!|DGz{P*C(;@s=+2jn|Ze zk@~g)<>`&91GVPT+ZG^+&>G5QAR!&dO&&QL|wETKDy!djm>8Gm~ z4!jqtc7tB%m1X2F%Yd~DFScD2ZBfFsII@HusI{4gL9=w(z%8D_8O5Zsm5hDu#ADK@PhG;wTQA}Y*nIQY1g`BVG^$R)roI(YI7KgT)# E2Z|Y~r~m)} literal 0 HcmV?d00001 diff --git a/core/i18nilize/__pycache__/__init__.cpython-310.pyc b/core/i18nilize/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1f27b1d1d423ee2cd3923e3579f1828ad03b491 GIT binary patch literal 157 zcmd1j<>g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpdwBw+vm literal 0 HcmV?d00001 diff --git a/core/i18nilize/__pycache__/urls.cpython-310.pyc b/core/i18nilize/__pycache__/urls.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d902cc5ec802f772b11cfdaece320806d40b6633 GIT binary patch literal 311 zcmYjLy-ve05Vqr_iAb~X7FlY+#89Ckv9KVd3WhAm)TiLqKarjCH^39{4lwdcUOV*_ zSl}!cPP*^(-F@HPxu!WF7>ifhzhT`a@;?eB3(RngAc>@!7}`-vWG0!;4C@#rKxGbW zoqrUcL>6-L&U)HSWVs}5wMQRmY0L*P-tXxjDIOF&hDc(etc0gDw!*+=TgFvixM%6)pl=LlW16lTzHc6D)s{#c4|n-;|y#khV1Z^IYybuuLQp7ZMfKJYuQgdK$6 z@N)>8(G6U?mC))%jLKQQavr!kI@dO1D-snfw)AB2@pUJbD50O%`&_5vvl`B*eqV; z>I0bg0=&{(J^2bA)T&vCtg$Cu{Y_VORefJ~+3B}@Rbqr9e?f*4nJEkbsvl% zf@UPAA*F~}#&RpP8f;}ew?n(ZJack4bSZg5ge{zFA{=Rbwn9(1N5uDjKqlhT+EKC) zQUP+e58i%AP3C7RxWI) z<FvYR55ZuHlwNT|rrgjW6V?|7N%&sv=2Gi;ASbO|dAVjz zrIPCk&-<3b6v_b;F76&5A4JbKHlqD^zFl)Ivy<9Y@~o2D)I3%LT|1+TX5}I_@eNU3 zIQa8r@Lo%$gO4hWi*c+*L0{^TDaS!pCUKTdVw09dkd#UW>E`nyg)JGJgJQZjzO1c* zG#=#9*ac_&ch{OM&++a-#2oh~5~3UKPXSEnkX&&=r(Cda?8-KDY8y5LId3(XJnlos zYf2_EJ(prlS4je*oK#tMx$ZNC4b+`GcZBq23USo|*FBk*Ze`kxULWpkAMf;iM=f9o zzC^W%rj2G9Ob8ig?_rh^%=3 zsBT43UWzJ1+>WBND$ZsewS*;B(EKgdAgridFgP2nJ>t=})9mf}3-yv1#>JrQ>C;k~ zq%vCJa|>62f{9KP6uv0csMp+^ve5PDAJ-k(My;?r?`g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpdpgfKPQ z;+{-^nYZN1-kSXmO$<cUX<1_OzOXB183Mzkb*yQG?l;)(`6|n;CUe7CmYCd3EN)REm@q#RZcBSZK%*CAWc`A(`FBD=Dhv{q?&SZ6l z+AO{y`9@(QTonn;3>Hsi7UV`W|N=QNGR8V1jqia%!Im8`WPa%wN4Zp(9lXO?EmL)7pPUGsXtvr4PwA!>Mt z8XnnNJF>P*du|JBVW`WZ1K8QXodmfcwY{@2bX+4B7*|CX86Yl5Z^Mq5J@9`my#M(N zUwDV8BmaDLH%bes(y)L!hHihKIs~V?=pRNIg|ij=ZWf&5|Tc1=vln7b|Sv z{kDBhix}7|KU2{xg6K^H2Zz9ij@nJ9E4%6JYVbP!2v-rqLzaH!gld+DN=x2(6zE)I22B>g3%_5;pX7h#SO=&vT_Bb z8Fje5kLF%y;RDQquiU3nJ{;lxeq{Ft{QaahYGq>P??l}K>Yum4JGi|LE>#q!Kv)E? zq+S$R9>m$S?L!bfe3C}c6&YwX4Q{kb2Kxd{;wY8l{8PoIafA=j4`A~QkGjllg#P<= zOqccP9eN7BQ|cM&1P;M_&AHA}<$=QQwfV=8e|$6l_=Ajdctummx`A?)ppmrXV^=j@)* zkU$D68!ZGaQdlXXg_X5-78VJlIHn4Sh22RMf|YL;lNdwZu;09S-+OPqx9q;Q?KA>2 zj%O-G4WX~#uXm8IZaqFjz|IIG-=-CGnC1uNVqHv z+{ouF{B9@?%Y@GeWzl>-6kgtE5fv;>a07py=BGo>M*V>1|1CYEq7u)6AR~57Qk$)Y z(%@CN#hep|HFT(ty;e+;KW85M3s z)hK7G52d{om{cmnQBa|jgmr)=wB9EgC literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/__pycache__/generate_file.cpython-311.pyc b/i18nilize/src/internationalize/__pycache__/generate_file.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b2e53ec10de4f063aa8dfa73c2c2db01f6c15a10 GIT binary patch literal 850 zcmZWn&ubGw6rR~1X`1a?o2acdLIf`((n1emKqz?XZJ~JS$u|qBRNu~i@4cDt&3wF>ueO~-U?1kJ7S|B^ zrIL|Bp4wRn+-F1(!68~#UJG$oTh}lm`g^pl6TF7X#;GDV%2-;ypk7QjIuU2SnjBdM z0v-M{1^^pkq7j`K#3Y$LgN%_Z8Q;@d8p-WxyC}w^GK4x8@eU%^_lbRwb}*8Mc5!U} z{smfJg-L?8f%p`r<;(*<4!T79oYrP-!o$fefcQh(jvl4ENZ!!i>vLRnnarJ=eeP15i7BB7cEl@psm zNH=`WV&F(iF*bO!L;W~XO(>Pl+3G#_RYXPPdW;C_K4&duz%S@1hD`;wVXcrPwH(*AAotrfh)4rBT5WwKs?-D9Z zf13N^{ z@*5I2fi9*2&a?Nsob*HbKolWW4<=dxNOX+x5Ltut8zSfM@<_6Id^d`}iGt%z5bK?z;27qpt2V=FsnV_)mI$M|%hF zPI|S^-9vb2?~e@qY$rIl%bXEL7>0P~(YqY)IQo9??UPS<@ac(15gvZ-ed#>2W6b*P zJB^@am>gE`B|TA3GhKg_4N^Y5^qcihTJ=@Y&3KY-)z_rVLFnDiIdzUYcR#lPX3;v;<5>BoB8_;hQ09_!dJ zaqP$%!uaBo<^v_9YHrFTPW!RkZLSKntFwNymvsq1i)1r-|5ln z?&cm3c=*(^yIq~zDnJ`JY zNcFIG|AgxGm~+9G8ztjr%0zqduHcDOrgDF!_3?w1kJr{atH1u#_!ES7vLrP@FWVQ= zgmxAsX=E9|0J_0mUs6N>Y&6XiSwcs%k&u`JTVXs$CR;{&h)!C z(4!V%s_ZHN@|h2i7TL9zWmmq9?yd(jy=c-R{uYWcZZy*5kd3_D8v~Fn2Z2Wtje^`? zbv|1jg?Wg6?}+8jt}E|wA8*_opxi-{X~qK!MM3*JLGI-RQlbA21#?pNxS9v5r9&R& z1bOk9O-@}HL%EJlV6sq^TBfXJoT{EBu(~JfSoVgz3@ew&T!DG9aFTSVc-Z*!68 zOob4+$RKfu+Q_A%*Kk`V*vNK8+F+K64bKXN<&6n6y*aq4eI$Z!Y=_MijRk)QkHLhexh z&X#Y=W5{uH7EPPme#;c6q*wA1rnhO`h~!neCuNh@U`zp8o5p*>6yi-~B{u4GY(?zY zG&I4!OtfeOrbHF1lWp#ZuAU@dv>7YW!2lD1Eo1{tU!D(IsVfEL5qN`;t^2o|lPbTR zDSi9a&6_uyaX)EJB>_ZLHWsppWj0(B;(QSADO1=MF-N(7{uTNq@zJnl69_uSoM|i0 zF_9FH2SRBjZ@{TtQaaWHg&KvgDGrmm7EoPNHd27FPW?2Y@dmOdZ_(q=VA>c=^|2(; zE?WqvmF}nHaW3a7TOt*ba3NO#4@H@R69<0tY|g#LaPL;VDw7}K#VZL$6_@@NA)-D` z5GZ70AVq}^1+GF#hG!S_MhTQlz>4MG9p`bB(}CD)SsAf=Ic9eA4S$k)^RvldJS?&7vxQKm*u({E+VGAShoaL+3nu z!muSolD=7iu>`Pa*v;6%W^lE^nTNB9?(AiJ&=WYLW9m0yA}drlQQ{aAdC@{tjh3SC KM072bi{AiDQ2rwT literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/__pycache__/helpers.cpython-311.pyc b/i18nilize/src/internationalize/__pycache__/helpers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..67816824ac66dff3152701dcf06ed1bc1ee0370e GIT binary patch literal 2860 zcmaJ@&1)M+6rb4-X_b{^*|H;2JC+?AH%f^@uuU2hY~t8~HmMS77aF71Y_%I%wzR9x zu4~uGMT8zi35^?4WJm)#C4}@4=%J8OO7a&-MNqNeQ^_GWm9$`T>YI`EWxJi#zMY-- zF>l|;Z}iCHIfCf;H54C}5c-q7>=AD7`Fa{Ad88s0C(%Ofi5DH38-ZNW%ux-Bf52GFFTsCFl{5HYOFRG$gjVwxm$%kH4Im?^Ec?wVbXX=y8A z=pn&&-2}bGv|=sU0-f4|s#uDRHB*4^9Dwm=>C!~>BU2-0RMAzUMX%}F3`u;UMK8t_ zRZAseX7p0c&+Eik)?$_!O&T#Jnb=V1Ceg&%cl89kX;G8JqTrH7bjG0~T69TEronhP z{iQ9%HEWT66zPP`Y4Xe?P%v3k<=mq0rKfW%v^`hy43<5ERfJtbh4~$S;NJP|`R}Ig zP32~)JghMWBY#nmzbR?19X8wD-93EyrQBCVoH)=VJCdj9?Jr5evJ@;z!5uH7az|MX zQXyZHFv+2kG+dU3i_&n#+mUm^M!P$5cTu!@g?Ty1P}taQ1EEzTP&njXR|Um>2*-XLBe zwrEj~Nq2x6B0jq2qUmMpqzB%qLGw6}EZUL%Tknoy_jTi^iffp_md1T8JYQb8K;qBrFX&Po|7T<1^YZwp3SPA+(*w zsztl8(S)@C$}yrTmR4&K8o5EZ&F_I^QNwO{tV9hWDU*!GuP$IGtcP~YNE zAyAPz?s&fOY^{`}6J_Z{Q91!FBhvQRBhWG;ZJE}!CU@Vg);IqnYI?x4{Lu;inK0>m zj`5_ktpX{)unPQ?ia{P#PUThM2Of@)mK-fN=1_&=kB;`7Le3jdj!=e!JVLEB4>4X|jg`B`vR8J5jxBln(P}j_(WD4Em&>HhAHnFs$r9V`)PX5yFl$`~~3O4rb^-2|i-GEu!dV zk^#NRLi`xpJRm?ws3C-}RbVltq;0ung=y?7|L&BsqAj)vQ7v)?wxwH}*MUGE1dbJj z?nFhcKb(^)vL9;OHC_pg72SOh zVfV;xMeZ#My|v)BqEDl0!?0Z*{a0WqVzyTzgoTT2^vpNI(me3VJ75eD;xs&JUrx8I z<7NlL&88kX3rt!+CWTP=WV!bbIrzIAEJ(#u7fbSVS)MKm)6Dmft5&%Z(LP_*Ov|)6 z!(?#HFqoAxD@qneX8AGvBLce&a^6T6Qii&k)F#O|tkG69?*IYZz_@~XiiiCw$dzSR vRq|pu6B}fN$DNRaI`Q!su%|)1o%ro4YLJr-499PSbYXl6LzWJu%;A3l6_9}I literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/__pycache__/helpers.cpython-312.pyc b/i18nilize/src/internationalize/__pycache__/helpers.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..945a4fe8c11389ee5379916dd21967bac7ab9c85 GIT binary patch literal 1662 zcmZt`OK2NMbY^GQT6b6SI@#T`{|^ z9kFVK>A{6iWO|UH6ntn8Ay5jv6xvI2?M1CkE4IG1m)?Y32soF%8F?kSWR`jR=Kbe= z=9g&n1qAEcpD$%^iwOP24&f5ckdtvhs>nnp&ZE1?6h1?Du}J_5rU;Oj5)nPy3VSl|nFG4h2) zG={Dq7jFs}-9Z?>Pl2{Y?x0OPhCCJpU*m{gz{u+k&!!Ms1!_xb8++mH(JIeSDBreH zA{|yp+lo)Nv589L6S9dtHPi#Y{pU19pL~VB?(p8Jw|N%1E~NuZi?Lg|yp^;aFL}?| zu+3up?Zx-g$$2Z|m^nL}T%gpU#R&i1Na~S5bPARoh^wvxFz*;<(90~O9q$&?=YoM$ zpgG$MdYCP4%4*WP7q&81!OJ2&$z09qp~?dy9wBm-d&A;)&|@-RpZxU(W2zKP4!3 zxiNrLt^Cf@L>qthZyc$^$4HQpM{=|l8#$Cmk7A=WfJ)CF%IL4kC}V1zId&+I*JC|9 zk!MFrUr4S*_Hf1BSwEDAn!JVt@~7@qh-zD%Mqdm}l5gZ`^qq7q@&lPhKf?a$)wzE1 z_~q#A6nQ+Q0{#SPa~gS~Nr0c55!Uy7MkWBMo|}-cuS(d*CcX&#lEAuM7t(>W!Kp82|*Hx{O`24-{ zLS50y@16h`oePvzf(N<^NEPK^XnnNW8fYfpTqe%8#&aHhG}sLLxst6BC=s8y_(8%K zeC(5(VCccHhg`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpdh0un3?07Eh^mjD0& literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ec1fe08ab3e828051014fda28ec3a64d9c40d171 GIT binary patch literal 560 zcmZ8d&1w`u5U%R!Str>ELGfTfaKXbemmR!$kRX_I5Q3LQSvuRD&A5~9vAdVx(tFak z2mw9%N{u&9zC!R|^{6mdO?^duRb7AP;9ws}_P*a=oil(R$r%c9@RHO$B9I`lg)5vR zf@CuL409&=8C3aCib934SSi1F?~Gn%iTNudvN`E1Qumg?Lx4}X%R(mc2u|SLlN}FS zvLgt%W_B9*7Yytx?(&dJAm*ve0=ogp1Kz+bXMk`9A^&4P6ci<1=C>IQGdi7@-U{tn z;Txk}ELx#g8?jP%INcsjC))VQh1qC1Y4l_}9uO6?Y2ldB8r3N7T{Nv)bi!ZSv`*yL z#>&X0@FI=}E#`$**NYVV1~%RE?sfgfDeLNU+X&qWyRJ`^TYJ;htyzk;+4iH=&9mpa zAy3uLF6%~nWpy7(De7OYnsp!JVY=*~XF+Y;1A+oediz-5LsIsu%xy{ZX_dvtRCV@$ k)!C(LJDRQEv`_6v9>AEs$Ku76k(*W>V`{_+N+|FB2JEekj{pDw literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/__pycache__/localize.cpython-312.pyc b/i18nilize/src/internationalize/__pycache__/localize.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f7338747845efe8886925048b13d4b9d1dd642e GIT binary patch literal 710 zcmZ8fziZn-6n-bkMveRn3~_#xVnW(PG*|>Wlu$Z(Xcu=dT>{0ZzKg9yKADr;G(sU6 zI+)VIooomJFNKya{R8?RbaCSjLbOw-ZU%3jdM78v^ufKS@4fHd`|eKP(&;7O_TlSV zi;8mW-iA%W(da@FwJZ4hYHa*LsZlu~KZFI~AnV~H| zyH%u)S3Gb!6c;U8^tFYAE-|4flKHXqWOVDmvPrFNdQFxTY30~qI8w0bnUS_IB2p6c*WReRpYr!m}?x7R~Ge~T!T?|>YWy$o@>}n-Lx$~R%lqe52?iwFax?hUhF)Q|qCuy>W)3-jx5pG`Da*_osu zlkL9l9uBmTwmDKZr+gGtbUC`s^_KqETWS)!%?}=5WvuTLupHmPGThD7M=b|;Z1R}p XITXK(o91pJBZPjz?lhyKyD|MQjikKo literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/__pycache__/parser.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/parser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a85641450bc944f69e766c974907f6be411a6d1 GIT binary patch literal 393 zcmYjNy-ou$47PI_j&h|8h)X5 zWfr+@brboGw}iEoD#cnEt|PxRwT@iLAm6}k(7NwRoO$iMxNt@`t#os7s{K6JR@8PT zYx5|Bv5hdp{l<`|g?BSynxI|NWm1V2)JRkI+J`vk%xPLaP1|_-SV2&*0(-xlZU1oQ hHYrdtmy(^`y=4v3sbhY4Yt>z?kJ7<>s?DLu{s543SnL1* literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/__pycache__/test.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/test.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30e0d93c9b5dab8261280ab47bc1ba35aa6e4bcb GIT binary patch literal 1797 zcmaJ>OK;mo5Z>iOq9jU@lQgaRN>L;S0kLHpcA@}95g>_E1ceIJ3DWL`ptLKCGR;+X zS8XHMC*|J1U>(z+#A{Ff1qFIZXO?wJ$8AaMkh42Gk8d8b*{lK=K_qvQ$UF85v&?g=vWmoBS_D)$c^bz6|rU_~hC z*te@&IRl+!(4~2BAWSsXG8^Ge`Eh`G088HiA_&?9dz3q`33Cfe%;P?<0PpiE58zwj zwSCg9=Z$AVno8-Yhngyvh@m#YZ9!qG+6?B8qZvDw8a)*-I$%#>qV`(lKj{=1Pgo zL~!Q~Q6ZTB^V{BYEtKvJRT5{jSRM8r34Lhfte47BoF}K z{#~(imxV^fnNBTm`V4D9VR7U^8fORd_&~7A9wcZqVg5v8FoV69bD5msbynS<#aW^!%=<>Bao1B;a}6~&Vh!mvk6+H?Gx!D#~zJRX~v zT^(CU8(!|?MTU_U@gMF-T0IAcqbDf4xn-(wrK?QWm6>#C^g-XC! z0$8>;`tSoeAcn5!uT4q}wBC|Z@&b_e;9a^!4z`H?;Ahy!_eX5;zk8<5rO;5Oza&tZ zwrkuxEWr3aPPEYZ+8(saK$<-{&-i1dq_VhmsRii$h_6|{ZHHyjL}R@4G5Dyl*h5;U zU%p-3ycFj}`3uovj^0K412F$L2>^+TsZImHq6JvgphNusK;!nmp>e}{pJYElyYkW` zsVi(hh5e^65LHEjZYeAu^&t?LCopu_m8bjP4IYV+e1Zh$T8Uu6Di;Vw zX}t(YKm#vmho0R>Lq~CvMNzlLf_au044^;;Q_QN+j58RLwm$Lz9e)@@TcJ|*DUjU5 f`z4#!1=}gXSB2+aV|8oX{|HdH>IOGM>b?C7v>U9t literal 0 HcmV?d00001 diff --git a/i18nilize/src/internationalize/__pycache__/test_parse_json.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/test_parse_json.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0a2e243c38901d42e468dfc0f449abff5a9f08ca GIT binary patch literal 1808 zcmaJ>OK;mo5Z>iOq9jU@lQgaRN)aRn0d-^>cA@}95g>_Edz=BY5xP%(x37Y{1Mz#hTUUjZ>>LeCuIF6k+?|K17Zbm^Rs$max?M?W4-IkGo?gk zBDnL0s1VHmwcmT8h0?tPmBiUJR!68sq=!n~MPFis3Oq}Su;X^ff^yI9S&sW1atiQ)yu&LXU%ikAJ^;Q};_JXSN_+@>v!ts9 zx?HQvwYsjnmvybKHu5%2YlGZ>E{{Yuzun*2+}a-9f3UvM-+HjVebC=n?;q?8*ZI!Y z{f!OYzbCfuvCybE)2YQ!pJQ1ltdl%QLUI7{@HdEd!2?t02&``0z zCfXDYqb(?8;fjpC~1j#jQ&%Kp#eY&H8PdEt4i1;iXT(M~%fE z(mK8Mc7F3xoU8IH(PEC?NBbi%|2Gr>iHfOC0>GjLSk$0H{Qp4X&cC5?!+M`&KSSs8 z(om@@Y(Itlr!WvzMS^ZAEFbkT5Ev~mf7q30d*2Tpi=pJ=AFvdr{zItNE*bk0q%?|# zP#7&5B3NHs0;}xapj*Y^hC>d9TRn=7C7;Yb&!091V>znV8JRE z2u5kW2uMH!FKCCJ-A6;mags$*x5k25mKY46Kn7FHs?dy6n3uLb@&Fxw6hm8~QuR5I h+{61No7M%}DZw{|=ig#=Yux_?P`K&_H$&>Z{Tmz;v0?xK literal 0 HcmV?d00001 diff --git a/i18nilize/tests/__pycache__/__init__.cpython-310.pyc b/i18nilize/tests/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2dda11fb85410fde7ee80eb20539036cffb08bae GIT binary patch literal 158 zcmd1j<>g`k0*412=^*+sh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o6vJKeRZts8~O# zC^IpyAh9T0-zBv;yClCrKPNvqF(CBr6{v3HO4VHF(oxOGr2g%IX@*cFI^#^C_gJTxuiHICqFqcC$lQC zBr`uRCezR&FB8a1jVVbj21>@qXXa&=#K-FuRQ}?y$<0qG%}KQ@Vg*_Sa!fHlkodsN O$jJDC0Y(%t1H}NE05l)~ literal 0 HcmV?d00001 diff --git a/i18nilize/tests/__pycache__/__init__.cpython-312.pyc b/i18nilize/tests/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..92ab8343071b94eb46dd76390c2a2819d7fe3493 GIT binary patch literal 165 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 literal 0 HcmV?d00001 diff --git a/i18nilize/tests/__pycache__/test_read_file.cpython-310.pyc b/i18nilize/tests/__pycache__/test_read_file.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e44393c6bec47341035d218013885f91903da804 GIT binary patch literal 1384 zcmZ{k%}(1u5P)}W$95n(c5Vn*(IZl^f5RQ5RiVkk ziHN;e`BH~|97GaS`BW913fV!c$zi}|52k(#LJ&qdVFstnOq3dm52c249N3uiV;(r6ZVbuFD^)d)ff6xnZ zO=6IJ23lVYJ3?nwx9u8{O@lYNNTnQ{8Ac8`Wlevs2}p>)VY6Z*GZ=t%{k< z`dSMWe>fZYp)%pxB;O4};SK$`S1}Sxi?GY)#rL7;#DaSrYtbSduN+VC zs!f?bVuZYGm?@*Luz29ZDK{=nZX%;cS_`zf|Fkw}ohhxG-jKhiJkv_-0|kZAOL9FC zhEd|QBiV;EGNTnSvlU5Ze(9YvcL=((Q4}!eXz0s8_n7rD3jJGC<=~MDQ>*aZw^TW} zM!K2E!zw9G#Qad4dLF)MG%W(9B3-8A*UyofIQ2ZR23++B%~QajkpPW-55Z}vSvaTW zK#W(*cL2&I8O5b;G?Kg&$Wlg$IR`4mr3z@gRKD9z7%PlPEuffUkhV!yHEpPzi6+&r zz&x#%ltK9!2Ggfn6(?~$Px=GldC83D4I(~*!uOJb=V3QwU(&oNEJ*bN#p2_)rLV*! zDJ)k^o<>_2D%Uk!t6-=4ip$)Q3}Vb9Th*#l3uG*mO#37K8>roNj7W=ttvqQ1MK*+f p%i7e%IQM;MK=hng13!=x(C#0WxbL#acCkC|URR(6`qC;a{RN~eTFU?c literal 0 HcmV?d00001 diff --git a/i18nilize/tests/__pycache__/test_read_file.cpython-312.pyc b/i18nilize/tests/__pycache__/test_read_file.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c479b7731a0bc265bd8f5f861942cea5d32118f GIT binary patch literal 2065 zcmd5-O>7%Q6rR~1dlHSOKhnD_P41)d$UzYXmINo%<>&~nz zVihS!L2%@j3x{$*5aj?z4jg)n#HE!JH5$|tCvH{UQ%}5EZ(=7nm%@QLyqS6L&3ilF z`{wQMBO}8I#t*+uEPbXS^rzhH4Lw?P8n9SLHnOpc%5qj*Tvy5pmTT2j>sndENI@5n zt*s$jr)W8hx)-QBZ>rt798(Z@j2^Vg-Daf1Xa#3tf5}}bgGF+Q21dY4kGp2z_#UW+ zLY04$dRBBMoN%=1yatPP$Wq2ODl0ZFtG2R+%9^c$)a6%}V=HIo zHls6l@TStW!QD|tDYd4GbEoo!>iojYY%#wuQ>YYYXNr|MYsQ|-&(F@<#nZHKI-`mg zOwK6_-n-Q_T_!V#p{nCjqhSWMj3P8n-KrR+pEsx#P}>M3W?be! zqz6xfSVg<3cfT3kC5eY*`~eyNE_Ju?0UvY#`#2~k`-J zz}?2Svd2eT?P34i(X{<&`hO5DwjVA2ucMK^n-2A&0n3ITYA{(2HUwe=v#_$VB59TY zDPHcYeD4YK*6T;nqt8jU2!0y`uw<;OcgQs+^AG0UU9kL5xTo3rK3if3>KiYyWAL5q zB@nHX(@|}w)1DustA5k7(~g&p2oOKdLME^mrSsTywC!_dDH&@51n(Idq z6WXC65{4mrWY-e1m5s<7y&}aVhz%4*2x-e=QY(dQH(XwQ4ecI#d-c*2P0`QcCq&b) z<4!`+Dej(Z&w+GvdTRA9#xmXv^JhP9%tD zP3Y4ygV5@x<1zVr>wWAqa;AIBMfMgLWOaBB#A6j>{0B-tLJN;j{wYafioY#B9GiMD YHuV(A-QzbA9$h70k9;}uRWc0tH=upXCIA2c literal 0 HcmV?d00001 From 379227404f01ee5a03e3c9631fb5f81705315364 Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sun, 17 Nov 2024 00:23:07 -0800 Subject: [PATCH 21/27] remove egg info --- .gitignore | 3 ++- i18nilize/src/localization.egg-info/PKG-INFO | 25 ------------------- .../src/localization.egg-info/SOURCES.txt | 19 -------------- .../dependency_links.txt | 1 - .../src/localization.egg-info/top_level.txt | 1 - 5 files changed, 2 insertions(+), 47 deletions(-) delete mode 100644 i18nilize/src/localization.egg-info/PKG-INFO delete mode 100644 i18nilize/src/localization.egg-info/SOURCES.txt delete mode 100644 i18nilize/src/localization.egg-info/dependency_links.txt delete mode 100644 i18nilize/src/localization.egg-info/top_level.txt diff --git a/.gitignore b/.gitignore index 65833dd..77f2135 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ env/ **/__pycache__ myenv -venv \ No newline at end of file +venv +i18nilize.egg-info \ No newline at end of file diff --git a/i18nilize/src/localization.egg-info/PKG-INFO b/i18nilize/src/localization.egg-info/PKG-INFO deleted file mode 100644 index dd59d81..0000000 --- a/i18nilize/src/localization.egg-info/PKG-INFO +++ /dev/null @@ -1,25 +0,0 @@ -Metadata-Version: 2.1 -Name: localization -Version: 1.0.0 -Summary: A localization package for microservices -Author: UBC Launchpad -Author-email: strategy@ubclaunchpad.com -Classifier: Programming Language :: Python :: 3 -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Requires-Python: >=3.6 -Description-Content-Type: text/markdown -License-File: LICENSE.txt - -### L10n -A simple, lightweight interface for Python-based applications handle anything l10n/i18n -MIT License - -Copyright (c) [2024] [UBC Launchpad] - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/i18nilize/src/localization.egg-info/SOURCES.txt b/i18nilize/src/localization.egg-info/SOURCES.txt deleted file mode 100644 index 5cb9de1..0000000 --- a/i18nilize/src/localization.egg-info/SOURCES.txt +++ /dev/null @@ -1,19 +0,0 @@ -LICENSE.txt -README.md -pyproject.toml -setup.cfg -src/internationalize/__init__.py -src/internationalize/command_line.py -src/internationalize/globals.py -src/internationalize/helpers.py -src/internationalize/internationalize.py -src/internationalize/localize.py -src/localization.egg-info/PKG-INFO -src/localization.egg-info/SOURCES.txt -src/localization.egg-info/dependency_links.txt -src/localization.egg-info/top_level.txt -tests/test.py -tests/test_cli.py -tests/test_generate_file.py -tests/test_parse_json.py -tests/test_read_file.py \ No newline at end of file diff --git a/i18nilize/src/localization.egg-info/dependency_links.txt b/i18nilize/src/localization.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/i18nilize/src/localization.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/i18nilize/src/localization.egg-info/top_level.txt b/i18nilize/src/localization.egg-info/top_level.txt deleted file mode 100644 index 1d2fe09..0000000 --- a/i18nilize/src/localization.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -internationalize From b8951da77b87790ae1e6743565cb0fbad88ebc4e Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sun, 17 Nov 2024 00:25:20 -0800 Subject: [PATCH 22/27] remove useless --- i18nilize/src/internationalize/helpers.py | 3 --- i18nilize/src/internationalize/resources/languages.json | 0 2 files changed, 3 deletions(-) delete mode 100644 i18nilize/src/internationalize/resources/languages.json diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index 23b1134..3ab6fad 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -1,9 +1,6 @@ -import json -import sys import os import requests -DEFAULT_PATH = 'src/internationalize/resources/languages.json' # to be removed after refactoring LANGUAGES_DIR = 'src/internationalize/languages' # Function to parse json file, given its path diff --git a/i18nilize/src/internationalize/resources/languages.json b/i18nilize/src/internationalize/resources/languages.json deleted file mode 100644 index e69de29..0000000 From 02886324638629af841a2abf72c2635ef5cca576 Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sun, 17 Nov 2024 00:29:30 -0800 Subject: [PATCH 23/27] move languages_dir to globals --- i18nilize/src/internationalize/globals.py | 1 + i18nilize/src/internationalize/helpers.py | 13 +++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/i18nilize/src/internationalize/globals.py b/i18nilize/src/internationalize/globals.py index e69de29..4f7adb6 100644 --- a/i18nilize/src/internationalize/globals.py +++ b/i18nilize/src/internationalize/globals.py @@ -0,0 +1 @@ +LANGUAGES_DIR = 'src/internationalize/languages' \ No newline at end of file diff --git a/i18nilize/src/internationalize/helpers.py b/i18nilize/src/internationalize/helpers.py index 3ab6fad..2014c7d 100644 --- a/i18nilize/src/internationalize/helpers.py +++ b/i18nilize/src/internationalize/helpers.py @@ -1,7 +1,8 @@ +import json +import sys import os import requests - -LANGUAGES_DIR = 'src/internationalize/languages' +from . import globals # Function to parse json file, given its path def get_json(file_path): @@ -22,8 +23,8 @@ def get_json(file_path): # Adds a json file corresponding to the added language def add_language(language): - os.makedirs(LANGUAGES_DIR, exist_ok=True) - file_path = os.path.join(LANGUAGES_DIR, f"{language.lower()}.json") + os.makedirs(globals.LANGUAGES_DIR, exist_ok=True) + file_path = os.path.join(globals.LANGUAGES_DIR, f"{language.lower()}.json") if os.path.exists(file_path): return @@ -35,7 +36,7 @@ def add_language(language): # Adds/updates a translated word under the given language in the default JSON file def add_update_translated_word(language, original_word, translated_word): - file_path = os.path.join(LANGUAGES_DIR, f"{language.lower()}.json") + file_path = os.path.join(globals.LANGUAGES_DIR, f"{language.lower()}.json") if not os.path.exists(file_path): print(f"Error: Language '{language}' does not exist. Add the language before adding a translation.") @@ -50,7 +51,7 @@ def add_update_translated_word(language, original_word, translated_word): # Deletes a translated word for the given language def delete_translation(language, original_word, translated_word): - file_path = os.path.join(LANGUAGES_DIR, f"{language.lower()}.json") + file_path = os.path.join(globals.LANGUAGES_DIR, f"{language.lower()}.json") if not os.path.exists(file_path): print(f"Error: Language '{language}' does not exist.") From 688a46ccba50efdb7035601813e61b9a66937eef Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Sun, 17 Nov 2024 00:32:02 -0800 Subject: [PATCH 24/27] delete more egg info --- i18ilize.egg-info/PKG-INFO | 4 ---- i18ilize.egg-info/SOURCES.txt | 7 ------- i18ilize.egg-info/dependency_links.txt | 1 - i18ilize.egg-info/entry_points.txt | 2 -- i18ilize.egg-info/top_level.txt | 1 - i18nilize.egg-info/entry_points.txt | 2 -- 6 files changed, 17 deletions(-) delete mode 100644 i18ilize.egg-info/PKG-INFO delete mode 100644 i18ilize.egg-info/SOURCES.txt delete mode 100644 i18ilize.egg-info/dependency_links.txt delete mode 100644 i18ilize.egg-info/entry_points.txt delete mode 100644 i18ilize.egg-info/top_level.txt delete mode 100644 i18nilize.egg-info/entry_points.txt diff --git a/i18ilize.egg-info/PKG-INFO b/i18ilize.egg-info/PKG-INFO deleted file mode 100644 index c4dd000..0000000 --- a/i18ilize.egg-info/PKG-INFO +++ /dev/null @@ -1,4 +0,0 @@ -Metadata-Version: 2.1 -Name: i18nilize -Version: 1.0 -Author: Brian Park diff --git a/i18ilize.egg-info/SOURCES.txt b/i18ilize.egg-info/SOURCES.txt deleted file mode 100644 index e6f9b1b..0000000 --- a/i18ilize.egg-info/SOURCES.txt +++ /dev/null @@ -1,7 +0,0 @@ -README.md -setup.py -i18nilize.egg-info/PKG-INFO -i18nilize.egg-info/SOURCES.txt -i18nilize.egg-info/dependency_links.txt -i18nilize.egg-info/entry_points.txt -i18nilize.egg-info/top_level.txt \ No newline at end of file diff --git a/i18ilize.egg-info/dependency_links.txt b/i18ilize.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/i18ilize.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/i18ilize.egg-info/entry_points.txt b/i18ilize.egg-info/entry_points.txt deleted file mode 100644 index fcb2919..0000000 --- a/i18ilize.egg-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -i18nilize = i18nilize.src.internationalize.command_line:cli diff --git a/i18ilize.egg-info/top_level.txt b/i18ilize.egg-info/top_level.txt deleted file mode 100644 index 8b13789..0000000 --- a/i18ilize.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/i18nilize.egg-info/entry_points.txt b/i18nilize.egg-info/entry_points.txt deleted file mode 100644 index fcb2919..0000000 --- a/i18nilize.egg-info/entry_points.txt +++ /dev/null @@ -1,2 +0,0 @@ -[console_scripts] -i18nilize = i18nilize.src.internationalize.command_line:cli From 7d7f7aa8fd8cd85f8f64f5561d73f90ccbce6e7f Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Tue, 19 Nov 2024 14:17:50 -0800 Subject: [PATCH 25/27] delete build files --- .../build/lib/internationalize/__init__.py | 0 .../lib/internationalize/command_line.py | 47 ------- .../build/lib/internationalize/globals.py | 0 .../build/lib/internationalize/helpers.py | 132 ------------------ .../lib/internationalize/internationalize.py | 0 .../build/lib/internationalize/localize.py | 16 --- 6 files changed, 195 deletions(-) delete mode 100644 i18nilize/build/lib/internationalize/__init__.py delete mode 100644 i18nilize/build/lib/internationalize/command_line.py delete mode 100644 i18nilize/build/lib/internationalize/globals.py delete mode 100644 i18nilize/build/lib/internationalize/helpers.py delete mode 100644 i18nilize/build/lib/internationalize/internationalize.py delete mode 100644 i18nilize/build/lib/internationalize/localize.py diff --git a/i18nilize/build/lib/internationalize/__init__.py b/i18nilize/build/lib/internationalize/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/i18nilize/build/lib/internationalize/command_line.py b/i18nilize/build/lib/internationalize/command_line.py deleted file mode 100644 index e2c4124..0000000 --- a/i18nilize/build/lib/internationalize/command_line.py +++ /dev/null @@ -1,47 +0,0 @@ -#from src.internationalize.helpers import add_language -import json -import argparse -from i18nilize.src.internationalize.helpers import add_language, add_update_translated_word, delete_translation - -def cli(): - # initialize the parser - parser = argparse.ArgumentParser(description="internationalization for translation") - subparsers = parser.add_subparsers(dest='command') - - # sub parser for add_language - add_lang_parser = subparsers.add_parser('add-language') - add_lang_parser.add_argument('language') - - # sub parser for add - add_parser = subparsers.add_parser('add') - add_parser.add_argument('language') - add_parser.add_argument('original_word') - add_parser.add_argument('translated_word') - - # sub parser for update - update_parser = subparsers.add_parser('update') - update_parser.add_argument('language') - update_parser.add_argument('original_word') - update_parser.add_argument('translated_word') - - # sub parser for delete - delete_parser = subparsers.add_parser('delete') - delete_parser.add_argument('language') - delete_parser.add_argument('original_word') - delete_parser.add_argument('translated_word') - - # the subparser is used because different CLIs use a different amount of inputs - - args = parser.parse_args() - - # depending on the command, do different things - if args.command == 'add-language': - add_language(args.language) - elif args.command == 'add' or args.command == 'update': - add_update_translated_word(args.language, args.original_word, args.translated_word) - elif args.command == 'delete': - delete_translation(args.language, args.original_word, args.translated_word) - else: - print("Invalid command") - -cli() \ No newline at end of file diff --git a/i18nilize/build/lib/internationalize/globals.py b/i18nilize/build/lib/internationalize/globals.py deleted file mode 100644 index e69de29..0000000 diff --git a/i18nilize/build/lib/internationalize/helpers.py b/i18nilize/build/lib/internationalize/helpers.py deleted file mode 100644 index fca2d33..0000000 --- a/i18nilize/build/lib/internationalize/helpers.py +++ /dev/null @@ -1,132 +0,0 @@ -import json -import sys - -# Should this be removed? -DEFAULT_PATH = 'src/internationalize/resources/languages.json' - -# Function to parse json file, given its path -def get_json(file_path): - try: - # open file and parse - with open(file_path, 'r') as file: - data = json.load(file) - except FileNotFoundError: - print("File not found") - raise FileNotFoundError - except json.JSONDecodeError as e: - print("JSON Decoding Error") - raise e - except Exception as e: - print(f"Error: {e}") - raise e - return data - -# Adds a language to the default JSON file -def add_language(language): - # filename = f"{language.lower()}.json" - # file_path = os.path.join('i18nilize/src/internationalize/resources', filename) - - data = get_json(DEFAULT_PATH) - translations = data.get('translations', []) - - # Check if the language already exists in the translations list - if not any(t.get('language') == language for t in translations): - # Add new language as a dictionary in the list - new_language = {"language": language} - translations.append(new_language) - data['translations'] = translations - - # open and write - with open(DEFAULT_PATH, 'w') as file: - json.dump(data, file, indent=4) - -# Adds/updates a translated word under the given language in the default JSON file -def add_update_translated_word(language, original_word, translated_word): - data = get_json(DEFAULT_PATH) - translations = data.get('translations', []) - - language_exists = False - for translation in translations: - if translation.get('language') == language: - language_exists = True - translation[original_word] = translated_word - - with open(DEFAULT_PATH, 'w') as file: - json.dump(data, file, indent=4) - - break - - if not language_exists: - print(f"Error: Language '{language}' does not exist. Add the language before adding a translation.") - sys.exit(1) - -# Deletes a translated word -def delete_translation(language, original_word, translated_word): - data = get_json(DEFAULT_PATH) - translations = data.get('translations', []) - - language_exists = False - for translation in translations: - if translation.get('language') == language: - language_exists = True - if original_word in translation and translation[original_word] == translated_word: - del translation[original_word] - - with open(DEFAULT_PATH, 'w') as file: - json.dump(data, file, indent=4) - - break - - if not language_exists: - print(f"Error: Language '{language}' does not exist.") - sys.exit(1) - -# Input: -# - file_path: path of json file -# Output: Token in json file -def get_token(file_path): - data = get_json(file_path) - token = data["Token"] - return token - - -# Input: a JSON object -# Output: None, but creates a local JSON file containing the object -def create_json(json_object): - with open("src/internationalize/jsonFile/translations.json", "w") as outfile: - outfile.write(json_object) - -# Input: None (for now) -# Output: None, but creates a local JSON file containing translations -def generate_file(): - file_content = { - "Token": "85124f79-0829-4b80-8b5c-d52700d86e46", - "translations" : [{ - "language": "French", - "hello": "bonjour", - "No": "Non", - "Why": "pourquoi", - }, - { - "language": "Spanish", - "hello": "Hola", - }, - ] - } - - # transforms the dictionary object above into a JSON object - json_object = json.dumps(file_content, indent=4) - create_json(json_object) - -# make hashmap from translations -def make_translation_map(data): - translations_map = {} - for translation in data.get('translations', []): - language = translation.get('language') - if language: - translations_map[language] = translation - return translations_map - -# get translations from hashmap given the language -def get_translation(translations_map, language): - return translations_map.get(language, "Translation not found") diff --git a/i18nilize/build/lib/internationalize/internationalize.py b/i18nilize/build/lib/internationalize/internationalize.py deleted file mode 100644 index e69de29..0000000 diff --git a/i18nilize/build/lib/internationalize/localize.py b/i18nilize/build/lib/internationalize/localize.py deleted file mode 100644 index 7aca8ac..0000000 --- a/i18nilize/build/lib/internationalize/localize.py +++ /dev/null @@ -1,16 +0,0 @@ -from src.internationalize.helpers import get_json - -# Input: -# - file_path: path of json file -# - language: chosen language to translate to -# - word: chosen word to translate -# Output: translated word based on chosen language -def get_translation(file_path, language, word): - data = get_json(file_path) - for translation in data["translations"]: - if translation["language"] == language: - new_word = translation.get(word) - if (new_word == None): - return f"'{word}' not found in {language}" - return new_word - return f"'{language}' not found" \ No newline at end of file From d341e65875f1c171bb32369d428368a455f39d73 Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Tue, 19 Nov 2024 14:21:21 -0800 Subject: [PATCH 26/27] delete pycache --- core/core/__pycache__/__init__.cpython-310.pyc | Bin 152 -> 0 bytes core/core/__pycache__/settings.cpython-310.pyc | Bin 2269 -> 0 bytes core/core/__pycache__/urls.cpython-310.pyc | Bin 994 -> 0 bytes core/core/__pycache__/wsgi.cpython-310.pyc | Bin 549 -> 0 bytes 4 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 core/core/__pycache__/__init__.cpython-310.pyc delete mode 100644 core/core/__pycache__/settings.cpython-310.pyc delete mode 100644 core/core/__pycache__/urls.cpython-310.pyc delete mode 100644 core/core/__pycache__/wsgi.cpython-310.pyc diff --git a/core/core/__pycache__/__init__.cpython-310.pyc b/core/core/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index 9afb2d4f43744cd4571e356e673007cf8d33e1c6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 152 zcmd1j<>g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpd;R;8}#{1yr(E5NMEyGF{~zPk40UtvKNADq68GqAI$Gi|EoV4z0cw2yb6Pm(d#7 zTt@5pcqJdN5`G}stLU128C|#6Alf?ISI`anD*DL2hHjc%?Uq~PIj*7&-Ea^|6f;J` z0hRhuEO}9krBNIWvB%^}We0~ib{R%e??}3ba)%8U1tgRxb7MBMyeEw*Ku9yhC-Np- zmC7~%1{oj;0XuLRi9!kfY@a|h;^R*tIIiq7HlklD3W_``Ph%Ws;6;IgLj?d87LABU zmE&xcDLmW9Qh)6Gl20g;qW+z>$^Ok(M^>yI)0Ke1xmp9}N{>?~K~Q?cW+{bXy# z0tqSh#xdR)9Nrxbqo;R7&wPJE*3L|?_$YRoyb5fJ_Md=tK-dYf5E;wZDXoP8UeL+bvr9kspMF0wS03J6N zJs50^mu&~Fm6DB_HXsQ3c;d!b&euuUk!)rQhDqy0mponsn}wI>{LQIs&Z~Ad2<&ta zg>pTA{D&!x`*IzIR|HSyOg~@9#Rc-_^HAX(cq3k3h;xpMi#Vog-nliUZ_ewp4=lnb z-oeoI4xkz2@3vz%z{V)6dOGK~ob{MIj(wUaGYE!*kq>Pq_rMp2=(r7JE$=vMrl$5< zzV~mK0}bLqMo~;_Vsd{G=B$;BaBn1 zfWxt_CZ?q=wf<6XYqqF0c1^pib~;WrOG`$_Y8Y)Zxtg;zp#vhjqY?0%Z(dqLxbKdA zc2do#cS;^T^a;a{k_rfC^O}$r_4ZDqt*2sJZRv3ddOCTrkab=$BbU-i6e9=D4TAD; za+l&*Wm%(+88%5kd^c-^S5u29PM)0?sYOB(jDsc)2W`Rz~Tvrdnzi)=Y1xUF(I@QB8Bt*wvg@YO?`K18T0?RNFgUbw_vV zhNc5xqoq5x0VPxJLc)#BFWPA_n^`twZUJ&Vi=M7&`nK9_S`Hu^&UQm@YQJ&uZD1iE z{`yME%7-ewn7AQuaG+?I9>DiZ@gol^D9LL~$qIcs9Dn2F(NS9d8h9W3_!)e$Ir=RO zBDb=#x+IpwB~d6B%FAL!5CvY~%YyJ;{9Al4t_mfAFY@9)Ft374oV))N*F`Xgt5`1l E3osN2YXATM diff --git a/core/core/__pycache__/urls.cpython-310.pyc b/core/core/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index 8e63f600a1a5a4d46cb8eac0553296d689d17e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 994 zcmb7DU5gVj6wOShAI^4{{Rw$%2kL|hq7;=Cb#Xy_Q1_)T-E@++=}wX%N!6|3OMi`j zXzcDmLEMjpP z$#@z^{@f~CGMOf_J#9ybCoJLdy0h-?VmP;Xn{{^4E?&md9_zkGS&x2+5lXM$y}^Z6 z3$ff7>V#H!p$$X~$Cc4*Ubs9>Kdd;u*_g7T&T*sc4K9Us*yxSp76XLEPUDY)f3i8g zg!|Ip7Yd-{9<(YswH#Z{Cn<)ta;~xyLYOXW&el{d^`Ts$CEj295mr?4rvrZ;Wa*2NT6=#E!q^e&-&kn3;>Hun1LFgo*MRjuY9O=u;^_DqZ)D^ZFq z4*+kodv$jXV~}e?!K{GF{!j#h?*?4jY|u}SiOSE z7kNJR1il;Xz!AR$vaM!PvP%hsIl@Sz`L%@C64oHenpx4N6l;K!`J5ReMa8_(YCey6 zpCd(+D1?e^O`9NEMR4KBLP&T;96-MG-nb8xa$UKCub8U!|DGz{P*C(;@s=+2jn|Ze zk@~g)<>`&91GVPT+ZG^+&>G5QAR!&dO&&QL|wETKDy!djm>8Gm~ z4!jqtc7tB%m1X2F%Yd~DFScD2ZBfFsII@HusI{4gL9=w(z%8D_8O5Zsm5hDu#ADK@PhG;wTQA}Y*nIQY1g`BVG^$R)roI(YI7KgT)# E2Z|Y~r~m)} From f00e7ba923581733e7a9ec87caf6dafbf7620d74 Mon Sep 17 00:00:00 2001 From: angelafeliciaa Date: Tue, 19 Nov 2024 14:24:59 -0800 Subject: [PATCH 27/27] delete pycache --- .../__pycache__/__init__.cpython-310.pyc | Bin 157 -> 0 bytes core/i18nilize/__pycache__/urls.cpython-310.pyc | Bin 311 -> 0 bytes core/i18nilize/__pycache__/views.cpython-310.pyc | Bin 999 -> 0 bytes .../__pycache__/command_line.cpython-310.pyc | Bin 1137 -> 0 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 3394 -> 0 bytes .../__pycache__/localize.cpython-310.pyc | Bin 560 -> 0 bytes .../tests/__pycache__/test_cli.cpython-310.pyc | Bin 2595 -> 0 bytes .../__pycache__/test_parse_json.cpython-310.pyc | Bin 4784 -> 0 bytes .../__pycache__/test_read_file.cpython-310.pyc | Bin 1384 -> 0 bytes 9 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 core/i18nilize/__pycache__/__init__.cpython-310.pyc delete mode 100644 core/i18nilize/__pycache__/urls.cpython-310.pyc delete mode 100644 core/i18nilize/__pycache__/views.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/command_line.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/helpers.cpython-310.pyc delete mode 100644 i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc delete mode 100644 i18nilize/tests/__pycache__/test_cli.cpython-310.pyc delete mode 100644 i18nilize/tests/__pycache__/test_parse_json.cpython-310.pyc delete mode 100644 i18nilize/tests/__pycache__/test_read_file.cpython-310.pyc diff --git a/core/i18nilize/__pycache__/__init__.cpython-310.pyc b/core/i18nilize/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index e1f27b1d1d423ee2cd3923e3579f1828ad03b491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 157 zcmd1j<>g`k0*5-rbP)X*L?8o3AjbiSi&=m~3PUi1CZpdwBw+vm diff --git a/core/i18nilize/__pycache__/urls.cpython-310.pyc b/core/i18nilize/__pycache__/urls.cpython-310.pyc deleted file mode 100644 index d902cc5ec802f772b11cfdaece320806d40b6633..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311 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 KM072bi{AiDQ2rwT diff --git a/i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc b/i18nilize/src/internationalize/__pycache__/localize.cpython-310.pyc deleted file mode 100644 index ec1fe08ab3e828051014fda28ec3a64d9c40d171..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 560 zcmZ8d&1w`u5U%R!Str>ELGfTfaKXbemmR!$kRX_I5Q3LQSvuRD&A5~9vAdVx(tFak z2mw9%N{u&9zC!R|^{6mdO?^duRb7AP;9ws}_P*a=oil(R$r%c9@RHO$B9I`lg)5vR zf@CuL409&=8C3aCib934SSi1F?~Gn%iTNudvN`E1Qumg?Lx4}X%R(mc2u|SLlN}FS zvLgt%W_B9*7Yytx?(&dJAm*ve0=ogp1Kz+bXMk`9A^&4P6ci<1=C>IQGdi7@-U{tn z;Txk}ELx#g8?jP%INcsjC))VQh1qC1Y4l_}9uO6?Y2ldB8r3N7T{Nv)bi!ZSv`*yL z#>&X0@FI=}E#`$**NYVV1~%RE?sfgfDeLNU+X&qWyRJ`^TYJ;htyzk;+4iH=&9mpa zAy3uLF6%~nWpy7(De7OYnsp!JVY=*~XF+Y;1A+oediz-5LsIsu%xy{ZX_dvtRCV@$ k)!C(LJDRQEv`_6v9>AEs$Ku76k(*W>V`{_+N+|FB2JEekj{pDw diff --git a/i18nilize/tests/__pycache__/test_cli.cpython-310.pyc b/i18nilize/tests/__pycache__/test_cli.cpython-310.pyc deleted file mode 100644 index bd5b023a7b129d4487fa59c3e6060872abe5e83f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2595 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