glotfile 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +234 -0
- package/bin/glotfile.js +7 -0
- package/dist/server/cli.js +5172 -0
- package/dist/server/server.js +3936 -0
- package/dist/ui/assets/ad-B18i8NGa.svg +150 -0
- package/dist/ui/assets/ae-CZRtWSox.svg +6 -0
- package/dist/ui/assets/af-C77Rf6cE.svg +81 -0
- package/dist/ui/assets/ag-C8MykuG2.svg +14 -0
- package/dist/ui/assets/ai-Dmedkf4v.svg +29 -0
- package/dist/ui/assets/al-10QRkakw.svg +5 -0
- package/dist/ui/assets/am-DMt4_dd4.svg +5 -0
- package/dist/ui/assets/ao-tXuRa6vm.svg +13 -0
- package/dist/ui/assets/aq-CF5jO-0h.svg +5 -0
- package/dist/ui/assets/ar-Be8Ju1cG.svg +32 -0
- package/dist/ui/assets/arab-C4CYPgyC.svg +109 -0
- package/dist/ui/assets/as-Dekqy8Of.svg +72 -0
- package/dist/ui/assets/asean-WMtZ-US_.svg +13 -0
- package/dist/ui/assets/at-DGA_6m5E.svg +4 -0
- package/dist/ui/assets/au-DAHDIuPI.svg +8 -0
- package/dist/ui/assets/aw-W0PWLK5p.svg +186 -0
- package/dist/ui/assets/ax-DvLIy84U.svg +18 -0
- package/dist/ui/assets/az-Bk-bYNxy.svg +8 -0
- package/dist/ui/assets/ba-WdDiSMvP.svg +12 -0
- package/dist/ui/assets/bb-DJxbaxmT.svg +6 -0
- package/dist/ui/assets/bd-BF9t1-60.svg +4 -0
- package/dist/ui/assets/be-CLLkK3PN.svg +7 -0
- package/dist/ui/assets/bf-YclsoDuF.svg +7 -0
- package/dist/ui/assets/bg-GUQenraa.svg +5 -0
- package/dist/ui/assets/bh-BQqEGq6F.svg +4 -0
- package/dist/ui/assets/bi-CRmKY6RQ.svg +15 -0
- package/dist/ui/assets/bj-14PhO9bM.svg +14 -0
- package/dist/ui/assets/bl-4CI2YcwX.svg +5 -0
- package/dist/ui/assets/bm-BeYgB2z9.svg +97 -0
- package/dist/ui/assets/bn-B6T3O78g.svg +36 -0
- package/dist/ui/assets/bo-CcUiMqkJ.svg +673 -0
- package/dist/ui/assets/bq-BYpdxEeT.svg +5 -0
- package/dist/ui/assets/br-Cu5YU29T.svg +45 -0
- package/dist/ui/assets/bs-7Gd_oriM.svg +13 -0
- package/dist/ui/assets/bt-BTo4qm10.svg +89 -0
- package/dist/ui/assets/bv-wM9JLv4R.svg +13 -0
- package/dist/ui/assets/bw-n5ZaAnGL.svg +7 -0
- package/dist/ui/assets/by-C621sBpd.svg +18 -0
- package/dist/ui/assets/bz-BCKHR4_q.svg +145 -0
- package/dist/ui/assets/ca-PYUrLVUV.svg +4 -0
- package/dist/ui/assets/cc-BNT6Xjzk.svg +19 -0
- package/dist/ui/assets/cd-BGclsrP6.svg +5 -0
- package/dist/ui/assets/cefta-2dDBYygd.svg +13 -0
- package/dist/ui/assets/cf-DRetLmp-.svg +15 -0
- package/dist/ui/assets/cg-CwIyG6SE.svg +12 -0
- package/dist/ui/assets/ch-sfriZoF1.svg +9 -0
- package/dist/ui/assets/ci-C8Q8IYTn.svg +7 -0
- package/dist/ui/assets/ck-DfXMUOTo.svg +9 -0
- package/dist/ui/assets/cl-BgYYb4qP.svg +13 -0
- package/dist/ui/assets/cm-D4yjdmKT.svg +15 -0
- package/dist/ui/assets/cn-DifnnI3t.svg +11 -0
- package/dist/ui/assets/co-DV591zMm.svg +7 -0
- package/dist/ui/assets/cp-K_ay05Q_.svg +7 -0
- package/dist/ui/assets/cr-BlYVN-_Q.svg +7 -0
- package/dist/ui/assets/cu-L6XVZNgo.svg +13 -0
- package/dist/ui/assets/cv-CPsfcOfk.svg +13 -0
- package/dist/ui/assets/cw-BbrnximR.svg +14 -0
- package/dist/ui/assets/cx-DpYD6n6U.svg +15 -0
- package/dist/ui/assets/cy-bZuP8hmf.svg +6 -0
- package/dist/ui/assets/cz-WWBC5Aeb.svg +5 -0
- package/dist/ui/assets/de-B-2o-4Z9.svg +5 -0
- package/dist/ui/assets/dg-CJPJrjiZ.svg +130 -0
- package/dist/ui/assets/dj-hp_BwbmO.svg +13 -0
- package/dist/ui/assets/dk-DmS9BCZB.svg +5 -0
- package/dist/ui/assets/dm-Cbhezfe1.svg +152 -0
- package/dist/ui/assets/do-B86d445t.svg +121 -0
- package/dist/ui/assets/dz-Dytc1TFu.svg +5 -0
- package/dist/ui/assets/eac-CwGQsyAM.svg +48 -0
- package/dist/ui/assets/ec-CaVOFQ3t.svg +138 -0
- package/dist/ui/assets/ee-DufrxGIR.svg +5 -0
- package/dist/ui/assets/eg-YC70hswZ.svg +38 -0
- package/dist/ui/assets/eh-0awM4TVj.svg +16 -0
- package/dist/ui/assets/er-X83uml6t.svg +8 -0
- package/dist/ui/assets/es-ct-CVyhLp7O.svg +4 -0
- package/dist/ui/assets/es-d5m8M5h8.svg +544 -0
- package/dist/ui/assets/es-ga-D9xG2hYr.svg +187 -0
- package/dist/ui/assets/es-pv-CO3NM2SE.svg +5 -0
- package/dist/ui/assets/et-DwdlzOIx.svg +14 -0
- package/dist/ui/assets/eu-Brdgz8ab.svg +28 -0
- package/dist/ui/assets/fi-DWUIkfjL.svg +5 -0
- package/dist/ui/assets/fj-DEAVMg38.svg +120 -0
- package/dist/ui/assets/fk-nuUF_Ak3.svg +90 -0
- package/dist/ui/assets/fm-B4Z83GL0.svg +11 -0
- package/dist/ui/assets/fo-DFjwyWur.svg +12 -0
- package/dist/ui/assets/fr-DVvUyOqI.svg +5 -0
- package/dist/ui/assets/ga-BklUhLH_.svg +7 -0
- package/dist/ui/assets/gb-DTXiLQoe.svg +7 -0
- package/dist/ui/assets/gb-eng-C8iDhGHN.svg +5 -0
- package/dist/ui/assets/gb-nir-D4gikpNq.svg +132 -0
- package/dist/ui/assets/gb-sct-fW5q01ek.svg +4 -0
- package/dist/ui/assets/gb-wls-Bxz9hxvX.svg +9 -0
- package/dist/ui/assets/gd-CO-whzUe.svg +27 -0
- package/dist/ui/assets/ge-B2RiL-Ih.svg +6 -0
- package/dist/ui/assets/gf-DWl5zcw0.svg +5 -0
- package/dist/ui/assets/gg-jdOQS2nU.svg +9 -0
- package/dist/ui/assets/gh-r3LP_X7q.svg +6 -0
- package/dist/ui/assets/gi-BJKE9SzW.svg +32 -0
- package/dist/ui/assets/gl-CHaBnMib.svg +4 -0
- package/dist/ui/assets/gm-Bu99atwn.svg +14 -0
- package/dist/ui/assets/gn-1dJNy9oQ.svg +7 -0
- package/dist/ui/assets/gp-DNyt_wTA.svg +5 -0
- package/dist/ui/assets/gq-Cag8QTk2.svg +23 -0
- package/dist/ui/assets/gr-C5PU0p9p.svg +16 -0
- package/dist/ui/assets/gs-DiiNa0F5.svg +133 -0
- package/dist/ui/assets/gt-CJo5DI-7.svg +204 -0
- package/dist/ui/assets/gu-Di1JYREk.svg +19 -0
- package/dist/ui/assets/gw-D249VY33.svg +13 -0
- package/dist/ui/assets/gy-CcVYUM2E.svg +9 -0
- package/dist/ui/assets/hk-CUNIaSX0.svg +8 -0
- package/dist/ui/assets/hm-Dh6t_Tj3.svg +8 -0
- package/dist/ui/assets/hn-CRjyS_bm.svg +18 -0
- package/dist/ui/assets/hr-fzLfaANM.svg +58 -0
- package/dist/ui/assets/ht-DIMg4gti.svg +116 -0
- package/dist/ui/assets/hu-7Q5wwIIi.svg +7 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-400-normal-BSMlKf0J.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-400-normal-CEL4l2ZJ.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-500-normal-Ael50iVv.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-500-normal-Bq9vWWag.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-400-normal-DMdlQ8Kv.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-400-normal-xuaO2J-f.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-500-normal-BIfNGwUT.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-cyrillic-ext-500-normal-BqneJy0T.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-500-normal-CB9ihrfo.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-500-normal-DSY6xOcd.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-ext-400-normal-BmRBH3aV.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-ext-400-normal-D3D2R8hC.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-ext-500-normal-CAhNIIs5.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-latin-ext-500-normal-CZ70TYgx.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-vietnamese-400-normal-BulugwFq.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-mono-vietnamese-400-normal-DDuiU_S-.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-vietnamese-500-normal-C8zxqsMH.woff +0 -0
- package/dist/ui/assets/ibm-plex-mono-vietnamese-500-normal-DZ4AoWbu.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-400-normal-BTotfTJu.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-400-normal-DZqxrq2p.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-500-normal-ByOcLdNv.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-500-normal-CocWQlwt.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-600-normal-71GNu3SW.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-600-normal-BGq0mW3O.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-400-normal-Dsrv2Tcn.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-400-normal-g30qAdWV.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-500-normal-Cs5J6C77.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-500-normal-DB5PtV2g.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-600-normal-Bz0x94Yp.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-cyrillic-ext-600-normal-DUMzJB7m.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-400-normal-D9ESIMu3.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-400-normal-_efipK4i.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-500-normal-CuWXN6rf.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-500-normal-JMMifIXV.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-600-normal-D-CqTdkO.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-greek-600-normal-DzTrcv_p.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-400-normal-CDDApCn2.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-400-normal-CYLoc0-x.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-500-normal-6ng42L7E.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-500-normal-BgVn5rGT.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-600-normal-Cu4Hd6ag.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-600-normal-CuJfVYMP.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-400-normal-C5H60-Va.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-400-normal-RBey6euL.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-500-normal-D0aIdm-b.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-500-normal-DakdToA3.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-600-normal-DIrixKbi.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-latin-ext-600-normal-DOrvGEcy.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-400-normal-DG4YqDda.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-400-normal-fK1oJ5dG.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-500-normal-BEb3_waV.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-500-normal-e4dixQRQ.woff2 +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-600-normal-DgdngZtN.woff +0 -0
- package/dist/ui/assets/ibm-plex-sans-vietnamese-600-normal-DpPYBSTl.woff2 +0 -0
- package/dist/ui/assets/ic-CSo4d8tH.svg +7 -0
- package/dist/ui/assets/id-DiSP6Fmm.svg +4 -0
- package/dist/ui/assets/ie-ChAXClx3.svg +7 -0
- package/dist/ui/assets/il-_56OEGLa.svg +14 -0
- package/dist/ui/assets/im--VPIqfkF.svg +36 -0
- package/dist/ui/assets/in-Cdwu6Bq7.svg +25 -0
- package/dist/ui/assets/index-BqcYDTXL.css +1 -0
- package/dist/ui/assets/index-DK-AGskd.js +1805 -0
- package/dist/ui/assets/io-13HOfeJD.svg +130 -0
- package/dist/ui/assets/iq-Dp8HDzo2.svg +10 -0
- package/dist/ui/assets/ir-cCIgaNf6.svg +219 -0
- package/dist/ui/assets/is-CZjefTNV.svg +12 -0
- package/dist/ui/assets/it-Br7q0Zh6.svg +7 -0
- package/dist/ui/assets/je-DyWbhIiC.svg +62 -0
- package/dist/ui/assets/jm-CItSr3iX.svg +8 -0
- package/dist/ui/assets/jo-BAF1FGbm.svg +16 -0
- package/dist/ui/assets/jp-BIMmfxpO.svg +11 -0
- package/dist/ui/assets/ke-C8foqndp.svg +23 -0
- package/dist/ui/assets/kg-B0FsxZiL.svg +4 -0
- package/dist/ui/assets/kh-BeWfuE30.svg +61 -0
- package/dist/ui/assets/ki-p_fAQGbS.svg +36 -0
- package/dist/ui/assets/km-B5tqtGG7.svg +16 -0
- package/dist/ui/assets/kn-DVPxDkNY.svg +14 -0
- package/dist/ui/assets/kp-CrDKzoxe.svg +15 -0
- package/dist/ui/assets/kr-BCXH1Hao.svg +24 -0
- package/dist/ui/assets/kw-fSBzmd30.svg +13 -0
- package/dist/ui/assets/ky-Dpsu1myA.svg +103 -0
- package/dist/ui/assets/kz-CwKXYZ8s.svg +36 -0
- package/dist/ui/assets/la-CuJflhIW.svg +12 -0
- package/dist/ui/assets/lb-BSjpYEoo.svg +15 -0
- package/dist/ui/assets/lc-CNvab8Ae.svg +8 -0
- package/dist/ui/assets/li-CHdhvNcr.svg +43 -0
- package/dist/ui/assets/lk-DUkgV9Tq.svg +22 -0
- package/dist/ui/assets/lr-B84vu3Ds.svg +14 -0
- package/dist/ui/assets/ls-5Xk3Mxq5.svg +8 -0
- package/dist/ui/assets/lt-DoukV-Sm.svg +7 -0
- package/dist/ui/assets/lu-DOI02Msy.svg +5 -0
- package/dist/ui/assets/lv-C-KfY8Yc.svg +6 -0
- package/dist/ui/assets/ly-BWpTK3ux.svg +13 -0
- package/dist/ui/assets/ma-BTRNTRUj.svg +4 -0
- package/dist/ui/assets/mc-PK078JHl.svg +6 -0
- package/dist/ui/assets/md-DRlxvNwm.svg +70 -0
- package/dist/ui/assets/me-Cv4Gwqah.svg +116 -0
- package/dist/ui/assets/mf-BaAGWwAq.svg +5 -0
- package/dist/ui/assets/mg-C168LHXW.svg +7 -0
- package/dist/ui/assets/mh-gxuIp6Wk.svg +7 -0
- package/dist/ui/assets/mk-D9SIMr-a.svg +5 -0
- package/dist/ui/assets/ml-DVf6ujpi.svg +7 -0
- package/dist/ui/assets/mm-lwT09MQ0.svg +12 -0
- package/dist/ui/assets/mn-CgXyw0O9.svg +14 -0
- package/dist/ui/assets/mo-BAtCjuYA.svg +9 -0
- package/dist/ui/assets/mp-CrOApEqW.svg +86 -0
- package/dist/ui/assets/mq-BFnJ22KI.svg +5 -0
- package/dist/ui/assets/mr-D6G1wpeZ.svg +6 -0
- package/dist/ui/assets/ms-DxciGbUu.svg +29 -0
- package/dist/ui/assets/mt-YqzKx9xl.svg +58 -0
- package/dist/ui/assets/mu-mcq7cUFl.svg +8 -0
- package/dist/ui/assets/mv-BynAllfM.svg +6 -0
- package/dist/ui/assets/mw-C15nc1xZ.svg +10 -0
- package/dist/ui/assets/mx-Cc8Ccfe8.svg +382 -0
- package/dist/ui/assets/my-Co4JeeyE.svg +26 -0
- package/dist/ui/assets/mz-Drlr_USV.svg +21 -0
- package/dist/ui/assets/na-D79ffb4Z.svg +16 -0
- package/dist/ui/assets/nc-5j7wEmDR.svg +13 -0
- package/dist/ui/assets/ne-B1jPOYkl.svg +6 -0
- package/dist/ui/assets/nf-Dl00mlk2.svg +9 -0
- package/dist/ui/assets/ng-su4NM9If.svg +6 -0
- package/dist/ui/assets/ni-CcFCSQxm.svg +129 -0
- package/dist/ui/assets/nl-BnOa6UiA.svg +5 -0
- package/dist/ui/assets/no-qf2JPO73.svg +7 -0
- package/dist/ui/assets/np-CIuq5GKd.svg +13 -0
- package/dist/ui/assets/nr-DERIdzkN.svg +12 -0
- package/dist/ui/assets/nu-BfgWvGcd.svg +10 -0
- package/dist/ui/assets/nz-5vODdBjz.svg +36 -0
- package/dist/ui/assets/om-DcqxRdQL.svg +115 -0
- package/dist/ui/assets/pa-BLNN9G2-.svg +14 -0
- package/dist/ui/assets/pc-BJpYiA9b.svg +33 -0
- package/dist/ui/assets/pe-BLqhuu1C.svg +4 -0
- package/dist/ui/assets/pf-C8ahG68q.svg +19 -0
- package/dist/ui/assets/pg-BAYpbp9Z.svg +9 -0
- package/dist/ui/assets/ph-BEzTn62K.svg +6 -0
- package/dist/ui/assets/pk-CWMEc3ad.svg +15 -0
- package/dist/ui/assets/pl-o38JROoc.svg +6 -0
- package/dist/ui/assets/pm-CHiP5UmZ.svg +5 -0
- package/dist/ui/assets/pn-DgxdtieE.svg +53 -0
- package/dist/ui/assets/pr-B4tMV0xm.svg +13 -0
- package/dist/ui/assets/ps-DO8YKYeS.svg +6 -0
- package/dist/ui/assets/pt-DZ2ADgIR.svg +57 -0
- package/dist/ui/assets/pw-CQP52WMX.svg +11 -0
- package/dist/ui/assets/py-mNzh0mZC.svg +157 -0
- package/dist/ui/assets/qa-Dkmpc78M.svg +4 -0
- package/dist/ui/assets/re-Bk4ipYK1.svg +5 -0
- package/dist/ui/assets/ro-CoSeqKY1.svg +7 -0
- package/dist/ui/assets/rs-BfwKwXtn.svg +292 -0
- package/dist/ui/assets/ru-D-4tNwXt.svg +5 -0
- package/dist/ui/assets/rw-D7nbSYKI.svg +13 -0
- package/dist/ui/assets/sa-Dh79zbT9.svg +25 -0
- package/dist/ui/assets/sb-BDTYjcbk.svg +13 -0
- package/dist/ui/assets/sc-CRNsSLg9.svg +7 -0
- package/dist/ui/assets/sd-ClziNjGr.svg +13 -0
- package/dist/ui/assets/se-8C923vhy.svg +4 -0
- package/dist/ui/assets/sg-DGYIMG0G.svg +13 -0
- package/dist/ui/assets/sh-DNImvbrE.svg +7 -0
- package/dist/ui/assets/sh-ac-FjwY7RYr.svg +689 -0
- package/dist/ui/assets/sh-hl-CqtQPzWZ.svg +164 -0
- package/dist/ui/assets/sh-ta-CPJublpi.svg +76 -0
- package/dist/ui/assets/si-BMKT-Tec.svg +18 -0
- package/dist/ui/assets/sj-BFFEGknm.svg +7 -0
- package/dist/ui/assets/sk-K9BNIYAO.svg +9 -0
- package/dist/ui/assets/sl-DxLJY5vJ.svg +7 -0
- package/dist/ui/assets/sm-DGBIRFB_.svg +75 -0
- package/dist/ui/assets/sn-S8ipNF1U.svg +8 -0
- package/dist/ui/assets/so-DlzA2Fco.svg +11 -0
- package/dist/ui/assets/sr-Co7OKBh3.svg +6 -0
- package/dist/ui/assets/ss-CxVEpdPD.svg +8 -0
- package/dist/ui/assets/st-C1Nd1c3V.svg +16 -0
- package/dist/ui/assets/sv-CJIHhYwF.svg +593 -0
- package/dist/ui/assets/sx-nDhIaDNb.svg +56 -0
- package/dist/ui/assets/sy-DwSud114.svg +6 -0
- package/dist/ui/assets/sz-qxMwa2gs.svg +34 -0
- package/dist/ui/assets/tc-dtelpZmc.svg +50 -0
- package/dist/ui/assets/td-BsuVhZpT.svg +7 -0
- package/dist/ui/assets/tf-Co33RhQH.svg +15 -0
- package/dist/ui/assets/tg-CP1-sc35.svg +14 -0
- package/dist/ui/assets/th-tzq84hgd.svg +7 -0
- package/dist/ui/assets/tj-b-aWfOTb.svg +22 -0
- package/dist/ui/assets/tk-CDucsEss.svg +5 -0
- package/dist/ui/assets/tl-wpo93AGk.svg +13 -0
- package/dist/ui/assets/tm-C_WSgUcv.svg +204 -0
- package/dist/ui/assets/tn-BcKCZULf.svg +4 -0
- package/dist/ui/assets/to-D8uVsoxb.svg +10 -0
- package/dist/ui/assets/tr-Cd6FO9Bg.svg +8 -0
- package/dist/ui/assets/tt-CTnr7aY5.svg +5 -0
- package/dist/ui/assets/tv-DDqkVT-n.svg +9 -0
- package/dist/ui/assets/tw-d-Mf-0VT.svg +34 -0
- package/dist/ui/assets/tz-BjLtHeil.svg +13 -0
- package/dist/ui/assets/ua-Bq0XgQqK.svg +6 -0
- package/dist/ui/assets/ug-ByL2ejGl.svg +30 -0
- package/dist/ui/assets/um-Bhke9Eic.svg +9 -0
- package/dist/ui/assets/un-Bqg4Cbbh.svg +16 -0
- package/dist/ui/assets/us-C73uVeEr.svg +9 -0
- package/dist/ui/assets/uy-DD6peej-.svg +28 -0
- package/dist/ui/assets/uz-C2f-Cubn.svg +30 -0
- package/dist/ui/assets/va-B9-hqIE-.svg +190 -0
- package/dist/ui/assets/vc-COpmFovN.svg +8 -0
- package/dist/ui/assets/ve-BSqnIB9l.svg +26 -0
- package/dist/ui/assets/vg-C7xY6pic.svg +59 -0
- package/dist/ui/assets/vi-BC_zcciE.svg +28 -0
- package/dist/ui/assets/vn-BEAEijd0.svg +11 -0
- package/dist/ui/assets/vu-D6k0NQlg.svg +21 -0
- package/dist/ui/assets/wf-DrxpOO_G.svg +5 -0
- package/dist/ui/assets/ws-vzJNwdVm.svg +7 -0
- package/dist/ui/assets/xk-Bj15g7cp.svg +5 -0
- package/dist/ui/assets/xx-zm_JmrXl.svg +4 -0
- package/dist/ui/assets/ye-BwST9gXC.svg +7 -0
- package/dist/ui/assets/yt-DIfEG0ex.svg +5 -0
- package/dist/ui/assets/za-Jz40JTrv.svg +17 -0
- package/dist/ui/assets/zm-BmsW91ne.svg +27 -0
- package/dist/ui/assets/zw-U0m7oJ5e.svg +21 -0
- package/dist/ui/index.html +13 -0
- package/package.json +68 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 James Dempster
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
# Glotfile
|
|
2
|
+
|
|
3
|
+
A local-first, git-native translation manager. All your app's copy lives in one
|
|
4
|
+
JSON file you commit to your repo, you edit and AI-translate it through a local
|
|
5
|
+
web UI, and you export to whatever locale formats your apps consume — no SaaS,
|
|
6
|
+
no hosted database, nothing leaves your machine except the AI calls you choose
|
|
7
|
+
to make.
|
|
8
|
+
|
|
9
|
+
- **One source of truth** — every string and translation lives in `glotfile.json`, committed alongside your code. Versioning, review, and rollback come from git. For large catalogs, run `glotfile split` to store the catalog as a `glotfile/` directory with one file per locale — so a one-locale change is a one-file `git diff` instead of a multi-megabyte one. The in-app experience is identical.
|
|
10
|
+
- **Local web UI** — run one command, edit in the browser, changes save straight back to the file.
|
|
11
|
+
- **AI translation** — fill in missing languages with Anthropic, OpenAI, or AWS Bedrock, using per-key context, a glossary, and screenshots.
|
|
12
|
+
- **Export anywhere** — generate Flutter ARB, Laravel PHP, i18next JSON, gettext `.po`, and Apple `.stringsdict` from the same source.
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Requirements
|
|
17
|
+
|
|
18
|
+
- Node **^20.19.0 || >=22.12.0**
|
|
19
|
+
|
|
20
|
+
## Getting started
|
|
21
|
+
|
|
22
|
+
Glotfile is designed to run with no install via `npx glotfile`. It's pre-1.0 and
|
|
23
|
+
not yet published to npm, so for now run it from a checkout of this repo:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install
|
|
27
|
+
npm run build # builds the UI + server into dist/
|
|
28
|
+
node bin/glotfile.js # same as the `glotfile` command
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
That starts a local server bound to `127.0.0.1`, opens your browser, and — if
|
|
32
|
+
there's no `glotfile.json` in the current directory yet — starts from sensible
|
|
33
|
+
defaults and writes the file as soon as you make your first edit.
|
|
34
|
+
|
|
35
|
+
> Working on Glotfile itself? `npm run dev` runs the Vite UI with hot-reload and
|
|
36
|
+
> the server side-by-side.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## The state file: `glotfile.json`
|
|
41
|
+
|
|
42
|
+
Everything is derived from this one file at the root of your project. It's
|
|
43
|
+
written deterministically (stable key order, fixed indent, one trailing
|
|
44
|
+
newline) so git diffs stay small and reviewable. A fresh file looks like this:
|
|
45
|
+
|
|
46
|
+
```json
|
|
47
|
+
{
|
|
48
|
+
"version": 2,
|
|
49
|
+
"config": {
|
|
50
|
+
"sourceLocale": "en",
|
|
51
|
+
"locales": ["en"],
|
|
52
|
+
"outputs": [
|
|
53
|
+
{ "adapter": "flutter-arb", "path": "lib/l10n/app_{locale}.arb" },
|
|
54
|
+
{ "adapter": "laravel-php", "path": "lang/{locale}/{namespace}.php" }
|
|
55
|
+
],
|
|
56
|
+
"ai": { "provider": "anthropic", "model": "claude-opus-4-8", "endpoint": null, "region": null, "batchSize": 25 },
|
|
57
|
+
"format": { "indent": 2, "sortKeys": true, "finalNewline": true },
|
|
58
|
+
"spelling": { "customWords": [] }
|
|
59
|
+
},
|
|
60
|
+
"glossary": [],
|
|
61
|
+
"keys": {}
|
|
62
|
+
}
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
- **`sourceLocale` / `locales`** — the language you author in, and every language you maintain.
|
|
66
|
+
- **`keys`** — a flat map of dot-notation keys (e.g. `auth.signIn.button`), each with a value per locale, a review `state`, and optional metadata (context, tags, max length, screenshot, notes).
|
|
67
|
+
- **`outputs`** — where exported locale files are written, one entry per format (see [Output formats](#output-formats)).
|
|
68
|
+
- **`ai`** — which model translates and how (see [AI translation](#ai-translation)).
|
|
69
|
+
- **`glossary`** — do-not-translate terms and forced per-locale translations.
|
|
70
|
+
|
|
71
|
+
You normally never edit this file by hand — the UI does it for you.
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## Commands
|
|
76
|
+
|
|
77
|
+
Run `glotfile <command>` (or `node bin/glotfile.js <command>` from a checkout).
|
|
78
|
+
All commands accept `--file <path>` (`-f`) to target a state file other than
|
|
79
|
+
`./glotfile.json`. Run `glotfile --help` for the command list, or
|
|
80
|
+
`glotfile <command> --help` for a command's options.
|
|
81
|
+
|
|
82
|
+
| Command | What it does |
|
|
83
|
+
|---|---|
|
|
84
|
+
| `glotfile` or `glotfile serve` | Start the local web UI and open the browser. |
|
|
85
|
+
| `glotfile translate` | AI-translate strings (writes results back to `glotfile.json`). |
|
|
86
|
+
| `glotfile export` | Write the locale files for every configured output. |
|
|
87
|
+
| `glotfile prune --empty-source` | List keys whose source value is empty (dry run); add `--write` to remove them. |
|
|
88
|
+
| `glotfile prune --unused` | List keys with no code reference in the last scan (dry run); add `--write` to remove them. Runs a scan first. |
|
|
89
|
+
|
|
90
|
+
### `translate` options
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
glotfile translate # fill empty values (the default)
|
|
94
|
+
glotfile translate --all # re-translate every string
|
|
95
|
+
glotfile translate --locale fr,de # only these target languages
|
|
96
|
+
glotfile translate --key "auth.*" # only keys matching a glob
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
These combine. With no flags, only empty values are filled; `--all` re-translates
|
|
100
|
+
every string (a `reviewed` value is never overwritten either way).
|
|
101
|
+
|
|
102
|
+
### `export` options
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
glotfile export # write all configured outputs
|
|
106
|
+
glotfile export --adapter laravel-php # just one format
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Re-running `export` with no changes produces a zero-line diff — safe to run in
|
|
110
|
+
CI to check your locale files are up to date.
|
|
111
|
+
|
|
112
|
+
### `prune` options
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
glotfile prune --empty-source # list keys with an empty source (dry run)
|
|
116
|
+
glotfile prune --empty-source --write # remove them
|
|
117
|
+
|
|
118
|
+
glotfile prune --unused # list keys with no code reference (dry run)
|
|
119
|
+
glotfile prune --unused --write # remove them
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
`--unused` runs a scan first, so the result reflects your current code, and
|
|
123
|
+
treats keys referenced only by a dynamic prefix (e.g. `t('errors.' + code)`) as
|
|
124
|
+
used. The selectors combine: `prune --unused --empty-source --write` removes the
|
|
125
|
+
union of both sets.
|
|
126
|
+
|
|
127
|
+
Dry-run by default — it prints what it would remove and changes nothing until
|
|
128
|
+
`--write` is passed. Recovery is via git, like every other edit.
|
|
129
|
+
|
|
130
|
+
---
|
|
131
|
+
|
|
132
|
+
## The web UI
|
|
133
|
+
|
|
134
|
+
`glotfile serve` opens a single-page app for managing the catalog:
|
|
135
|
+
|
|
136
|
+
- **Editor** — a searchable, filterable table of every key with the source string and each target language side by side. Create, rename, and delete keys; edit values inline; toggle each value's review **state** (`source` → `machine` → `reviewed` / `needs-review`). Filter by missing, machine (unreviewed), tag, or free text.
|
|
137
|
+
- **Per-key metadata** — context for humans and the AI, tags, a max length, freeform notes, and a screenshot showing where the string appears.
|
|
138
|
+
- **Plurals** — manage CLDR plural forms (`one`, `other`, …) per language.
|
|
139
|
+
- **Languages** — add or remove the locales you maintain.
|
|
140
|
+
- **Glossary** — terms to never translate, and forced translations per language; these are injected into every AI request.
|
|
141
|
+
- **Screenshots** — attach an image to a key so vision-capable models can see the UI context.
|
|
142
|
+
- **Settings** — edit the `config` block (source locale, outputs, AI provider/model, formatting, custom spelling dictionary).
|
|
143
|
+
- **AI log** — a record of recent translation runs (prompts and results; never your API keys or image bytes).
|
|
144
|
+
|
|
145
|
+
The UI also surfaces **checks** (missing values, placeholder mismatches, length
|
|
146
|
+
and glossary violations) and an **export preview** before you write files.
|
|
147
|
+
|
|
148
|
+
---
|
|
149
|
+
|
|
150
|
+
## Output formats
|
|
151
|
+
|
|
152
|
+
Add entries to `config.outputs`; each names an adapter and a path template
|
|
153
|
+
(`{locale}` and `{namespace}` are substituted). Available adapters:
|
|
154
|
+
|
|
155
|
+
| Adapter | Target |
|
|
156
|
+
|---|---|
|
|
157
|
+
| `flutter-arb` | Flutter `.arb` files |
|
|
158
|
+
| `laravel-php` | Laravel `lang/**/*.php` arrays |
|
|
159
|
+
| `i18next-json` | i18next / generic JSON |
|
|
160
|
+
| `gettext-po` | gettext `.po` |
|
|
161
|
+
| `apple-stringsdict` | Apple `.stringsdict` |
|
|
162
|
+
|
|
163
|
+
Placeholders (`{name}`, `{{count}}`, `%s`, `:name`) and ICU plural/select
|
|
164
|
+
structure are preserved across formats; where a conversion would be lossy the
|
|
165
|
+
export warns rather than corrupting output.
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## AI translation
|
|
170
|
+
|
|
171
|
+
Translation is the only feature that needs network access or credentials —
|
|
172
|
+
everything else works offline. Configure the provider in `config.ai` (via the
|
|
173
|
+
Settings panel or by editing the file), make sure the credentials are in your
|
|
174
|
+
environment, then translate from the **Editor** or with `glotfile translate`.
|
|
175
|
+
|
|
176
|
+
Glotfile reads credentials from the environment, including a local `.env` file
|
|
177
|
+
in the project directory. For example:
|
|
178
|
+
|
|
179
|
+
```bash
|
|
180
|
+
# .env
|
|
181
|
+
ANTHROPIC_API_KEY=sk-ant-...
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Three providers are supported — Anthropic (default), OpenAI, and AWS Bedrock
|
|
185
|
+
(Amazon Nova, Claude, and Meta Llama). For the full setup of each — required
|
|
186
|
+
env vars, model ids, regions, and the optional SDKs to install — see
|
|
187
|
+
**[docs/ai-providers.md](docs/ai-providers.md)**.
|
|
188
|
+
|
|
189
|
+
What the translator does for you:
|
|
190
|
+
|
|
191
|
+
- Sends each string with its key context, relevant glossary terms, the target locale, any max length, and (for vision-capable models) its screenshot.
|
|
192
|
+
- Preserves interpolation placeholders and ICU plural/select structure, and validates them on the way back — a translation that drops a placeholder or busts a length limit is rejected, not written.
|
|
193
|
+
- Writes results as **`machine`** state and **never overwrites a value you've marked `reviewed`**, so human edits are safe.
|
|
194
|
+
- Skips screenshots for models that can't see them (and tells you), so any model still works.
|
|
195
|
+
|
|
196
|
+
---
|
|
197
|
+
|
|
198
|
+
## Suggested workflow
|
|
199
|
+
|
|
200
|
+
1. Run `glotfile serve`, add keys and source copy as you build a feature.
|
|
201
|
+
2. `glotfile translate` (or the Editor's translate action) to fill the other languages.
|
|
202
|
+
3. Review machine translations in the UI; promote good ones to `reviewed`.
|
|
203
|
+
4. `glotfile export` to regenerate your apps' locale files.
|
|
204
|
+
5. Commit `glotfile.json` together with your code — the diff is the review.
|
|
205
|
+
|
|
206
|
+
Because the catalog is just a file in your repo, branching, pull-request review,
|
|
207
|
+
and rollback all work the way they already do for code.
|
|
208
|
+
|
|
209
|
+
## Large catalogs: split storage
|
|
210
|
+
|
|
211
|
+
A catalog grows with every key and locale. Past a few megabytes, a single
|
|
212
|
+
`glotfile.json` makes `git diff` slow, overflows GitHub's render limit, and
|
|
213
|
+
conflicts badly. Run:
|
|
214
|
+
|
|
215
|
+
```
|
|
216
|
+
glotfile split
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
This converts `glotfile.json` into a `glotfile/` directory:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
glotfile/
|
|
223
|
+
config.json # { $schema, version, config, glossary } — everything except keys
|
|
224
|
+
keys.json # per-key metadata (tags, notes, context, plurals)
|
|
225
|
+
locales/
|
|
226
|
+
en.json # one file per locale
|
|
227
|
+
fr.json
|
|
228
|
+
...
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Now translating a locale, or adding a key, changes only the relevant file(s).
|
|
232
|
+
New projects stay as a single `glotfile.json`; splitting is an explicit,
|
|
233
|
+
one-time, reviewable commit. The CLI, web UI, and exports behave identically
|
|
234
|
+
either way.
|