Merge branch 'main' into translations_russian_and_ukrainian

This commit is contained in:
Nariman Jelveh 2024-07-08 13:08:55 -07:00 committed by GitHub
commit d2c68308bb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 345 additions and 146 deletions

View File

@ -1,5 +1,152 @@
# Changelog
## 2.4.0 (2024-07-08)
### Features
* add (pt-br) translation for system settings. ([77211c4](https://github.com/HeyPuter/puter/commit/77211c4f71b0285fb3060f7e5c8d493b4d7c4f0c))
* add /group/list endpoint ([d55f38c](https://github.com/HeyPuter/puter/commit/d55f38ca68899c3574cfe328d2b206b1143ff0d4))
* add /share/file-by-username endpoint ([5d214c7](https://github.com/HeyPuter/puter/commit/5d214c7b52887b594af6be497f1892baf7d77679))
* add /sharelink/request endpoint ([742f625](https://github.com/HeyPuter/puter/commit/742f625309f9f4cfa70cf7d2fe5b03fd164913ea))
* add /show urls ([079e25a](https://github.com/HeyPuter/puter/commit/079e25a9fe8e179f26d72378856058eb656e2314))
* add app metadata ([f7216b9](https://github.com/HeyPuter/puter/commit/f7216b95672b38802b288ef5b022e947017ff311))
* add appdata permission (if applicable) on app share ([9751fd9](https://github.com/HeyPuter/puter/commit/9751fd92a50e75385cffed0ca847d5076ba98c92))
* add cookie for site token ([a813fbb](https://github.com/HeyPuter/puter/commit/a813fbbb88bcfb8b9a61976e2a4fc4aab943fc88))
* add cross-server event broadcasting ([1207a15](https://github.com/HeyPuter/puter/commit/1207a158bdc88a90b14d31d03387ce353c176a9c))
* add debug mod ([16b1649](https://github.com/HeyPuter/puter/commit/16b1649ff62fd87a4dda5d2e1c68941c864c5da4))
* add endpoints for share tokens ([301ffaf](https://github.com/HeyPuter/puter/commit/301ffaf61dbb4fca1a855650ab80707ae6d9f602))
* Add exit status code to apps ([7674da4](https://github.com/HeyPuter/puter/commit/7674da4cd225bcad34079251c5600fc32e32248b))
* add external mod loading ([eb05fbd](https://github.com/HeyPuter/puter/commit/eb05fbd2dc4877553b5118a069a9afdc32bea137))
* add group management endpoints ([4216346](https://github.com/HeyPuter/puter/commit/4216346384d90dcba429dbcb175e6f86482d19f4))
* add group permission endpoints ([c374b0c](https://github.com/HeyPuter/puter/commit/c374b0cbca761e7c8a47d56a09551f2e9378066a))
* add mark-read endpoint ([0101f42](https://github.com/HeyPuter/puter/commit/0101f425d480705c20df4919a76f66e987f5790f))
* add permission rewriter for app by name ([16c4907](https://github.com/HeyPuter/puter/commit/16c4907be592dae31ed3c1aa3fac3b9655255d6f))
* add protected apps ([f2f3d6f](https://github.com/HeyPuter/puter/commit/f2f3d6ff460932698fb8da7309fbce3e96132950))
* add protected subdomains ([86fca17](https://github.com/HeyPuter/puter/commit/86fca17fb17c0c24397c29b49b133deadea1de8b))
* add querystring-informed errors ([e7c0b83](https://github.com/HeyPuter/puter/commit/e7c0b8320a6829315d9154d6d513bab4491c47ea))
* add readdir delegate for shares in a user directory ([8424d44](https://github.com/HeyPuter/puter/commit/8424d446099ac30ccf829c57d43eef1f235618e4))
* add readdir delegate for sharing user homedirs ([19a5eb0](https://github.com/HeyPuter/puter/commit/19a5eb00763f3ac31df8483fb59cb7a96c448745))
* add service for notifications ([a1e6887](https://github.com/HeyPuter/puter/commit/a1e6887bf93da21b9482040b3e30ee083fb23477))
* add service to test file share logic ([332371f](https://github.com/HeyPuter/puter/commit/332371fccb198462948a440419adc7a26d671a23))
* add share list to stat ([8c49ba2](https://github.com/HeyPuter/puter/commit/8c49ba2553ce6bee20eb5b6f2721bc80f639e98a))
* add share service and share-by-email to /share ([db5990a](https://github.com/HeyPuter/puter/commit/db5990a98935817c0e16d30e921bb99c57a98fc8))
* add subdomain permission (if applicable) on app share ([13e2f72](https://github.com/HeyPuter/puter/commit/13e2f72c9f33f485570f13f45341246b1a05879f))
* add user-group permission check ([0014940](https://github.com/HeyPuter/puter/commit/00149402e041443aa3ac571fbe97a9a85f95564b))
* **backend:** add script service ([30550fc](https://github.com/HeyPuter/puter/commit/30550fcddda18469735499546de502d29b85e2ad))
* **backend:** Add tab completion to server console command arguments ([fa81dca](https://github.com/HeyPuter/puter/commit/fa81dca9507b7fa0f82099b75f2ab89c865626ac))
* **backend:** Add tab-completion to server console command names ([e1e76c6](https://github.com/HeyPuter/puter/commit/e1e76c6be71fdeb3b6246307b626734d8dc26f86))
* **backend:** add tip of day ([2d8e624](https://github.com/HeyPuter/puter/commit/2d8e6240c61dc6301f49cbdcd1c3b04736f9ca93))
* **backend:** allow services to provide user properties ([522664d](https://github.com/HeyPuter/puter/commit/522664d415c33342500defec309c2ff15bc94804))
* **backend:** allow services to provide whoami values ([fccabf1](https://github.com/HeyPuter/puter/commit/fccabf1bc0c4418f3599222616dd63bf98c14fe1))
* **backend:** improve logger and reduce logs ([4bdad75](https://github.com/HeyPuter/puter/commit/4bdad75766d0617a164024b39b79bf5373c495a6))
* Display app icon and description in embeds ([ef298ce](https://github.com/HeyPuter/puter/commit/ef298ce3aa3ce90224e883fb0ba33f9cd3a3da44))
* get first test working on share-test service ([88d6bee](https://github.com/HeyPuter/puter/commit/88d6bee9546f36d689c53ec7fe95f01f772f5211))
* **git:** Add --color and --no-color options ([d6dd1a5](https://github.com/HeyPuter/puter/commit/d6dd1a5bb0a2b2bba2cfe86d2e51ff2a6e42841c))
* **git:** Add a --debug option, which sets the DEBUG global ([fa3df72](https://github.com/HeyPuter/puter/commit/fa3df72f6ed2d45a440ebc2aacbbae67bf042478))
* **git:** Add authentication to clone, fetch, and pull. ([364d580](https://github.com/HeyPuter/puter/commit/364d580ff896691ee70d3735f495c720651a9f41))
* **git:** Add diff display to `show` and `log` subcommands ([3cad1ec](https://github.com/HeyPuter/puter/commit/3cad1ec436f99a78f782ab9576325d4341284964))
* **git:** Add start-revision and file arguments to `git log` ([49c2f16](https://github.com/HeyPuter/puter/commit/49c2f163515d2130c17a6f6a6a16bc27ea69336a))
* **git:** Allow checking out a commit instead of a branch ([057b3ac](https://github.com/HeyPuter/puter/commit/057b3acf00af49c005b9bf7069c5d22983a32e1e))
* **git:** Color output for `git status` files ([bab5204](https://github.com/HeyPuter/puter/commit/bab5204209aa2efc0c053643677a78db6ede0929))
* **git:** Display file contents as a string for `git show FILE_OID` ([a680371](https://github.com/HeyPuter/puter/commit/a68037111a04580cfa2688694a68ef6ac7a495fa))
* **git:** Display ref names in `git log` and `git show` ([45cdfcb](https://github.com/HeyPuter/puter/commit/45cdfcb5bfa66937b33054a127e0b17001f3faa4))
* **git:** Format output closer to canonical git ([60976b1](https://github.com/HeyPuter/puter/commit/60976b1ed61984d9d290f3a0ae99dd97632e9909))
* **git:** Handle detached HEAD in `git status` and `git branch --list` ([2c9b1a3](https://github.com/HeyPuter/puter/commit/2c9b1a3ffc3d5e282ffe5b83a86314e99445bbc6))
* **git:** Implement `git branch` ([ad4f132](https://github.com/HeyPuter/puter/commit/ad4f13255d52f8226f22800c16b388cf0e6384d7))
* **git:** Implement `git checkout` ([35e4453](https://github.com/HeyPuter/puter/commit/35e4453930bc4e151887f83c97efec19cc15da70))
* **git:** Implement `git cherry-pick` ([2e4259d](https://github.com/HeyPuter/puter/commit/2e4259d267b3cfafd5cefc57a02643c6432fec4d))
* **git:** Implement `git clone` ([95c8235](https://github.com/HeyPuter/puter/commit/95c8235a4a1fea39a46c40df04cb1004a2fe7b23))
* **git:** Implement `git diff` ([622b6a9](https://github.com/HeyPuter/puter/commit/622b6a9b921c3c03efc0b519c9a26c6701d80e50))
* **git:** Implement `git fetch` ([98a4b9e](https://github.com/HeyPuter/puter/commit/98a4b9ede39b94c0c6b6b8345d7551359961186a))
* **git:** Implement `git pull` ([eb2b6a0](https://github.com/HeyPuter/puter/commit/eb2b6a08b03cee0612885412cd4b03c9564044e3))
* **git:** Implement `git push` ([8c70229](https://github.com/HeyPuter/puter/commit/8c70229a188b743220db076a740a992fd7971301))
* **git:** Implement `git remote` ([43ce0d5](https://github.com/HeyPuter/puter/commit/43ce0d5b45d4eb4f296afcaaa1ecadc125c53e89))
* **git:** Implement `git restore` ([4ba8a32](https://github.com/HeyPuter/puter/commit/4ba8a32b45d395f28433572db5644d630776789e))
* **git:** Make `git add` work for deleted files ([9551544](https://github.com/HeyPuter/puter/commit/955154468f48e45028dad2e916708d6a763affad))
* **git:** Make shorten_hash() guaranteed to produce a unique hash ([dd10a37](https://github.com/HeyPuter/puter/commit/dd10a377493c0d8f10a1ac8779dc27f3f3bf6c37))
* **git:** Resolve more forms of commit reference ([b6906bb](https://github.com/HeyPuter/puter/commit/b6906bbcaaa50fc8a8c60beb6d2d38bcb7dda758))
* **git:** Understand references like `HEAD^` and `main~3` ([711dbc0](https://github.com/HeyPuter/puter/commit/711dbc0d2fde9c2ddc6c86f64fb4caa7837c9dcb))
* implicit access from apps to shared appdata dirs ([31d4eb0](https://github.com/HeyPuter/puter/commit/31d4eb090efb340fdfb7cb6b751145e859624eeb))
* introduce notification selection via driver ([c5334b0](https://github.com/HeyPuter/puter/commit/c5334b0e19cf9762f536ec482c3ff872e9c12399))
* multi-recipient multi-file share endpoint ([846fdc2](https://github.com/HeyPuter/puter/commit/846fdc20d4a887a1f8a4f3bda4fafe41efab2733))
* **parsely:** Add a fail() parser ([5656d9d](https://github.com/HeyPuter/puter/commit/5656d9d42f76202a534ad640d3a4e287e0e40418))
* **parsely:** Add stringUntil() parser ([d46b043](https://github.com/HeyPuter/puter/commit/d46b043c5d16f1205d61de3f3ba43ed8ad7bff93))
* **phoenix:** Add --dump and --file options to sed ([f250f86](https://github.com/HeyPuter/puter/commit/f250f86446a506f24fa2ad396328e3a2212a68d0))
* **phoenix:** Add more commands to sed, including labels and branching ([306014a](https://github.com/HeyPuter/puter/commit/306014adc77a7ca155feb95d1146cb46ee075b52))
* **phoenix:** Expose parsed arg tokens to apps that request them ([4067c82](https://github.com/HeyPuter/puter/commit/4067c82486c99cad20f41927ad39ebea438b717f))
* **phoenix:** Implement an `exit` builtin ([3184d34](https://github.com/HeyPuter/puter/commit/3184d3482c7b95c0fd1fc0745555ff82fc9a8c99))
* **phoenix:** Implement parsing of sed scripts ([0d4f907](https://github.com/HeyPuter/puter/commit/0d4f907b6675b15bd50a55f50aa28f0803b18b7b))
* **phoenix:** Make `clear` clear scrollback unless `-x` is given ([75a989a](https://github.com/HeyPuter/puter/commit/75a989a7b69bfdfdf69e5f0365027c5b27d8bfc6))
* **Phoenix:** Pass command line arguments and ENV when launching apps ([8f1c4fc](https://github.com/HeyPuter/puter/commit/8f1c4fcda98e72a7b970e8c6fc2fe39a5e012264))
* **phoenix:** Respond to exit status codes ([5de3052](https://github.com/HeyPuter/puter/commit/5de305202656a172b187dac87543d6c1c69a2958))
* **phoenix:** Show actual host name in prompt and neofetch ([4539408](https://github.com/HeyPuter/puter/commit/4539408a218a50244dc615cf7de56c29dcac53e6))
* rate-limit for excessive groups ([4af279a](https://github.com/HeyPuter/puter/commit/4af279a72fc9de89ddc3ba51806ca3760a36265d))
* re-send unreads on login ([02fc4d8](https://github.com/HeyPuter/puter/commit/02fc4d86b7166fb4803be5d28e2a593d6b7d9785))
* register dev center to apps ([10f4d7d](https://github.com/HeyPuter/puter/commit/10f4d7d50ce9314f9c3888c74cb17c8ebbecee98))
* send notification when file gets shared ([2f6c428](https://github.com/HeyPuter/puter/commit/2f6c428a403a006f7878861d2f0356c3294519be))
* start directory index frame ([fb1e2f2](https://github.com/HeyPuter/puter/commit/fb1e2f21fb67aefe0602f6c978199c7cd019bbf7))
* support canonical puter.js url in dev ([fd41ae2](https://github.com/HeyPuter/puter/commit/fd41ae217c7a9f7229326f62a829471580a744bd))
* **ui:** add new components ([577bd59](https://github.com/HeyPuter/puter/commit/577bd59b6cc94810e851ad544f8234e25a4e6e27))
* **ui:** add new components ([38ba425](https://github.com/HeyPuter/puter/commit/38ba42575ce9f3506f8ce219b9580202b3ed9993))
* **ui:** allow component-based settings tabs ([1245960](https://github.com/HeyPuter/puter/commit/124596058a286241b51dd87ce2fc1a68478cb5b8))
* update share endpoint to support more things ([dd5fde5](https://github.com/HeyPuter/puter/commit/dd5fde5130c1840ab598e6622766ae835142e58a))
### Bug Fixes
* add app_uid param to kv interface ([f7a0549](https://github.com/HeyPuter/puter/commit/f7a054956b8739a3bc305a49faee929ea0da1e15))
* add missing columns for public directory update ([b10302a](https://github.com/HeyPuter/puter/commit/b10302ad744fd9c58f9735743e075815183c772c))
* Add missing file extension to 0009_app-prefix-fix.sql in DB init ([a8160a8](https://github.com/HeyPuter/puter/commit/a8160a8cdcdd6aff98728a6f1643d93386e6bb5a))
* add permission implicator for file modes ([e63ab3a](https://github.com/HeyPuter/puter/commit/e63ab3a67f6555eb13d6af477a8da9f1b54d6608))
* add stream limit ([ceba309](https://github.com/HeyPuter/puter/commit/ceba309dbd4df89f310d1a530f939a5b7991f4c7))
* **backend:** remove a bad thing that really doesn't work ([8d22276](https://github.com/HeyPuter/puter/commit/8d22276f13106f7642d11da30b1500817a20ad43))
* bug introduced when refactoring /share to Sequence ([ecb9978](https://github.com/HeyPuter/puter/commit/ecb997885c1efb766827c84d2ffb8dc6ddabe992))
* check subdomain earlier for /apps ([4e3a24e](https://github.com/HeyPuter/puter/commit/4e3a24e6093e279e210765e07e436f4e63b74072))
* column nullability blunder ([1429d6f](https://github.com/HeyPuter/puter/commit/1429d6f57c67dff51fc41ca0c2868f8d000845f1))
* Correct APIError imports ([062e23b](https://github.com/HeyPuter/puter/commit/062e23b5c9673db1f8b0ff0469289d52dd1e3f99))
* correct shown flag behavior ([632c536](https://github.com/HeyPuter/puter/commit/632c5366161ff8fbbd4d60c61dfbe52dad488a2c))
* database migration ([9b39309](https://github.com/HeyPuter/puter/commit/9b39309e18a2927d25fe794d91da4e4d068c4bca))
* do not delegate to select on read like ever that is really dumb ([a2a10b9](https://github.com/HeyPuter/puter/commit/a2a10b94be59403e03fb08bec5d7c056ce5b554f))
* docker runtime fail because stdout columns ([94c0449](https://github.com/HeyPuter/puter/commit/94c0449437ce4cb26d00a15a3f277bc7b09367b4))
* fix issues with apps in /share endpoint ([0cf90ee](https://github.com/HeyPuter/puter/commit/0cf90ee39af6548d271dec45ed8ee9e6df1cd14d))
* fix owner ids for default apps ([283f409](https://github.com/HeyPuter/puter/commit/283f409a662d126e7f3ce811f1467ac6fab9a522))
* fix permission cascade properly this time ([de58866](https://github.com/HeyPuter/puter/commit/de5886698e1eae2b250baac174b57029f3244e96))
* Fix phoenix app prefix and TokenService test ([afb9d86](https://github.com/HeyPuter/puter/commit/afb9d866b5091058711db931cde904947e661c15))
* fix that fix ([b126b67](https://github.com/HeyPuter/puter/commit/b126b670940a0e20cfe7bd0eba3db891bab5c142))
* fix typo ([ce328b7](https://github.com/HeyPuter/puter/commit/ce328b7245ad741b64c5885f64f806fc98a55d84))
* **git:** Make git commit display detached HEAD correctly ([73d0f5a](https://github.com/HeyPuter/puter/commit/73d0f5a90cb5dcbadfc6d0fd22f14e8bc0e61f86))
* group permission audit table ([7d2f6d2](https://github.com/HeyPuter/puter/commit/7d2f6d256f56e30d752e9999c6e8bde68f9d9637))
* handle subpaths under another user ([d128cee](https://github.com/HeyPuter/puter/commit/d128ceed6f4928fa0793815feb2e2715cd273ff8))
* handling of batch requests with zero files ([c0063a8](https://github.com/HeyPuter/puter/commit/c0063a871fd891a1774f1bee00e86170fed249fa))
* i forgot to test reloading ([7eabb43](https://github.com/HeyPuter/puter/commit/7eabb43bd4257b4129d67eaeda2aa27e8268dc78))
* improve console experience on mac ([15465bf](https://github.com/HeyPuter/puter/commit/15465bfc5035a64762f7c86a3d38af8be6be5b59))
* incorrect error from suggested_apps ([b648817](https://github.com/HeyPuter/puter/commit/b648817f2743c2b6214ebe4177d921c9b9027594))
* Make polyfilled import.meta.filename getter a valid function ([85c6798](https://github.com/HeyPuter/puter/commit/85c679844869b6b05fcbda231d8dc7026a66da97))
* null email in request to /share ([bf63144](https://github.com/HeyPuter/puter/commit/bf63144f7a79c48bd650ae851ddd0c8a10d748c3))
* Only run Component initialization functions once ([5b43358](https://github.com/HeyPuter/puter/commit/5b43358219402bee3eadf4a0f184a4b924d3293b))
* oops ([a136ee5](https://github.com/HeyPuter/puter/commit/a136ee5edd3149798a0d82f494f423f503b65f00))
* **parsely:** Make Repeat parser work when no separator is given ([9b4d16f](https://github.com/HeyPuter/puter/commit/9b4d16fbe9d5698c57f9da725a22b528a7d7cac2))
* peers array assumption ([10cbf08](https://github.com/HeyPuter/puter/commit/10cbf08233620440aa39f5302deaac4f59f02247))
* **phoenix:** Add missing newlines to sed command output ([e047b0b](https://github.com/HeyPuter/puter/commit/e047b0bf302284da61e677432e4cc25b531b24f2))
* **phoenix:** Gracefully handle completing a non-existent path ([d76e713](https://github.com/HeyPuter/puter/commit/d76e7130cba9f0ca05940abafe4fd1a41464aa83))
* property validation on some permission endpoints ([0855f2b](https://github.com/HeyPuter/puter/commit/0855f2b36eca3bbdaa8429cbde3aa1242e8e96ee))
* readdir on file ([a72ec97](https://github.com/HeyPuter/puter/commit/a72ec9799ac3bd76ceafa22cce149e373a13f3b9))
* remove last component when share URL is file ([1166e69](https://github.com/HeyPuter/puter/commit/1166e69c76688d1811701c56cd4df9d38e286793))
* remove legacy permission check in stat ([f2c6e01](https://github.com/HeyPuter/puter/commit/f2c6e01296e4214336e63bc2d69bcbf17f59890f))
* Remove null or duplicate app entries from suggest_app_for_fsentry() ([6900233](https://github.com/HeyPuter/puter/commit/6900233c5aaa2d1a49f495e9f9a060796757a91e))
* **security:** Move token for socket.io to request body ([49b257e](https://github.com/HeyPuter/puter/commit/49b257ecffbb1e12090b86a67528a5ad09da69db))
* switch share notif username to sender ([cd65217](https://github.com/HeyPuter/puter/commit/cd65217f5cda1c986ee231e2eeeef5abefa36ecb))
* **Terminal:** Accept input from Chrome on Android ([4ef3e53](https://github.com/HeyPuter/puter/commit/4ef3e53de34f0097950a7e707ca2483863beafb5))
* Throw an error when readdir is called on a non-directory ([46eb4ed](https://github.com/HeyPuter/puter/commit/46eb4ed2b96c235e10e15645a30d2f192a1af0de))
* type error in puter-site ([d96f924](https://github.com/HeyPuter/puter/commit/d96f924cad7a13ea6e9084bb0ebb79ecc5fcb8a3))
* ui color input attributes ([d9c4fbb](https://github.com/HeyPuter/puter/commit/d9c4fbbd1dcce12ee05ee33652a5fa518196463d))
* **ui:** improve Component base class ([f8780d0](https://github.com/HeyPuter/puter/commit/f8780d032b10138851c22af53b8610c578139acc))
* update email share object ([9033f6f](https://github.com/HeyPuter/puter/commit/9033f6f8c74ef8739294d640ac1c7eba95519bbd))
* update PD alert custom details ([2f16322](https://github.com/HeyPuter/puter/commit/2f163221bdde09425cae11ef7f8e4eb0b10c7103))
* update test kernel ([55c609b](https://github.com/HeyPuter/puter/commit/55c609b3fec4ef018febc6e88c44a6277960d728))
* validate size metadata ([2008db0](https://github.com/HeyPuter/puter/commit/2008db08524259264a0c8186a34fc75d7a133f5f))
## 2.3.0 (2024-05-22)

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{
"name": "puter.com",
"version": "2.3.0",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "puter.com",
"version": "2.3.0",
"version": "1.0.0",
"license": "AGPL-3.0-only",
"workspaces": [
"src/*"

View File

@ -1,6 +1,6 @@
{
"name": "puter.com",
"version": "2.3.0",
"version": "1.0.0",
"author": "Puter Technologies Inc.",
"license": "AGPL-3.0-only",
"description": "Desktop environment in the browser!",

View File

@ -58,6 +58,11 @@ class DBKVStore extends Driver {
`SELECT * FROM kv WHERE user_id=? AND (app IS NULL OR app = 'global') AND kkey_hash=? LIMIT 1`,
[ user.id, key_hash ]
);
if ( kv[0] ) kv[0].value = db.case({
mysql: () => kv[0].value,
otherwise: () => JSON.parse(kv[0].value ?? 'null'),
})();
return kv[0]?.value ?? null;
},
@ -74,10 +79,11 @@ class DBKVStore extends Driver {
}
// Validate the value
value = value === undefined ? null : String(value);
value = value === undefined ? null : value;
if (
value !== null &&
Buffer.byteLength(value, 'utf8') > config.kv_max_value_size
Buffer.byteLength(JSON.stringify(value), 'utf8') >
config.kv_max_value_size
) {
throw new Error(`value is too large. Max size is ${config.kv_max_value_size}.`);
}
@ -102,7 +108,8 @@ class DBKVStore extends Driver {
sqlite: 'ON CONFLICT(user_id, app, kkey_hash) DO UPDATE SET value = excluded.value',
}),
[
user.id, app?.uid ?? 'global', key_hash, key, value,
user.id, app?.uid ?? 'global', key_hash, key,
JSON.stringify(value),
...db.case({ mysql: [value], otherwise: [] }),
]
);
@ -164,7 +171,10 @@ class DBKVStore extends Driver {
rows = rows.map(row => ({
key: row.kkey,
value: row.value,
value: db.case({
mysql: () => row.value,
otherwise: () => JSON.parse(row.value ?? 'null')
})(),
}));
as = as || 'entries';

View File

@ -42,7 +42,7 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService {
this.db = new Database(this.config.path);
// Database upgrade logic
const TARGET_VERSION = 20;
const TARGET_VERSION = 21;
if ( do_setup ) {
this.log.noticeme(`SETUP: creating database at ${this.config.path}`);
@ -69,6 +69,7 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService {
'0020_dev-center.sql',
'0021_app-owner-id.sql',
'0022_dev-center-max.sql',
'0023_fix-kv.sql',
].map(p => path_.join(__dirname, 'sqlite_setup', p));
const fs = require('fs');
for ( const filename of sql_files ) {
@ -165,6 +166,10 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService {
upgrade_files.push('0022_dev-center-max.sql');
}
if ( user_version <= 20 ) {
upgrade_files.push('0023_fix-kv.sql');
}
if ( upgrade_files.length > 0 ) {
this.log.noticeme(`Database out of date: ${this.config.path}`);
this.log.noticeme(`UPGRADING DATABASE: ${user_version} -> ${TARGET_VERSION}`);

View File

@ -0,0 +1,31 @@
CREATE TABLE `new_kv` (
`id` INTEGER PRIMARY KEY,
`app` char(40) DEFAULT NULL,
`user_id` int(10) NOT NULL,
`kkey_hash` bigint(20) NOT NULL,
`kkey` text NOT NULL,
`value` JSON,
`migrated` tinyint(1) DEFAULT '0',
UNIQUE (user_id, app, kkey_hash)
);
INSERT INTO `new_kv`
(
`app`,
`user_id`,
`kkey_hash`,
`kkey`,
`value`
)
SELECT
`app`,
`user_id`,
`kkey_hash`,
`kkey`,
json_quote(value)
FROM `kv`;
DROP TABLE `kv`;
ALTER TABLE `new_kv`
RENAME TO `kv`;

View File

@ -23,130 +23,131 @@ const ru = {
dictionary: {
about: "О системе",
account: "Учетная запись",
account_password: роверить пароль учётной записи",
account_password: одтвердите пароль",
access_granted_to: "Доступ предоставлен",
add_existing_account: "Добавить существующую учетную запись",
all_fields_required: 'Все поля обязательны.',
allow: "Позволить",
add_existing_account: "Добавить существующую Учетную запись",
all_fields_required: 'Все поля обязательны для заполнения.',
allow: 'Разрешить',
apply: "Применить",
ascending: 'По возрастанию',
associated_websites: "Ассоциированные веб-сайты",
associated_websites: "Связанные сайты",
auto_arrange: 'Автоупорядочивание',
background: "Фон",
browse: "Пролистать",
cancel: 'Отмена',
center: 'Отцентровать',
change_desktop_background: 'Сменить фон рабочего стола…',
change_email: "Сменить Email",
change_language: "Сменить Язык",
change_password: "Сменить Пароль",
change_ui_colors: "Сменить Тему Оформления",
change_username: "Сменить Имя Пользователя",
change_email: "Изменить электронныю почту",
change_language: "Изменить язык",
change_password: "Изменить пароль",
change_ui_colors: "Изменить тему оформления",
change_username: "Изменить имя пользователя",
close: 'Закрыть',
close_all_windows: "Закрыть все Окна",
close_all_windows: "Закрыть все окна",
close_all_windows_confirm: "Вы уверены, что хотите закрыть все окна?",
close_all_windows_and_log_out: 'Закрыть Окна и Выйти',
change_always_open_with: "Хотите всегда открывать файлы этого типа в",
close_all_windows_and_log_out: 'Закрыть все окна и выйти',
change_always_open_with: "Хотите всегда открывать файлы этого типа с помощью",
color: 'Цвет',
confirm: "Подтвердить",
confirm_2fa_setup: "Я добавил код в своё приложение для аутентификации",
confirm_2fa_recovery: "Я сохранил свои коды для восстановления в безопасном месте",
confirm: 'Подтвердить',
hue: 'Цветовая Гамма',
confirm_2fa_setup: 'Я добавил код в приложение для аутентификации',
confirm_2fa_recovery: 'Я сохранил коды восстановления доступа в безопасном месте',
confirm_account_for_free_referral_storage_c2a: 'Создайте учетную запись и подтвердите свой адрес электронной почты, чтобы получить 1 Гб бесплатного дискового пространства. Ваш друг также получит 1 Гб бесплатного дискового пространства.',
confirm_code_generic_incorrect: "Код неверен",
confirm_code_generic_too_many_requests: "Слишком много запросов. Пожалуйста, подождите несколько минут",
confirm_code_generic_submit: "Принять код",
confirm_code_generic_try_again: "Попробовать снова",
confirm_code_generic_title: "Ввести код подтверждения",
confirm_code_2fa_instruction: "Введите шестизначный код из вашего приложения для аутентификации.",
confirm_code_2fa_submit_btn: "Принять",
confirm_code_2fa_title: "Введите код для двухфакторной аутентификации",
confirm_code_generic_incorrect: "Неверный код.",
confirm_code_generic_too_many_requests: "Слишком много запросов. Пожалуйста, подождите несколько минут.",
confirm_code_generic_submit: "Отправить код",
confirm_code_generic_try_again: "Попробуйте снова",
confirm_code_generic_title: "Введите код подтверждения",
confirm_code_2fa_instruction: "Введите 6-значный код из приложения для аутентификации.",
confirm_code_2fa_submit_btn: "Отправить",
confirm_code_2fa_title: "Введите код аутентификации",
confirm_delete_multiple_items: 'Вы уверены, что хотите навсегда удалить эти элементы?',
confirm_delete_single_item: 'Вы уверены, что хотите навсегда удалить этот элемент?',
confirm_open_apps_log_out: 'У вас имеются открытые приложения. Вы уверены, что хотите выйти из системы?',
confirm_new_password: "Подтвердите новый пароль",
confirm_delete_user: "Вы уверены, что хотите удалить свою учетную запись? Все ваши файлы и данные будут удалены безвозвратно. Это действие нельзя отменить.",
confirm_delete_user_title: "Удалить учетную запись?",
confirm_session_revoke: "Вы уверены, что хотите отозвать эту сессию?",
confirm_your_email_address: "Подтвердить адрес электронной почты",
confirm_session_revoke: "Вы уверены, что хотите отменить эту сессию?",
contact_us: "Связаться с нами",
contact_us_verification_required:"Вам необходимо иметь подтвержденный адрес электронной почты для использования этой функции",
contact_us_verification_required: "Подтвердите адрес электронной почты чтобы продожить.",
contain: 'Содержание',
continue: "Продолжить",
copy: 'Копировать',
copy_link: "Копировать Ссылку",
copying: "Копируется",
copying_file:"Копируется %%",
copy_link: "Скопировать ссылку",
copying: "Создаю копию",
copying_file: "Создаю копию %%",
cover: 'Обложка',
create_account: "Создать Учетную Запись",
create_free_account: "Создать Бесплатную Учетную Запись",
create_shortcut: "Создать Ярлык",
credits: "Титры",
current_password: "Текущий Пароль",
create_account: "Создать учетную запись",
create_free_account: "Создать бесплатную учетную запись",
create_shortcut: "Создать ярлык",
credits: "Авторы",
current_password: "Текущий пароль",
cut: 'Вырезать',
clock: "Часы",
clock_visible_hide: 'Скрыть - Всегда скрыто',
clock_visible_show: 'Показать - Всегда на виду',
clock_visible_auto: 'Авто - По Умолчанию, видно только в полноэкранном режиме',
close_all: "Закрыть все",
created: "Создано",
clock_visible_auto: 'Авто - По Умолчанию, видно только в полноэкранном режиме.',
close_all: 'Закрыть все',
created: 'Создано',
date_modified: 'Дата изменения',
default: 'По умолчанию',
delete: 'Удалить',
delete_account: "Удалить Учетную Запись",
delete_permanently: "Удалить Безвозвратно",
delete_account: "Удалить учетную запись",
delete_permanently: "Удалить безвозвратно",
deleting_file: "Удаление %%",
deploy_as_app: 'Развернуть как приложение',
descending: 'По убыванию',
desktop: "Рабочий стол",
desktop: 'Рабочий стол',
desktop_background_fit: "Вместить",
developers: "Разработчики",
dir_published_as_website: `%strong% опубликован в:`,
disable_2fa: "Отключить двухфакторную аутентификацию",
disable_2fa_confirm: "Вы уверены что хотите отключить двухфакторную аутентификацию?",
disable_2fa_instructions: "Введите ваш пароль для отключения двухфакторной аутентификации",
disassociate_dir: "Отключить Директорию",
documents: "Документы",
dont_allow: "Не разрешать",
disable_2fa: 'Отключить двойную аутентификацию',
disable_2fa_confirm: "Вы уверены, что хотите отключить двойную аутентификацию?",
disable_2fa_instructions: "Введите пароль чтобы отключить двойную аутентификацию.",
disassociate_dir: "Отключить директорию",
documents: 'Документы',
dont_allow: 'Доступ запрещён',
download: 'Загрузить',
download_file: 'Загрузить Файл',
downloading: "Загружается",
email: "Email",
download_file: 'Загрузить файл',
downloading: "Загрузка",
email: "Электронная почта",
email_change_confirmation_sent: "На ваш новый адрес электронной почты было отправлено письмо с подтверждением. Пожалуйста, проверьте свой ящик электронной почты и следуйте инструкциям, чтобы завершить процесс.",
email_invalid: 'Адрес электронной почты недействителен.',
email_or_username: "Email или Имя Пользователя",
email_or_username: "Email или Имя пользователя",
email_required: 'Email обязателен.',
empty_trash: 'Очистить Корзину',
empty_trash: 'Очистить корзину',
empty_trash_confirmation: `Вы уверены, что хотите навсегда удалить элементы из Корзины?`,
emptying_trash: 'Очистка Корзины…',
enable_2fa: "Включить двухфакторную аутентификацию",
end_hard: "Закрыть жестко", //принудительно
enable_2fa: 'Включить двойную аутентификацию',
end_hard: "Принудительно закрыть",
end_process_force_confirm: "Вы уверены, что хотите принудительно завершить этот процесс?",
end_soft: "Закрыть мягко",
end_soft: "Закрыть",
enlarged_qr_code: "Увеличить QR код",
enter_password_to_confirm_delete_user: "Введите пароль для подтверждения удаления учетной записи",
error_message_is_missing: "Сообщение об ошибке отсутствует",
error_unknown_cause: "Произошла неизвестная ошибка",
error_uploading_files: "Сбой загрузки файлов",
favorites: "Избранное",
error_message_is_missing: "Сообщение об ошибке отсутствует.",
error_unknown_cause: "Неизвестная ошибка.",
error_uploading_files: "Не удалось загрузить файлы",
favorites: "Избранное",
feedback: "Обратная связь",
feedback_c2a: "Пожалуйста, используйте форму ниже, чтобы отправить нам свои отзывы, комментарии и сообщения об ошибках.",
feedback_sent_confirmation: "Спасибо, что связались с нами. Если у вас есть электронная почта, связанная с вашим аккаунтом, мы ответим вам как можно скорее.",
fit: "Вместить",
folder: "Папка",
force_quit: 'Принудительно Закрыть',
folder: 'Папка',
force_quit: 'Принудительно закрыть',
forgot_pass_c2a: "Забыли пароль?",
from: "От",
general: "Общий",
general: "Общее",
get_a_copy_of_on_puter: `Получите копию '%%' на Puter.com!`,
get_copy_link: 'Получить Ссылку для Копирования',
get_copy_link: 'Получить ссылку для копирования',
hide_all_windows: "Скрыть все окна",
home: "Домой",
home: 'Домой',
html_document: 'HTML документ',
hue: 'Цветовая Гамма',
hue: 'Оттенок',
image: 'Изображение',
incorrect_password: "Неверный пароль",
invite_link: "Пригласительная ссылка",
item: 'Элемент',
items_in_trash_cannot_be_renamed: `Этот элемент нельзя переименовать, потому что он находится в Корзине. Чтобы переименовать этот элемент, сначала перетащите его из Корзины.`,
invite_link: "Ссылка для приглашения",
item: 'элемент',
items_in_trash_cannot_be_renamed: `Этот элемент нельзя переименовать, потому что он находится в Корзине. Чтобы переименовать этот элемент, сначала перенесите его из Корзины.`,
jpeg_image: 'JPEG изображение',
keep_in_taskbar: 'Сохранить на Панели Задач',
language: "Язык",
@ -157,15 +158,15 @@ const ru = {
log_in: "Войти",
log_into_another_account_anyway: 'Все-равно войти в другой аккаунт',
log_out: 'Выйти',
looks_good: "Выглядит хорошо!",
looks_good: "Выглядит здорово!",
manage_sessions: "Управление Сеансами",
menubar_style: "Стиль Меню",
menubar_style_desktop: "Рабочего стола",
menubar_style_system: "Системы",
menubar_style_window: "Окна",
modified: "Изменено",
menubar_style: "Стиль меню",
menubar_style_desktop: "Рабочий стол",
menubar_style_system: "Система",
menubar_style_window: "Окно",
modified: 'Изменено',
move: 'Переместить',
moving_file: "Перемещается %%",
moving_file: "Перемещаю %%",
my_websites: "Мои Сайты",
name: 'Имя',
name_cannot_be_empty: 'Имя не может быть пустым.',
@ -175,43 +176,44 @@ const ru = {
name_must_be_string: "Имя может содержать только текстовые символы.",
name_too_long: `Имя не может быть длинее %% символов.`,
new: 'Новый',
new_email: 'Новый Email',
new_email: 'Новая электронная почта',
new_folder: 'Новая папка',
new_password: "Новый Пароль",
new_username: "Новое Имя Пользователя",
new_password: "Новый пароль",
new_username: "Новое имя пользователя",
no: 'Нет',
no_dir_associated_with_site: 'Нет директории, связанной с этим адресом.',
no_websites_published: "Вы еще не опубликовали ни одного сайта.",
ok: 'OK',
open: "Открыть",
open_in_new_tab: "Открыть в Новой Вкладке",
open_in_new_window: "Открыть в Новом Окне",
open_in_new_tab: "Открыть в новой вкладке",
open_in_new_window: "Открыть в новом окне",
open_with: "Открыть с помощью",
original_name: "Оригинальное имя",
original_path: "Оригинальный путь",
original_name: 'Оригинальное имя',
original_path: 'Изначальный путь',
oss_code_and_content: "Программное обеспечение и контент с открытым исходным кодом",
password: "Пароль",
password_changed: "Пароль изменен.",
password_recovery_rate_limit: "Вы достигли лимита; пожалуйста, подождите несколько минут. Чтобы предотвратить это в будущем, не перезагружайте страницу слишком много раз.",
password_recovery_rate_limit: "Вы достигли лимита. Пожалуйста, подождите несколько минут. Чтобы предотвратить это в будущем, не перезагружайте страницу слишком много раз.",
password_recovery_token_invalid: "Этот токен восстановления пароля больше не действителен.",
password_recovery_unknown_error: "Произошла неизвестная ошибка. Пожалуйста, повторите попытку позже.",
password_required: 'Необходим Пароль.',
password_strength_error: "Пароль должен иметь длину не менее 8 символов и содержать хотя бы одну заглавную букву, одну строчную букву, одну цифру и один специальный символ.",
passwords_do_not_match: 'Поля `Новый Пароль` и `Подтвердите Новый Пароль` не совпадают.',
password_required: 'Необходимо ввести пароль.',
password_strength_error: "Пароль должен иметь длину не менее 8 символов и содержать хотя бы одну заглавную букву, одну строчную букву, одну цифру и один специальный знак.",
passwords_do_not_match: 'Поля `Новый пароль` и `Подтвердите новый пароль` не совпадают.',
paste: 'Вставить',
paste_into_folder: "Вставить в Папку",
path: "Путь",
paste_into_folder: "Вставить в папку",
path: 'Путь',
personalization: "Персонализация",
pick_name_for_website: "Выберите имя для вашего сайта:",
picture: "Изображение",
pictures: "Изображения",
plural_suffix: 's', //?? в русском языке это или И или Ы
pictures: 'Изображения',
plural_suffix: 's', //does not exist in Russian language
powered_by_puter_js: `Создано на {{link=docs}}Puter.js{{/link}}`,
preparing: "Подготовка...",
preparing_for_upload: "Подготовка к загрузке...",
print: 'Печать',
privacy: "Конфиденциальность",
proceed_to_login: 'Перейти к Входу',
proceed_with_account_deletion: "Продолжить Удаление Учетной Записи",
proceed_to_login: 'Перейти ко входу',
proceed_with_account_deletion: "Продолжить удаление учетной записи",
process_status_initializing: "Инициализация",
process_status_running: "Выполняется",
process_type_app: 'Прил',
@ -220,26 +222,27 @@ const ru = {
properties: "Свойства",
public: "Общий",
publish: "Опубликовать",
public: 'Общий доступ',
publish_as_website: 'Опубликовать как сайт',
puter_description: `Puter — это персональное облако, обеспечивающее конфиденциальность, позволяющее хранить все ваши файлы, приложения и игры в одном безопасном месте, доступном из любого места в любое время.`,
reading_file: "Чтение файла",
recent: "Недавний",
recommended: "Рекомендованный",
reading_file: "Чтение %strong%",
recent: "Недавнее",
recommended: "Рекоммендации",
recover_password: "Восстановить Пароль",
refer_friends_c2a: "Получите 1 ГБ за каждого друга, который создаст и подтвердит учетную запись на Puter. Ваш друг тоже получит 1 ГБ!",
refer_friends_social_media_c2a: `Получите 1 ГБ бесплатного хранилища на Puter.com!`,
refresh: 'Обновить',
release_address_confirmation: `Вы уверены, что хотите освободить этот адрес?`,
remove_from_taskbar:'Удалить с Панели Задач',
remove_from_taskbar:'Удалить из панели задач',
rename: 'Переименовать',
repeat: 'Повторить',
replace: 'Заменить',
replace_all: 'Заменить Все',
resend_confirmation_code: "Повторно отправить Код Подтверждения",
reset_colors: "Сбросить Цвета",
replace_all: 'Заменить все',
resend_confirmation_code: "Повторно отправить код подтверждения",
reset_colors: "Сбросить цвета",
restart_puter_confirm: "Вы уверены, что хотите перезапустить Puter?",
restore: "Восстановить",
save: "Сохранить",
save: 'Сохранить',
saturation: 'Насыщенность',
save_account: 'Сохранить Учетную запись',
save_account_to_get_copy_link: "Пожалуйста, создайте учетную запись, чтобы продолжить.",
@ -247,9 +250,9 @@ const ru = {
save_session: 'Сохранить сеанс',
save_session_c2a: 'Создайте учетную запись, чтобы сохранить текущий сеанс и не потерять данные.',
scan_qr_c2a: 'Отсканируйте код ниже, чтобы войти в этот сеанс с других устройств',
scan_qr_2fa: "Отсканируйте код с помощью вашего приложения для аутентификации",
scan_qr_2fa: 'Отсканируйте QR-код с помощью приложения аутентификации',
scan_qr_generic: 'Отсканируйте этот QR-код с помощью телефона или другого устройства',
search: "Поиск",
search: 'Поиск',
seconds: 'секунды',
security: "Безопасность",
select: "Выбрать",
@ -260,9 +263,10 @@ const ru = {
send_password_recovery_email: "Отправить электронное письмо для восстановления пароля",
session_saved: "Благодарим вас за создание учетной записи. Этот сеанс сохранен.",
settings: "Настройки",
set_new_password: "Установить Новый Пароль",
share_to: "Поделиться с",
share_with: "Поделиться с",
set_new_password: "Установить новый пароль",
share: "Поделиться",
share_to: "Поделиться",
share_with: "Поделиться с: ",
shortcut_to: "Ярлык для",
show_all_windows: "Показать Все Окна",
show_hidden: 'Показать скрытые',
@ -271,13 +275,14 @@ const ru = {
signing_in: "Вход в систему…",
size: 'Размер',
skip: 'Пропустить',
something_went_wrong: "Что-то пошло не так.",
sort_by: 'Отсортировать по',
start: 'Начать',
status: "Статус",
storage_usage: "Использование хранилища",
storage_puter_used: 'использовано Puter',
taking_longer_than_usual: 'Это занимает немного больше времени, чем обычно. пожалуйста, подождите...',
task_manager: "Диспетчер Задач",
taking_longer_than_usual: 'Это занимает немного больше времени чем обычно, пожалуйста, подождите...',
task_manager: "Диспетчер задач",
taskmgr_header_name: "Имя",
taskmgr_header_status: "Статус",
taskmgr_header_type: "Тип",
@ -286,12 +291,12 @@ const ru = {
tos_fineprint: `Нажимая 'Создать бесплатную учетную запись', вы соглашаетесь с {{link=terms}}Условиями Использования{{/link}} и {{link=privacy}}Политикой Конфиденциальности{{/link}} Puter.`,
transparency: "Прозрачность",
trash: 'Корзина',
two_factor: "Двухфакторная аутентификация",
two_factor_disabled: "Двухфакторная аутентификация отключена",
two_factor_enabled:"Двухфакторная аутентификация включена",
two_factor: 'Двухфакторная аутентификация',
two_factor_disabled: 'Двухфакторная аутентификация отключена',
two_factor_enabled: 'Двухфакторная аутентификация включена',
type: 'Тип',
type_confirm_to_delete_account: "Введите 'Подтвердить', чтобы удалить учетную запись.",
ui_colors: "Цвета UI",
type_confirm_to_delete_account: "Введите 'подтвердить', чтобы удалить учетную запись.",
ui_colors: "Цвета пользовательского интерфейса",
ui_manage_sessions: "Менеджер Сеансов",
ui_revoke: "Отозвать",
undo: 'Отменить',
@ -300,43 +305,44 @@ const ru = {
upload: 'Загрузить',
upload_here: 'Загрузить здесь',
usage: 'Использование',
username: "Имя Пользователя",
username_changed: 'Имя Пользователя успешно обновлено.',
username: "Имя пользователя",
username_changed: 'Имя пользователя успешно обновлено.',
username_required: 'Требуется имя Пользователя.',
versions: "Версии",
videos: "Видео",
videos: 'Видео',
visibility: 'Видимость',
yes: 'Да',
yes_release_it: 'Да, освободить.',
you_have_been_referred_to_puter_by_a_friend: "Вы были приглашены в Puter другом!",
zip: "Заархивировать",
zipping_file: "Архивация %strong%",
zip: "Добавить в архив",
zipping_file: "Добавление в архив %strong%",
// === 2FA Setup ===
setup2fa_1_step_heading: 'Откройте ваше приложение для аутентификации',
// === 2FA Setup ===
setup2fa_1_step_heading: 'Откройте приложение для аутенцификации',
setup2fa_1_instructions: `
Вы можете использовать любое приложение, которое поддерживает Одноразовый Пароль, на основе времени.
Их множество, но если вы не уверены в выборе
Вы можете использовать любое приложение для аутентификации, поддерживающее протокол одноразового пароля на основе времени (TOTP).
Существует большой выбор приложений, но если вы не уверены, то
<a target="_blank" href="https://authy.com/download">Authy</a>
является прекрасным вариантом для Android и iOS.
это хороший выбор для Android и iOS
`,
setup2fa_2_step_heading: 'Отсканируйте QR код',
setup2fa_3_step_heading: 'Введите шестизначный код',
setup2fa_4_step_heading: 'Скопируйте ваши коды восстановления',
setup2fa_2_step_heading: 'Отсканируйте QR-код',
setup2fa_3_step_heading: 'Введите 6-значный код',
setup2fa_4_step_heading: 'Скопируйте коды восстановления',
setup2fa_4_instructions: `
Эти коды восстановления являются единственным способом входа в Ваш аккаунт если вы потеряете телефон или не
сможете использовать приложение для аутентификации. Удостоверьтесь в их сохранности.`,
setup2fa_5_step_heading: 'Подтвердите настройку 2FA',
setup2fa_5_confirmation_1: 'Я сохранил свои коды в надежном месте',
setup2fa_5_confirmation_2: 'Я готов использовать 2FA',
setup2fa_5_button: 'Включить 2FA',
Эти коды восстановления единственный способ получить доступ к вашей учетной записи, если вы потеряете свой телефон или не сможете использовать приложение для аутентификации.
Обязательно храните их в безопасном месте.
`,
setup2fa_5_step_heading: 'Подтвердите установку двухфакторной аутентификации',
setup2fa_5_confirmation_1: 'Я созранил коды восстановления в безопасном месте',
setup2fa_5_confirmation_2: 'Я готов включить двухфакторную аутентификацию',
setup2fa_5_button: 'Включить двухфакторную аутентификацию',
// === 2FA Login ===
login2fa_otp_title: 'Введите код 2FA',
login2fa_otp_instructions: 'Введите шестизначный код из вашего приложения дла аутентификации',
login2fa_recovery_title: 'Введите код восстановления',
login2fa_recovery_instructions: 'Введите один из кодов восстановления для доступа к учетной записи',
login2fa_use_recovery_code: 'Используйте код восстановления',
// === 2FA Login ===
login2fa_otp_title: 'Введите код двухфакторной аутентификации',
login2fa_otp_instructions: 'Введите 6-значный код из приложения для аутентификации',
login2fa_recovery_title: 'Введите код восстановления доступа',
login2fa_recovery_instructions: 'Введите один из кодов восстановления доступа чтобы получить доступ к учетной записи.',
login2fa_use_recovery_code: 'Используйте код восстановления доступа',
login2fa_recovery_back: 'Назад',
login2fa_recovery_placeholder: 'XXXXXXXX',
}

View File

@ -1,6 +1,6 @@
{
"name": "@heyputer/gui",
"version": "2.3.0",
"version": "2.4.0",
"author": "Puter Technologies Inc.",
"license": "AGPL-3.0-only",
"description": "Desktop environment in the browser!",