mirror of
https://github.com/HeyPuter/puter.git
synced 2026-11-13 20:12:57 -10:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
203669a79f | ||
|
|
f8b39630ab | ||
|
|
5d58764316 | ||
|
|
5d2a6fce30 | ||
|
|
1f7f094282 | ||
|
|
d8dd218089 | ||
|
|
a9801fc10d | ||
|
|
2d5a0bb894 | ||
|
|
a0113788f9 | ||
|
|
5cf74a0ad9 | ||
|
|
382fb24dbb | ||
|
|
8f87770ceb | ||
|
|
2a5cec7ee9 | ||
|
|
1579cbccf0 | ||
|
|
02e1b1e8f5 | ||
|
|
f4a45d74e7 | ||
|
|
c2d3d69dbe | ||
|
|
71f4b4d71f | ||
|
|
452b7495b1 | ||
|
|
ace14e99fa | ||
|
|
b3c1b128e2 | ||
|
|
b6a433ce0c | ||
|
|
3a09e84838 | ||
|
|
4990ba01cc | ||
|
|
6b5c31ddfe | ||
|
|
b9e73b7288 | ||
|
|
37fd666a9a | ||
|
|
f897e84498 | ||
|
|
eae51e945b | ||
|
|
98e69642d0 | ||
|
|
45c29b6220 | ||
|
|
f2bb551e75 | ||
|
|
8a3d0430f3 | ||
|
|
333d6e3b65 | ||
|
|
e58da265ba | ||
|
|
7043b9400c | ||
|
|
eeda9fb568 | ||
|
|
ae25711a13 | ||
|
|
602a19895c | ||
|
|
614f2c5061 | ||
|
|
9d549b192d | ||
|
|
74adcddc1d | ||
|
|
5a4328e449 | ||
|
|
8b5f58c156 | ||
|
|
d9a90a67c1 | ||
|
|
84b993bce9 | ||
|
|
3bca973f5f | ||
|
|
aebe89a1ac | ||
|
|
58c199c153 | ||
|
|
82fa2d0862 | ||
|
|
ad3d318d07 | ||
|
|
e539932070 | ||
|
|
8c8904cb36 | ||
|
|
f9333b3d1e | ||
|
|
ba50d0f96d | ||
|
|
8e7306c23b | ||
|
|
e6833253c7 | ||
|
|
4d6edff169 | ||
|
|
29f919c98a | ||
|
|
45f131f8ea | ||
|
|
d80f2fa847 | ||
|
|
5c636d4fd2 | ||
|
|
f28836180e | ||
|
|
8bece96f62 | ||
|
|
6c29427e16 | ||
|
|
9bfee0862f | ||
|
|
9d8a46814d | ||
|
|
c19c18bfcf | ||
|
|
151527825f | ||
|
|
cc4c93b77f | ||
|
|
3ca92955cb | ||
|
|
9bc427ced2 | ||
|
|
8e297cd7e3 | ||
|
|
5833b391f1 | ||
|
|
64e4299ac0 | ||
|
|
747d7dea89 | ||
|
|
c80526900b | ||
|
|
1b12a413fe | ||
|
|
69a80ab3d2 | ||
|
|
56820cf6ee | ||
|
|
a259755fe5 | ||
|
|
7a12e699de | ||
|
|
7f0365202e | ||
|
|
81781f80af | ||
|
|
93f4e52983 | ||
|
|
b52c31133e | ||
|
|
84e31eff2f | ||
|
|
46cbe077bc | ||
|
|
3b8af7cc5c | ||
|
|
9afb1b78b8 | ||
|
|
ae04a09c90 | ||
|
|
e8f4c328bf | ||
|
|
7b4e95139f | ||
|
|
6a2fbc1925 | ||
|
|
ab74f1ee8d | ||
|
|
b790bab9c0 | ||
|
|
f7d15bae41 |
No files matched your search
@@ -0,0 +1,11 @@
|
||||
---
|
||||
name: App idea
|
||||
about: Suggest a potential app for Puter
|
||||
title: ''
|
||||
labels:
|
||||
- app-request
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
# This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node
|
||||
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs
|
||||
|
||||
name: Node.js CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [20.x, 21.x, 22.x]
|
||||
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
cache: 'npm'
|
||||
- run: npm ci
|
||||
- run: npm run build --if-present
|
||||
- run: npm test
|
||||
@@ -1,5 +1,96 @@
|
||||
# Changelog
|
||||
|
||||
## v2.4.2 (2024-07-22)
|
||||
|
||||
### Puter
|
||||
|
||||
#### Features
|
||||
|
||||
- add new file templates ([1f7f094](https://github.com/HeyPuter/puter/commit/1f7f094282fae915a2436701cfb756444cd3f781))
|
||||
- add cross_origin_isolation option ([e539932](https://github.com/HeyPuter/puter/commit/e53993207077aecd2c01712519251993bb2562bc))
|
||||
- add option to disable temporary users ([f9333b3](https://github.com/HeyPuter/puter/commit/f9333b3d1e05bd0dffaecd2e29afd08ea61559fc))
|
||||
- add some default groups ([ba50d0f](https://github.com/HeyPuter/puter/commit/ba50d0f96d58075abec067d24e6532bd874093f0))
|
||||
- Add support for dropping multiple Puter items onto Dev Center (close #311) ([8e7306c](https://github.com/HeyPuter/puter/commit/8e7306c23be01ee6c31cdb4c99f2fb1f71a2247f))
|
||||
|
||||
#### Translations
|
||||
|
||||
- Update ig.js ([382fb24](https://github.com/HeyPuter/puter/commit/382fb24dbb1737a8a54ed2491f80b2e2276cde61))
|
||||
- feat: add vietnamese localization-a ([c2d3d69](https://github.com/HeyPuter/puter/commit/c2d3d69dbe33f36fcae13bcbc8e2a31a86025af9))
|
||||
- Update zhtw.js, Complete Traditional Chinese translation based on English file #550 ([b9e73b7](https://github.com/HeyPuter/puter/commit/b9e73b7288aebb14e6bbf1915743e9157fc950b1))
|
||||
- update zhtw.js to match en.js ([37fd666](https://github.com/HeyPuter/puter/commit/37fd666a9a6788d5f0c59311499f29896b48bc82))
|
||||
- Add Tamil translation to translations.js ([8a3d043](https://github.com/HeyPuter/puter/commit/8a3d0430f39f872b8a460c344cce652c340b700b))
|
||||
- Move Tamil translation to the rest of translations ([333d6e3](https://github.com/HeyPuter/puter/commit/333d6e3b651e460caca04a896cbc8c175555b79b))
|
||||
- Translation improvements, mainly style and context-based ([8bece96](https://github.com/HeyPuter/puter/commit/8bece96f6224a060d5b408e08c58865fadb8b79c))
|
||||
- update translation file es.js to be up to date with the file en.js ([1515278](https://github.com/HeyPuter/puter/commit/151527825f1eb4b060aaf97feb7d18af4fcddbf2))
|
||||
- Translate en.js as of 2024-07-10 ([8e297cd](https://github.com/HeyPuter/puter/commit/8e297cd7e30757073e2f96593c363a273b639466))
|
||||
- Create hu.js hungarian language ([69a80ab](https://github.com/HeyPuter/puter/commit/69a80ab3d2c94ee43d96021c3bcbdab04a4b5dc6))
|
||||
- Update translations.js to Hungarian lang ([56820cf](https://github.com/HeyPuter/puter/commit/56820cf6ee56ff810a6b495a281ccbb2e7f9d8fb))
|
||||
- Tamil translation ([81781f8](https://github.com/HeyPuter/puter/commit/81781f80afc07cd1e6278906cdc68c8092fbfedf))
|
||||
- Update it.js ([84e31ef](https://github.com/HeyPuter/puter/commit/84e31eff2f58584d8fab7dd10606f2f6ced933a2))
|
||||
- Update Armenian translation file ([3b8af7c](https://github.com/HeyPuter/puter/commit/3b8af7cc5c1be8ed67be827360bbfe0f0b5027e9))
|
||||
|
||||
#### Bug Fixes
|
||||
|
||||
- fix templates ([5d2a6fc](https://github.com/HeyPuter/puter/commit/5d2a6fce305a3dcd4857f52ebb75f529dffe4790))
|
||||
- popup login in co isolation mode ([8f87770](https://github.com/HeyPuter/puter/commit/8f87770cebab32c00cb10133979d426306685292))
|
||||
- add necessary iframe attributes for co isolation ([2a5cec7](https://github.com/HeyPuter/puter/commit/2a5cec7ee914c9c97ae90b85464f9fc5332ad2fb))
|
||||
- chore: fix confirm for type_confirm_to_delete_account ([02e1b1e](https://github.com/HeyPuter/puter/commit/02e1b1e8f5f8e22d7ab39ebff99f7dd8e08a4221))
|
||||
- syntax error and formatting issue ([3a09e84](https://github.com/HeyPuter/puter/commit/3a09e84838fe8b74bd050641620eec87d9f59dfc))
|
||||
- #432 ([f897e84](https://github.com/HeyPuter/puter/commit/f897e844989083b0b369ba0ce4d2c5a9f3db5ad8))
|
||||
- `launch_app` not considering `explorer` as a special case ([98e6964](https://github.com/HeyPuter/puter/commit/98e69642d027a83975a0b2b825317213098bb689))
|
||||
- well kinda (HOSTNAME in phoenix) ([7043b94](https://github.com/HeyPuter/puter/commit/7043b9400c63842c4c54d82724167666708d3119))
|
||||
- it was github actions the entire time ([602a198](https://github.com/HeyPuter/puter/commit/602a19895c05b45a7d283470e7af3ae786be1bf2))
|
||||
- fix CI attempt #7 ([614f2c5](https://github.com/HeyPuter/puter/commit/614f2c5061525f230ccd879bfb047434ac46a9ba))
|
||||
- fix CI attempt #6 ([9d549b1](https://github.com/HeyPuter/puter/commit/9d549b192d149eac96c316ded645bf7c2e96153d))
|
||||
- fix CI attempt #5 ([74adcdd](https://github.com/HeyPuter/puter/commit/74adcddc1d60e0a513408a0716ed2b301126225d))
|
||||
- fix CI attempt #4 ([84b993b](https://github.com/HeyPuter/puter/commit/84b993bce913c3ad99127063bcfaae19331b199c))
|
||||
- fix CI attempt #3 ([3bca973](https://github.com/HeyPuter/puter/commit/3bca973f5f4e65a2bd24c634c347fbd681a7458b))
|
||||
- fix CI attempt #2 ([aebe89a](https://github.com/HeyPuter/puter/commit/aebe89a1acb070764551e8e89e325325ffbed8f9))
|
||||
- run mocha within packages in monorepo ([58c199c](https://github.com/HeyPuter/puter/commit/58c199c15356ac087a04b16dd18e8fe0f1aea359))
|
||||
- make webpack output not look like errors ([ad3d318](https://github.com/HeyPuter/puter/commit/ad3d318d07377c78c0429247225655e489b68be4))
|
||||
- No scrollbar for session list ([45f131f](https://github.com/HeyPuter/puter/commit/45f131f8eaf94cf3951ca7ffeb6f311590233b8a))
|
||||
- fix path issues under win32 platform ([d80f2fa](https://github.com/HeyPuter/puter/commit/d80f2fa847bfaef98dc8d482898f5c15f268e4bd))
|
||||
- remove abnoxious debug file ([5c636d4](https://github.com/HeyPuter/puter/commit/5c636d4fd25e14ba3813f7fca3b70ff7bd6860e7))
|
||||
- read_only fields in ES ([e8f4c32](https://github.com/HeyPuter/puter/commit/e8f4c328bff5c36b95fe460b80803e12e619f8ee))
|
||||
|
||||
### Security
|
||||
|
||||
#### Bug Fixes
|
||||
|
||||
- hoist acl check in ll_read ([6a2fbc1](https://github.com/HeyPuter/puter/commit/6a2fbc1925952ecceed741afe138270d1eeda7b7))
|
||||
|
||||
## v2.4.1 (2024-07-11)
|
||||
|
||||
### Puter
|
||||
|
||||
|
||||
#### Features
|
||||
|
||||
- update BR translation ([42a6b39](https://github.com/HeyPuter/puter/commit/42a6b3938a588b8b4d1bd976c37e9c6e58408c75))
|
||||
- JSON support for kv driver ([3ed7916](https://github.com/HeyPuter/puter/commit/3ed7916856f03eafbe0891f2ab39c34d20d2bd24))
|
||||
|
||||
#### Translations
|
||||
|
||||
- Update bn.js file formatting ([cff488f](https://github.com/HeyPuter/puter/commit/cff488f4f4378ca6c7568a585a665f2a3b87b89c))
|
||||
- Issue#530 - Update bengali translations ([92abc99](https://github.com/HeyPuter/puter/commit/92abc9947f811f94f17a5ee5a4b73ee2b210900a))
|
||||
- Added missing Romanian translations. ([8440f56](https://github.com/HeyPuter/puter/commit/8440f566b91c9eb4f01addcb850061e3fbe3afc7))
|
||||
- Add 2FA Romanian translations ([473b651](https://github.com/HeyPuter/puter/commit/473b6512c697854e3f3badae1eb7b87742954da5))
|
||||
- Add Japanese Translation ([47ec74f](https://github.com/HeyPuter/puter/commit/47ec74f0aa6adb3952e6460909029a4acb0c3039))
|
||||
- Completing Italian translation based on English file ([f5a8ee1](https://github.com/HeyPuter/puter/commit/f5a8ee1c6ab950d62c90b6257791f026a508b4e4))
|
||||
- Completing Italian translation based on English file. ([a96abb5](https://github.com/HeyPuter/puter/commit/a96abb5793528d0dc56d75f95d771e1dcf5960d1))
|
||||
- Completing Arabic translation based on English file ([78a0ace](https://github.com/HeyPuter/puter/commit/78a0acea6980b6d491da4874edbd98e17c0d9577))
|
||||
- Update Arabic translations in src/gui/src/i18n/translations/ar.js to match English version in src/gui/src/i18n/translations/en.js ([fe5be7f](https://github.com/HeyPuter/puter/commit/fe5be7f3cf7f336730137293ba86a637e8d8591d))
|
||||
- Update Arabic translations in src/gui/src/i18n/translations/ar.js to match English version in src/gui/src/i18n/translations/en.js ([bffa192](https://github.com/HeyPuter/puter/commit/bffa192805216fc17045cd8d629f34784dca7f3f))
|
||||
- Ukrainian updated ([e61039f](https://github.com/HeyPuter/puter/commit/e61039faf409b0ad85c7513b0123f3f2e92ebe32))
|
||||
- Update ru.js issue #547 ([17145d0](https://github.com/HeyPuter/puter/commit/17145d0be6a9a1445947cc0c4bec8f16a475144c))
|
||||
- Russian translation fixed ([8836011](https://github.com/HeyPuter/puter/commit/883601142873f10d69c84874499065a7d29af054))
|
||||
|
||||
#### Bug Fixes
|
||||
|
||||
- remove flag that breaks puter-js webpack ([7aadae5](https://github.com/HeyPuter/puter/commit/7aadae58ce1a51f925bf64c3d65ac1fa6971b164))
|
||||
- Improve `getMimeType` to remove trailing dot in the extension if preset ([535475b](https://github.com/HeyPuter/puter/commit/535475b3c36a37e3319ed067a24fb671790dcda3))
|
||||
|
||||
|
||||
## 2.4.0 (2024-07-08)
|
||||
|
||||
|
||||
|
||||
@@ -23,6 +23,9 @@ COPY package*.json ./
|
||||
# Copy the source files
|
||||
COPY . .
|
||||
|
||||
# Install mocha
|
||||
RUN npm install -g mocha
|
||||
|
||||
# Install node modules
|
||||
RUN npm cache clean --force && \
|
||||
for i in 1 2 3; do \
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<a href="https://hackerone.com/puter_h1b">Bug Bounty</a>
|
||||
</p>
|
||||
|
||||
<h3 align="center"><img width="700" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
|
||||
<h3 align="center"><img width="800" style="border-radius:5px;" alt="screenshot" src="https://assets.puter.site/puter.com-screenshot-3.webp"></h3>
|
||||
|
||||
<br/>
|
||||
|
||||
@@ -64,6 +64,7 @@ mkdir puter && cd puter && mkdir -p puter/config puter/data && sudo chown -R 100
|
||||
### 🐙 Docker Compose
|
||||
|
||||
|
||||
#### Linux/macOS
|
||||
```bash
|
||||
mkdir -p puter/config puter/data
|
||||
sudo chown -R 1000:1000 puter
|
||||
@@ -72,6 +73,19 @@ docker compose up
|
||||
```
|
||||
<br/>
|
||||
|
||||
#### Windows
|
||||
|
||||
|
||||
```powershell
|
||||
mkdir -p puter
|
||||
cd puter
|
||||
New-Item -Path "puter\config" -ItemType Directory -Force
|
||||
New-Item -Path "puter\data" -ItemType Directory -Force
|
||||
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/HeyPuter/puter/main/docker-compose.yml" -OutFile "docker-compose.yml"
|
||||
docker compose up
|
||||
```
|
||||
<br/>
|
||||
|
||||
### ☁️ Puter.com
|
||||
|
||||
Puter is available as a hosted service at [**puter.com**](https://puter.com).
|
||||
@@ -82,10 +96,11 @@ Puter is available as a hosted service at [**puter.com**](https://puter.com).
|
||||
|
||||
Connect with the maintainers and community through these channels:
|
||||
|
||||
- Bug report or feature request? Please [open an issue](https://github.com/HeyPuter/puter/issues/new/choose).
|
||||
- Discord: [https://discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
|
||||
- X (Twitter): [https://x.com/HeyPuter](https://x.com/HeyPuter)
|
||||
- Reddit: [https://www.reddit.com/r/puter/](https://www.reddit.com/r/puter/)
|
||||
- Bug report or feature request? Please [open an issue](github.com/HeyPuter/puter/issues/new/choose).
|
||||
- Discord: [discord.com/invite/PQcx7Teh8u](https://discord.com/invite/PQcx7Teh8u)
|
||||
- X (Twitter): [x.com/HeyPuter](https://x.com/HeyPuter)
|
||||
- Reddit: [reddit.com/r/puter/](https://www.reddit.com/r/puter/)
|
||||
- Mastodon: [mastodon.social/@puter](https://mastodon.social/@puter)
|
||||
- Email maintainers at [[email protected]](mailto:[email protected])
|
||||
|
||||
We are always happy to help you with any questions you may have. Don't hesitate to ask!
|
||||
|
||||
@@ -3,5 +3,6 @@ We would like to thank the following security researchers for their responsible
|
||||
|
||||
# 2024
|
||||
|
||||
- Tim Suess: [GitHub](https://github.com/blackfortresslabs) | [Email]([email protected]) | [Website](blackfortresslabs.com)
|
||||
- Tim Suess: [GitHub](https://github.com/blackfortresslabs) | [Email]([email protected]) | [Website](https://www.blackfortresslabs.com)
|
||||
- xyzeva: [Github](https://github.com/xyzeva) | [Email](mailto:[email protected]) | [Website](https://kibty.town/)
|
||||
- Yusuf Kelany: [GitHub](https://github.com/YusufYaser) | [Twitter](https://x.com/RealYusufYaser) | [Website](https://yusufyaser.xyz)
|
||||
Generated
+36
-307
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "puter.com",
|
||||
"version": "1.0.0",
|
||||
"version": "2.4.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "puter.com",
|
||||
"version": "1.0.0",
|
||||
"version": "2.4.1",
|
||||
"license": "AGPL-3.0-only",
|
||||
"workspaces": [
|
||||
"src/*",
|
||||
@@ -29,6 +29,7 @@
|
||||
"globals": "^15.0.0",
|
||||
"html-entities": "^2.3.3",
|
||||
"license-check-and-add": "^4.0.5",
|
||||
"mocha": "^10.6.0",
|
||||
"nodemon": "^3.1.0",
|
||||
"uglify-js": "^3.17.4",
|
||||
"webpack": "^5.88.2",
|
||||
@@ -1024,102 +1025,6 @@
|
||||
"url": "https://github.com/sponsors/nzakas"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/cliui": {
|
||||
"version": "8.0.2",
|
||||
"resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
|
||||
"integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"string-width": "^5.1.2",
|
||||
"string-width-cjs": "npm:string-width@^4.2.0",
|
||||
"strip-ansi": "^7.0.1",
|
||||
"strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
|
||||
"wrap-ansi": "^8.1.0",
|
||||
"wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/cliui/node_modules/ansi-regex": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
|
||||
"integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/ansi-regex?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/cliui/node_modules/ansi-styles": {
|
||||
"version": "6.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
|
||||
"integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/cliui/node_modules/emoji-regex": {
|
||||
"version": "9.2.2",
|
||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
|
||||
"integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@isaacs/cliui/node_modules/string-width": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
|
||||
"integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"eastasianwidth": "^0.2.0",
|
||||
"emoji-regex": "^9.2.2",
|
||||
"strip-ansi": "^7.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/sindresorhus"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/cliui/node_modules/strip-ansi": {
|
||||
"version": "7.1.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
|
||||
"integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-regex": "^6.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/strip-ansi?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
|
||||
"version": "8.1.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
|
||||
"integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-styles": "^6.1.0",
|
||||
"string-width": "^5.0.1",
|
||||
"strip-ansi": "^7.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/@istanbuljs/load-nyc-config": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
|
||||
@@ -6435,6 +6340,7 @@
|
||||
"version": "7.0.3",
|
||||
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
|
||||
"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"path-key": "^3.1.0",
|
||||
"shebang-command": "^2.0.0",
|
||||
@@ -6820,12 +6726,6 @@
|
||||
"url": "https://dotenvx.com"
|
||||
}
|
||||
},
|
||||
"node_modules/eastasianwidth": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
|
||||
"integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/ecdsa-sig-formatter": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
|
||||
@@ -8133,10 +8033,6 @@
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/google-license": {
|
||||
"resolved": "tools/google-license",
|
||||
"link": true
|
||||
},
|
||||
"node_modules/gopd": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
|
||||
@@ -8818,7 +8714,8 @@
|
||||
"node_modules/isexe": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
|
||||
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
|
||||
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/isobject": {
|
||||
"version": "3.0.1",
|
||||
@@ -9024,24 +8921,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/jackspeak": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.1.tgz",
|
||||
"integrity": "sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==",
|
||||
"license": "BlueOak-1.0.0",
|
||||
"dependencies": {
|
||||
"@isaacs/cliui": "^8.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "20 || >=22"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@pkgjs/parseargs": "^0.11.0"
|
||||
}
|
||||
},
|
||||
"node_modules/jest-worker": {
|
||||
"version": "27.5.1",
|
||||
"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
|
||||
@@ -10926,12 +10805,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/package-json-from-dist": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz",
|
||||
"integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==",
|
||||
"license": "BlueOak-1.0.0"
|
||||
},
|
||||
"node_modules/pako": {
|
||||
"version": "1.0.11",
|
||||
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
|
||||
@@ -11027,6 +10900,7 @@
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
|
||||
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
@@ -11036,40 +10910,6 @@
|
||||
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
|
||||
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
|
||||
},
|
||||
"node_modules/path-scurry": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
|
||||
"integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
|
||||
"license": "BlueOak-1.0.0",
|
||||
"dependencies": {
|
||||
"lru-cache": "^11.0.0",
|
||||
"minipass": "^7.1.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "20 || >=22"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"node_modules/path-scurry/node_modules/lru-cache": {
|
||||
"version": "11.0.0",
|
||||
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.0.tgz",
|
||||
"integrity": "sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==",
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": "20 || >=22"
|
||||
}
|
||||
},
|
||||
"node_modules/path-scurry/node_modules/minipass": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
|
||||
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
}
|
||||
},
|
||||
"node_modules/path-to-regexp": {
|
||||
"version": "0.1.7",
|
||||
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
|
||||
@@ -12170,6 +12010,7 @@
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
|
||||
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"shebang-regex": "^3.0.0"
|
||||
},
|
||||
@@ -12181,6 +12022,7 @@
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
|
||||
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
|
||||
"dev": true,
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
@@ -12644,21 +12486,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/string-width-cjs": {
|
||||
"name": "string-width",
|
||||
"version": "4.2.3",
|
||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"emoji-regex": "^8.0.0",
|
||||
"is-fullwidth-code-point": "^3.0.0",
|
||||
"strip-ansi": "^6.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-ansi": {
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||
@@ -12670,19 +12497,6 @@
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-ansi-cjs": {
|
||||
"name": "strip-ansi",
|
||||
"version": "6.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-regex": "^5.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
}
|
||||
},
|
||||
"node_modules/strip-bom": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
|
||||
@@ -13218,6 +13032,29 @@
|
||||
"node": ">=14.17"
|
||||
}
|
||||
},
|
||||
"node_modules/ua-parser-js": {
|
||||
"version": "1.0.38",
|
||||
"resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.38.tgz",
|
||||
"integrity": "sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/ua-parser-js"
|
||||
},
|
||||
{
|
||||
"type": "paypal",
|
||||
"url": "https://paypal.me/faisalman"
|
||||
},
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/faisalman"
|
||||
}
|
||||
],
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/uglify-js": {
|
||||
"version": "3.17.4",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
|
||||
@@ -13620,6 +13457,7 @@
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
|
||||
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"isexe": "^2.0.0"
|
||||
},
|
||||
@@ -13761,24 +13599,6 @@
|
||||
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/wrap-ansi-cjs": {
|
||||
"name": "wrap-ansi",
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"ansi-styles": "^4.0.0",
|
||||
"string-width": "^4.1.0",
|
||||
"strip-ansi": "^6.0.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=10"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/wrappy": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
|
||||
@@ -14277,6 +14097,7 @@
|
||||
"string-length": "^6.0.0",
|
||||
"svgo": "^3.0.2",
|
||||
"tiktoken": "^1.0.11",
|
||||
"ua-parser-js": "^1.0.38",
|
||||
"uglify-js": "^3.17.4",
|
||||
"uuid": "^9.0.0",
|
||||
"validator": "^13.9.0",
|
||||
@@ -14387,7 +14208,7 @@
|
||||
"@rollup/plugin-commonjs": "^24.1.0",
|
||||
"@rollup/plugin-node-resolve": "^15.0.2",
|
||||
"@rollup/plugin-replace": "^5.0.2",
|
||||
"mocha": "^10.2.0",
|
||||
"mocha": "^10.6.0",
|
||||
"rollup": "^3.21.4",
|
||||
"rollup-plugin-copy": "^3.4.0"
|
||||
},
|
||||
@@ -14559,6 +14380,7 @@
|
||||
},
|
||||
"tools/google-license": {
|
||||
"version": "1.0.0",
|
||||
"extraneous": true,
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"commander": "^12.1.0",
|
||||
@@ -14566,99 +14388,6 @@
|
||||
"handlebars": "^4.7.8"
|
||||
}
|
||||
},
|
||||
"tools/google-license/node_modules/brace-expansion": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
|
||||
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"balanced-match": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"tools/google-license/node_modules/commander": {
|
||||
"version": "12.1.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
|
||||
"integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
|
||||
"license": "MIT",
|
||||
"engines": {
|
||||
"node": ">=18"
|
||||
}
|
||||
},
|
||||
"tools/google-license/node_modules/foreground-child": {
|
||||
"version": "3.2.1",
|
||||
"resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz",
|
||||
"integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"cross-spawn": "^7.0.0",
|
||||
"signal-exit": "^4.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"tools/google-license/node_modules/glob": {
|
||||
"version": "11.0.0",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz",
|
||||
"integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"foreground-child": "^3.1.0",
|
||||
"jackspeak": "^4.0.1",
|
||||
"minimatch": "^10.0.0",
|
||||
"minipass": "^7.1.2",
|
||||
"package-json-from-dist": "^1.0.0",
|
||||
"path-scurry": "^2.0.0"
|
||||
},
|
||||
"bin": {
|
||||
"glob": "dist/esm/bin.mjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": "20 || >=22"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"tools/google-license/node_modules/minimatch": {
|
||||
"version": "10.0.1",
|
||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
|
||||
"integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"brace-expansion": "^2.0.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": "20 || >=22"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"tools/google-license/node_modules/minipass": {
|
||||
"version": "7.1.2",
|
||||
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
|
||||
"integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=16 || 14 >=14.17"
|
||||
}
|
||||
},
|
||||
"tools/google-license/node_modules/signal-exit": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
|
||||
"integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
|
||||
"license": "ISC",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/sponsors/isaacs"
|
||||
}
|
||||
},
|
||||
"tools/license-headers": {
|
||||
"version": "1.0.0",
|
||||
"license": "AGPL-3.0-only",
|
||||
|
||||
+3
-2
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "puter.com",
|
||||
"version": "1.0.0",
|
||||
"version": "2.4.1",
|
||||
"author": "Puter Technologies Inc.",
|
||||
"license": "AGPL-3.0-only",
|
||||
"description": "Desktop environment in the browser!",
|
||||
@@ -20,13 +20,14 @@
|
||||
"globals": "^15.0.0",
|
||||
"html-entities": "^2.3.3",
|
||||
"license-check-and-add": "^4.0.5",
|
||||
"mocha": "^10.6.0",
|
||||
"nodemon": "^3.1.0",
|
||||
"uglify-js": "^3.17.4",
|
||||
"webpack": "^5.88.2",
|
||||
"webpack-cli": "^5.1.1"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "mocha ./src/phoenix/test ./src/phoenix/packages/contextlink/test",
|
||||
"test": "npx mocha src/phoenix/test src/contextlink/test",
|
||||
"start=gui": "nodemon --exec \"node dev-server.js\" ",
|
||||
"start": "node ./tools/run-selfhosted.js",
|
||||
"build": "cd src/gui; node ./build.js",
|
||||
|
||||
@@ -2,7 +2,13 @@
|
||||
|
||||
This document describes the boot sequence of Puter's backend.
|
||||
|
||||
**Constriction**
|
||||
**Runtime Environment**
|
||||
- Configuration directory is determined
|
||||
- Runtime directory is determined
|
||||
- Mod directory is determined
|
||||
- Services are instantiated
|
||||
|
||||
**Construction**
|
||||
- Data structures are created
|
||||
|
||||
**Initialization**
|
||||
|
||||
@@ -66,6 +66,7 @@
|
||||
"string-length": "^6.0.0",
|
||||
"svgo": "^3.0.2",
|
||||
"tiktoken": "^1.0.11",
|
||||
"ua-parser-js": "^1.0.38",
|
||||
"uglify-js": "^3.17.4",
|
||||
"uuid": "^9.0.0",
|
||||
"validator": "^13.9.0",
|
||||
|
||||
@@ -19,6 +19,7 @@
|
||||
const { is_valid_path } = require("../../filesystem/validation");
|
||||
const { is_valid_uuid4 } = require("../../helpers");
|
||||
const { Context } = require("../../util/context");
|
||||
const { PathBuilder } = require("../../util/pathutil");
|
||||
const APIError = require("../APIError");
|
||||
const _path = require('path');
|
||||
|
||||
@@ -73,6 +74,7 @@ module.exports = class FSNodeParam {
|
||||
});
|
||||
}
|
||||
|
||||
return await fs.node({ path: _path.resolve('/', uidOrPath) });
|
||||
const resolved_path = PathBuilder.resolve(uidOrPath, { puterfs: true });
|
||||
return await fs.node({ path: resolved_path });
|
||||
}
|
||||
}
|
||||
@@ -25,6 +25,9 @@ let config = {};
|
||||
// Static defaults
|
||||
config.servers = [];
|
||||
|
||||
// Will disable the auto-generated temp users. If a user lands on the site, they will be required to sign up or log in.
|
||||
config.disable_temp_users = false;
|
||||
|
||||
config.max_file_size = 100_000_000_000,
|
||||
config.max_thumb_size = 1_000,
|
||||
config.max_fsentry_name_length = 767,
|
||||
@@ -131,7 +134,6 @@ const config_pointer = {};
|
||||
config_to_export = config_pointer;
|
||||
}
|
||||
|
||||
|
||||
// We have some methods that can be called on `config`
|
||||
{
|
||||
// Add configuration values with precedence over the current config
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const { AsyncProviderTrait } = require("../../traits/AsyncProviderTrait");
|
||||
const { AsyncProviderFeature } = require("../../traits/AsyncProviderFeature");
|
||||
const { HLMkdir, QuickMkdir } = require("../hl_operations/hl_mkdir");
|
||||
const { Context } = require("../../util/context");
|
||||
const { HLWrite } = require("../hl_operations/hl_write");
|
||||
@@ -32,8 +32,8 @@ const { HLRemove } = require("../hl_operations/hl_remove");
|
||||
|
||||
|
||||
class BatchCommand extends AdvancedBase {
|
||||
static TRAITS = [
|
||||
new AsyncProviderTrait(),
|
||||
static FEATURES = [
|
||||
new AsyncProviderFeature(),
|
||||
]
|
||||
static async run (executor, parameters) {
|
||||
const instance = new this();
|
||||
|
||||
@@ -26,8 +26,8 @@ const StringParam = require('../../api/filesystem/StringParam');
|
||||
const FlagParam = require("../../api/filesystem/FlagParam");
|
||||
const UserParam = require('../../api/filesystem/UserParam');
|
||||
const FSNodeContext = require('../FSNodeContext');
|
||||
const { ContextAwareTrait } = require('../../traits/ContextAwareTrait');
|
||||
const { OtelTrait } = require('../../traits/OtelTrait');
|
||||
const { ContextAwareFeature } = require('../../traits/ContextAwareFeature');
|
||||
const { OtelFeature } = require('../../traits/OtelFeature');
|
||||
const { HLFilesystemOperation } = require('./definitions');
|
||||
const { is_valid_path } = require('../validation');
|
||||
const { HLRemove } = require('./hl_remove');
|
||||
@@ -249,8 +249,8 @@ class HLMkdir extends HLFilesystemOperation {
|
||||
parent_directories_created: () => [],
|
||||
}
|
||||
|
||||
static TRAITS = [
|
||||
new OtelTrait([
|
||||
static FEATURES = [
|
||||
new OtelFeature([
|
||||
'_get_existing_parent',
|
||||
'_create_parents',
|
||||
]),
|
||||
|
||||
@@ -33,7 +33,7 @@ const { HLFilesystemOperation } = require("./definitions");
|
||||
const { MkTree } = require("./hl_mkdir");
|
||||
const { Actor } = require("../../services/auth/Actor");
|
||||
|
||||
class WriteCommonTrait {
|
||||
class WriteCommonFeature {
|
||||
install_in_instance (instance) {
|
||||
instance._verify_size = async function () {
|
||||
if (
|
||||
@@ -84,8 +84,8 @@ class HLWrite extends HLFilesystemOperation {
|
||||
- create shortcuts
|
||||
`
|
||||
|
||||
static TRAITS = [
|
||||
new WriteCommonTrait(),
|
||||
static FEATURES = [
|
||||
new WriteCommonFeature(),
|
||||
]
|
||||
|
||||
static PARAMETERS = {
|
||||
|
||||
@@ -26,6 +26,24 @@ const { buffer_to_stream } = require("../../util/streamutil");
|
||||
const { TYPE_SYMLINK, TYPE_DIRECTORY } = require("../FSNodeContext");
|
||||
const { LLFilesystemOperation } = require("./definitions");
|
||||
|
||||
const dry_checks = [
|
||||
async function check_ACL_for_read (a) {
|
||||
if ( a.get('no_acl') ) return;
|
||||
const context = a.iget('context');
|
||||
const svc_acl = context.get('services').get('acl');
|
||||
const { fsNode, actor } = a.values();
|
||||
if ( ! await svc_acl.check(actor, fsNode, 'read') ) {
|
||||
throw await svc_acl.get_safe_acl_error(actor, fsNode, 'read');
|
||||
}
|
||||
},
|
||||
async function type_check_for_read (a) {
|
||||
const fsNode = a.get('fsNode');
|
||||
if ( await fsNode.get('type') === TYPE_DIRECTORY ) {
|
||||
throw APIError.create('cannot_read_a_directory');
|
||||
}
|
||||
},
|
||||
];
|
||||
|
||||
class LLRead extends LLFilesystemOperation {
|
||||
static METHODS = {
|
||||
_run: new Sequence({
|
||||
@@ -39,12 +57,7 @@ class LLRead extends LLFilesystemOperation {
|
||||
throw APIError.create('subject_does_not_exist');
|
||||
}
|
||||
},
|
||||
async function type_check_for_read (a) {
|
||||
const fsNode = a.get('fsNode');
|
||||
if ( await fsNode.get('type') === TYPE_DIRECTORY ) {
|
||||
throw APIError.create('cannot_read_a_directory');
|
||||
}
|
||||
},
|
||||
...dry_checks,
|
||||
async function resolve_symlink (a) {
|
||||
let fsNode = a.get('fsNode');
|
||||
let type = await fsNode.get('type');
|
||||
@@ -54,15 +67,7 @@ class LLRead extends LLFilesystemOperation {
|
||||
}
|
||||
a.set('fsNode', fsNode);
|
||||
},
|
||||
async function check_ACL_for_read (a) {
|
||||
if ( a.get('no_acl') ) return;
|
||||
const context = a.iget('context');
|
||||
const svc_acl = context.get('services').get('acl');
|
||||
const { fsNode, actor } = a.values();
|
||||
if ( ! await svc_acl.check(actor, fsNode, 'read') ) {
|
||||
throw await svc_acl.get_safe_acl_error(actor, fsNode, 'read');
|
||||
}
|
||||
},
|
||||
...dry_checks,
|
||||
async function calculate_has_range (a) {
|
||||
const { offset, length } = a.values();
|
||||
const fsNode = a.get('fsNode');
|
||||
|
||||
@@ -21,7 +21,7 @@ const { id2path } = require("../../helpers");
|
||||
|
||||
const { PuterPath } = require("../lib/PuterPath");
|
||||
const { NodeUIDSelector } = require("../node/selectors");
|
||||
const { OtelTrait } = require("../../traits/OtelTrait");
|
||||
const { OtelFeature } = require("../../traits/OtelFeature");
|
||||
const { Context } = require("../../util/context");
|
||||
const { DB_WRITE } = require("../../services/database/consts");
|
||||
|
||||
@@ -195,8 +195,8 @@ class DatabaseFSEntryService extends AdvancedBase {
|
||||
static STATUS_READY = {};
|
||||
static STATUS_RUNNING_JOB = {};
|
||||
|
||||
static TRAITS = [
|
||||
new OtelTrait([
|
||||
static FEATURES = [
|
||||
new OtelFeature([
|
||||
'insert',
|
||||
'update',
|
||||
'delete',
|
||||
|
||||
@@ -56,9 +56,6 @@ const surrounding_box = (col, lines, lengths) => {
|
||||
const c = str => `\x1b[${col}m${str}\x1b[0m`;
|
||||
const bar = c(Array(max_length + 4).fill('━').join(''));
|
||||
for ( let i = 0 ; i < lines.length ; i++ ) {
|
||||
require('fs').appendFileSync('/tmp/asdfqwer',
|
||||
'' + lines[i] +':'+ lines[i].length +':'+ lengths[i]+
|
||||
':'+max_length+'\n');
|
||||
if ( lengths[i] < max_length ) {
|
||||
lines[i] += Array(max_length - lengths[i])
|
||||
.fill(' ')
|
||||
|
||||
@@ -31,6 +31,7 @@ const { BaseDatabaseAccessService } = require('./services/database/BaseDatabaseA
|
||||
const { LLRmNode } = require('./filesystem/ll_operations/ll_rmnode');
|
||||
const { Context } = require('./util/context');
|
||||
const { NodeUIDSelector } = require('./filesystem/node/selectors');
|
||||
const { PathBuilder } = require('./util/pathutil');
|
||||
|
||||
let systemfs = null;
|
||||
let services = null;
|
||||
@@ -1155,8 +1156,12 @@ async function jwt_auth(req){
|
||||
async function mkdir(options){
|
||||
const fs = systemfs;
|
||||
|
||||
const dirpath = _path.dirname(_path.resolve('/', options.path));
|
||||
let target_name = _path.basename(_path.resolve('/', options.path));
|
||||
debugger;
|
||||
|
||||
const resolved_path = PathBuilder.resolve(options.path, { puterfs: true });
|
||||
|
||||
const dirpath = _path.dirname(resolved_path);
|
||||
let target_name = _path.basename(resolved_path);
|
||||
const overwrite = options.overwrite ?? false;
|
||||
const dedupe_name = options.dedupe_name ?? false;
|
||||
const immutable = options.immutable ?? false;
|
||||
@@ -1182,7 +1187,7 @@ async function mkdir(options){
|
||||
|
||||
// dirpath not found
|
||||
if(parent === false && !create_missing_parents)
|
||||
throw "Target path not found";
|
||||
throw new Error("Target path not found");
|
||||
// create missing parent directories
|
||||
else if(parent === false && create_missing_parents){
|
||||
const dirs = _path.resolve('/', dirpath).split('/');
|
||||
@@ -1206,7 +1211,7 @@ async function mkdir(options){
|
||||
// try setting parent again
|
||||
parent = await convert_path_to_fsentry(dirpath);
|
||||
if(parent === false)
|
||||
throw "Target path not found";
|
||||
throw new Error("Target path not found");
|
||||
}
|
||||
|
||||
// check permission
|
||||
|
||||
@@ -17,13 +17,13 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const { WeakConstructorTrait } = require("../traits/WeakConstructorTrait");
|
||||
const { WeakConstructorFeature } = require("../traits/WeakConstructorFeature");
|
||||
const { Eq, And } = require("./query/query");
|
||||
const { Entity } = require("./entitystorage/Entity");
|
||||
|
||||
class IdentifierUtil extends AdvancedBase {
|
||||
static TRAITS = [
|
||||
new WeakConstructorTrait(),
|
||||
static FEATURES = [
|
||||
new WeakConstructorFeature(),
|
||||
]
|
||||
|
||||
async detect_identifier (object) {
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
*/
|
||||
const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const { instance_ } = require("../../monitor/PerformanceMonitor");
|
||||
const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
|
||||
const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
|
||||
const { Property } = require("./Property");
|
||||
const { Entity } = require("../entitystorage/Entity");
|
||||
const FSNodeContext = require("../../filesystem/FSNodeContext");
|
||||
@@ -29,13 +29,13 @@ const FSNodeContext = require("../../filesystem/FSNodeContext");
|
||||
* Both wrapping and registering are done by RegistrantService.
|
||||
*/
|
||||
class Mapping extends AdvancedBase {
|
||||
static TRAITS = [
|
||||
static FEATURES = [
|
||||
// Whenever you can override something, it's reasonable to want
|
||||
// to pull the desired implementation from somewhere else to
|
||||
// avoid repeating yourself. Class constructors are one of a few
|
||||
// examples where this is typically not possible.
|
||||
// However, javascript is magic, and we do what we want.
|
||||
new WeakConstructorTrait(),
|
||||
new WeakConstructorFeature(),
|
||||
]
|
||||
|
||||
static create (context, data) {
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
|
||||
const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
|
||||
|
||||
class PropType extends AdvancedBase {
|
||||
static TRAITS = [
|
||||
new WeakConstructorTrait(),
|
||||
static FEATURES = [
|
||||
new WeakConstructorFeature(),
|
||||
]
|
||||
|
||||
static create (context, data, k) {
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
|
||||
const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
|
||||
|
||||
class Property extends AdvancedBase {
|
||||
static TRAITS = [
|
||||
new WeakConstructorTrait(),
|
||||
static FEATURES = [
|
||||
new WeakConstructorFeature(),
|
||||
]
|
||||
|
||||
static create (context, name, descriptor) {
|
||||
|
||||
@@ -17,15 +17,15 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
|
||||
const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
|
||||
const { Context } = require("../../util/context");
|
||||
|
||||
/**
|
||||
* BaseES is a base class for Entity Store classes.
|
||||
*/
|
||||
class BaseES extends AdvancedBase {
|
||||
static TRAITS = [
|
||||
new WeakConstructorTrait(),
|
||||
static FEATURES = [
|
||||
new WeakConstructorFeature(),
|
||||
]
|
||||
|
||||
// Default implementations
|
||||
|
||||
@@ -17,11 +17,11 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
|
||||
const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
|
||||
|
||||
class Entity extends AdvancedBase {
|
||||
static TRAITS = [
|
||||
new WeakConstructorTrait(),
|
||||
static FEATURES = [
|
||||
new WeakConstructorFeature(),
|
||||
]
|
||||
|
||||
constructor (args) {
|
||||
|
||||
@@ -21,14 +21,14 @@ const { BaseES } = require("./BaseES");
|
||||
|
||||
const APIError = require("../../api/APIError");
|
||||
const { Entity } = require("./Entity");
|
||||
const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
|
||||
const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
|
||||
const { And, Or, Eq, Like, Null, Predicate, PredicateUtil, IsNotNull } = require("../query/query");
|
||||
const { DB_WRITE } = require("../../services/database/consts");
|
||||
|
||||
class RawCondition extends AdvancedBase {
|
||||
// properties: sql:string, values:any[]
|
||||
static TRAITS = [
|
||||
new WeakConstructorTrait(),
|
||||
static FEATURES = [
|
||||
new WeakConstructorFeature(),
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@@ -41,7 +41,10 @@ class ValidationES extends BaseES {
|
||||
console.log('OLD ENT', extra.old_entity);
|
||||
|
||||
for ( const prop of Object.values(this.om.properties) ) {
|
||||
if ( prop.descriptor.protected ) {
|
||||
if (
|
||||
prop.descriptor.protected ||
|
||||
prop.descriptor.read_only
|
||||
) {
|
||||
await entity.del(prop.name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@ module.exports = {
|
||||
// SYSTEM
|
||||
godmode: {
|
||||
type: 'flag',
|
||||
protected: true,
|
||||
read_only: true,
|
||||
},
|
||||
}
|
||||
}
|
||||
@@ -17,11 +17,11 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
|
||||
const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
|
||||
|
||||
class Predicate extends AdvancedBase {
|
||||
static TRAITS = [
|
||||
new WeakConstructorTrait(),
|
||||
static FEATURES = [
|
||||
new WeakConstructorFeature(),
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@@ -81,16 +81,6 @@ module.exports = eggspress('/readdir', {
|
||||
const no_thumbs = req.values.no_thumbs;
|
||||
const no_assocs = req.values.no_assocs;
|
||||
|
||||
{
|
||||
const fs = require('fs');
|
||||
fs.appendFileSync('/tmp/readdir.log',
|
||||
JSON.stringify({
|
||||
recursive,
|
||||
no_thumbs,
|
||||
no_assocs,
|
||||
}, null, 2) + '\n');
|
||||
}
|
||||
|
||||
const hl_readdir = new HLReadDir();
|
||||
const result = await hl_readdir.run({
|
||||
subject,
|
||||
|
||||
@@ -100,10 +100,12 @@ module.exports = eggspress(['/signup'], {
|
||||
}
|
||||
|
||||
// temporary user
|
||||
if(req.body.is_temp){
|
||||
if(req.body.is_temp && !config.disable_temp_users){
|
||||
req.body.username = await generate_random_username();
|
||||
req.body.email = req.body.username + '@gmail.com';
|
||||
req.body.password = 'sadasdfasdfsadfsa';
|
||||
}else if(config.disable_temp_users){
|
||||
return res.status(400).send('Temp users are disabled.');
|
||||
}
|
||||
|
||||
// send_confirmation_code
|
||||
|
||||
@@ -89,8 +89,8 @@ class DevWatcherService extends BaseService {
|
||||
log_ (name, isErr, line) {
|
||||
let txt = `[${name}:`;
|
||||
txt += isErr
|
||||
? `\x1B[31;1merr\x1B[0m`
|
||||
: `\x1B[32;1mout\x1B[0m`;
|
||||
? `\x1B[34;1m2\x1B[0m`
|
||||
: `\x1B[32;1m1\x1B[0m`;
|
||||
txt += '] ' + line;
|
||||
this.log.info(txt);
|
||||
}
|
||||
|
||||
@@ -40,7 +40,7 @@ class EntityStoreService extends BaseService {
|
||||
});
|
||||
}
|
||||
|
||||
// TODO: can replace these with MethodProxyTrait
|
||||
// TODO: can replace these with MethodProxyFeature
|
||||
async create (entity) {
|
||||
return await this.upstream.upsert(entity, { old_entity: null });
|
||||
}
|
||||
|
||||
@@ -18,10 +18,10 @@
|
||||
*/
|
||||
const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const { Context } = require("../util/context");
|
||||
const { ContextAwareTrait } = require("../traits/ContextAwareTrait");
|
||||
const { OtelTrait } = require("../traits/OtelTrait");
|
||||
const { ContextAwareFeature } = require("../traits/ContextAwareFeature");
|
||||
const { OtelFeature } = require("../traits/OtelFeature");
|
||||
const APIError = require("../api/APIError");
|
||||
const { AssignableMethodsTrait } = require("../traits/AssignableMethodsTrait");
|
||||
const { AssignableMethodsFeature } = require("../traits/AssignableMethodsFeature");
|
||||
|
||||
const CONTEXT_KEY = Context.make_context_key('operation-trace');
|
||||
|
||||
@@ -220,10 +220,10 @@ class OperationTraceService {
|
||||
}
|
||||
|
||||
class BaseOperation extends AdvancedBase {
|
||||
static TRAITS = [
|
||||
new ContextAwareTrait(),
|
||||
new OtelTrait(['run']),
|
||||
new AssignableMethodsTrait(),
|
||||
static FEATURES = [
|
||||
new ContextAwareFeature(),
|
||||
new OtelFeature(['run']),
|
||||
new AssignableMethodsFeature(),
|
||||
]
|
||||
|
||||
async run (values) {
|
||||
|
||||
@@ -108,6 +108,8 @@ class PuterHomepageService extends BaseService {
|
||||
require_email_verification_to_publish_website: config.require_email_verification_to_publish_website,
|
||||
short_description: config.short_description,
|
||||
long_description: config.long_description,
|
||||
disable_temp_users: config.disable_temp_users,
|
||||
co_isolation_enabled: req.co_isolation_enabled,
|
||||
},
|
||||
}));
|
||||
}
|
||||
|
||||
@@ -357,10 +357,31 @@ class WebServerService extends BaseService {
|
||||
app.use(helmet.xssFilter());
|
||||
// app.use(helmet.referrerPolicy());
|
||||
app.disable('x-powered-by');
|
||||
|
||||
const uaParser = require('ua-parser-js');
|
||||
app.use(function (req, res, next) {
|
||||
const ua_header = req.headers['user-agent'];
|
||||
const ua = uaParser(ua_header);
|
||||
req.ua = ua;
|
||||
console.log('\x1B[26;1m===== UA =====\x1B[0m', ua);
|
||||
next();
|
||||
});
|
||||
|
||||
app.use(function (req, res, next) {
|
||||
req.co_isolation_enabled =
|
||||
['Chrome', 'Edge'].includes(req.ua.browser.name)
|
||||
&& (Number(req.ua.browser.major) >= 110);
|
||||
next();
|
||||
});
|
||||
|
||||
app.use(function (req, res, next) {
|
||||
const origin = req.headers.origin;
|
||||
|
||||
|
||||
const is_site = req.hostname.endsWith(config.static_hosting_domain);
|
||||
const is_popup = !! req.query.embedded_in_popup;
|
||||
|
||||
const co_isolation_okay = !is_popup && (is_site || req.co_isolation_enabled);
|
||||
|
||||
if ( req.path === '/signup' || req.path === '/login' ) {
|
||||
res.setHeader('Access-Control-Allow-Origin', origin ?? '*');
|
||||
}
|
||||
@@ -386,9 +407,14 @@ class WebServerService extends BaseService {
|
||||
// to the API (e.g. in case you use sessions)
|
||||
// res.setHeader('Access-Control-Allow-Credentials', true);
|
||||
|
||||
//needed for SharedArrayBuffer
|
||||
// res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
|
||||
// res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp')
|
||||
// Needed for SharedArrayBuffer
|
||||
// NOTE: This is put behind a configuration flag because we
|
||||
// need some experimentation to ensure the interface
|
||||
// between apps and Puter doesn't break.
|
||||
if ( config.cross_origin_isolation && co_isolation_okay ) {
|
||||
res.setHeader('Cross-Origin-Opener-Policy', 'same-origin');
|
||||
res.setHeader('Cross-Origin-Embedder-Policy', 'require-corp');
|
||||
}
|
||||
res.setHeader('Cross-Origin-Resource-Policy', 'cross-origin');
|
||||
// Pass to next layer of middleware
|
||||
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
const { get_user, get_app } = require("../../helpers");
|
||||
const { AssignableMethodsTrait } = require("../../traits/AssignableMethodsTrait");
|
||||
const { AssignableMethodsFeature } = require("../../traits/AssignableMethodsFeature");
|
||||
const { Context } = require("../../util/context");
|
||||
const BaseService = require("../BaseService");
|
||||
const { DB_WRITE } = require("../database/consts");
|
||||
|
||||
@@ -42,7 +42,7 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService {
|
||||
this.db = new Database(this.config.path);
|
||||
|
||||
// Database upgrade logic
|
||||
const TARGET_VERSION = 21;
|
||||
const TARGET_VERSION = 22;
|
||||
|
||||
if ( do_setup ) {
|
||||
this.log.noticeme(`SETUP: creating database at ${this.config.path}`);
|
||||
@@ -70,6 +70,7 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService {
|
||||
'0021_app-owner-id.sql',
|
||||
'0022_dev-center-max.sql',
|
||||
'0023_fix-kv.sql',
|
||||
'0024_default-groups.sql',
|
||||
].map(p => path_.join(__dirname, 'sqlite_setup', p));
|
||||
const fs = require('fs');
|
||||
for ( const filename of sql_files ) {
|
||||
@@ -170,6 +171,10 @@ class SqliteDatabaseAccessService extends BaseDatabaseAccessService {
|
||||
upgrade_files.push('0023_fix-kv.sql');
|
||||
}
|
||||
|
||||
if ( user_version <= 21 ) {
|
||||
upgrade_files.push('0024_default-groups.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}`);
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
INSERT INTO `group` (
|
||||
`uid`,
|
||||
`owner_user_id`,
|
||||
`extra`,
|
||||
`metadata`
|
||||
) VALUES
|
||||
('26bfb1fb-421f-45bc-9aa4-d81ea569e7a5', 1,
|
||||
'{"critical": true, "type": "default", "name": "system"}',
|
||||
'{"title": "System", "color": "#000000"}'),
|
||||
('ca342a5e-b13d-4dee-9048-58b11a57cc55', 1,
|
||||
'{"critical": true, "type": "default", "name": "admin"}',
|
||||
'{"title": "Admin", "color": "#a83232"}'),
|
||||
('78b1b1dd-c959-44d2-b02c-8735671f9997', 1,
|
||||
'{"critical": true, "type": "default", "name": "user"}',
|
||||
'{"title": "User", "color": "#3254a8"}'),
|
||||
('3c2dfff7-d22a-41aa-a193-59a61dac4b64', 1,
|
||||
'{"type": "default", "name": "moderator"}',
|
||||
'{"title": "Moderator", "color": "#a432a8"}'),
|
||||
('5e8f251d-3382-4b0d-932c-7bb82f48652f', 1,
|
||||
'{"type": "default", "name": "developer"}',
|
||||
'{"title": "Developer", "color": "#32a852"}')
|
||||
;
|
||||
|
||||
INSERT INTO `jct_user_group` (
|
||||
`user_id`,
|
||||
`group_id`,
|
||||
`extra`,
|
||||
`metadata`
|
||||
) VALUES (
|
||||
1,
|
||||
(SELECT `id` FROM `group` WHERE uid='ca342a5e-b13d-4dee-9048-58b11a57cc55'),
|
||||
'{}',
|
||||
'{"default": true}'
|
||||
);
|
||||
@@ -20,7 +20,7 @@ const { AdvancedBase } = require("@heyputer/puter-js-common");
|
||||
const APIError = require("../../api/APIError");
|
||||
const { Context } = require("../../util/context");
|
||||
const BaseService = require("../BaseService");
|
||||
const { SyncTrait } = require("../../traits/SyncTrait");
|
||||
const { SyncFeature } = require("../../traits/SyncFeature");
|
||||
const { DB_WRITE } = require("../database/consts");
|
||||
|
||||
const ts_to_sql = (ts) => Math.floor(ts / 1000);
|
||||
@@ -31,8 +31,8 @@ class RateLimitService extends BaseService {
|
||||
kv: globalThis.kv,
|
||||
}
|
||||
|
||||
static TRAITS = [
|
||||
new SyncTrait([
|
||||
static FEATURES = [
|
||||
new SyncFeature([
|
||||
'check_and_increment',
|
||||
]),
|
||||
]
|
||||
|
||||
+2
-2
@@ -16,7 +16,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
class AssignableMethodsTrait {
|
||||
class AssignableMethodsFeature {
|
||||
install_in_instance (instance) {
|
||||
const methods = instance._get_merged_static_object('METHODS');
|
||||
|
||||
@@ -27,5 +27,5 @@ class AssignableMethodsTrait {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
AssignableMethodsTrait
|
||||
AssignableMethodsFeature
|
||||
};
|
||||
+7
-7
@@ -16,18 +16,18 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
class AsyncProviderTrait {
|
||||
class AsyncProviderFeature {
|
||||
install_in_instance (instance) {
|
||||
instance.valueListeners_ = {};
|
||||
instance.valueFactories_ = {};
|
||||
instance.values_ = {};
|
||||
instance.rejections_ = {};
|
||||
|
||||
instance.provideValue = AsyncProviderTrait.prototype.provideValue;
|
||||
instance.rejectValue = AsyncProviderTrait.prototype.rejectValue;
|
||||
instance.awaitValue = AsyncProviderTrait.prototype.awaitValue;
|
||||
instance.onValue = AsyncProviderTrait.prototype.onValue;
|
||||
instance.setFactory = AsyncProviderTrait.prototype.setFactory;
|
||||
instance.provideValue = AsyncProviderFeature.prototype.provideValue;
|
||||
instance.rejectValue = AsyncProviderFeature.prototype.rejectValue;
|
||||
instance.awaitValue = AsyncProviderFeature.prototype.awaitValue;
|
||||
instance.onValue = AsyncProviderFeature.prototype.onValue;
|
||||
instance.setFactory = AsyncProviderFeature.prototype.setFactory;
|
||||
}
|
||||
|
||||
provideValue (key, value) {
|
||||
@@ -116,5 +116,5 @@ class AsyncProviderTrait {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
AsyncProviderTrait
|
||||
AsyncProviderFeature
|
||||
};
|
||||
+2
-2
@@ -18,7 +18,7 @@
|
||||
*/
|
||||
const { Context } = require("../util/context");
|
||||
|
||||
class ContextAwareTrait {
|
||||
class ContextAwareFeature {
|
||||
install_in_instance (instance) {
|
||||
instance.context = Context.get();
|
||||
instance.x = instance.context;
|
||||
@@ -26,5 +26,5 @@ class ContextAwareTrait {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
ContextAwareTrait,
|
||||
ContextAwareFeature,
|
||||
};
|
||||
@@ -18,7 +18,7 @@
|
||||
*/
|
||||
const { Context } = require("../util/context");
|
||||
|
||||
class OtelTrait {
|
||||
class OtelFeature {
|
||||
constructor (method_include_list) {
|
||||
this.method_include_list = method_include_list;
|
||||
}
|
||||
@@ -44,7 +44,7 @@ class OtelTrait {
|
||||
}
|
||||
}
|
||||
|
||||
class SyncOtelTrait {
|
||||
class SyncOtelFeature {
|
||||
constructor (method_include_list) {
|
||||
this.method_include_list = method_include_list;
|
||||
}
|
||||
@@ -72,5 +72,5 @@ class SyncOtelTrait {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
OtelTrait
|
||||
OtelFeature
|
||||
};
|
||||
@@ -18,7 +18,7 @@
|
||||
*/
|
||||
const { Lock } = require("../util/promise");
|
||||
|
||||
class SyncTrait {
|
||||
class SyncFeature {
|
||||
constructor (method_include_list) {
|
||||
this.method_include_list = method_include_list;
|
||||
}
|
||||
@@ -37,5 +37,5 @@ class SyncTrait {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
SyncTrait,
|
||||
SyncFeature,
|
||||
};
|
||||
+2
-2
@@ -16,7 +16,7 @@
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
class WeakConstructorTrait {
|
||||
class WeakConstructorFeature {
|
||||
install_in_instance(instance, { parameters }) {
|
||||
for ( const key in parameters ) {
|
||||
instance[key] = parameters[key];
|
||||
@@ -25,5 +25,5 @@ class WeakConstructorTrait {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
WeakConstructorTrait,
|
||||
WeakConstructorFeature,
|
||||
};
|
||||
@@ -28,25 +28,40 @@ class PathBuilder extends AdvancedBase {
|
||||
path: require('path'),
|
||||
}
|
||||
|
||||
constructor() {
|
||||
constructor(parameters = {}) {
|
||||
super();
|
||||
if ( parameters.puterfs ) {
|
||||
this.modules.path =
|
||||
this.modules.path.posix;
|
||||
}
|
||||
this.path_ = '';
|
||||
}
|
||||
|
||||
static create () {
|
||||
return new PathBuilder();
|
||||
static create (parameters) {
|
||||
return new PathBuilder(parameters);
|
||||
}
|
||||
|
||||
static add (fragment, options) {
|
||||
return PathBuilder.create().add(fragment, options);
|
||||
}
|
||||
|
||||
static resolve (fragment) {
|
||||
const p = PathBuilder.create();
|
||||
static resolve (fragment, parameters = {}) {
|
||||
const { puterfs } = parameters;
|
||||
|
||||
const p = PathBuilder.create(parameters);
|
||||
const require = p.require;
|
||||
const node_path = require('path');
|
||||
fragment = node_path.resolve(fragment);
|
||||
return p.add(fragment).build();
|
||||
if ( process.platform === 'win32' && !parameters.puterfs ) {
|
||||
fragment = '/' + fragment.slice('c:\\'.length); // >:-(
|
||||
}
|
||||
let result = p.add(fragment).build();
|
||||
if ( puterfs && process.platform === 'win32' &&
|
||||
result.startsWith('\\')
|
||||
) {
|
||||
result = '/' + result.slice(1);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
add (fragment, options) {
|
||||
|
||||
@@ -278,7 +278,7 @@ label, input[type="text"] {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
input[type="text"], textarea {
|
||||
input[type="text"], textarea, input[type="number"] {
|
||||
display: block;
|
||||
width: 100%;
|
||||
height: 34px;
|
||||
|
||||
+171
-16
@@ -62,21 +62,20 @@ if(domain === 'puter.localhost'){
|
||||
static_hosting_domain = 'site.puter.localhost';
|
||||
}
|
||||
|
||||
// port
|
||||
// add port to static_hosting_domain if provided
|
||||
if (URLParams.has('puter.port') && URLParams.get('puter.port')) {
|
||||
static_hosting_domain = static_hosting_domain + `:` + URLParams.get('puter.port');
|
||||
static_hosting_domain = static_hosting_domain + `:` + html_encode(URLParams.get('puter.port'));
|
||||
}
|
||||
|
||||
// protocol
|
||||
let protocol = 'https';
|
||||
if (URLParams.has('puter.protocol')) {
|
||||
protocol = URLParams.get('puter.protocol');
|
||||
}
|
||||
if (URLParams.has('puter.protocol') && URLParams.get('puter.protocol') === 'http')
|
||||
protocol = 'http';
|
||||
|
||||
// port
|
||||
let port = '';
|
||||
if (URLParams.has('puter.port') && URLParams.get('puter.port')) {
|
||||
port = URLParams.get('puter.port');
|
||||
port = html_encode(URLParams.get('puter.port'));
|
||||
}
|
||||
|
||||
$(document).ready(function () {
|
||||
@@ -436,6 +435,8 @@ function generate_edit_app_section(app) {
|
||||
if(app.result)
|
||||
app = app.result;
|
||||
|
||||
let maximize_on_start = app.maximize_on_start ? 'checked' : '';
|
||||
|
||||
let h = ``;
|
||||
h += `
|
||||
<div class="edit-app-navbar">
|
||||
@@ -486,11 +487,6 @@ function generate_edit_app_section(app) {
|
||||
<label for="edit-app-app-id">App ID</label>
|
||||
<input type="text" style="width: 362px;" class="app-uid" value="${html_encode(app.uid)}" readonly>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="edit-app-maximize-on-start" name="edit-app-maximize-on-start" value="true" style="margin-top:30px;" ${app.maximize_on_start ? 'checked' : ''}>
|
||||
<label for="edit-app-maximize-on-start" style="display: inline;">Maximize window on start</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="edit-app-background" name="edit-app-background" value="true" style="margin-top:30px;" ${app.background ? 'checked' : ''}>
|
||||
<label for="edit-app-background" style="display: inline;">Run as a background process.</label>
|
||||
@@ -501,6 +497,35 @@ function generate_edit_app_section(app) {
|
||||
<label for="edit-app-fullpage-on-landing" style="display: inline;">Load in full-page mode when a user lands directly on this app.</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<input type="checkbox" id="edit-app-maximize-on-start" name="edit-app-maximize-on-start" value="true" style="margin-top:30px;" ${maximize_on_start ? 'checked' : ''}>
|
||||
<label for="edit-app-maximize-on-start" style="display: inline;">Maximize window on start</label>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<label for="edit-app-window-width">Window Width</label>
|
||||
<input type="number" id="edit-app-window-width" placeholder="800" value="${html_encode(app.metadata?.window_size?.width ?? 800)}" style="width:200px;" ${maximize_on_start ? 'disabled' : ''}>
|
||||
<label for="edit-app-window-height">Window Height</label>
|
||||
<input type="number" id="edit-app-window-height" placeholder="600" value="${html_encode(app.metadata?.window_size?.height ?? 600)}" style="width:200px;" ${maximize_on_start ? 'disabled' : ''}>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:30px;">
|
||||
<label for="edit-app-window-top">Window Top</label>
|
||||
<input type="number" id="edit-app-window-top" placeholder="100" value="${app.metadata?.window_position?.top ? html_encode(app.metadata.window_position.top) : ''}" style="width:200px;" ${maximize_on_start ? 'disabled' : ''}>
|
||||
<label for="edit-app-window-left">Window Left</label>
|
||||
<input type="number" id="edit-app-window-left" placeholder="100" value="${app.metadata?.window_position?.left ? html_encode(app.metadata.window_position.left) : ''}" style="width:200px;" ${maximize_on_start ? 'disabled' : ''}>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:30px;">
|
||||
<input type="checkbox" id="edit-app-window-resizable" name="edit-app-window-resizable" value="true" ${app.metadata?.window_resizable ? 'checked' : ''}>
|
||||
<label for="edit-app-window-resizable" style="display: inline;">Window Resizable</label>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:30px;">
|
||||
<input type="checkbox" id="edit-app-hide-titlebar" name="edit-app-hide-titlebar" value="true" ${app.metadata?.hide_titlebar ? 'checked' : ''}>
|
||||
<label for="edit-app-hide-titlebar" style="display: inline;">Hide Titlebar</label>
|
||||
</div>
|
||||
|
||||
<label for="edit-app-icon">Icon</label>
|
||||
<div id="edit-app-icon" style="background-image:url(${!app.icon ? './img/app.svg' : html_encode(app.icon)});" ${app.icon ? 'data-url="' + html_encode(app.icon) + '"' : ''}>
|
||||
<div id="change-app-icon">Change App Icon</div>
|
||||
@@ -567,7 +592,7 @@ async function edit_app_section(cur_app_name) {
|
||||
let items = e.detail.items;
|
||||
|
||||
// ----------------------------------------------------
|
||||
// one file dropped
|
||||
// one Puter files dropped
|
||||
// ----------------------------------------------------
|
||||
if (items.length === 1 && !items[0].isDirectory) {
|
||||
if (items[0].name.toLowerCase() === 'index.html') {
|
||||
@@ -593,7 +618,41 @@ async function edit_app_section(cur_app_name) {
|
||||
return;
|
||||
}
|
||||
// ----------------------------------------------------
|
||||
// one directory dropped
|
||||
// Multiple Puter files dropped
|
||||
// ----------------------------------------------------
|
||||
else if (items.length > 1) {
|
||||
let hasIndexHtml = false;
|
||||
for (let item of items) {
|
||||
if (item.name.toLowerCase() === 'index.html') {
|
||||
hasIndexHtml = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (hasIndexHtml) {
|
||||
dropped_items = items;
|
||||
$('.drop-area').removeClass('drop-area-hover');
|
||||
$('.drop-area').addClass('drop-area-ready-to-deploy');
|
||||
drop_area_content = `<p style="margin-bottom:0; font-weight: 500;">${items.length} items</p><p>Ready to deploy 🚀</p>`;
|
||||
$('.drop-area').html(drop_area_content);
|
||||
|
||||
// enable deploy button
|
||||
$('.deploy-btn').removeClass('disabled');
|
||||
} else {
|
||||
puter.ui.alert(`You need to have an index.html file in your deployment.`, [
|
||||
{
|
||||
label: 'Ok',
|
||||
},
|
||||
]);
|
||||
$('.drop-area').removeClass('drop-area-ready-to-deploy');
|
||||
$('.drop-area').removeClass('drop-area-hover');
|
||||
$('.deploy-btn').addClass('disabled');
|
||||
dropped_items = [];
|
||||
}
|
||||
return;
|
||||
}
|
||||
// ----------------------------------------------------
|
||||
// One Puter directory dropped
|
||||
// ----------------------------------------------------
|
||||
else if (items.length === 1 && items[0].isDirectory) {
|
||||
let children = await puter.fs.readdir(items[0].path);
|
||||
@@ -771,6 +830,11 @@ $(document).on('click', '.edit-app-save-btn', async function (e) {
|
||||
const index_url = $('#edit-app-index-url').val();
|
||||
const description = $('#edit-app-description').val();
|
||||
const uid = $('#edit-app-uid').val();
|
||||
const height = $('#edit-app-window-height').val();
|
||||
const width = $('#edit-app-window-width').val();
|
||||
const top = $('#edit-app-window-top').val();
|
||||
const left = $('#edit-app-window-left').val();
|
||||
|
||||
let filetype_associations = $('#edit-app-filetype-associations').val();
|
||||
|
||||
let icon;
|
||||
@@ -794,6 +858,24 @@ $(document).on('click', '.edit-app-save-btn', async function (e) {
|
||||
error = `<strong>Index URL</strong> must be a valid url.`;
|
||||
else if (!index_url.toLowerCase().startsWith('https://') && !index_url.toLowerCase().startsWith('http://'))
|
||||
error = `<strong>Index URL</strong> must start with 'https://' or 'http://'.`;
|
||||
// height must be a number
|
||||
else if (isNaN(height))
|
||||
error = `<strong>Window Height</strong> must be a number.`;
|
||||
// height must be greater than 0
|
||||
else if (height <= 0)
|
||||
error = `<strong>Window Height</strong> must be greater than 0.`;
|
||||
// width must be a number
|
||||
else if (isNaN(width))
|
||||
error = `<strong>Window Width</strong> must be a number.`;
|
||||
// width must be greater than 0
|
||||
else if (width <= 0)
|
||||
error = `<strong>Window Width</strong> must be greater than 0.`;
|
||||
// top must be a number
|
||||
else if (top && isNaN(top))
|
||||
error = `<strong>Window Top</strong> must be a number.`;
|
||||
// left must be a number
|
||||
else if (left && isNaN(left))
|
||||
error = `<strong>Window Left</strong> must be a number.`;
|
||||
|
||||
// download icon from URL
|
||||
else {
|
||||
@@ -838,6 +920,16 @@ $(document).on('click', '.edit-app-save-btn', async function (e) {
|
||||
background: $('#edit-app-background').is(":checked"),
|
||||
metadata: {
|
||||
fullpage_on_landing: $('#edit-app-fullpage-on-landing').is(":checked"),
|
||||
window_size: {
|
||||
width: width ?? 800,
|
||||
height: height ?? 600,
|
||||
},
|
||||
window_position: {
|
||||
top: top,
|
||||
left: left,
|
||||
},
|
||||
window_resizable: $('#edit-app-window-resizable').is(":checked"),
|
||||
hide_titlebar: $('#edit-app-hide-titlebar').is(":checked"),
|
||||
},
|
||||
filetypeAssociations: filetype_associations,
|
||||
}).then(async (app) => {
|
||||
@@ -1307,13 +1399,15 @@ window.deploy = async function (app, items) {
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// (A) Puter Items: If 'items' is a string and starts with /, it's a path to a Puter item
|
||||
// (A) One Puter Item: If 'items' is a string and starts with /, it's a path to a Puter item
|
||||
// --------------------------------------------------------------------
|
||||
if (typeof items === 'string' && (items.startsWith('/') || items.startsWith('~'))) {
|
||||
// perform stat on 'items'
|
||||
const stat = await puter.fs.stat(items);
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// Puter Directory
|
||||
// --------------------------------------------------------------------
|
||||
// Perform readdir on 'items'
|
||||
// todo there is apparently a bug in Puter where sometimes path is literally missing from the items
|
||||
// returned by readdir. This is the 'path' that readdit didn't return a path for: "~/Desktop/particle-clicker-master"
|
||||
@@ -1333,7 +1427,9 @@ window.deploy = async function (app, items) {
|
||||
}
|
||||
}
|
||||
}
|
||||
// --------------------------------------------------------------------
|
||||
// Puter File
|
||||
// --------------------------------------------------------------------
|
||||
else {
|
||||
// copy the 'files' to the app directory
|
||||
await puter.fs.copy(
|
||||
@@ -1370,9 +1466,57 @@ window.deploy = async function (app, items) {
|
||||
reset_drop_area();
|
||||
})
|
||||
}
|
||||
// --------------------------------------------------------------------
|
||||
// (B) Multiple Puter Items: If `items` is an Array `items[0]` has `uid`
|
||||
// then it's a Puter Item Array.
|
||||
// --------------------------------------------------------------------
|
||||
else if (Array.isArray(items) && items[0].uid) {
|
||||
// If there's no index.html in the root, return
|
||||
if (!hasRootIndexHtml)
|
||||
return;
|
||||
|
||||
// copy the 'files' to the app directory
|
||||
for (let item of items) {
|
||||
// perform copy
|
||||
await puter.fs.copy(
|
||||
item.fullPath ? item.fullPath : item.path ? item.path : item.filepath,
|
||||
appdata_dir.path,
|
||||
{ overwrite: true }
|
||||
);
|
||||
// update progress
|
||||
$('.deploy-percent').text(`(${Math.round((items.indexOf(item) / items.length) * 100)}%)`);
|
||||
}
|
||||
|
||||
// generate new hostname with a random suffix
|
||||
let hostname = `${currently_editing_app.name}-${(Math.random() + 1).toString(36).substring(7)}`;
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// Create a router for the app with the fresh hostname
|
||||
// we change hostname every time to prevent caching issues
|
||||
// --------------------------------------------------------------------
|
||||
puter.hosting.create(hostname, appdata_dir.path).then(async (res) => {
|
||||
// TODO this endpoint needs to be able to update only the specified fields
|
||||
puter.apps.update(currently_editing_app.name, {
|
||||
indexURL: protocol + `://${hostname}.` + static_hosting_domain,
|
||||
title: currently_editing_app.title,
|
||||
name: currently_editing_app.name,
|
||||
icon: currently_editing_app.icon,
|
||||
description: currently_editing_app.description,
|
||||
maximizeOnStart: currently_editing_app.maximize_on_start,
|
||||
background: currently_editing_app.background,
|
||||
filetypeAssociations: currently_editing_app.filetype_associations,
|
||||
})
|
||||
// set the 'Index URL' field for the 'Settings' tab
|
||||
$('#edit-app-index-url').val(protocol + `://${hostname}.` + static_hosting_domain);
|
||||
// show success message
|
||||
$('.deploy-success-msg').show();
|
||||
// reset drop area
|
||||
reset_drop_area();
|
||||
})
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------
|
||||
// (B) Local Items: Upload new deploy
|
||||
// (C) Local Items: Upload new deploy
|
||||
// --------------------------------------------------------------------
|
||||
else {
|
||||
puter.fs.upload(
|
||||
@@ -1928,4 +2072,15 @@ function getMimeType(extension) {
|
||||
|
||||
// Return the MIME type if found, otherwise return 'application/octet-stream'
|
||||
return mimeTypes[cleanExtension] || 'application/octet-stream';
|
||||
}
|
||||
}
|
||||
|
||||
// if edit-app-maximize-on-start is checked, disable window size and position fields
|
||||
$(document).on('change', '#edit-app-maximize-on-start', function (e) {
|
||||
if ($(this).is(':checked')) {
|
||||
$('#edit-app-window-width, #edit-app-window-height').prop('disabled', true);
|
||||
$('#edit-app-window-top, #edit-app-window-left').prop('disabled', true);
|
||||
} else {
|
||||
$('#edit-app-window-width, #edit-app-window-height').prop('disabled', false);
|
||||
$('#edit-app-window-top, #edit-app-window-left').prop('disabled', false);
|
||||
}
|
||||
})
|
||||
@@ -33,11 +33,15 @@ async function UIWindowSettings(options){
|
||||
|
||||
h += `<div class="settings-container">`;
|
||||
h += `<div class="settings">`;
|
||||
// side bar
|
||||
// sidebar toggle
|
||||
h += `<button class="sidebar-toggle hidden-lg hidden-xl"><div class="sidebar-toggle-button"><span></span><span></span><span></span></div></button>`;
|
||||
// sidebar
|
||||
h += `<div class="settings-sidebar disable-user-select disable-context-menu">`;
|
||||
tabs.forEach((tab, i) => {
|
||||
h += `<div class="settings-sidebar-item disable-context-menu disable-user-select ${i === 0 ? 'active' : ''}" data-settings="${tab.id}" style="background-image: url(${window.icons[tab.icon]});">${i18n(tab.title_i18n_key)}</div>`;
|
||||
});
|
||||
// sidebar items
|
||||
h += `<div class="settings-sidebar-burger disable-context-menu disable-user-select" style="background-image: url(${window.icons['menu']});"></div>`;
|
||||
tabs.forEach((tab, i) => {
|
||||
h += `<div class="settings-sidebar-item disable-context-menu disable-user-select ${i === 0 ? 'active' : ''}" data-settings="${tab.id}" style="background-image: url(${window.icons[tab.icon]});">${i18n(tab.title_i18n_key)}</div>`;
|
||||
});
|
||||
h += `</div>`;
|
||||
|
||||
// content
|
||||
@@ -123,5 +127,45 @@ async function UIWindowSettings(options){
|
||||
});
|
||||
}
|
||||
|
||||
$(document).on('mousedown', '.sidebar-toggle', function(e) {
|
||||
e.preventDefault();
|
||||
$('.settings-sidebar').toggleClass('active');
|
||||
$('.sidebar-toggle-button').toggleClass('active');
|
||||
// move sidebar toggle button
|
||||
setTimeout(() => {
|
||||
$('.sidebar-toggle').css({
|
||||
left: $('.settings-sidebar').hasClass('active') ? 243 : 2
|
||||
});
|
||||
}, 10);
|
||||
})
|
||||
|
||||
$(document).on('click', '.settings-sidebar-item', function(e) {
|
||||
// hide sidebar
|
||||
$('.settings-sidebar').removeClass('active');
|
||||
// move sidebar toggle button ro the right
|
||||
setTimeout(() => {
|
||||
$('.sidebar-toggle').css({
|
||||
left: 2
|
||||
});
|
||||
}, 10);
|
||||
|
||||
})
|
||||
|
||||
// clicking anywhere on the page will close the sidebar
|
||||
$(document).on('click', function(e) {
|
||||
// print event target class
|
||||
|
||||
if (!$(e.target).closest('.settings-sidebar').length && !$(e.target).closest('.sidebar-toggle-button').length && !$(e.target).hasClass('sidebar-toggle-button') && !$(e.target).hasClass('sidebar-toggle')) {
|
||||
$('.settings-sidebar').removeClass('active');
|
||||
$('.sidebar-toggle-button').removeClass('active');
|
||||
// move sidebar toggle button ro the right
|
||||
setTimeout(() => {
|
||||
$('.sidebar-toggle').css({
|
||||
left: 2
|
||||
});
|
||||
}, 10);
|
||||
|
||||
}
|
||||
})
|
||||
|
||||
export default UIWindowSettings
|
||||
@@ -215,7 +215,7 @@ async function UIDesktop(options){
|
||||
|
||||
// Update matching items
|
||||
// set new item name
|
||||
$(`.item[data-uid='${html_encode(item.uid)}'] .item-name`).html(html_encode(truncate_filename(item.name)).replaceAll(' ', ' '));
|
||||
$(`.item[data-uid='${html_encode(item.uid)}'] .item-name`).html(html_encode(truncate_filename(item.name)));
|
||||
|
||||
// Set new icon
|
||||
const new_icon = (item.is_dir ? window.icons['folder.svg'] : (await item_icon(item)).image);
|
||||
@@ -419,7 +419,7 @@ async function UIDesktop(options){
|
||||
|
||||
// Update matching items
|
||||
// Set new item name
|
||||
$(`.item[data-uid='${html_encode(item.uid)}'] .item-name`).html(html_encode(truncate_filename(item.name)).replaceAll(' ', ' '));
|
||||
$(`.item[data-uid='${html_encode(item.uid)}'] .item-name`).html(html_encode(truncate_filename(item.name)));
|
||||
|
||||
// Set new icon
|
||||
const new_icon = (item.is_dir ? window.icons['folder.svg'] : (await item_icon(item)).image);
|
||||
|
||||
@@ -162,7 +162,7 @@ function UIItem(options){
|
||||
h += `</div>`;
|
||||
|
||||
// name
|
||||
h += `<span class="item-name" data-item-id="${item_id}" title="${html_encode(options.name)}">${options.is_trash ? i18n('trash') : html_encode(truncate_filename(options.name)).replaceAll(' ', ' ')}</span>`
|
||||
h += `<pre class="item-name" data-item-id="${item_id}" title="${html_encode(options.name)}">${options.is_trash ? i18n('trash') : html_encode(truncate_filename(options.name))}</pre>`
|
||||
// name editor
|
||||
h += `<textarea class="item-name-editor hide-scrollbar" spellcheck="false" autocomplete="off" autocorrect="off" autocapitalize="off" data-gramm_editor="false">${html_encode(options.name)}</textarea>`
|
||||
h += `</div>`;
|
||||
@@ -653,7 +653,7 @@ function UIItem(options){
|
||||
UIAlert(`The name ".." is not allowed, because it is a reserved name. Please choose another name.`)
|
||||
}
|
||||
|
||||
$(el_item_name).html(html_encode(truncate_filename(options.name)).replaceAll(' ', ' '));
|
||||
$(el_item_name).html(html_encode(truncate_filename(options.name)));
|
||||
$(el_item_name).show();
|
||||
$(el_item_name_editor).val($(el_item).attr('data-name'));
|
||||
$(el_item_name_editor).hide();
|
||||
@@ -1412,7 +1412,7 @@ function UIItem(options){
|
||||
// --------------------------------------------------------
|
||||
$(el_item_name_editor).on('input keypress focus', function(){
|
||||
const val = $(el_item_name_editor).val();
|
||||
$('.item-name-shadow').html(html_encode(val).replaceAll(' ', ' '));
|
||||
$('.item-name-shadow').html(html_encode(val));
|
||||
if(val !== ''){
|
||||
const w = $('.item-name-shadow').width();
|
||||
const h = $('.item-name-shadow').height();
|
||||
|
||||
@@ -323,6 +323,10 @@ async function UIWindow(options) {
|
||||
frameborder="0"
|
||||
${options.iframe_url ? 'src="'+ html_encode(options.iframe_url)+'"' : ''}
|
||||
${options.iframe_srcdoc ? 'srcdoc="'+ html_encode(options.iframe_srcdoc) +'"' : ''}
|
||||
${window.co_isolation_enabled
|
||||
? 'credentialless allow="cross-origin-isolated" '
|
||||
: ''
|
||||
}
|
||||
allow = "accelerometer; camera; encrypted-media; gamepad; display-capture; geolocation; gyroscope; microphone; midi; clipboard-read; clipboard-write; fullscreen;"
|
||||
allowtransparency="true"
|
||||
allowpaymentrequest="true"
|
||||
|
||||
@@ -28,15 +28,17 @@ async function UIWindowSessionList(options){
|
||||
return new Promise(async (resolve) => {
|
||||
let h = '';
|
||||
h += `<div style="margin:10px;">`;
|
||||
h += `<div class="loading">${i18n('signing_in')}</div>`
|
||||
h += `<div style="overflow-y: scroll; max-width: 400px; margin: 0 auto;">`;
|
||||
h += `<h1 style="text-align: center; font-size: 18px; font-weight: normal; color: #757575;"><img src="${window.icons['logo-white.svg']}" style="padding: 4px; background-color: blue; border-radius: 5px; width: 25px; box-sizing: border-box; margin-bottom: -6px; margin-right: 6px;">${i18n('sign_in_with_puter')}</h1>`
|
||||
for (let index = 0; index < window.logged_in_users.length; index++) {
|
||||
const l_user = window.logged_in_users[index];
|
||||
h += `<div data-uuid="${l_user.uuid}" class="session-entry">${l_user.username}</div>`;
|
||||
}
|
||||
// loading indicator
|
||||
h += `<div class="loading">${i18n('signing_in')}</div>`;
|
||||
// session list
|
||||
h += `<div class="hide-scrollbar" style="overflow-y: scroll; max-width: 400px; margin: 0 auto;">`;
|
||||
h += `<h1 style="text-align: center; font-size: 18px; font-weight: normal; color: #757575;"><img src="${window.icons['logo-white.svg']}" style="padding: 4px; background-color: blue; border-radius: 5px; width: 25px; box-sizing: border-box; margin-bottom: -6px; margin-right: 6px;">${i18n('sign_in_with_puter')}</h1>`
|
||||
for (let index = 0; index < window.logged_in_users.length; index++) {
|
||||
const l_user = window.logged_in_users[index];
|
||||
h += `<div data-uuid="${l_user.uuid}" class="session-entry">${l_user.username}</div>`;
|
||||
}
|
||||
h += `</div>`;
|
||||
|
||||
// c2a
|
||||
h += `<div style="margin-top: 20px; margin-bottom: 20px; text-align:center;"><span class="login-c2a-session-list">Log Into Another Account</span> • <span class="signup-c2a-session-list">${i18n('create_account')}</span></div>`;
|
||||
h += `</div>`;
|
||||
|
||||
|
||||
@@ -22,14 +22,14 @@ async function UIWindowShare(items, recipient){
|
||||
return new Promise(async (resolve) => {
|
||||
let h = '';
|
||||
h += `<div style="padding: 30px 40px 20px; border-bottom: 1px solid #ced7e1;">`;
|
||||
h += `<div class="qr-code-window-close-btn generic-close-window-button" style="margin: 5px;"> × </div>`;
|
||||
h += `<div class="generic-close-window-button" style="margin: 5px;"> × </div>`;
|
||||
|
||||
//------------------------------------------------
|
||||
// Icon
|
||||
// Icons
|
||||
//------------------------------------------------
|
||||
|
||||
// 1 item shared
|
||||
h += `<div style="display:flex; justify-content: center; margin-bottom: 10px;">`;
|
||||
h += `<div style="display:flex; justify-content: center; margin-bottom: 10px; disable-user-select">`;
|
||||
// 1 item shared
|
||||
if(items.length === 1)
|
||||
h += `<img src="${items[0].icon}" style="width:70px; height:70px;">`;
|
||||
// 2 items shared
|
||||
@@ -58,7 +58,6 @@ async function UIWindowShare(items, recipient){
|
||||
h += `<img src="${items[3].icon}" style="width:70px; height:70px; margin-left:-60px; margin-top: -35px; z-index:2; transform:scale(0.4);">`;
|
||||
h += `<img src="${items[4].icon}" style="width:70px; height:70px; margin-left:-60px; margin-top: -45px; z-index:1; transform:scale(0.2);">`;
|
||||
}
|
||||
|
||||
h += `</div>`;
|
||||
|
||||
// ------------------------------------------------
|
||||
|
||||
+161
-24
@@ -17,7 +17,7 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
@font-face {
|
||||
@font-face {
|
||||
font-family: 'Inter';
|
||||
src: url('/fonts/Inter-Thin.ttf') format('truetype');
|
||||
font-weight: 100;
|
||||
@@ -77,7 +77,10 @@
|
||||
font-optical-sizing: auto;
|
||||
font-style: normal;
|
||||
font-variation-settings: "slnt"0;
|
||||
}
|
||||
|
||||
pre{
|
||||
font-family: "Inter", "Helvetica Neue", HelveticaNeue, Helvetica, Arial, sans-serif;
|
||||
}
|
||||
|
||||
:root {
|
||||
@@ -617,8 +620,9 @@ span.header-sort-icon img {
|
||||
display: inline-block;
|
||||
font-weight: bold;
|
||||
border-radius: 4px;
|
||||
line-break: anywhere;
|
||||
box-sizing: border-box;
|
||||
white-space: pre-wrap;
|
||||
word-break: break-word;
|
||||
}
|
||||
|
||||
.item-name {
|
||||
@@ -805,6 +809,7 @@ span.header-sort-icon img {
|
||||
.window-menubar:not(.window-menubar-global):empty {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.window-menubar {
|
||||
display: flex;
|
||||
box-sizing: border-box;
|
||||
@@ -815,7 +820,7 @@ span.header-sort-icon img {
|
||||
padding: 2px 5px;
|
||||
}
|
||||
|
||||
.window-menubar-global{
|
||||
.window-menubar-global {
|
||||
background-color: transparent;
|
||||
color: white;
|
||||
border-bottom: none;
|
||||
@@ -825,7 +830,8 @@ span.header-sort-icon img {
|
||||
margin-left: 15px;
|
||||
padding: 0;
|
||||
}
|
||||
.window-menubar-global .window-menubar-item span{
|
||||
|
||||
.window-menubar-global .window-menubar-item span {
|
||||
padding: 3px 10px;
|
||||
font-size: 13px;
|
||||
border-radius: 3px;
|
||||
@@ -1595,13 +1601,16 @@ span.header-sort-icon img {
|
||||
display: none;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.context-menu .has-open-context-menu-submenu,
|
||||
.context-menu .context-menu-item-active {
|
||||
border-radius: 4px;
|
||||
}
|
||||
.context-menu .has-open-context-menu-submenu{
|
||||
|
||||
.context-menu .has-open-context-menu-submenu {
|
||||
background-color: #dfdfdf;
|
||||
}
|
||||
|
||||
.context-menu .context-menu-item-active {
|
||||
background-color: var(--select-color);
|
||||
color: white;
|
||||
@@ -2456,10 +2465,11 @@ label {
|
||||
/*****************************************************
|
||||
* Notification
|
||||
*****************************************************/
|
||||
.notification, .notification-wrapper{
|
||||
.notification, .notification-wrapper {
|
||||
width: 320px;
|
||||
border-radius: 11px;
|
||||
}
|
||||
|
||||
.notification {
|
||||
min-height: 54px;
|
||||
background: #ffffffcd;
|
||||
@@ -2472,9 +2482,11 @@ label {
|
||||
flex-direction: row;
|
||||
pointer-events: all;
|
||||
}
|
||||
.notification-wrapper{
|
||||
|
||||
.notification-wrapper {
|
||||
overflow: visible;
|
||||
}
|
||||
|
||||
.notification-close {
|
||||
position: absolute;
|
||||
background: white;
|
||||
@@ -2491,7 +2503,8 @@ label {
|
||||
.notification:hover .notification-close {
|
||||
display: block;
|
||||
}
|
||||
.notification-icon{
|
||||
|
||||
.notification-icon {
|
||||
width: 40px;
|
||||
margin: 10px 5px 10px 15px;
|
||||
border-radius: 50%;
|
||||
@@ -2500,25 +2513,30 @@ label {
|
||||
align-items: center;
|
||||
filter: drop-shadow(0px 0px 0.5px rgb(51, 51, 51));
|
||||
}
|
||||
.notification-icon img{
|
||||
|
||||
.notification-icon img {
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
}
|
||||
.notification-title{
|
||||
|
||||
.notification-title {
|
||||
font-size: 12px;
|
||||
font-weight: 600;
|
||||
}
|
||||
.notification-text{
|
||||
font-size: 12px;
|
||||
|
||||
.notification-text {
|
||||
font-size: 12px;
|
||||
margin-top: 4px;
|
||||
}
|
||||
.notification-content{
|
||||
flex-grow:1;
|
||||
|
||||
.notification-content {
|
||||
flex-grow: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 10px;
|
||||
}
|
||||
.notification-container{
|
||||
|
||||
.notification-container {
|
||||
position: absolute;
|
||||
top: 40px;
|
||||
right: 10px;
|
||||
@@ -2527,7 +2545,7 @@ label {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.notifications-close-all{
|
||||
.notifications-close-all {
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
@@ -2542,16 +2560,20 @@ label {
|
||||
cursor: pointer;
|
||||
filter: drop-shadow(0px 0px 0.5px rgb(51, 51, 51));
|
||||
}
|
||||
.notifications-close-all:hover{
|
||||
|
||||
.notifications-close-all:hover {
|
||||
background-color: #dee1e3;
|
||||
}
|
||||
.notification-container.has-multiple{
|
||||
|
||||
.notification-container.has-multiple {
|
||||
pointer-events: all;
|
||||
}
|
||||
.notification-container.has-multiple:hover .notifications-close-all{
|
||||
|
||||
.notification-container.has-multiple:hover .notifications-close-all {
|
||||
pointer-events: all;
|
||||
opacity: 1 !important;
|
||||
}
|
||||
|
||||
/*****************************************************
|
||||
* Start
|
||||
*****************************************************/
|
||||
@@ -3027,12 +3049,13 @@ fieldset[name=number-code] {
|
||||
border: 2px solid #CCC;
|
||||
}
|
||||
|
||||
.launch-search-wrapper{
|
||||
margin-bottom: 10px;
|
||||
padding: 5px;
|
||||
.launch-search-wrapper {
|
||||
margin-bottom: 10px;
|
||||
padding: 5px;
|
||||
position: relative;
|
||||
}
|
||||
.device-phone .launch-search-wrapper{
|
||||
|
||||
.device-phone .launch-search-wrapper {
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
@@ -3572,7 +3595,7 @@ fieldset[name=number-code] {
|
||||
background-color: #f9f9f9;
|
||||
border-right: 1px solid #e0e0e0;
|
||||
padding: 20px;
|
||||
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.settings-sidebar-item {
|
||||
@@ -3996,4 +4019,118 @@ fieldset[name=number-code] {
|
||||
flex-direction: row;
|
||||
gap: 10px;
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
/* Extra small devices (phones, less than 576px) */
|
||||
@media (max-width: 575.98px) {
|
||||
.hidden-xs {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Small devices (landscape phones, 576px and up) */
|
||||
@media (min-width: 576px) and (max-width: 767.98px) {
|
||||
.hidden-sm {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Medium devices (tablets, 768px and up) */
|
||||
@media (min-width: 768px) and (max-width: 991.98px) {
|
||||
.hidden-md {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Large devices (desktops, 992px and up) */
|
||||
@media (min-width: 992px) and (max-width: 1199.98px) {
|
||||
.hidden-lg {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Extra large devices (large desktops, 1200px and up) */
|
||||
@media (min-width: 1200px) {
|
||||
.hidden-xl {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
/* Visible classes */
|
||||
.visible-xs,
|
||||
.visible-sm,
|
||||
.visible-md,
|
||||
.visible-lg,
|
||||
.visible-xl {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
@media (max-width: 575.98px) {
|
||||
.visible-xs {
|
||||
display: block !important;
|
||||
}
|
||||
.settings-sidebar {
|
||||
display: none;
|
||||
position: fixed;
|
||||
height: 100%;
|
||||
z-index: 9;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 576px) and (max-width: 767.98px) {
|
||||
.visible-sm {
|
||||
display: block !important;
|
||||
}
|
||||
.settings-sidebar {
|
||||
display: none;
|
||||
position: fixed;
|
||||
height: 100%;
|
||||
z-index: 9;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 768px) and (max-width: 991.98px) {
|
||||
.visible-md {
|
||||
display: block !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 992px) and (max-width: 1199.98px) {
|
||||
.visible-lg {
|
||||
display: block !important;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 1200px) {
|
||||
.visible-xl {
|
||||
display: block !important;
|
||||
}
|
||||
}
|
||||
|
||||
.sidebar-toggle{
|
||||
position: fixed;
|
||||
z-index: 9999999999;
|
||||
top: 32px;
|
||||
left: 2px;
|
||||
border: 0;
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
.sidebar-toggle .sidebar-toggle-button {
|
||||
height: 20px;
|
||||
width: 20px;
|
||||
}
|
||||
|
||||
.sidebar-toggle span:nth-child(1) {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
.sidebar-toggle span {
|
||||
border-bottom: 2px solid #858585;
|
||||
display: block;
|
||||
margin-bottom: 5px;
|
||||
width: 100%;
|
||||
}
|
||||
.settings-sidebar.active {
|
||||
display: block;
|
||||
}
|
||||
@@ -231,6 +231,8 @@ window.is_auto_arrange_enabled = true;
|
||||
window.desktop_item_positions = {};
|
||||
window.reset_item_positions = true; // The variable decides if the item positions should be reset when the user enabled auto arrange
|
||||
|
||||
window.file_templates = []
|
||||
|
||||
// default language
|
||||
window.locale = 'en';
|
||||
|
||||
|
||||
+72
-3
@@ -432,7 +432,7 @@ window.refresh_user_data = async (auth_token)=>{
|
||||
}
|
||||
}
|
||||
|
||||
window.update_auth_data = (auth_token, user)=>{
|
||||
window.update_auth_data = async (auth_token, user)=>{
|
||||
window.auth_token = auth_token;
|
||||
localStorage.setItem('auth_token', auth_token);
|
||||
|
||||
@@ -493,6 +493,9 @@ window.update_auth_data = (auth_token, user)=>{
|
||||
$('.user-options-login-btn, .user-options-create-account-btn').hide();
|
||||
$('.user-options-menu-btn').show();
|
||||
}
|
||||
|
||||
// Search and store user templates
|
||||
window.file_templates = await window.available_templates()
|
||||
}
|
||||
|
||||
window.mutate_user_preferences = function(user_preferences_delta) {
|
||||
@@ -837,6 +840,66 @@ window.create_file = async(options)=>{
|
||||
}
|
||||
}
|
||||
|
||||
window.available_templates = async () => {
|
||||
const baseRoute = `/${window.user.username}`
|
||||
const keywords = ["template", "templates", i18n('template')]
|
||||
//make sure all its lowercase
|
||||
const lowerCaseKeywords = keywords.map(keywords => keywords.toLowerCase())
|
||||
|
||||
//create file
|
||||
try{
|
||||
// search the folder name i18n("template"), "template" or "templates"
|
||||
const files = await puter.fs.readdir(baseRoute)
|
||||
|
||||
const hasTemplateFolder = files.find(file => lowerCaseKeywords.includes(file.name.toLowerCase()))
|
||||
console.log(hasTemplateFolder)
|
||||
|
||||
if(!hasTemplateFolder){
|
||||
return []
|
||||
}
|
||||
|
||||
const hasTemplateFiles = await puter.fs.readdir(baseRoute + "/" + hasTemplateFolder.name)
|
||||
console.log(hasTemplateFiles)
|
||||
|
||||
if(hasTemplateFiles.length == 0) {
|
||||
return []
|
||||
}
|
||||
|
||||
let result = []
|
||||
|
||||
hasTemplateFiles.forEach(element => {
|
||||
console.log(element)
|
||||
|
||||
const extIndex = element.name.lastIndexOf('.');
|
||||
const name = extIndex === -1
|
||||
? element.name
|
||||
: element.name.slice(0, extIndex);
|
||||
let extension = extIndex === -1
|
||||
? ''
|
||||
: element.name.slice(extIndex + 1);
|
||||
|
||||
if(extension == "txt") extension = "text"
|
||||
|
||||
const _path = path.join( baseRoute, hasTemplateFolder.name, element.name);
|
||||
|
||||
console.log(_path)
|
||||
const itemStructure = {
|
||||
path: _path,
|
||||
html: `${extension.toUpperCase()} ${name}`,
|
||||
extension:extension,
|
||||
name: element.name
|
||||
}
|
||||
result.push(itemStructure)
|
||||
});
|
||||
|
||||
// return result
|
||||
return result
|
||||
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
}
|
||||
}
|
||||
|
||||
window.create_shortcut = async(filename, is_dir, basedir, appendto_element, shortcut_to, shortcut_to_path)=>{
|
||||
let dirname = basedir;
|
||||
const extname = path.extname(filename);
|
||||
@@ -1169,7 +1232,13 @@ window.trigger_download = (paths)=>{
|
||||
|
||||
urls.forEach(async function (e) {
|
||||
const anti_csrf = await (async () => {
|
||||
const resp = await fetch(`${window.gui_origin}/get-anticsrf-token`);
|
||||
const resp = await fetch(
|
||||
`${window.gui_origin}/get-anticsrf-token`,{
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': 'Bearer ' + window.auth_token,
|
||||
}
|
||||
},)
|
||||
const { token } = await resp.json();
|
||||
return token;
|
||||
})();
|
||||
@@ -2089,7 +2158,7 @@ window.rename_file = async(options, new_name, old_name, old_path, el_item, el_it
|
||||
}
|
||||
|
||||
// Set new item name
|
||||
$(`.item[data-uid='${$(el_item).attr('data-uid')}'] .item-name`).html(html_encode(truncate_filename(new_name)).replaceAll(' ', ' '));
|
||||
$(`.item[data-uid='${$(el_item).attr('data-uid')}'] .item-name`).html(html_encode(truncate_filename(new_name)));
|
||||
$(el_item_name).show();
|
||||
|
||||
// Hide item name editor
|
||||
|
||||
@@ -136,7 +136,7 @@ const get_html_element_from_options = async function(options){
|
||||
h += `</div>`;
|
||||
|
||||
// name
|
||||
h += `<span class="item-name" data-item-id="${item_id}" title="${html_encode(options.name)}">${html_encode(truncate_filename(options.name)).replaceAll(' ', ' ')}</span>`
|
||||
h += `<span class="item-name" data-item-id="${item_id}" title="${html_encode(options.name)}">${html_encode(truncate_filename(options.name))}</span>`
|
||||
// name editor
|
||||
h += `<textarea class="item-name-editor hide-scrollbar" spellcheck="false" autocomplete="off" autocorrect="off" autocapitalize="off" data-gramm_editor="false">${html_encode(options.name)}</textarea>`
|
||||
h += `</div>`;
|
||||
|
||||
@@ -36,7 +36,17 @@ const launch_app = async (options)=>{
|
||||
}
|
||||
|
||||
// If the app object is not provided, get it from the server
|
||||
let app_info = options.app_obj ?? await window.get_apps(options.name);
|
||||
let app_info;
|
||||
|
||||
// explorer is a special case
|
||||
if(options.name === 'explorer'){
|
||||
console.log('explorer');
|
||||
app_info = [];
|
||||
}
|
||||
else if(options.app_obj)
|
||||
app_info = options.app_obj;
|
||||
else
|
||||
app_info = await puter.apps.get(options.name);
|
||||
|
||||
// For backward compatibility reasons we need to make sure that both `uuid` and `uid` are set
|
||||
app_info.uuid = app_info.uuid ?? app_info.uid;
|
||||
@@ -68,7 +78,7 @@ const launch_app = async (options)=>{
|
||||
//-----------------------------------
|
||||
// maximize on start
|
||||
//-----------------------------------
|
||||
if(app_info.maximize_on_start && app_info.maximize_on_start === 1)
|
||||
if(app_info.maximize_on_start)
|
||||
options.maximized = 1;
|
||||
|
||||
//-----------------------------------
|
||||
@@ -197,7 +207,7 @@ const launch_app = async (options)=>{
|
||||
|
||||
// In godmode, we add the super token to the iframe URL
|
||||
// so that the app can access everything.
|
||||
if (app_info.godmode && app_info.godmode === 1){
|
||||
if (app_info.godmode && (app_info.godmode === true || app_info.godmode === 1)){
|
||||
iframe_url.searchParams.append('puter.auth.token', window.auth_token);
|
||||
iframe_url.searchParams.append('puter.auth.username', window.user.username);
|
||||
}
|
||||
@@ -254,6 +264,44 @@ const launch_app = async (options)=>{
|
||||
// register app_instance_uid
|
||||
window.app_instance_ids.add(uuid);
|
||||
|
||||
// width
|
||||
let window_width;
|
||||
if(app_info.metadata?.window_size?.width !== undefined && app_info.metadata?.window_size?.width !== '')
|
||||
window_width = parseFloat(app_info.metadata.window_size.width);
|
||||
if(options.maximized)
|
||||
window_width = '100%';
|
||||
|
||||
// height
|
||||
let window_height;
|
||||
if(app_info.metadata?.window_size?.height !== undefined && app_info.metadata?.window_size?.height !== ''){
|
||||
window_height = parseFloat(app_info.metadata.window_size.height);
|
||||
}if(options.maximized)
|
||||
window_height = `calc(100% - ${window.taskbar_height + window.toolbar_height + 1}px)`;
|
||||
|
||||
// top
|
||||
let top;
|
||||
if(app_info.metadata?.window_position?.top !== undefined && app_info.metadata?.window_position?.top !== '')
|
||||
top = parseFloat(app_info.metadata.window_position.top) + window.toolbar_height + 1;
|
||||
if(options.maximized)
|
||||
top = 0;
|
||||
|
||||
// left
|
||||
let left;
|
||||
if(app_info.metadata?.window_position?.left !== undefined && app_info.metadata?.window_position?.left !== '')
|
||||
left = parseFloat(app_info.metadata.window_position.left);
|
||||
if(options.maximized)
|
||||
left = 0;
|
||||
|
||||
// window_resizable
|
||||
let window_resizable = true;
|
||||
if(app_info.metadata?.window_resizable !== undefined && typeof app_info.metadata.window_resizable === 'boolean')
|
||||
window_resizable = app_info.metadata.window_resizable;
|
||||
|
||||
// hide_titlebar
|
||||
let hide_titlebar = false;
|
||||
if(app_info.metadata?.hide_titlebar !== undefined && typeof app_info.metadata.hide_titlebar === 'boolean')
|
||||
hide_titlebar = app_info.metadata.hide_titlebar;
|
||||
|
||||
// open window
|
||||
el_win = UIWindow({
|
||||
element_uuid: uuid,
|
||||
@@ -264,18 +312,21 @@ const launch_app = async (options)=>{
|
||||
window_class: 'window-app',
|
||||
update_window_url: true,
|
||||
app_uuid: app_info.uuid ?? app_info.uid,
|
||||
top: options.maximized ? 0 : undefined,
|
||||
left: options.maximized ? 0 : undefined,
|
||||
height: options.maximized ? `calc(100% - ${window.taskbar_height + window.toolbar_height + 1}px)` : undefined,
|
||||
width: options.maximized ? `100%` : undefined,
|
||||
top: top,
|
||||
left: left,
|
||||
height: window_height,
|
||||
width: window_width,
|
||||
app: options.name,
|
||||
is_visible: ! app_info.background,
|
||||
is_maximized: options.maximized,
|
||||
is_fullpage: options.is_fullpage,
|
||||
...window_options,
|
||||
is_resizable: window_resizable,
|
||||
has_head: ! hide_titlebar,
|
||||
show_in_taskbar: app_info.background ? false : window_options?.show_in_taskbar,
|
||||
});
|
||||
|
||||
// If the app is not in the background, show the window
|
||||
if ( ! app_info.background ) {
|
||||
$(el_win).show();
|
||||
}
|
||||
|
||||
@@ -27,52 +27,86 @@
|
||||
*/
|
||||
|
||||
const new_context_menu_item = function(dirname, append_to_element){
|
||||
return {
|
||||
html: i18n('new'),
|
||||
items: [
|
||||
// New Folder
|
||||
{
|
||||
html: i18n('new_folder'),
|
||||
icon: `<img src="${html_encode(window.icons['folder.svg'])}" class="ctx-item-icon">`,
|
||||
onClick: function(){
|
||||
window.create_folder(dirname, append_to_element);
|
||||
}
|
||||
|
||||
const baseItems = [
|
||||
// New Folder
|
||||
{
|
||||
html: i18n('new_folder'),
|
||||
icon: `<img src="${html_encode(window.icons['folder.svg'])}" class="ctx-item-icon">`,
|
||||
onClick: function() {
|
||||
window.create_folder(dirname, append_to_element);
|
||||
},
|
||||
// divider
|
||||
'-',
|
||||
// Text Document
|
||||
{
|
||||
html: i18n('text_document'),
|
||||
icon: `<img src="${html_encode(window.icons['file-text.svg'])}" class="ctx-item-icon">`,
|
||||
onClick: async function(){
|
||||
window.create_file({dirname: dirname, append_to_element: append_to_element, name: 'New File.txt'});
|
||||
}
|
||||
},
|
||||
// HTML Document
|
||||
{
|
||||
html: i18n('html_document'),
|
||||
icon: `<img src="${html_encode(window.icons['file-html.svg'])}" class="ctx-item-icon">`,
|
||||
onClick: async function(){
|
||||
window.create_file({dirname: dirname, append_to_element: append_to_element, name: 'New File.html'});
|
||||
}
|
||||
},
|
||||
// JPG Image
|
||||
{
|
||||
html: i18n('jpeg_image'),
|
||||
icon: `<img src="${html_encode(window.icons['file-image.svg'])}" class="ctx-item-icon">`,
|
||||
onClick: async function(){
|
||||
var canvas = document.createElement("canvas");
|
||||
},
|
||||
// divider
|
||||
'-',
|
||||
// Text Document
|
||||
{
|
||||
html: i18n('text_document'),
|
||||
icon: `<img src="${html_encode(window.icons['file-text.svg'])}" class="ctx-item-icon">`,
|
||||
onClick: async function() {
|
||||
window.create_file({dirname: dirname, append_to_element: append_to_element, name: 'New File.txt'});
|
||||
}
|
||||
},
|
||||
// HTML Document
|
||||
{
|
||||
html: i18n('html_document'),
|
||||
icon: `<img src="${html_encode(window.icons['file-html.svg'])}" class="ctx-item-icon">`,
|
||||
onClick: async function() {
|
||||
window.create_file({dirname: dirname, append_to_element: append_to_element, name: 'New File.html'});
|
||||
}
|
||||
},
|
||||
// JPG Image
|
||||
{
|
||||
html: i18n('jpeg_image'),
|
||||
icon: `<img src="${html_encode(window.icons['file-image.svg'])}" class="ctx-item-icon">`,
|
||||
onClick: async function() {
|
||||
var canvas = document.createElement("canvas");
|
||||
|
||||
canvas.width = 800;
|
||||
canvas.height = 600;
|
||||
|
||||
canvas.toBlob((blob) =>{
|
||||
window.create_file({dirname: dirname, append_to_element: append_to_element, name: 'New Image.jpg', content: blob});
|
||||
canvas.width = 800;
|
||||
canvas.height = 600;
|
||||
|
||||
canvas.toBlob((blob) => {
|
||||
window.create_file({dirname: dirname, append_to_element: append_to_element, name: 'New Image.jpg', content: blob});
|
||||
});
|
||||
}
|
||||
},
|
||||
];
|
||||
|
||||
//Show file_templates on the lower part of "New"
|
||||
if (window.file_templates.length > 0) {
|
||||
// divider
|
||||
baseItems.push('-');
|
||||
|
||||
// User templates
|
||||
baseItems.push({
|
||||
html: "User templates",
|
||||
icon: `<img src="${html_encode(window.icons['file-template.svg'])}" class="ctx-item-icon">`,
|
||||
items: window.file_templates.map(template => ({
|
||||
html: template.html,
|
||||
icon: `<img src="${html_encode(window.icons[`file-${template.extension}.svg`])}" class="ctx-item-icon">`,
|
||||
onClick: async function () {
|
||||
const content = await puter.fs.read(template.path);
|
||||
window.create_file({
|
||||
dirname: dirname,
|
||||
append_to_element: append_to_element,
|
||||
name: template.name,
|
||||
content,
|
||||
});
|
||||
}
|
||||
},
|
||||
]
|
||||
}))
|
||||
});
|
||||
} else {
|
||||
// baseItems.push({
|
||||
// html: "No templates found",
|
||||
// icon: `<img src="${html_encode(window.icons['file-template.svg'])}" class="ctx-item-icon">`,
|
||||
// });
|
||||
}
|
||||
|
||||
//Conditional rendering for the templates
|
||||
return {
|
||||
html: i18n('new'),
|
||||
items: baseItems
|
||||
};
|
||||
}
|
||||
|
||||
export default new_context_menu_item;
|
||||
@@ -17,72 +17,162 @@
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Traslation notes:
|
||||
* - Change all "Email" to "Correo electrónico"
|
||||
* - puter_description the most acurated translation for "privacy-first personal cloud" I could think of is "servicio de nube personal enfocado en privacidad"
|
||||
* - plural_suffix: 's' has no direct translation to spanish. There are multiple plural suffix in spanish 'as' || "es" || "os || "s". Leave "s" as it is only been used on item: 'elemento' and will end up as 'elementos'
|
||||
*/
|
||||
|
||||
const es = {
|
||||
name: "Español",
|
||||
english_name: "Spanish",
|
||||
code: "es",
|
||||
dictionary: {
|
||||
about: "Acerca De",
|
||||
account: "Cuenta",
|
||||
account_password: "Verifica Contraseña De La Cuenta",
|
||||
access_granted_to: "Acceso Permitido A",
|
||||
add_existing_account: "Añadir una cuenta existente",
|
||||
all_fields_required: 'Todos los campos son obligatorios.',
|
||||
allow: 'Permitir',
|
||||
apply: "Aplicar",
|
||||
ascending: 'Ascendiente',
|
||||
associated_websites: "Sitios Web Asociados",
|
||||
auto_arrange: 'Organización Automática',
|
||||
background: "Fondo",
|
||||
browse: "Buscar",
|
||||
cancel: 'Cancelar',
|
||||
center: 'Centrar',
|
||||
change_desktop_background: 'Cambiar el fondo de pantalla…',
|
||||
change_email: "Cambiar Correo Electrónico",
|
||||
change_language: "Cambiar Idioma",
|
||||
change_password: "Cambiar Contraseña",
|
||||
change_ui_colors: "Cambiar colores de la interfaz",
|
||||
change_username: "Cambiar Nombre de Usuario",
|
||||
close: 'Cerrar',
|
||||
close_all_windows: "Cerrar todas las ventanas",
|
||||
close_all_windows_confirm: "¿Estás seguro de que quieres cerrar todas las ventanas?",
|
||||
close_all_windows_and_log_out: 'Cerrar ventanas y cerrar sesión',
|
||||
change_always_open_with: "¿Quieres abrir siempre este tipo de archivos con",
|
||||
color: 'Color',
|
||||
confirm_account_for_free_referral_storage_c2a: 'Crea una cuenta y confirma tu dirección de email para recibir 1 GB de almacenamiento gratuito. Tu amigo recibirá 1 GB de almacenamiento gratuito también.',
|
||||
confirm: 'Confirmar',
|
||||
confirm_2fa_setup: 'He añadido el código a mi aplicación de autenticación',
|
||||
confirm_2fa_recovery: 'He guardado mis códigos de recuperación en un lugar seguro',
|
||||
confirm_account_for_free_referral_storage_c2a: 'Crea una cuenta y confirma tu correo electrónico para recibir 1 GB de almacenamiento gratuito. Tu amigo recibirá 1 GB de almacenamiento gratuito también.',
|
||||
confirm_code_generic_incorrect: "Código incorrecto.",
|
||||
confirm_code_generic_too_many_requests: "Too many requests. Please wait a few minutes.",
|
||||
confirm_code_generic_submit: "Enviar código",
|
||||
confirm_code_generic_try_again: "Intenta nuevamente",
|
||||
confirm_code_generic_title: "Enter Confirmation Code",
|
||||
confirm_code_2fa_instruction: "Ingresa los 6 dígitos de tu aplicación de autenticación.",
|
||||
confirm_code_2fa_submit_btn: "Enviar",
|
||||
confirm_code_2fa_title: "Ingrese el código de 2FA",
|
||||
confirm_delete_multiple_items: '¿Estás seguro de que quieres eliminar permanentemente estos elementos?',
|
||||
confirm_delete_single_item: '¿Quieres eliminar este elemento permanentemente?',
|
||||
confirm_open_apps_log_out: 'Tienes aplicaciones abiertas.¿Estás seguro de que quieres cerrar sesión?',
|
||||
confirm_new_password: "Confirma la Nueva Contraseña",
|
||||
confirm_delete_user: "¿Estás seguro que quieres borrar esta cuenta? Todos tus archivos e información serán borrados permanentemente. Esta acción no se puede deshacer.",
|
||||
confirm_delete_user_title: "¿Eliminar cuenta?",
|
||||
confirm_session_revoke: "¿Estás seguro de que quieres revocar esta sesión?",
|
||||
confirm_your_email_address: "Confirma tu dirección de correo electrónico",
|
||||
contact_us: "Contáctanos",
|
||||
contact_us_verification_required: "Debes tener un correo electrónico verificado para usar esto.",
|
||||
contain: 'Contiene',
|
||||
continue: "Continuar",
|
||||
copy: 'Copiar',
|
||||
copy_link: "Copiar Enlace",
|
||||
copying: "Copiando",
|
||||
copying_file: "Copiando %%",
|
||||
cover: 'Cubrir',
|
||||
create_account: "Crear una cuenta",
|
||||
create_free_account: "Crear una cuenta gratuita",
|
||||
create_shortcut: "Crear un acceso directo",
|
||||
credits: "Creditos",
|
||||
current_password: "Contraseña actual",
|
||||
cut: 'Cortar',
|
||||
clock: "Reloj",
|
||||
clock_visible_hide: 'Ocultar - Siempre oculto',
|
||||
clock_visible_show: 'Mostrar - Siempre visible',
|
||||
clock_visible_auto: 'Auto - Por defecto, visible solo en modo pantalla completa.',
|
||||
close_all: 'Cerrar todo',
|
||||
created: 'Creado',
|
||||
date_modified: 'Fecha de modificación',
|
||||
default: 'Por defecto',
|
||||
delete: 'Borrar',
|
||||
delete_account: "Borrar cuenta",
|
||||
delete_permanently: "Borrar permanentemente",
|
||||
deleting_file: "Eliminando %%",
|
||||
deploy_as_app: 'Desplegar como una aplicación',
|
||||
descending: 'Descendiente',
|
||||
desktop_background_fit: "Llenar",
|
||||
dir_published_as_website: `%strong% ha sido publicado a:`,
|
||||
desktop: 'Escritorio',
|
||||
desktop_background_fit: "Ajustar",
|
||||
developers: "Desarrolladores",
|
||||
dir_published_as_website: `%strong% ha sido publicado en:`,
|
||||
disable_2fa: 'Deshabilitar 2FA',
|
||||
disable_2fa_confirm: "¿Estás seguro que quieres deshabilitar 2FA?",
|
||||
disable_2fa_instructions: "Ingresa tu contraseña para deshabilitar 2FA.",
|
||||
disassociate_dir: "Desvincular directorio",
|
||||
documents: 'Documentos',
|
||||
dont_allow: 'No permitir',
|
||||
download: 'Descargar',
|
||||
download_file: 'Descargar archivo',
|
||||
downloading: "Descargando",
|
||||
email: "Email",
|
||||
email_or_username: "Email o Nombre de Usuario",
|
||||
email: "Correo electrónico",
|
||||
email_change_confirmation_sent: "Se ha enviado un mensaje de confirmación a tu nueva dirección de correo electrónico. Por favor, revisa tu bandeja de entrada y sigue las instrucciónes para completar el proceso.",
|
||||
email_invalid: 'El correo electrónico no es válido.',
|
||||
email_or_username: "Correo electrónico o Nombre de Usuario",
|
||||
email_required: 'El correo electrónico es obligatorio.',
|
||||
empty_trash: 'Vaciar la papelera',
|
||||
empty_trash_confirmation: `¿Estás seguro de que quieres borrar permanentemente todos los elementos de la Papelera?`,
|
||||
emptying_trash: 'Vaciando la papelera…',
|
||||
feedback: "Feedback",
|
||||
feedback_c2a: "Por favor, usa el formulario para enviarnos tu feedback, comentario y reportar bugs.",
|
||||
feedback_sent_confirmation: "Gracias por ponerte en contacto con nosotros. Si tienes un email vinculado con la cuenta, nos pondremos en contacto contigo tan pronto como podamos.",
|
||||
forgot_pass_c2a: "¿Contraseña olvidada?",
|
||||
enable_2fa: 'Habilitar 2FA',
|
||||
end_hard: "Finalizar abruptamente",
|
||||
end_process_force_confirm: "¿Estás seguro de que quieres forzar la salida de este proceso?",
|
||||
end_soft: "Finalizar suavemente",
|
||||
enlarged_qr_code: "Código QR ampliado",
|
||||
enter_password_to_confirm_delete_user: "Ingresa tu contraseña para confirmar la eliminación de la cuenta",
|
||||
error_message_is_missing: "Falta el mensaje de error.",
|
||||
error_unknown_cause: "Un error desconocido a ocurrido.",
|
||||
error_uploading_files: "Error al subir archivos",
|
||||
favorites: "Favoritos",
|
||||
feedback: "Sugerencias",
|
||||
feedback_c2a: "Por favor, usa el formulario para enviarnos tus sugerencias, comentarios y reporte de errores.",
|
||||
feedback_sent_confirmation: "Gracias por ponerte en contacto con nosotros. Si tienes un correo electrónico vinculado a esta cuenta, nos pondremos en contacto contigo tan pronto como podamos.",
|
||||
fit: "Ajustar",
|
||||
folder: 'Carpeta',
|
||||
force_quit: 'Forzar cierre',
|
||||
forgot_pass_c2a: "¿Olvidaste tu contraseña?",
|
||||
from: "De",
|
||||
general: "General",
|
||||
get_a_copy_of_on_puter: `¡Consigue una copia de '%%' en Puter.com!`,
|
||||
get_copy_link: 'Copiar el enlace',
|
||||
hide_all_windows: "Ocultar Todas las Ventanas",
|
||||
hide_all_windows: "Ocultar todas las ventanas",
|
||||
home: 'Inicio',
|
||||
html_document: 'Documento HTML',
|
||||
hue: 'Hue',
|
||||
image: 'Imagen',
|
||||
incorrect_password: "Contraseña incorrecta",
|
||||
invite_link: "Enlace de invitación",
|
||||
item: 'elemento',
|
||||
items_in_trash_cannot_be_renamed: `Este elemento no se puede renombrar porque está en la papelera. Para cambiar el nombre de este archivo, primero extráelo fuera de la misma.`,
|
||||
jpeg_image: 'Imagen JPEG',
|
||||
keep_in_taskbar: 'Fijar a la barra de tareas',
|
||||
keep_in_taskbar: 'Mantener en la barra de tareas',
|
||||
language: "Lenguage",
|
||||
license: "Licencia",
|
||||
lightness: 'Claridad',
|
||||
link_copied: "Enlace copiado",
|
||||
loading: 'Cargando',
|
||||
log_in: "Iniciar sesión",
|
||||
log_into_another_account_anyway: 'Iniciar sesión en otra cuenta de todos modos',
|
||||
log_out: 'Cerrar sesión',
|
||||
looks_good: "Se ve bien!",
|
||||
manage_sessions: "Administrar sesión",
|
||||
menubar_style: "Estilo de la barra de menú",
|
||||
menubar_style_desktop: "Escritorio",
|
||||
menubar_style_system: "Sistema",
|
||||
menubar_style_window: "Ventana",
|
||||
modified: 'Modified',
|
||||
move: 'Mover',
|
||||
moving_file: "Moviendo %%",
|
||||
my_websites: "Mis páginas web",
|
||||
@@ -94,74 +184,174 @@ const es = {
|
||||
name_must_be_string: "El nombre debe ser una cadena de texto.",
|
||||
name_too_long: `El nombre no puede tener más de %% caracteres.`,
|
||||
new: 'Nuevo',
|
||||
new_email: 'Nuevo correo electrónico',
|
||||
new_folder: 'Nueva carpeta',
|
||||
new_password: "Nueva contraseña",
|
||||
new_username: "Nuevo nombre de usuario",
|
||||
no: 'No',
|
||||
no_dir_associated_with_site: 'No hay un directorio vinculado con esta dirección.',
|
||||
no_websites_published: "No has publicado ninguna página web todavía.",
|
||||
no_websites_published: "Aun no has publicado ningún sitio web. Haz click derecho en una carpeta para empezar",
|
||||
ok: 'OK',
|
||||
open: "Abrir",
|
||||
open_in_new_tab: "Abrir en una Nueva Pestaña",
|
||||
open_in_new_window: "Abrir en una Nueva Ventana",
|
||||
open_with: "Abrir Con",
|
||||
open_in_new_tab: "Abrir en una nueva pestaña",
|
||||
open_in_new_window: "Abrir en una nueva ventana",
|
||||
open_with: "Abrir con",
|
||||
original_name: 'Nombre original',
|
||||
original_path: 'Ruta original',
|
||||
oss_code_and_content: "Software y contenido de código abierto",
|
||||
password: "Contraseña",
|
||||
password_changed: "Contraseña cambiada.",
|
||||
passwords_do_not_match: '`Nueva Contraseña` y `Confirmar Nueva Contraseña` no coincide.',
|
||||
password_recovery_rate_limit: "Haz alcanzado nuestra tasa de refresco; por favor espera unos minutos. Para evitar esto en el futuro, evita refrescar la página muchas veces.",
|
||||
password_recovery_token_invalid: "La contraseña de token de recuperación ya no es válida.",
|
||||
password_recovery_unknown_error: "Ocurrió un error desconocido. Por favor, inténtalo de nuevo más tarde.",
|
||||
password_required: 'La contraseña es obligatoria.',
|
||||
password_strength_error: "La contraseña debe tener almenos 8 caracteres de largo y contener almenos una letra mayúscula, una minúscula, un numero, y un caracter especial.",
|
||||
passwords_do_not_match: '`Nueva Contraseña` y `Confirmar Nueva Contraseña` no coinciden.',
|
||||
paste: 'Pegar',
|
||||
paste_into_folder: "Pegar en la Carpeta",
|
||||
path: 'Ruta',
|
||||
personalization: "Personalización",
|
||||
pick_name_for_website: "Escoge un nombre para tu página web:",
|
||||
picture: "Imagen",
|
||||
pictures: 'Imagenes',
|
||||
plural_suffix: 's',
|
||||
powered_by_puter_js: `Creado por {{link=docs}}Puter.js{{/link}}`,
|
||||
preparing: "Preparando...",
|
||||
preparing_for_upload: "Preparando para la subida...",
|
||||
print: 'Imprimir',
|
||||
privacy: "Privacidad",
|
||||
proceed_to_login: 'Procede a iniciar sesión',
|
||||
proceed_with_account_deletion: "Procede con la eliminación de la cuenta",
|
||||
process_status_initializing: "Inicializando",
|
||||
process_status_running: "El ejecución",
|
||||
process_type_app: 'Aplicación',
|
||||
process_type_init: 'Inicialización',
|
||||
process_type_ui: 'Interfaz de usuario',
|
||||
properties: "Propiedades",
|
||||
public: 'Publico',
|
||||
publish: "Publicar",
|
||||
publish_as_website: 'Publicar como página web',
|
||||
puter_description: `Puter es un servicio de nube personal enfocado en privacidad que mantiene tus archivos, aplicaciónes, y juegos en un solo lugar, accesible desde cualquier lugar en cualquier momento.`,
|
||||
reading_file: "Leyendo %strong%",
|
||||
recent: "Reciente",
|
||||
recommended: "Recomendado",
|
||||
recover_password: "Recuperar Contraseña",
|
||||
refer_friends_c2a: "Consigue 1 GB por cada amigo que cree y confirme una cuenta en Puter ¡Tu amigo recibirá 1GB también!",
|
||||
refer_friends_social_media_c2a: `¡Consigue 1 GB de almacenamiento gratuito en Puter.com!`,
|
||||
refresh: 'Refrescar',
|
||||
release_address_confirmation: `¿Estás seguro de liberar esta dirección?`,
|
||||
release_address_confirmation: `¿Estás seguro de que quieres liberar esta dirección?`,
|
||||
remove_from_taskbar:'Eliminar de la barra de tareas',
|
||||
rename: 'Renombrar',
|
||||
repeat: 'Repetir',
|
||||
replace: 'Remplazar',
|
||||
replace_all: 'Replace All',
|
||||
resend_confirmation_code: "Reenviar Código de Confirmación",
|
||||
reset_colors: "Restablecer colores",
|
||||
restart_puter_confirm: "¿Estás seguro que deseas reiniciar Puter?",
|
||||
restore: "Restaurar",
|
||||
save: 'Guardar',
|
||||
saturation: 'Saturación',
|
||||
save_account: 'Guardar cuenta',
|
||||
save_account_to_get_copy_link: "Por favor, crea una cuenta para continuar.",
|
||||
save_account_to_publish: 'Por favor, crea una cuenta para continuar.',
|
||||
save_session: 'Guardar sesión',
|
||||
save_session_c2a: 'Crea una cuenta para guardar tu sesión actual y evitar así perder tu trabajo.',
|
||||
scan_qr_c2a: 'Escanea el código de debajo e inicia sesión desde otros dispositivos',
|
||||
scan_qr_c2a: 'Escanee el código a continuación para inicia sesión desde otros dispositivos',
|
||||
scan_qr_2fa: 'Escanee el codigo QR con su aplicación de autenticación',
|
||||
scan_qr_generic: 'Scan this QR code using your phone or another device',
|
||||
search: 'Buscar',
|
||||
seconds: 'segundos',
|
||||
security: "Seguridad",
|
||||
select: "Seleccionar",
|
||||
selected: 'seleccionado',
|
||||
select_color: 'Seleccionar color…',
|
||||
sessions: "Sesión",
|
||||
send: "Enviar",
|
||||
send_password_recovery_email: "Enviar la contraseña al correo de recuperación",
|
||||
session_saved: "Gracias por crear una cuenta. La sesión ha sido guardada.",
|
||||
set_new_password: "Establecer una nueva contraseña",
|
||||
share_to: "Compartir con",
|
||||
settings: "Opciones",
|
||||
share: "Compartir",
|
||||
share_to: "Compartir a",
|
||||
share_with: "Compartir con:",
|
||||
shortcut_to: "Acceso directo a",
|
||||
show_all_windows: "Mostrar todas las ventanas",
|
||||
show_hidden: 'Mostrar ocultos',
|
||||
sign_in_with_puter: "Inicia sesión con Puter",
|
||||
sign_up: "Registrarse",
|
||||
signing_in: "Registrándose…",
|
||||
size: 'Tamaño',
|
||||
skip: 'Saltar',
|
||||
something_went_wrong: "Algo salió mal.",
|
||||
sort_by: 'Ordenar Por',
|
||||
start: 'Inicio',
|
||||
taking_longer_than_usual: 'Tardando un poco más de lo usual. Por favor, espere...',
|
||||
status: "Estado",
|
||||
storage_usage: "Uso del almacenamiento",
|
||||
storage_puter_used: 'Usado por Puter',
|
||||
taking_longer_than_usual: 'Tardando un poco más de lo habitual. Por favor, espere...',
|
||||
task_manager: "Administrador de tareas",
|
||||
taskmgr_header_name: "Nombre",
|
||||
taskmgr_header_status: "Estado",
|
||||
taskmgr_header_type: "Tipo",
|
||||
terms: "Terminos",
|
||||
text_document: 'Documento de Texto',
|
||||
tos_fineprint: `Pulsando sobre 'Crear una cuenta gratuita' aceptas los {{link=terms}}términos del servicio{{/link}} de Puter y {{link=privacy}}la política de privacidad{{/link}}.`,
|
||||
tos_fineprint: `Al hacer clic en 'Crear una cuenta gratuita' aceptas los {{link=terms}}términos del servicio{{/link}} y {{link=privacy}}la política de privacidad{{/link}} de Puter.`,
|
||||
transparency: "Transparencia",
|
||||
trash: 'Papelera',
|
||||
two_factor: 'Autenticación de dos factores',
|
||||
two_factor_disabled: '2FA Deshabilitadp',
|
||||
two_factor_enabled: '2FA Habilitado',
|
||||
type: 'Tipo',
|
||||
type_confirm_to_delete_account: "Ingrese 'Confirmar' para borrar esta cuenta.",
|
||||
ui_colors: "Colores de interfaz",
|
||||
ui_manage_sessions: "Administrador de sesión",
|
||||
ui_revoke: "Revocar",
|
||||
undo: 'Deshacer',
|
||||
unlimited: 'Ilimitado',
|
||||
unzip: "Descomprimir",
|
||||
upload: 'Subir',
|
||||
upload_here: 'Subir aquí',
|
||||
usage: 'Uso',
|
||||
username: "Nombre de usuario",
|
||||
username_changed: 'Nombre de usuario actualizado correctamente.',
|
||||
username_required: 'El nombre de usuario es obligatorio.',
|
||||
versions: "Versiones",
|
||||
yes_release_it: 'Sí, liberar',
|
||||
videos: 'Videos',
|
||||
visibility: 'Visibilidad',
|
||||
yes: 'Si',
|
||||
yes_release_it: 'Sí, libéralo',
|
||||
you_have_been_referred_to_puter_by_a_friend: "¡Has sido invitado a Puter por un amigo!",
|
||||
zip: "Comprimir en Zip",
|
||||
zip: "Zip",
|
||||
zipping_file: "Compriminendo %strong%",
|
||||
|
||||
// === 2FA Setup ===
|
||||
setup2fa_1_step_heading: 'Abre tu aplicación de autenticación',
|
||||
setup2fa_1_instructions: `
|
||||
Puedes usar cualquier aplicación de autenticación que soporte el protocolo de Time-based One-time (TOTP).
|
||||
Hay muchos para elegir, pero si no estas seguro
|
||||
<a target="_blank" href="https://authy.com/download">Authy</a>
|
||||
es una opción segura para Android y iOS.
|
||||
`,
|
||||
setup2fa_2_step_heading: 'Escanea el código QR',
|
||||
setup2fa_3_step_heading: 'Ingresa el código de 6 dígitos',
|
||||
setup2fa_4_step_heading: 'Copiar tus códigos de recuperación',
|
||||
setup2fa_4_instructions: `
|
||||
Estos códigos de recuperación son la única forma de acceder a tu cuenta, si pierdes tu teléfono o no puedes usar la aplicación de autenticación.
|
||||
Asegurate de guardarlos en un lugar seguro.
|
||||
`,
|
||||
setup2fa_5_step_heading: 'Confirmar la configuración de 2FA',
|
||||
setup2fa_5_confirmation_1: 'He guardado mis códigos de recuperación en un lugar seguro',
|
||||
setup2fa_5_confirmation_2: 'Estoy listo para habilitar 2FA',
|
||||
setup2fa_5_button: 'Habilitar 2FA',
|
||||
|
||||
// === 2FA Login ===
|
||||
login2fa_otp_title: 'Ingresar el código 2FA',
|
||||
login2fa_otp_instructions: 'Ingresa tu código de 6 dígitos de tu aplicación de autenticación.',
|
||||
login2fa_recovery_title: 'Ingresa tu código de recuperación',
|
||||
login2fa_recovery_instructions: 'Ingresa uno de tus códigos de recuperación para acceder a tu cuenta.',
|
||||
login2fa_use_recovery_code: 'Usar un código de recuperación',
|
||||
login2fa_recovery_back: 'Atras',
|
||||
login2fa_recovery_placeholder: 'XXXXXXXX',
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,339 @@
|
||||
/**
|
||||
* Copyright (C) 2024 Puter Technologies Inc.
|
||||
*
|
||||
* Ez a fájl a Puter része.
|
||||
*
|
||||
* A Puter szabad szoftver: terjesztheted és/vagy módosíthatod
|
||||
* a GNU Affero General Public License feltételei szerint, amelyet a Free Software Foundation adott ki, akár a licenc 3-as verziója, akár (választásod szerint) bármely későbbi verzió alapján.
|
||||
*
|
||||
* Ez a program abban a reményben kerül terjesztésre, hogy hasznos lesz,
|
||||
* de mindenféle GARANCIA NÉLKÜL; még az ELADHATÓSÁGRA vagy egy adott célra való ALKALMASSÁG hallgatólagos garanciája nélkül is. További részletekért lásd a GNU Affero General Public License-t.
|
||||
*
|
||||
* A programhoz mellékelték a GNU Affero General Public License egy példányát.
|
||||
* Ha nem, látogass el a <https://www.gnu.org/licenses/> oldalra.
|
||||
*/
|
||||
|
||||
const hu = {
|
||||
name: "Magyar",
|
||||
english_name: "Hungarian",
|
||||
code: "hu",
|
||||
dictionary: {
|
||||
about: "Névjegy",
|
||||
account: "Fiók",
|
||||
account_password: "Fiók jelszó megerősítése",
|
||||
access_granted_to: "Hozzáférés engedélyezve",
|
||||
add_existing_account: "Meglévő fiók hozzáadása",
|
||||
all_fields_required: "Minden mező kitöltése kötelező.",
|
||||
allow: "Engedélyez",
|
||||
apply: "Alkalmaz",
|
||||
ascending: "Növekvő",
|
||||
associated_websites: "Kapcsolódó weboldalak",
|
||||
auto_arrange: "Automatikus elrendezés",
|
||||
background: "Háttér",
|
||||
browse: "Böngészés",
|
||||
cancel: "Mégsem",
|
||||
center: "Középre",
|
||||
change_desktop_background: "Asztal háttérképének módosítása...",
|
||||
change_email: "Email módosítása",
|
||||
change_language: "Nyelv módosítása",
|
||||
change_password: "Jelszó módosítása",
|
||||
change_ui_colors: "UI színek módosítása",
|
||||
change_username: "Felhasználónév módosítása",
|
||||
close: "Bezár",
|
||||
close_all_windows: "Minden ablak bezárása",
|
||||
close_all_windows_confirm: "Biztosan be akarod zárni az összes ablakot?",
|
||||
close_all_windows_and_log_out: "Ablakok bezárása és kijelentkezés",
|
||||
change_always_open_with: "Mindig ezzel az alkalmazással nyitja meg ezt a fájlt?",
|
||||
color: "Szín",
|
||||
confirm: "Megerősít",
|
||||
confirm_2fa_setup: "A kódot hozzáadtam a hitelesítő alkalmazásomhoz",
|
||||
confirm_2fa_recovery: "A helyreállítási kódokat biztonságos helyen tároltam",
|
||||
confirm_account_for_free_referral_storage_c2a: "Hozz létre egy fiókot és erősítsd meg email címedet, hogy 1 GB ingyenes tárhelyet kapj. A barátod is kap 1 GB ingyenes tárhelyet.",
|
||||
confirm_code_generic_incorrect: "Hibás kód.",
|
||||
confirm_code_generic_too_many_requests: "Túl sok kérés. Kérlek, várj néhány percet.",
|
||||
confirm_code_generic_submit: "Kód beküldése",
|
||||
confirm_code_generic_try_again: "Próbáld újra",
|
||||
confirm_code_generic_title: "Megerősítő kód megadása",
|
||||
confirm_code_2fa_instruction: "Add meg a 6-jegyű kódot a hitelesítő alkalmazásodból.",
|
||||
confirm_code_2fa_submit_btn: "Beküldés",
|
||||
confirm_code_2fa_title: "2FA kód megadása",
|
||||
confirm_delete_multiple_items: "Biztosan véglegesen törölni akarod ezeket az elemeket?",
|
||||
confirm_delete_single_item: "Biztosan véglegesen törölni akarod ezt az elemet?",
|
||||
confirm_open_apps_log_out: "Nyitott alkalmazásaid vannak. Biztosan ki akarsz jelentkezni?",
|
||||
confirm_new_password: "Új jelszó megerősítése",
|
||||
confirm_delete_user: "Biztosan törölni akarod a fiókodat? Minden fájlod és adatod véglegesen törlődik. Ez a művelet nem visszavonható.",
|
||||
confirm_delete_user_title: "Fiók törlése?",
|
||||
confirm_session_revoke: "Biztosan visszavonod ezt a munkamenetet?",
|
||||
confirm_your_email_address: "Email címed megerősítése",
|
||||
contact_us: "Kapcsolat",
|
||||
contact_us_verification_required: "A használathoz érvényesített email címmel kell rendelkezned.",
|
||||
contain: "Tartalmaz",
|
||||
continue: "Folytatás",
|
||||
copy: "Másolás",
|
||||
copy_link: "Link másolása",
|
||||
copying: "Másolás",
|
||||
copying_file: "Másolás: %%",
|
||||
cover: "Borító",
|
||||
create_account: "Fiók létrehozása",
|
||||
create_free_account: "Ingyenes fiók létrehozása",
|
||||
create_shortcut: "Parancsikon létrehozása",
|
||||
credits: "Kreditek",
|
||||
current_password: "Jelenlegi jelszó",
|
||||
cut: "Kivágás",
|
||||
clock: "Óra",
|
||||
clock_visible_hide: "Elrejt - Mindig rejtett",
|
||||
clock_visible_show: "Megjelenít - Mindig látható",
|
||||
clock_visible_auto: "Automatikus - Alapértelmezett, csak teljes képernyős módban látható.",
|
||||
close_all: "Összes bezárása",
|
||||
created: "Létrehozva",
|
||||
date_modified: "Módosítás dátuma",
|
||||
default: "Alapértelmezett",
|
||||
delete: "Törlés",
|
||||
delete_account: "Fiók törlése",
|
||||
delete_permanently: "Végleges törlés",
|
||||
deleting_file: "Törlés: %%",
|
||||
deploy_as_app: "Alkalmazásként telepít",
|
||||
descending: "Csökkenő",
|
||||
desktop: "Asztal",
|
||||
desktop_background_fit: "Illesztés",
|
||||
developers: "Fejlesztők",
|
||||
dir_published_as_website: "%strong% közzétéve a következő címen:",
|
||||
disable_2fa: "2FA letiltása",
|
||||
disable_2fa_confirm: "Biztosan letiltod a 2FA-t?",
|
||||
disable_2fa_instructions: "Add meg a jelszavad a 2FA letiltásához.",
|
||||
disassociate_dir: "Könyvtár leválasztása",
|
||||
documents: "Dokumentumok",
|
||||
dont_allow: "Nem engedélyez",
|
||||
download: "Letöltés",
|
||||
download_file: "Fájl letöltése",
|
||||
downloading: "Letöltés",
|
||||
email: "Email",
|
||||
email_change_confirmation_sent: "Megerősítő emailt küldtünk az új email címedre. Kérlek, ellenőrizd a postaládádat és kövesd az utasításokat a folyamat befejezéséhez.",
|
||||
email_invalid: "Érvénytelen email cím.",
|
||||
email_or_username: "Email vagy Felhasználónév",
|
||||
email_required: "Email szükséges.",
|
||||
empty_trash: "Kuka ürítése",
|
||||
empty_trash_confirmation: "Biztosan véglegesen törölni akarod a Kukában lévő elemeket?",
|
||||
emptying_trash: "Kuka ürítése...",
|
||||
enable_2fa: "2FA engedélyezése",
|
||||
end_hard: "Kemény befejezés",
|
||||
end_process_force_confirm: "Biztosan kényszerített kilépést hajtasz végre erre a folyamatra?",
|
||||
end_soft: "Lágy befejezés",
|
||||
enlarged_qr_code: "Nagyított QR kód",
|
||||
enter_password_to_confirm_delete_user: "Add meg a jelszavad a fiók törlésének megerősítéséhez",
|
||||
error_message_is_missing: "Hiányzik a hibaüzenet.",
|
||||
error_unknown_cause: "Ismeretlen hiba történt.",
|
||||
error_uploading_files: "Fájlok feltöltése sikertelen",
|
||||
favorites: "Kedvencek",
|
||||
feedback: "Visszajelzés",
|
||||
feedback_c2a: "Kérlek, használd az alábbi űrlapot, hogy elküldd nekünk visszajelzésedet, észrevételeidet és hibajelentéseidet.",
|
||||
feedback_sent_confirmation: "Köszönjük, hogy kapcsolatba léptél velünk. Ha van email címed a fiókodhoz társítva, hamarosan hallani fogsz rólunk.",
|
||||
fit: "Illesztés",
|
||||
folder: "Mappa",
|
||||
force_quit: "Kényszerített kilépés",
|
||||
forgot_pass_c2a: "Elfelejtetted a jelszavad?",
|
||||
from: "Tól",
|
||||
general: "Általános",
|
||||
get_a_copy_of_on_puter: "Szerezz egy példányt a(z) '%%' Puter.com-on!",
|
||||
get_copy_link: "Másolási link megszerzése",
|
||||
hide_all_windows: "Minden ablak elrejtése",
|
||||
home: "Otthon",
|
||||
html_document: "HTML dokumentum",
|
||||
hue: "Színárnyalat",
|
||||
image: "Kép",
|
||||
incorrect_password: "Helytelen jelszó",
|
||||
invite_link: "Meghívó link",
|
||||
item: "elem",
|
||||
items_in_trash_cannot_be_renamed: "Ez az elem nem nevezhető át, mert a kukában van. A név megváltoztatásához először húzd ki a Kukából.",
|
||||
jpeg_image: "JPEG kép",
|
||||
keep_in_taskbar: "Tartsa a tálcán",
|
||||
language: "Nyelv",
|
||||
license: "Licenc",
|
||||
lightness: "Világosság",
|
||||
link_copied: "Link másolva",
|
||||
loading: "Betöltés",
|
||||
log_in: "Bejelentkezés",
|
||||
log_into_another_account_anyway: "Bejelentkezés egy másik fiókba",
|
||||
log_out: "Kijelentkezés",
|
||||
looks_good: "Jól néz ki!",
|
||||
manage_sessions: "Munkamenetek kezelése",
|
||||
menubar_style: "Menü stílusa",
|
||||
menubar_style_desktop: "Asztal",
|
||||
menubar_style_system: "Rendszer",
|
||||
menubar_style_window: "Ablak",
|
||||
modified: "Módosítva",
|
||||
move: "Mozgatás",
|
||||
moving_file: "Mozgatás: %%",
|
||||
my_websites: "Saját weboldalaim",
|
||||
name: "Név",
|
||||
name_cannot_be_empty: "A név nem lehet üres.",
|
||||
name_cannot_contain_double_period: "A név nem tartalmazhatja a '..' karaktert.",
|
||||
name_cannot_contain_period: "A név nem tartalmazhatja a '.' karaktert.",
|
||||
name_cannot_contain_slash: "A név nem tartalmazhatja a '/' karaktert.",
|
||||
name_must_be_string: "A név csak szöveg lehet.",
|
||||
name_too_long: "A név nem lehet hosszabb, mint %% karakter.",
|
||||
new: "Új",
|
||||
new_email: "Új email",
|
||||
new_folder: "Új mappa",
|
||||
new_password: "Új jelszó",
|
||||
new_username: "Új felhasználónév",
|
||||
no: "Nem",
|
||||
no_dir_associated_with_site: "Ehhez a címhez nincs társítva könyvtár.",
|
||||
no_websites_published: "Még nem publikáltál egyetlen weboldalt sem. Kattints jobb gombbal egy mappára a kezdéshez.",
|
||||
ok: "Rendben",
|
||||
open: "Megnyitás",
|
||||
open_in_new_tab: "Megnyitás új lapon",
|
||||
open_in_new_window: "Megnyitás új ablakban",
|
||||
open_with: "Megnyitás ezzel",
|
||||
original_name: "Eredeti név",
|
||||
original_path: "Eredeti útvonal",
|
||||
oss_code_and_content: "Nyílt forráskódú szoftver és tartalom",
|
||||
password: "Jelszó",
|
||||
password_changed: "Jelszó megváltoztatva.",
|
||||
password_recovery_rate_limit: "Elérted a korlátunkat; kérlek, várj néhány percet. A jövőben kerüld az oldal túl sokszori újratöltését.",
|
||||
password_recovery_token_invalid: "Ez a jelszó visszaállítási token már nem érvényes.",
|
||||
password_recovery_unknown_error: "Ismeretlen hiba történt. Kérlek, próbáld újra később.",
|
||||
password_required: "Jelszó szükséges.",
|
||||
password_strength_error: "A jelszónak legalább 8 karakter hosszúnak kell lennie és tartalmaznia kell legalább egy nagybetűt, egy kisbetűt, egy számot és egy speciális karaktert.",
|
||||
passwords_do_not_match: "'Új jelszó' és 'Új jelszó megerősítése' nem egyeznek.",
|
||||
paste: "Beillesztés",
|
||||
paste_into_folder: "Beillesztés a mappába",
|
||||
path: "Útvonal",
|
||||
personalization: "Személyre szabás",
|
||||
pick_name_for_website: "Válassz nevet a weboldaladnak:",
|
||||
picture: "Kép",
|
||||
pictures: "Képek",
|
||||
plural_suffix: "k",
|
||||
powered_by_puter_js: "A Puter.js hajtja",
|
||||
preparing: "Előkészítés...",
|
||||
preparing_for_upload: "Feltöltés előkészítése...",
|
||||
print: "Nyomtatás",
|
||||
privacy: "Adatvédelem",
|
||||
proceed_to_login: "Folytatás a bejelentkezéshez",
|
||||
proceed_with_account_deletion: "Fiók törlésének folytatása",
|
||||
process_status_initializing: "Inicializálás",
|
||||
process_status_running: "Fut",
|
||||
process_type_app: "Alkalmazás",
|
||||
process_type_init: "Inicializálás",
|
||||
process_type_ui: "Felhasználói felület",
|
||||
properties: "Tulajdonságok",
|
||||
public: "Nyilvános",
|
||||
publish: "Közzététel",
|
||||
publish_as_website: "Közzététel weboldalként",
|
||||
puter_description: "A Puter egy adatvédelmi elsőként kezelt személyes felhő, amelyben minden fájlodat, alkalmazásodat és játékodat egy biztonságos helyen tárolhatod, bárhonnan, bármikor elérhetően.",
|
||||
reading_file: "Fájl olvasása: %strong%",
|
||||
recent: "Legutóbbi",
|
||||
recommended: "Ajánlott",
|
||||
recover_password: "Jelszó visszaállítása",
|
||||
refer_friends_c2a: "Kapj 1 GB-ot minden barátodért, aki létrehoz és megerősít egy fiókot a Puteren. A barátod is kap 1 GB-ot!",
|
||||
refer_friends_social_media_c2a: "Kapj 1 GB ingyenes tárhelyet a Puter.com-on!",
|
||||
refresh: "Frissítés",
|
||||
release_address_confirmation: "Biztosan felszabadítod ezt a címet?",
|
||||
remove_from_taskbar: "Eltávolítás a tálcáról",
|
||||
rename: "Átnevezés",
|
||||
repeat: "Ismétlés",
|
||||
replace: "Csere",
|
||||
replace_all: "Összes cseréje",
|
||||
resend_confirmation_code: "Megerősítő kód újraküldése",
|
||||
reset_colors: "Színek visszaállítása",
|
||||
restart_puter_confirm: "Biztosan újraindítod a Putert?",
|
||||
restore: "Visszaállítás",
|
||||
save: "Mentés",
|
||||
saturation: "Telítettség",
|
||||
save_account: "Fiók mentése",
|
||||
save_account_to_get_copy_link: "A folytatáshoz kérlek, hozz létre egy fiókot.",
|
||||
save_account_to_publish: "A folytatáshoz kérlek, hozz létre egy fiókot.",
|
||||
save_session: "Munkamenet mentése",
|
||||
save_session_c2a: "Hozz létre egy fiókot, hogy mentsd az aktuális munkamenetedet és elkerüld a munkád elvesztését.",
|
||||
scan_qr_c2a: "Olvasd be az alábbi kódot, hogy bejelentkezhess ebbe a munkamenetbe más eszközökről",
|
||||
scan_qr_2fa: "Olvasd be a QR-kódot a hitelesítő alkalmazásoddal",
|
||||
scan_qr_generic: "Olvasd be ezt a QR-kódot a telefonoddal vagy más eszközzel",
|
||||
search: "Keresés",
|
||||
seconds: "másodperc",
|
||||
security: "Biztonság",
|
||||
select: "Kiválasztás",
|
||||
selected: "kiválasztva",
|
||||
select_color: "Szín kiválasztása...",
|
||||
sessions: "Munkamenetek",
|
||||
send: "Küldés",
|
||||
send_password_recovery_email: "Jelszó visszaállító email küldése",
|
||||
session_saved: "Köszönjük, hogy létrehoztál egy fiókot. Ez a munkamenet mentésre került.",
|
||||
settings: "Beállítások",
|
||||
set_new_password: "Új jelszó beállítása",
|
||||
share: "Megosztás",
|
||||
share_to: "Megosztás ide:",
|
||||
share_with: "Megosztás valakivel:",
|
||||
shortcut_to: "Parancsikon ide:",
|
||||
show_all_windows: "Összes ablak megjelenítése",
|
||||
show_hidden: "Rejtett megjelenítése",
|
||||
sign_in_with_puter: "Bejelentkezés Puterrel",
|
||||
sign_up: "Regisztráció",
|
||||
signing_in: "Bejelentkezés...",
|
||||
size: "Méret",
|
||||
skip: "Kihagyás",
|
||||
something_went_wrong: "Valami hiba történt.",
|
||||
sort_by: "Rendezés",
|
||||
start: "Indítás",
|
||||
status: "Állapot",
|
||||
storage_usage: "Tárhely használat",
|
||||
storage_puter_used: "Puter által használt",
|
||||
taking_longer_than_usual: "Kicsit tovább tart, mint általában. Kérlek várj...",
|
||||
task_manager: "Feladatkezelő",
|
||||
taskmgr_header_name: "Név",
|
||||
taskmgr_header_status: "Állapot",
|
||||
taskmgr_header_type: "Típus",
|
||||
terms: "Feltételek",
|
||||
text_document: "Szöveges dokumentum",
|
||||
tos_fineprint: "A 'Ingyenes fiók létrehozása' gombra kattintva elfogadod a Puter {{link=terms}}Szolgáltatási feltételeit{{/link}} és {{link=privacy}}Adatvédelmi irányelveit{{/link}}.",
|
||||
transparency: "Átlátszóság",
|
||||
trash: "Kuka",
|
||||
two_factor: "Kétfaktoros hitelesítés",
|
||||
two_factor_disabled: "2FA letiltva",
|
||||
two_factor_enabled: "2FA engedélyezve",
|
||||
type: "Típus",
|
||||
type_confirm_to_delete_account: "Írd be, hogy 'megerősít' a fiók törléséhez.",
|
||||
ui_colors: "UI színek",
|
||||
ui_manage_sessions: "Munkamenetkezelő",
|
||||
ui_revoke: "Visszavonás",
|
||||
undo: "Visszavonás",
|
||||
unlimited: "Korlátlan",
|
||||
unzip: "Kibontás",
|
||||
upload: "Feltöltés",
|
||||
upload_here: "Feltöltés ide",
|
||||
usage: "Használat",
|
||||
username: "Felhasználónév",
|
||||
username_changed: "A felhasználónév sikeresen frissítve.",
|
||||
username_required: "Felhasználónév szükséges.",
|
||||
versions: "Verziók",
|
||||
videos: "Videók",
|
||||
visibility: "Láthatóság",
|
||||
yes: "Igen",
|
||||
yes_release_it: "Igen, Engedd El",
|
||||
you_have_been_referred_to_puter_by_a_friend: "Egy barátod ajánlott téged a Puterhez!",
|
||||
zip: "Zip",
|
||||
zipping_file: "Tömörítés: %strong%",
|
||||
|
||||
// === 2FA Setup ===
|
||||
setup2fa_1_step_heading: "Nyisd meg a hitelesítő alkalmazásod",
|
||||
setup2fa_1_instructions: "Bármely hitelesítő alkalmazást használhatod, amely támogatja az időalapú egyszeri jelszó (TOTP) protokollt. Sok választási lehetőség van, de ha nem vagy biztos benne, az <a target='_blank' href='https://authy.com/download'>Authy</a> jó választás Android és iOS rendszeren.",
|
||||
setup2fa_2_step_heading: "Olvasd be a QR-kódot",
|
||||
setup2fa_3_step_heading: "Add meg a 6-jegyű kódot",
|
||||
setup2fa_4_step_heading: "Másold le a helyreállítási kódjaidat",
|
||||
setup2fa_4_instructions: "Ezek a helyreállítási kódok az egyetlen módja annak, hogy hozzáférj a fiókodhoz, ha elveszíted a telefonodat vagy nem tudod használni a hitelesítő alkalmazásodat. Ügyelj arra, hogy biztonságos helyen tárold őket.",
|
||||
setup2fa_5_step_heading: "2FA beállítás megerősítése",
|
||||
setup2fa_5_confirmation_1: "A helyreállítási kódokat biztonságos helyen tároltam",
|
||||
setup2fa_5_confirmation_2: "Készen állok a 2FA engedélyezésére",
|
||||
setup2fa_5_button: "2FA engedélyezése",
|
||||
|
||||
// === 2FA Login ===
|
||||
login2fa_otp_title: "2FA kód megadása",
|
||||
login2fa_otp_instructions: "Add meg a 6-jegyű kódot a hitelesítő alkalmazásodból.",
|
||||
login2fa_recovery_title: "Add meg egy helyreállítási kódot",
|
||||
login2fa_recovery_instructions: "Add meg az egyik helyreállítási kódodat a fiókhoz való hozzáféréshez.",
|
||||
login2fa_use_recovery_code: "Használj helyreállítási kódot",
|
||||
login2fa_recovery_back: "Vissza",
|
||||
login2fa_recovery_placeholder: "XXXXXXXX",
|
||||
}
|
||||
};
|
||||
|
||||
export default hu;
|
||||
@@ -22,147 +22,330 @@ const hy = {
|
||||
english_name: "Armenian",
|
||||
code: "hy",
|
||||
dictionary: {
|
||||
about: "Մեր մասին",
|
||||
account: "Հաշիվ",
|
||||
account_password: "Հաստատել հաշվի գաղտնաբառը",
|
||||
access_granted_to: "Մուտքը տրված է՝",
|
||||
add_existing_account: "Ավելացնել առկա հաշիվ",
|
||||
all_fields_required: "Բոլոր դաշտերը պահանջվում են",
|
||||
all_fields_required: "Բոլոր դաշտերը պարտադիր են",
|
||||
allow: "Թույլատրել",
|
||||
apply: "Կիրառել",
|
||||
ascending: "Աճման կարգով",
|
||||
ascending: "Աճող",
|
||||
associated_websites: "Կապված կայքեր",
|
||||
auto_arrange: "Ավտոմատ դասավորել",
|
||||
background: "Ֆոն",
|
||||
browse: "Թերթել",
|
||||
cancel: "Չեղարկել",
|
||||
center: "Կենտրոն",
|
||||
change_desktop_background: "Փոխել աշխատասեղանի ֆոնը",
|
||||
change_desktop_background: "Փոխել աշխատասեղանի ֆոնը…",
|
||||
change_email: "Փոխել էլ. փոստը",
|
||||
change_language: "Փոխել լեզուն",
|
||||
change_password: "Փոխել գաղտնաբառը",
|
||||
change_ui_colors: "Փոխել UI գույները",
|
||||
change_username: "Փոխել օգտանունը",
|
||||
close: "Փակել",
|
||||
close_all_windows: "Փակել բոլոր պատուհանները",
|
||||
close_all_windows_confirm: "Վստա՞հ եք, որ ցանկանում եք փակել բոլոր պատուհանները:",
|
||||
close_all_windows_and_log_out: "Փակել պատուհաններն ու դուրս գալ",
|
||||
change_always_open_with: "Ցանկանու՞մ եք այս տեսակի ֆայլը միշտ բացել",
|
||||
color: "Գույն",
|
||||
confirm_account_for_free_referral_storage_c2a: "Ստեղծեք հաշիվ և հաստատեք ձեր էլ․ հասցեն 1 ԳԲ անվճար պահեստ ստանալու համար: Ձեր ընկերը նույնպես կստանա 1 ԳԲ անվճար պահեստ:",
|
||||
confirm: "Հաստատել",
|
||||
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: "Մուտքագրեք 6 նիշանոց կոդը ձեր իսկորոշիչ հավելվածից:",
|
||||
confirm_code_2fa_submit_btn: "Հաստատել",
|
||||
confirm_code_2fa_title: "Մուտքագրեք 2FA կոդը",
|
||||
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: "Հաստատեք ձեր էլ. փոստի հասցեն",
|
||||
contact_us: "Հետադարձ կապ",
|
||||
contact_us_verification_required: "Սա օգտագործելու համար դուք պետք է ունենաք հաստատված էլ․ հասցե։:",
|
||||
contain: "Պարունակել",
|
||||
continue: "Շարունակել",
|
||||
copy: "Պատճենել",
|
||||
copy_link: "Պատճենել հղումը",
|
||||
copying: "Պատճենվում է",
|
||||
cover: "Ծածկել",
|
||||
copying_file: "Պատճենվում է %%",
|
||||
cover: "Ծածկոց",
|
||||
create_account: "Ստեղծել հաշիվ",
|
||||
create_free_account: "Ստեղծել անվճար հաշիվ",
|
||||
create_shortcut: "Ստեղծել դյուրանցում",
|
||||
current_password: "Ներկայիս գաղտնաբառ",
|
||||
credits: "Կրեդիտներ",
|
||||
current_password: "Ընթացիկ գաղտնաբառ",
|
||||
cut: "Կտրել",
|
||||
date_modified: "Փոփոխման ամսապիվ",
|
||||
clock: "Ժամացույց",
|
||||
clock_visible_hide: "Թաքցնել - Միշտ թաքնված",
|
||||
clock_visible_show: "Ցուցադրել - Միշտ տեսանելի",
|
||||
clock_visible_auto: "Ավտոմատ - լռելյայն, տեսանելի միայն ամբողջական էկրանային ռեժիմում:",
|
||||
close_all: "Փակել բոլորը",
|
||||
created: "Ստեղծված",
|
||||
date_modified: "Փոփոխման ամսաթիվ",
|
||||
default: "Լռելյայն",
|
||||
delete: "Ջնջել",
|
||||
delete_account: "Ջնջել հաշիվը",
|
||||
delete_permanently: "Ընդմիշտ ջնջել",
|
||||
deleting_file: "Ջնջվում է %%",
|
||||
deploy_as_app: "Տեղադրել որպես հավելված",
|
||||
descending: "Նվազման կարգով",
|
||||
descending: "Նվազող",
|
||||
desktop: "Աշխատասեղան",
|
||||
desktop_background_fit: "Հարմարեցնել",
|
||||
developers: "Ծրագրավորողներ",
|
||||
dir_published_as_website: "%strong% հրապարակվել է",
|
||||
disable_2fa: "Անջատել 2FA",
|
||||
disable_2fa_confirm: "Վստա՞հ եք, որ ցանկանում եք անջատել 2FA-ն:",
|
||||
disable_2fa_instructions: "Մուտքագրեք ձեր գաղտնաբառը՝ 2FA-ն անջատելու համար:",
|
||||
disassociate_dir: "Անջատել պանակը",
|
||||
documents: "Փաստաթղթեր",
|
||||
dont_allow: "Թույլ չտալ",
|
||||
download: "Ներբեռնել",
|
||||
downloading: "Ներբեռնում է",
|
||||
download_file: "Ներբեռնել ֆայլը",
|
||||
downloading: "Ներբեռնվում է",
|
||||
email: "Էլեկտրոնային հասցե",
|
||||
email_change_confirmation_sent: "Հաստատման նամակը ուղարկվել է ձեր նոր էլ. հասցեին։ Խնդրում ենք ստուգեք ձեր փոստարկղը և հետևեք ցուցումներին՝ գործընթացը ավարտելու համար:",
|
||||
email_invalid: "Էլ. հասցեն անվավեր է:",
|
||||
email_or_username: "Էլ․ հասցե կամ օգտանուն",
|
||||
empty_trash: "Դատարկել աղբամանը",
|
||||
email_required: "Էլ. հասցեն պարտադիր է:",
|
||||
empty_trash: "Դատարկել աղբարկղը",
|
||||
empty_trash_confirmation: "Իսկապե՞ս ուզում եք ընդմիշտ ջնջել աղբարկղում գտնվող տարրերը:",
|
||||
emptying_trash: "Աղբամանը դատարկվում է…",
|
||||
emptying_trash: "Աղբարկղը դատարկվում է…",
|
||||
enable_2fa: "Միացնել 2FA",
|
||||
end_hard: "Ավարտել խիստ",
|
||||
end_process_force_confirm: "Վստա՞հ եք, որ ցանկանում եք հարկադրաբար կանգնեցնել այս գործընթացը:",
|
||||
end_soft: "Ավարտել մեղմ",
|
||||
enlarged_qr_code: "Մեծացված QR-կոդ",
|
||||
enter_password_to_confirm_delete_user: "Մուտքագրեք ձեր գաղտնաբառը՝ հաշվի ջնջումը հաստատելու համար",
|
||||
error_message_is_missing: "Սխալի մասին հաղորդագրությունը բացակայում է:",
|
||||
error_unknown_cause: "Անհայտ սխալ է տեղի ունեցել:",
|
||||
error_uploading_files: "Չհաջողվեց վերբեռնել ֆայլերը",
|
||||
favorites: "Նախընտրածներ",
|
||||
feedback: "Հետադարձ կապ",
|
||||
feedback_c2a: "Խնդրում ենք օգտագործել ստորև բերված ձևը ձեր կարծիքի, մեկնաբանությունների և վրիպակների մասին զեկուցելու համար:",
|
||||
feedback_sent_confirmation: "Շնորհակալություն մեզ հետ կապնվելու համար: Եթե ձեր հաշվի հետ կապված էլ. հասցե ունեք, հնարավորինս շուտ կպատասխանեք ձեզ:",
|
||||
feedback_c2a: "Խնդրում ենք օգտագործել ստորև բերված ձևը՝ մեզ ուղարկելու ձեր կարծիքը, մեկնաբանությունները և վրիպակների հաղորդումները:",
|
||||
feedback_sent_confirmation: "Շնորհակալություն մեզ հետ կապվելու համար: Եթե ձեր հաշվի հետ կապված էլ. հասցե ունեք, հնարավորինս շուտ կպատասխանենք ձեզ:",
|
||||
fit: "Հարմարեցնել",
|
||||
folder: "Պանակ",
|
||||
force_quit: "Հարկադրված ելք",
|
||||
forgot_pass_c2a: "Մոռացե՞լ եք գաղտնաբառը",
|
||||
from: "Ումից՝",
|
||||
general: "Ընդհանուր",
|
||||
get_a_copy_of_on_puter: "Ստանալ '%%'-ի պատճենը Puter.com-ում:",
|
||||
get_a_copy_of_on_puter: "Ստանալ '%%'-ի պատճենը Puter.com-ում!",
|
||||
get_copy_link: "Ստանալ պատճենված հղումը",
|
||||
hide_all_windows: "Թաքցնել բոլոր պատուհանները",
|
||||
html_document: "HTML նիշք",
|
||||
home: "Գլխավոր",
|
||||
html_document: "HTML փաստաթուղթ",
|
||||
hue: "Երանգ",
|
||||
image: "Պատկեր",
|
||||
incorrect_password: "Սխալ գաղտնաբառ",
|
||||
invite_link: "Հրավերի հղում",
|
||||
item: "տարր",
|
||||
items_in_trash_cannot_be_renamed: "Այս տարրը չի կարող վերանվանվել, քանի որ այն աղբարկղում է: Այս տարրը վերանվանելու համար նախ տեղափոխեք այն աղբարկղից:",
|
||||
jpeg_image: "JPEG նիշք",
|
||||
jpeg_image: "JPEG պատկեր",
|
||||
keep_in_taskbar: "Պահպանել խնդրագոտում",
|
||||
language: "Լեզու",
|
||||
license: "Լիցենզիա",
|
||||
lightness: "Լուսավորություն",
|
||||
link_copied: "Հղումը պատճենվել է",
|
||||
loading: "Բեռնում",
|
||||
log_in: "Մուտք գործել",
|
||||
log_into_another_account_anyway: "Այնուամենայնիվ, մուտք գործեք մեկ այլ հաշիվ",
|
||||
log_out: "Դուրս գալ",
|
||||
looks_good: "Լավ է նայվում!",
|
||||
manage_sessions: "Սեսիաների կառավարում",
|
||||
menubar_style: "Մենյուբարի ոճը",
|
||||
menubar_style_desktop: "Աշխատասեղան",
|
||||
menubar_style_system: "Համակարգ",
|
||||
menubar_style_window: "Պատուհան",
|
||||
modified: "Փոփոխված",
|
||||
move: "Տեղափոխել",
|
||||
moving_file: "Տեղափոխվում է %%",
|
||||
my_websites: "Իմ կայքերը",
|
||||
name: "Անուն",
|
||||
name_cannot_be_empty: "Անվան դաշտը չի կառող լինել դատարկ։",
|
||||
name_cannot_contain_double_period: "Անունը չի կարող լինել '..' նիշը։",
|
||||
name_cannot_contain_period: "Անունը չի կարող պարունակել '.' նիշը։",
|
||||
name_cannot_contain_slash: "Անունը չի կարող պարունակել '/' նիշը։",
|
||||
name_cannot_be_empty: "Անվան դաշտը չի կարող լինել դատարկ:",
|
||||
name_cannot_contain_double_period: "Անունը չի կարող լինել '..' նիշը:",
|
||||
name_cannot_contain_period: "Անունը չի կարող լինել '.' նիշը:",
|
||||
name_cannot_contain_slash: "Անունը չի կարող պարունակել '/' նիշը:",
|
||||
name_must_be_string: "Անունը կարող է լինել միայն տող:",
|
||||
name_too_long: "Անունը չի կարող լինել ավելի քան %% նիշ:",
|
||||
new: "Նոր",
|
||||
new_email: "Նոր էլ. հասցե",
|
||||
new_folder: "Նոր պանակ",
|
||||
new_password: "Նոր գաղտնաբառ",
|
||||
new_username: "Նոր օգտանուն",
|
||||
no: "Ոչ",
|
||||
no_dir_associated_with_site: "Այս հասցեի հետ կապված պանակ չկա:",
|
||||
no_websites_published: "Դուք դեռ ոչ մի կայք չեք հրապարակել։",
|
||||
no_websites_published: "Դուք դեռ ոչ մի կայք չեք հրապարակել։ Սկսելու համար թղթապանակի վրա սեղմեք աջ",
|
||||
ok: "Լավ",
|
||||
open: "Բացել",
|
||||
open_in_new_tab: "Բացել նոր ներդիրով",
|
||||
open_in_new_window: "Բացել նոր պատուհանում",
|
||||
open_with: "Բացել հավելվածով",
|
||||
original_name: "սկզբնական անուն",
|
||||
original_path: "սկզբնական ուղի",
|
||||
oss_code_and_content: "Բաց կոդով ծրագրակազմ և բովանդակություն",
|
||||
password: "Գաղտնաբառ",
|
||||
password_changed: "Գաղտնաբառը փոփոխված է",
|
||||
passwords_do_not_match: "«Նոր գաղտնաբառ» և «Հաստատել նոր գաղտնաբառը» դաշտերը չեն համընկնում:",
|
||||
paste: "Կպցնել",
|
||||
password_recovery_rate_limit: "Դուք հասել եք մեր արագության սահմանաչափին. խնդրում ենք սպասել մի քանի րոպե: Ապագայում սա կանխելու համար խուսափեք էջը շատ անգամներ վերաբեռնելուց:",
|
||||
password_recovery_token_invalid: "Այս գաղտնաբառի վերականգնման տոկենը այլևս վավեր չէ:",
|
||||
password_recovery_unknown_error: "Անհայտ սխալ է տեղի ունեցել: Խնդրում ենք փորձել ավելի ուշ:",
|
||||
password_required: "Գաղտնաբառը պարտադիր է:",
|
||||
password_strength_error: "Գաղտնաբառը պետք է լինի առնվազն 8 նիշ երկարությամբ և պարունակի առնվազն մեկ մեծատառ, մեկ փոքրատառ, մեկ թիվ և մեկ հատուկ նիշ:",
|
||||
passwords_do_not_match: "«Նոր գաղտնաբառ» և «Հաստատել նոր գաղտնաբառը» չեն համընկնում:",
|
||||
paste: "Տեղադրել",
|
||||
paste_into_folder: "Տեղադրել պանակում",
|
||||
pick_name_for_website: "Ընտրել անուն ձեր կայքի համար",
|
||||
path: "Ուղի",
|
||||
personalization: "Անհատականացում",
|
||||
pick_name_for_website: "Ընտրեք անուն ձեր կայքի համար",
|
||||
picture: "Նկար",
|
||||
powered_by_puter_js: `Աջակցվում է {{link=docs}}Puter.js{{/link}}-ի կողմից`,
|
||||
pictures: "Նկարներ",
|
||||
plural_suffix: "ներ",
|
||||
powered_by_puter_js: "Աջակցվում է {{link=docs}}Puter.js{{/link}}-ի կողմից",
|
||||
preparing: "Պատրաստվում է...",
|
||||
preparing_for_upload: "Պատրաստվում է վերբեռնել...",
|
||||
print: "Տպել",
|
||||
privacy: "Գաղտնիություն",
|
||||
proceed_to_login: "Շարունակել մուտք գործելը",
|
||||
proceed_with_account_deletion: "Շարունակել հաշվի ջնջումը",
|
||||
process_status_initializing: "Սկսում է",
|
||||
process_status_running: "Աշխատում է",
|
||||
process_type_app: "Հավելված",
|
||||
process_type_init: "Սկսում",
|
||||
process_type_ui: "UI",
|
||||
properties: "Հատկություններ",
|
||||
public: "Հանրային",
|
||||
publish: "Հրապարակել",
|
||||
publish_as_website: "Հրապարակել որպես կայք",
|
||||
puter_description: "Փութերը գաղտնիության առաջնահերթություն ունեցող անձնական ամպ է՝ ձեր բոլոր ֆայլերը, հավելվածները և խաղերը մեկ անվտանգ տեղում պահելու համար, որը հասանելի է ցանկացած վայրից ցանկացած ժամանակ:",
|
||||
reading_file: "Ընթերցում է %strong%",
|
||||
recent: "Վերջին",
|
||||
recommended: "Խորհուրդ է տրվում",
|
||||
recover_password: "Վերականգնել գաղտնաբառը",
|
||||
refer_friends_c2a: "Ստացեք 1 ԳԲ Փութերում յուրաքանչյուր հաշիվ ստեղծող և այն հաստատող ընկերոջ համար: Ձեր ընկերը նույնպես կստանա 1 ԳԲ պահեստ:",
|
||||
refer_friends_social_media_c2a: "Ստացեք 1 ԳԲ անվճար պահեստ Puter.com-ում:",
|
||||
refer_friends_c2a: "Ստացեք 1 ԳԲ յուրաքանչյուր ընկերոջ համար, ով ստեղծում և հաստատում է հաշիվ Փութերում: Ձեր ընկերը նույնպես կստանա 1 ԳԲ!",
|
||||
refer_friends_social_media_c2a: "Ստացեք 1 ԳԲ անվճար պահեստ Puter.com-ում!",
|
||||
refresh: "Թարմացնել",
|
||||
release_address_confirmation: "Իսկապե՞ս ուզում եք ջնջել այս հասցեն:",
|
||||
release_address_confirmation: "Իսկապե՞ս ուզում եք թողարկել այս հասցեն:",
|
||||
remove_from_taskbar: "Հանել խնդրագոտուց",
|
||||
rename: "Վերանվանել",
|
||||
repeat: "Կրկնել",
|
||||
replace: "Փոխարինել",
|
||||
replace_all: "Փոխարինել բոլորը",
|
||||
resend_confirmation_code: "Նորից ուղարկել հաստատման կոդը",
|
||||
reset_colors: "Վերականգնել գույները",
|
||||
restart_puter_confirm: "Վստա՞հ եք, որ ցանկանում եք վերագործարկել Փութերը:",
|
||||
restore: "Վերականգնել",
|
||||
save: "Պահպանել",
|
||||
saturation: "Հագեցվածություն",
|
||||
save_account: "Պահպանել հաշիվը",
|
||||
save_account_to_get_copy_link: "Շարունակելու համար խնդրում ենք ստեղծել հաշիվ:",
|
||||
save_account_to_publish: "Շարունակելու համար խնդրում ենք ստեղծել հաշիվ:",
|
||||
save_session_c2a: "Ստեղծեք հաշիվ՝ ձեր ընթացիկ աշխատաշրջանը պահպանելու և աշխատանքը չկորցնելու համար:",
|
||||
scan_qr_c2a: "Սկանավորեք ստորև նշված կոդը՝ այլ սարքերից այս աշխատաշրջան մուտք գործելու համար",
|
||||
save_session: "Պահպանել սեսիան",
|
||||
save_session_c2a: "Ստեղծեք հաշիվ՝ ձեր ընթացիկ սեսիան պահպանելու և աշխատանքը չկորցնելու համար:",
|
||||
scan_qr_c2a: "Սկանավորեք ստորև նշված կոդը՝\nայլ սարքերից այս սեսիա մուտք գործելու համար",
|
||||
scan_qr_2fa: "Սկանավորեք QR-կոդը ձեր իսկորոշիչ հավելվածով",
|
||||
scan_qr_generic: "Սկանավորեք այս QR-կոդը ձեր հեռախոսով կամ այլ սարքով",
|
||||
search: "Որոնել",
|
||||
seconds: "վայրկյաններ",
|
||||
security: "Անվտանգություն",
|
||||
select: "Ընտրել",
|
||||
select_color: "Ընտրել գույն…",
|
||||
selected: "ընտրված",
|
||||
select_color: "Ընտրել գույնը…",
|
||||
sessions: "Սեսիաներ",
|
||||
send: "Ուղարկել",
|
||||
send_password_recovery_email: "Ուղարկել գաղտնաբառի վերականգնման էլ․փոստի նամակ",
|
||||
session_saved: "Շնորհակալություն հաշիվ ստեղծելու համար: Այս աշխատաշրջանը պահպանվել է:",
|
||||
session_saved: "Շնորհակալություն հաշիվ ստեղծելու համար: Այս սեսիան պահպանվել է:",
|
||||
settings: "Կարգավորումներ",
|
||||
set_new_password: "Սահմանել նոր գաղտնաբառ",
|
||||
share_to: "Տարածել",
|
||||
share: "Տարածել",
|
||||
share_to: "Տարածել դեպի",
|
||||
share_with: "Տարածել հետ՝",
|
||||
shortcut_to: "Դյուրանցում դեպի",
|
||||
show_all_windows: "Ցույց տալ բոլոր պատուհանները",
|
||||
show_hidden: "Ցույց տալ թաքնված տարրերը",
|
||||
sign_in_with_puter: "Մուտք գործել Փութերի միջոցով",
|
||||
sign_up: "Գրանցվել",
|
||||
signing_in: "Մուտք է գործում",
|
||||
signing_in: "Մուտք է գործում…",
|
||||
size: "Չափ",
|
||||
skip: "Բաց թողնել",
|
||||
something_went_wrong: "Ինչ-որ բան սխալ գնաց:",
|
||||
sort_by: "Տեսակավորել ըստ՝",
|
||||
start: "Սկսել",
|
||||
status: "Կարգավիճակ",
|
||||
storage_usage: "Պահեստի օգտագործում",
|
||||
storage_puter_used: "օգտագործվում է Փութերի կողմից",
|
||||
taking_longer_than_usual: "Սովորականից մի փոքր ավելի երկար է տևում: Խնդրում ենք սպասել...",
|
||||
text_document: "Text նիշք",
|
||||
tos_fineprint: `Սեղմելով «Ստեղծել անվճար հաշիվ»՝ դուք համաձայնում եք Փութերի {{link=terms}}ծառայությունների պայմաններին{{/link}} և {{link=privacy}}գաղտնիության քաղաքականությանը{{/link}}:`,
|
||||
trash: "Աղբաման",
|
||||
task_manager: "Առաջադրանքների կառավարիչ",
|
||||
taskmgr_header_name: "Անուն",
|
||||
taskmgr_header_status: "Կարգավիճակ",
|
||||
taskmgr_header_type: "Տեսակ",
|
||||
terms: "Պայմաններ",
|
||||
text_document: "Տեքստային փաստաթուղթ",
|
||||
tos_fineprint: "Սեղմելով «Ստեղծել անվճար հաշիվ»՝ դուք համաձայնում եք Փութերի {{link=terms}}ծառայությունների պայմաններին{{/link}} և {{link=privacy}}գաղտնիության քաղաքականությանը{{/link}}:",
|
||||
transparency: "Թափանցիկություն",
|
||||
trash: "Աղբարկղ",
|
||||
two_factor: "Երկու գործոնով նույնականացում",
|
||||
two_factor_disabled: "2FA-ն անջատված է",
|
||||
two_factor_enabled: "2FA-ն միացված է",
|
||||
type: "Տեսակ",
|
||||
type_confirm_to_delete_account: "Հաշիվը ջնջելու համար գրեք 'confirm':",
|
||||
ui_colors: "UI գույներ",
|
||||
ui_manage_sessions: "Սեսիայի կառավարիչ",
|
||||
ui_revoke: "Հետ կանչել",
|
||||
undo: "Հետարկել",
|
||||
unzip: "Դուրս բերել",
|
||||
unlimited: "Անսահմանափակ",
|
||||
unzip: "Արխիվից հանել",
|
||||
upload: "Վերբեռնել",
|
||||
upload_here: "Վերբեռնել այստեղ",
|
||||
usage: "Օգտագործում",
|
||||
username: "Օգտանուն",
|
||||
username_changed: "Օգտանունը հաջողությամբ թարմացվել է:",
|
||||
username_required: "Օգտանունը պարտադիր է:",
|
||||
versions: "Տարբերակներ",
|
||||
yes_release_it: "Այո, ջնջել",
|
||||
you_have_been_referred_to_puter_by_a_friend: "Դուք ուղղորդվել եք Փութեր ձեր ընկերոջ կողմից:",
|
||||
zip: "Սեղմել ZIP նիշքի",
|
||||
},
|
||||
videos: "Տեսանյութեր",
|
||||
visibility: "Տեսանելիություն",
|
||||
yes: "Այո",
|
||||
yes_release_it: "Այո, թողարկեք այն",
|
||||
you_have_been_referred_to_puter_by_a_friend: "Դուք ուղղորդվել եք Փութեր ձեր ընկերոջ կողմից!",
|
||||
zip: "Ավելացնել արխիվում",
|
||||
zipping_file: "Ավելացվում է արխիվում %strong%-ը",
|
||||
|
||||
// === 2FA Setup ===
|
||||
setup2fa_1_step_heading: "Բացեք ձեր իսկորոշիչ հավելվածը",
|
||||
setup2fa_1_instructions: `
|
||||
Դուք կարող եք օգտագործել ցանկացած իսկորոշիչ հավելված, որն աջակցում է ժամանակի վրա հիմնված միանգամյա գաղտնաբառ (TOTP) պրոտոկոլը:
|
||||
Կան բազմաթիվ տարբերակներ, բայց եթե վստահ չեք,
|
||||
<a target="_blank" href="https://authy.com/download">Authy</a>
|
||||
լավ ընտրություն է Android-ի և iOS-ի համար:
|
||||
`,
|
||||
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",
|
||||
|
||||
// === 2FA Login ===
|
||||
login2fa_otp_title: "Մուտքագրեք 2FA կոդը",
|
||||
login2fa_otp_instructions: "Մուտքագրեք 6 նիշանոց կոդը ձեր իսկորոշիչ հավելվածից:",
|
||||
login2fa_recovery_title: "Մուտքագրեք վերականգնման կոդը",
|
||||
login2fa_recovery_instructions: "Մուտքագրեք ձեր վերականգնման կոդերից մեկը ձեր հաշիվ մուտք գործելու համար:",
|
||||
login2fa_use_recovery_code: "Օգտագործել վերականգնման կոդը",
|
||||
login2fa_recovery_back: "Հետ",
|
||||
login2fa_recovery_placeholder: "XXXXXXXX",
|
||||
}
|
||||
};
|
||||
|
||||
export default hy;
|
||||
@@ -22,32 +22,46 @@ const ig = {
|
||||
english_name: "Igbo",
|
||||
code: "ig",
|
||||
dictionary: {
|
||||
about: "maka",
|
||||
about: "banyere",
|
||||
account: "akaụntụ",
|
||||
account_password: "nyochaa paswọọdụ akaụntụ",
|
||||
access_granted_to: "Enyere ohere",
|
||||
add_existing_account: "Tinye Akaụntụ dị adị",
|
||||
all_fields_required: 'A chọrọ mpaghara niile.',
|
||||
allow: 'ekwe',
|
||||
apply: "Tinye",
|
||||
ascending: 'Na-arịgo',
|
||||
auto_arrange: 'Hazie akpaaka',
|
||||
associated_websites: "Weebụsaịtị Ejikọtara",
|
||||
auto_arrange: 'ndokwa onwe',
|
||||
background: "ndabere",
|
||||
browse: "Chọgharịa",
|
||||
cancel: 'Kagbuo',
|
||||
center: 'etiti',
|
||||
change_desktop_background: 'Gbanwee ndabere desktọpụ…',
|
||||
change_email: "Gbanwee email",
|
||||
change_language: "Gbanwee Asụsụ",
|
||||
change_password: "Gbanwee paswọọdụ",
|
||||
change_ui_colors: "Gbanwee agba UI",
|
||||
change_username: "Gbanwee aha njirimara",
|
||||
change_desktop_background: 'ịgbanwe ndabere desktọpụ…',
|
||||
change_email: "ịgbanwe email",
|
||||
change_language: "ịgbanwe Asụsụ",
|
||||
change_password: "ịgbanwe paswọọdụ",
|
||||
change_ui_colors: "ịgbanwe agba UI",
|
||||
change_username: "ịgbanwe aha njirimara",
|
||||
close: 'mmechi',
|
||||
close_all_windows: "mmechi Windows niile",
|
||||
close_all_windows_confirm: "Ị ji n'aka na ị chọrọ imechi windo niile?",
|
||||
close_all_windows_and_log_out: 'mmechi Windows wee pụọ',
|
||||
change_always_open_with: "Ịchọrọ iji ụdị faịlụ a mepee mgbe niile",
|
||||
close_all_windows_and_log_out: 'mmechi Windows na wee pụọ',
|
||||
change_always_open_with: "Ị chọrọ I na mepee ụdị faịlụ site na",
|
||||
color: 'Agba',
|
||||
confirm: 'gosi',
|
||||
confirm_2fa_setup: 'Etinyela m koodu ahụ na ngwa nyocha m',
|
||||
confirm_2fa_recovery: 'Echekwala m koodu mgbake m na ebe echedoro',
|
||||
hue: 'Hue',
|
||||
confirm_account_for_free_referral_storage_c2a: 'Mepụta akaụntụ wee kwado adreesị ozi-e gị iji nweta 1 GB nke nchekwa efu. Enyi gị ga-enwetakwa 1 GB nke nchekwa efu.',
|
||||
confirm_code_generic_incorrect: "Koodu ezighi ezi.",
|
||||
confirm_code_generic_too_many_requests: "Ọtụtụ ọchịchọ. Biko chere nkeji ole na ole.",
|
||||
confirm_code_generic_submit: "Nye koodu",
|
||||
confirm_code_generic_try_again: "Nwa ọzọ",
|
||||
confirm_code_generic_title: "Tinye koodu Nkwenye",
|
||||
confirm_code_2fa_instruction: "Tinye koodu ọnụọgụ isi site na ngwa nyocha gị.",
|
||||
confirm_code_2fa_submit_btn: "tinye",
|
||||
confirm_code_2fa_title: "Tinye koodu 2FA",
|
||||
confirm_delete_multiple_items: "Ị ji n'aka na ịchọrọ ihichapụ ihe ndị a kpamkpam?",
|
||||
confirm_delete_single_item: 'Ịchọrọ ihichapụ ihe a kpamkpam?',
|
||||
confirm_open_apps_log_out: "Ị nwere ngwa mepere emepe. Ị ji n'aka na ị chọrọ ịpụ?",
|
||||
@@ -55,34 +69,46 @@ const ig = {
|
||||
confirm_delete_user: "Ị ji n'aka na ịchọrọ ihichapụ akaụntụ gị? A ga-ehichapụ faịlụ gị niile na data gị kpamkpam. Enweghị ike imegharị ihe a.",
|
||||
confirm_delete_user_title: "Hichapụ Akaụntụ?",
|
||||
confirm_session_revoke: "O doro gị anya na ịchọrọ kagbuo nnọkọ a?",
|
||||
confirm_your_email_address: "Kwenye na adreesị email",
|
||||
contact_us: "Kpọtụrụ anyị",
|
||||
contact_us_verification_required: "Ị ga-enwerịrị adreesị email ekwenyesiri ike ka ị jiri nke a.",
|
||||
contain: 'nwere',
|
||||
continue: "Gaa n'ihu",
|
||||
copy: 'Detuo',
|
||||
copy_link: "Detuo njikọ",
|
||||
copying: "Na-eṅomi",
|
||||
copying: "n'ide",
|
||||
copying_file: "n'ide %%",
|
||||
cover: 'Mkpuchi',
|
||||
create_account: "Mebe akaụntụ",
|
||||
create_account: "Mepe akaụntụ",
|
||||
create_free_account: "Mepụta Akaụntụ efu",
|
||||
create_shortcut: "Mepụta Ụzọ mkpirisi",
|
||||
credits: "Ebe e si nweta",
|
||||
current_password: "paswọọdụ Ugbu a",
|
||||
cut: 'Bee',
|
||||
clock: "Elekere",
|
||||
clock_visible_hide: 'Zoo - ezoro ezo mgbe niile',
|
||||
clock_visible_hide: 'Ezo - ezoro ezo mgbe niile',
|
||||
clock_visible_show: 'Gosi - A na-ahụ ya mgbe niile',
|
||||
clock_visible_auto: 'Nchekwa onwe - Emepụtara, a na-ahụ ya naanị na ọnọdụ ihuenyo zuru oke.',
|
||||
date_modified: 'Ụbọchị gbanwee',
|
||||
close_all: 'Mechie ha niile',
|
||||
created: 'kere',
|
||||
date_modified: 'Ụbọchị ịgbanwe',
|
||||
default: 'Default',
|
||||
delete: 'Hichapụ',
|
||||
delete_account: "Hichapụ Akaụntụ",
|
||||
delete_permanently: "Hichapụ kpamkpam",
|
||||
deleting_file: "ihichapụ %%",
|
||||
deploy_as_app: 'Bugharịa dị ka ngwa',
|
||||
descending: 'agbadata',
|
||||
desktop: 'desktọpụ',
|
||||
desktop_background_fit: "dabara",
|
||||
developers: "Ndị mmepe",
|
||||
developers: "Ndị mme ya",
|
||||
dir_published_as_website: `%strong% e bipụtara ya:`,
|
||||
disable_2fa: 'Gbanyụọ 2FA',
|
||||
disable_2fa_confirm: "Ị ji n'aka na ịchọrọ gbanyụọ 2FA?",
|
||||
disable_2fa_instructions: "Tinye paswọọdụ gị i ji gbanyụọ 2FA.",
|
||||
disassociate_dir: "hapụ Akwụkwọ ndekọ",
|
||||
documents: 'akwụkwọ',
|
||||
dont_allow: 'Ekwela',
|
||||
download: 'Budata',
|
||||
download_file: 'Budata faịlụ',
|
||||
downloading: "Nbudata",
|
||||
@@ -94,22 +120,31 @@ const ig = {
|
||||
empty_trash: 'Mkpofu ahịhịa',
|
||||
empty_trash_confirmation: `Ị ji n'aka na ịchọrọ ihichapụ ihe ndị dị na ahịhịa?`,
|
||||
emptying_trash: 'Mkpofu ahịhịa…',
|
||||
enable_2fa: 'Kwado 2FA',
|
||||
end_hard: "Kwụsị ike",
|
||||
end_process_force_confirm: "O doro gị anya na ịchọrọ ịmanye-akwụsị usoro a?",
|
||||
end_soft: "Kwụsị nwayọọ",
|
||||
enlarged_qr_code: "gbasawanyere QR Koodu",
|
||||
enter_password_to_confirm_delete_user: "Tinye paswọọdụ gị iji kwado nhichapụ akaụntụ gị",
|
||||
error_message_is_missing: "Ozi mmebe na-efu.",
|
||||
error_unknown_cause: "Nhe amaghị ama mere.",
|
||||
error_uploading_files: "Ibulite faịlụ agaghị",
|
||||
favorites: "ọkacha mmasị",
|
||||
feedback: "nzaghachi",
|
||||
feedback_c2a: "Biko jiri fọm dị n'okpuru zitere anyị nzaghachi gị, nkwupụta gị na mkpesa ahụhụ.",
|
||||
feedback_sent_confirmation: "Daalụ maka ịkpọtụrụ anyị. Ọ bụrụ na ị nwere email metụtara akaụntụ gị, ị ga-anụghachi anyị ozugbo enwere ike.",
|
||||
fit: "dabara",
|
||||
folder: 'nchekwa',
|
||||
force_quit: 'ịkwụsị ike',
|
||||
forgot_pass_c2a: "Chefuru paswọọdụ?",
|
||||
from: "si",
|
||||
general: "Izugbe",
|
||||
get_a_copy_of_on_puter: `Nweta otu '%%' na Puter.com!`,
|
||||
get_copy_link: 'Nweta njikọ nke',
|
||||
hide_all_windows: "Zoo Windows niile",
|
||||
hide_all_windows: "Ezo Windows niile",
|
||||
home: 'ụlọ',
|
||||
html_document: 'akwụkwọ HTML',
|
||||
hue: 'Hue',
|
||||
image: 'Onyonyo',
|
||||
incorrect_password: "paswọọdụ ezighi ezi",
|
||||
invite_link: "Njikọ ịkpọ òkù",
|
||||
@@ -121,11 +156,17 @@ const ig = {
|
||||
license: "ikike",
|
||||
lightness: 'ìhè',
|
||||
link_copied: "depụtagha njikọ",
|
||||
loading: 'Na-ebugo',
|
||||
loading: 'Na-ebugo ibu',
|
||||
log_in: "Banye",
|
||||
log_into_another_account_anyway: 'Banye na akaụntụ ọzọ na agbanyeghị',
|
||||
log_out: 'pụọ',
|
||||
looks_good: "Ọ mara mma!",
|
||||
manage_sessions: "Jikwaa Oge",
|
||||
menubar_style: "Ụdị Menubar",
|
||||
menubar_style_desktop: "Desktọpụ",
|
||||
menubar_style_system: "Sistemu",
|
||||
menubar_style_window: "Window",
|
||||
modified: 'gbanwee',
|
||||
move: 'Bugharịa',
|
||||
moving_file: "Na Bugharịa %%",
|
||||
my_websites: "Weebụsaịtị m",
|
||||
@@ -147,23 +188,31 @@ const ig = {
|
||||
ok: 'OK',
|
||||
open: "Mepee",
|
||||
open_in_new_tab: "Mepee na Tab ọhụrụ",
|
||||
open_in_new_window: "Mepee na windo ọhụrụ",
|
||||
open_with: "Mepee Ya",
|
||||
open_in_new_window: "Mepee na window ọhụrụ",
|
||||
open_with: "Ji Mepee Ya",
|
||||
original_name: 'Aha izizi',
|
||||
original_path: 'Ụzọ izizi',
|
||||
oss_code_and_content: "Ngwanrọ na ọdịnaya mepere emepe",
|
||||
password: "paswọọdụ",
|
||||
password_changed: "gbanwere paswọọdụ.",
|
||||
password_recovery_rate_limit: "Ị ruru oke ọnụ ahịa anyị; biko chere nkeji ole na ole. Iji gbochie nke a n'ọdịnihu, zere ibugharị ibe ahụ ọtụtụ oge.",
|
||||
password_recovery_token_invalid: "Ihe mgbake mgbake okwuntughe adịkwaghị irè.",
|
||||
password_recovery_unknown_error: "Nhe amaghị ama mere. Biko nwaa ọzọ ma emechaa.",
|
||||
password_required: 'Achọrọ paswọọdụ.',
|
||||
password_strength_error: "paswọọdụ ga-enwerịrị opekata mpe mkpụrụedemede 8 ma nwee opekata mpe otu mkpụrụedemede ukwu, otu mkpụrụedemede obere, otu nọmba na otu agwa pụrụ iche..",
|
||||
passwords_do_not_match: '`paswọọdụ ọhụrụ` na `Kwenye paswọọdụ ọhụrụ` adabaghị.',
|
||||
paste: 'tapawa',
|
||||
paste_into_folder: "Tapawa n'ime nchekwa",
|
||||
paste: 'tinye',
|
||||
paste_into_folder: "Tinye n'ime nchekwa",
|
||||
path: 'ụzọ',
|
||||
personalization: "Nhazi onwe",
|
||||
pick_name_for_website: "Họrọ aha maka weebụsaịtị gị:",
|
||||
picture: "Foto",
|
||||
pictures: 'Foto',
|
||||
plural_suffix: 's',
|
||||
powered_by_puter_js: `Kwadoro site na {{link=docs}}Puter.js{{/link}}`,
|
||||
preparing: "Na-akwado...",
|
||||
preparing_for_upload: "Na-akwado maka bulite...",
|
||||
print: 'ebipụta',
|
||||
privacy: "Nzuzo",
|
||||
proceed_to_login: 'Gaba na nbanye',
|
||||
proceed_with_account_deletion: "Gaa n'ihu na ihichapụ akaụntụ",
|
||||
@@ -173,10 +222,13 @@ const ig = {
|
||||
process_type_init: 'Init',
|
||||
process_type_ui: 'UI',
|
||||
properties: "Njirimara",
|
||||
public: 'eze',
|
||||
publish: "Bipụta",
|
||||
publish_as_website: 'Bipụta dị ka webụsaịtị',
|
||||
puter_description: `Puter bụ igwe ojii nzuzo nke mbụ iji dobe faịlụ gị, ngwa na egwuregwu gị n'otu ebe echekwara, enwere ike ịnweta ya ebe ọ bụla n'oge ọ bụla..`,
|
||||
reading_file: "ọgụgụ %strong%",
|
||||
recent: "Na nso nso a",
|
||||
recommended: "nwere ike ikwu",
|
||||
recover_password: "Weghachite paswọọdụ",
|
||||
refer_friends_c2a: "Nweta 1 GB maka enyi ọ bụla mepụtara ma kwado akaụntụ na Puter. Enyi gị ga-enwetakwa 1 GB!",
|
||||
refer_friends_social_media_c2a: `Nweta 1 GB nke nchekwa efu na Puter.com!`,
|
||||
@@ -191,6 +243,7 @@ const ig = {
|
||||
reset_colors: "Tọgharịa Agba",
|
||||
restart_puter_confirm: "Ị ji n'aka na ịchọrọ ịmalitegharịa Puter?",
|
||||
restore: "weghachi",
|
||||
save: 'chekwa',
|
||||
saturation: 'juputa',
|
||||
save_account: 'Chekwa akaụntụ',
|
||||
save_account_to_get_copy_link: "Biko mepụta akaụntụ iji gaa n'ihu.",
|
||||
@@ -198,6 +251,11 @@ const ig = {
|
||||
save_session: 'Chekwa oge',
|
||||
save_session_c2a: "Mepụta akaụntụ iji chekwaa nnọkọ gị ugbu a ma zere ịla n'iyi ọrụ gị.",
|
||||
scan_qr_c2a: "Chọgharịa koodu dị n'okpuru ka ịbanye na nnọkọ a site na ngwaọrụ ndị ọzọ",
|
||||
scan_qr_2fa: 'Jiri ngwa nyocha gị nyochaa QR koodu',
|
||||
scan_qr_generic: 'Jiri ekwentị gị ma ọ bụ ngwaọrụ ọzọ nyochaa QR koodu a',
|
||||
search: 'Chọọ',
|
||||
seconds: 'sekọnd',
|
||||
security: "nche",
|
||||
select: "Họrọ",
|
||||
selected: 'họrọ',
|
||||
select_color: 'Họrọ agba…',
|
||||
@@ -206,20 +264,24 @@ const ig = {
|
||||
send_password_recovery_email: "Zipu ozi-e mgbake paswọọdụ ",
|
||||
session_saved: "Daalụ maka ịmepụta akaụntụ. Achekwala nnọkọ a.",
|
||||
settings: "Ntọala",
|
||||
set_new_password: "Tọọ paswọọdụ ọhụrụ",
|
||||
share_to: "Kekọrịta na",
|
||||
set_new_password: "Tinye paswọọdụ ọhụrụ",
|
||||
share: "ike",
|
||||
share_to: "ike nye",
|
||||
share_with: "ji ike nye:",
|
||||
shortcut_to: "Ụzọ mkpirisi ka",
|
||||
show_all_windows: "Gosi Windows niile",
|
||||
show_hidden: 'Show hidden',
|
||||
show_hidden: 'Gosi ihe ezozo',
|
||||
sign_in_with_puter: "Jiri Puter banye",
|
||||
sign_up: "Debanye aha",
|
||||
signing_in: "Ịbanye…",
|
||||
size: 'Nha',
|
||||
skip: 'Mafee',
|
||||
something_went_wrong: "Ọ nwere ihe adịghị mma.",
|
||||
sort_by: 'Hazie site na',
|
||||
start: 'mbido',
|
||||
status: "Ọnọdụ",
|
||||
storage_usage: "Ojiji Nchekwa",
|
||||
storage_puter_used: 'nke Puter na-eji',
|
||||
storage_puter_used: 'nke Puter na-ji',
|
||||
taking_longer_than_usual: 'Na-ewe obere oge karịa ka ọ dị na mbụ. Biko chere...',
|
||||
task_manager: "Onye njikwa ọrụ",
|
||||
taskmgr_header_name: "Aha",
|
||||
@@ -230,6 +292,9 @@ const ig = {
|
||||
tos_fineprint: `Site na ịpị 'Mepụta Akaụntụ efu' ị kwenyere na Puter {{link=terms}} Usoro ọrụ{{/link}} na {{link=privacy}}Amụma nzuzo{{/link}} Puter.`,
|
||||
transparency: "nghọta",
|
||||
trash: 'ahịhịa',
|
||||
two_factor: 'Nyocha ihe abụọ',
|
||||
two_factor_disabled: 'Agbanyụrụ 2FA',
|
||||
two_factor_enabled: 'Agbanyere 2FA',
|
||||
type: 'Ụdị',
|
||||
type_confirm_to_delete_account: "Pịnye 'kwenye' ka ihichapụ akaụntụ gị.",
|
||||
ui_colors: "Agba UI",
|
||||
@@ -245,11 +310,42 @@ const ig = {
|
||||
username_changed: 'Emelitere aha njirimara nke ọma.',
|
||||
username_required: 'Achọrọ aha njirimara.',
|
||||
versions: "Ụdịdị",
|
||||
videos: 'Vidiyo',
|
||||
visibility: 'Nhụta',
|
||||
yes: 'Ee',
|
||||
yes_release_it: 'Ee, Hapụ ya',
|
||||
you_have_been_referred_to_puter_by_a_friend: "Otu enyi zigara gị na Puter!",
|
||||
zip: "Zip",
|
||||
zipping_file: "Zipping %strong%",
|
||||
|
||||
// === 2FA Setup ===
|
||||
setup2fa_1_step_heading: 'Mepee ngwa nyocha',
|
||||
setup2fa_1_instructions: `
|
||||
Ị nwere ike iji ngwa nyocha ọ bụla na-akwado protocol Paswọdu Otu oge (TOTP) dabere na Oge.
|
||||
Enwere ọtụtụ nhọrọ, mana ọ bụrụ na ị maghị
|
||||
<a target="_blank" href="https://authy.com/download">Authy</a>
|
||||
bụ nhọrọ siri ike maka android na iOS.
|
||||
`,
|
||||
setup2fa_2_step_heading: 'Nyochaa QR koodu',
|
||||
setup2fa_3_step_heading: 'Tinye koodu ọnụọgụ isi',
|
||||
setup2fa_4_step_heading: 'Detuo koodu mgbake gị',
|
||||
setup2fa_4_instructions: `
|
||||
Koodu mgbake ndị a bụ naanị ụzọ ị ga-esi iba akaụntụ gị ma ọ bụrụ na ekwentị gị furu ma ọ bụ enweghị ike iji ngwa nyocha gị..
|
||||
Gbaa mbọ hụ na ịchekwaa ha n'ebe dị mma.
|
||||
`,
|
||||
setup2fa_5_step_heading: 'Kwenye ntọlite 2FA',
|
||||
setup2fa_5_confirmation_1: 'Echekwala m koodu mgbake m na ebe echekwa',
|
||||
setup2fa_5_confirmation_2: 'Adị m njikere i Kwado 2FA',
|
||||
setup2fa_5_button: 'Kwado 2FA',
|
||||
|
||||
// === 2FA Login ===
|
||||
login2fa_otp_title: 'Tinye koodu 2FA',
|
||||
login2fa_otp_instructions: 'Tinye koodu ọnụọgụ isi site na ngwa nyocha.',
|
||||
login2fa_recovery_title: 'Tinye koodu mgbake',
|
||||
login2fa_recovery_instructions: 'Tinye otu koodu mgbake gị i ji eba akaụntụ gị.',
|
||||
login2fa_use_recovery_code: 'Ji koodu mgbake',
|
||||
login2fa_recovery_back: 'Azu',
|
||||
login2fa_recovery_placeholder: 'XXXXXXXX',
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -103,8 +103,8 @@ const it = {
|
||||
developers: "Sviluppatori",
|
||||
dir_published_as_website: `%strong% è stato pubblicato su:`,
|
||||
disable_2fa: 'Disabilita 2FA',
|
||||
disable_2fa_confirm: "Sei sicuro di voler disabilitare 2FA?",
|
||||
disable_2fa_instructions: "Inserisci la tua password per disabilitare 2FA.",
|
||||
disable_2fa_confirm: "Sei sicuro di voler disabilitare la 2FA?",
|
||||
disable_2fa_instructions: "Inserisci la tua password per disabilitare la 2FA.",
|
||||
disassociate_dir: "Dissocia la Directory",
|
||||
documents: 'Documenti',
|
||||
dont_allow: 'Non consentire',
|
||||
@@ -113,13 +113,13 @@ const it = {
|
||||
downloading: "Download in corso",
|
||||
email: "Email",
|
||||
email_change_confirmation_sent: "Ti abbiamo inviato un'email di conferma. Controlla la tua casella di posta e segui le istruzioni per completare il processo.",
|
||||
email_invalid: 'Email non valida.',
|
||||
email_invalid: 'Email invalida.',
|
||||
email_or_username: "Email o Nome Utente",
|
||||
email_required: "Email richiesta.",
|
||||
empty_trash: 'Svuota Cestino',
|
||||
empty_trash_confirmation: `Sei sicuro di voler svuotare il cestino?`,
|
||||
emptying_trash: 'Il cestino si sta svuotando…',
|
||||
enable_2fa: 'Abilita 2FA',
|
||||
enable_2fa: 'Abilita la 2FA',
|
||||
end_hard: "Forza la chiusura",
|
||||
end_process_force_confirm: "Sei sicuro di voler forzare la chiusura di questo processo?",
|
||||
end_soft: "Chiudi",
|
||||
@@ -240,7 +240,7 @@ const it = {
|
||||
replace_all: 'Sostituisci tutto',
|
||||
resend_confirmation_code: "Invia di nuovo il codice di conferma",
|
||||
reset_colors: "Ripristina i colori",
|
||||
restart_puter_confirm: "Sei sicuro di voler resettare Puter?",
|
||||
restart_puter_confirm: "Sei sicuro di voler riavviare Puter?",
|
||||
restore: "Ripristina",
|
||||
save: "Salva",
|
||||
saturation: "Saturazione",
|
||||
@@ -251,7 +251,7 @@ const it = {
|
||||
save_session_c2a: 'Crea un account per salvare la tua sessione e non perdere i tuoi dati.',
|
||||
scan_qr_c2a: 'Scansiona il codice qua sotto per utilizzare questa sessione da altri dispositivi',
|
||||
scan_qr_2fa: 'Scansiona il codice QR con la tua app di autenticazione',
|
||||
scan_qr_generic: 'Scansiona il codice QR usando il tuo sma',
|
||||
scan_qr_generic: 'Scansiona il codice QR usando il tuo smartphone',
|
||||
search: 'Search',
|
||||
seconds: 'seconds',
|
||||
security: "Security",
|
||||
@@ -260,7 +260,7 @@ const it = {
|
||||
select_color: 'Seleziona un colore…',
|
||||
sessions: "Sessioni",
|
||||
send: "Invia",
|
||||
send_password_recovery_email: "Invia Email per il ripristino della password",
|
||||
send_password_recovery_email: "Invia email per il ripristino della password",
|
||||
session_saved: "Grazie per aver creato un account. La sessione è stata salvata",
|
||||
settings: "Impostazioni",
|
||||
set_new_password: "Imposta una nuova Password",
|
||||
@@ -282,7 +282,7 @@ const it = {
|
||||
storage_usage: "Utilizzo dello spazio",
|
||||
storage_puter_used: 'utilizzato da Puter',
|
||||
taking_longer_than_usual: 'Il processo in corso ci sta mettendo più del solito. Attendere prego...',
|
||||
task_manager: "Task Manager",
|
||||
task_manager: "Gestione attività",
|
||||
taskmgr_header_name: "Nome",
|
||||
taskmgr_header_status: "Stato",
|
||||
taskmgr_header_type: "Tipo",
|
||||
@@ -301,7 +301,7 @@ const it = {
|
||||
ui_revoke: "Revoca",
|
||||
undo: 'Annulla',
|
||||
unlimited: 'Illimitato',
|
||||
unzip: "Unzip",
|
||||
unzip: "Estrai",
|
||||
upload: 'Carica',
|
||||
upload_here: 'Carica qui',
|
||||
usage: 'Utilizzo',
|
||||
@@ -334,8 +334,8 @@ const it = {
|
||||
`,
|
||||
setup2fa_5_step_heading: 'Conferma la configurazione del 2FA',
|
||||
setup2fa_5_confirmation_1: 'Ho salvato i miei codici di recupero in un luogo sicuro',
|
||||
setup2fa_5_confirmation_2: 'Sono pronto per abilitare il 2FA',
|
||||
setup2fa_5_button: 'Abilita 2FA',
|
||||
setup2fa_5_confirmation_2: 'Sono pronto per abilitare la 2FA',
|
||||
setup2fa_5_button: 'Abilita la 2FA',
|
||||
|
||||
// === 2FA Login ===
|
||||
login2fa_otp_title: 'Inserisci il codice 2FA',
|
||||
@@ -348,4 +348,4 @@ const it = {
|
||||
}
|
||||
};
|
||||
|
||||
export default it;
|
||||
export default it;
|
||||
@@ -22,77 +22,150 @@ const pl = {
|
||||
english_name: "Polish",
|
||||
code: "pl",
|
||||
dictionary: {
|
||||
about: "Informacje",
|
||||
account: "Konto",
|
||||
account_password: "Sprawdź hasło konta",
|
||||
access_granted_to: "Przyznano dostęp do",
|
||||
add_existing_account: "Dodaj istniejące konto",
|
||||
all_fields_required: 'Wszystkie pola są wymagane.',
|
||||
allow: 'Pozwól',
|
||||
apply: "Zaaplikuj",
|
||||
ascending: 'Rosnąco',
|
||||
associated_websites: "Powiązane strony",
|
||||
auto_arrange: 'Auto Aranżacja',
|
||||
background: "Tło",
|
||||
browse: "Przeglądaj",
|
||||
cancel: 'Anuluj',
|
||||
center: 'Środek',
|
||||
center: 'Na środku',
|
||||
change_desktop_background: 'Zmień tło pulpitu…',
|
||||
change_email: "Zmień email",
|
||||
change_language: "Zmień język",
|
||||
change_password: "Zmień hasło",
|
||||
change_ui_colors: "Zmień kolory interfejsu",
|
||||
change_username: "Zmień użytkownika",
|
||||
close: 'Zamknij',
|
||||
close_all_windows: "Zamknij wszystkie okna",
|
||||
close_all_windows_confirm: "Czy jesteś pewien że chcesz zamknąć wszystkie okna?",
|
||||
close_all_windows_and_log_out: 'Zamknij wszystkie okna i wyloguj',
|
||||
change_always_open_with: "Czy chcesz zawsze otwierać ten typ pliku używając",
|
||||
color: 'Kolor',
|
||||
confirm: 'Potwierdzam',
|
||||
confirm_2fa_setup: 'Dodałem kod do mojej aplikacji autentykującej',
|
||||
confirm_2fa_recovery: 'Zapisałem moje kody odzyskiwania w bezpiecznym miejscu',
|
||||
confirm_account_for_free_referral_storage_c2a: 'Stwórz konto i potwierdź swój adres e-mail, żeby dostać 1 GB darmowego miejsca. Twój znajomy również dostanie 1 GB darmowego miejsca.',
|
||||
confirm_code_generic_incorrect: "Nieprawidłowy kod.",
|
||||
confirm_code_generic_too_many_requests: "Zbyt wiele zapytań. Zaczekaj kilka minut.",
|
||||
confirm_code_generic_submit: "Wyślij kod",
|
||||
confirm_code_generic_try_again: "Spróbuj jeszcze raz",
|
||||
confirm_code_generic_title: "Wprowadź kod odzyskiwania",
|
||||
confirm_code_2fa_instruction: "Wprowadź 6-cyfrowy kod ze swojej aplikacji autentykującej.",
|
||||
confirm_code_2fa_submit_btn: "Wyślij",
|
||||
confirm_code_2fa_title: "Wprowadź kod uwierzytelniania dwuskładnikowego",
|
||||
confirm_delete_multiple_items: 'Czy na pewno chcesz na zawsze usunąć te przedmioty?',
|
||||
confirm_delete_single_item: 'Czy chcesz na zawsze usunąć ten przedmiot?',
|
||||
confirm_open_apps_log_out: 'Masz otwarte aplikacje. Czy chcesz na pewno się wylogować?',
|
||||
confirm_new_password: "Potwierdź nowe hasło",
|
||||
confirm_delete_user: "Czy jesteś pewien że chcesz skasować swoje konto? Wszystkie twoje pliki i dane zostaną trwale skasowane. Tej czynności nie da się cofnąć.",
|
||||
confirm_delete_user_title: "Skasować konto?",
|
||||
confirm_session_revoke: "Czy jesteś pewien że chcesz unieważnić tą sesję?",
|
||||
confirm_your_email_address: "Potwierdź swój adres email",
|
||||
contact_us: "Skontaktuj się z nami",
|
||||
contain: 'Zawieraj',
|
||||
contact_us_verification_required: "Twój adres email musi być potwierdzony aby tego użyć.",
|
||||
contain: 'Dopasuj do ekranu',
|
||||
continue: "Kontynuuj",
|
||||
copy: 'Kopiuj',
|
||||
copy_link: "Kopiuj Link",
|
||||
copying: "Kopiowanie",
|
||||
cover: 'Zakryj',
|
||||
copying_file: "Kopiowanie %%",
|
||||
cover: 'Wypełnij ekran',
|
||||
create_account: "Stwórz konto",
|
||||
create_free_account: "Stwórz darmowe konto",
|
||||
create_shortcut: "Stwórz skrót",
|
||||
credits: "Licencje",
|
||||
current_password: "Aktualne hasło",
|
||||
cut: 'Wytnij',
|
||||
clock: "Zegar",
|
||||
clock_visible_hide: 'Ukryj - zawsze ukryty',
|
||||
clock_visible_show: 'Pokaż - zawsze widoczny',
|
||||
clock_visible_auto: 'Automatycznie (domyślne) - widoczny tylko w trybie pełnoekranowym',
|
||||
close_all: 'Zamknij wszystko',
|
||||
created: 'Stworzone',
|
||||
date_modified: 'Data zmodyfikowania',
|
||||
default: 'Domyślne',
|
||||
delete: 'Usuń',
|
||||
delete_account: "Skasuj konto",
|
||||
delete_permanently: "Usuń permamentnie",
|
||||
deploy_as_app: 'Deploy as app',
|
||||
deleting_file: "Usuwanie %%",
|
||||
deploy_as_app: 'Wdrożenie jako apkę',
|
||||
descending: 'Malejąco',
|
||||
desktop_background_fit: "Dostosuj",
|
||||
desktop: 'Pulpit',
|
||||
desktop_background_fit: "Dopasowanie",
|
||||
developers: "Dla deweloperów",
|
||||
dir_published_as_website: `%strong% został opublikowany do:`,
|
||||
disassociate_dir: "Disassociate Directory",
|
||||
disable_2fa: 'Wyłącz uwierzytelnianie dwuskładnikowe',
|
||||
disable_2fa_confirm: "Czy jesteś pewien że chcesz wyłączyć uwierzytelnianie dwuskładnikowe?",
|
||||
disable_2fa_instructions: "Wprowadź swoje hasło aby wyłączyć uwierzytelnianie dwuskładnikowe.",
|
||||
disassociate_dir: "Odłącz katalog",
|
||||
documents: 'Dokumenty',
|
||||
dont_allow: 'Nie pozwalaj',
|
||||
download: 'Pobierz',
|
||||
download_file: 'Pobierz plik',
|
||||
downloading: "Pobieranie",
|
||||
email: "Email",
|
||||
email_change_confirmation_sent: "Email z potwierdzeniem został wysłany na twój adres. Sprawdź swoją skrzynkę mailową i wykonaj przesłane instrukcje aby zakończyć proces.",
|
||||
email_invalid: 'Email jest nieprawidłowy.',
|
||||
email_or_username: "Email lub nazwa użytkownika",
|
||||
email_required: 'Email jest wymagany.',
|
||||
empty_trash: 'Opróżnij Kosz',
|
||||
empty_trash_confirmation: `Czy chcesz permanentnie usunąć pliki z kosza?`,
|
||||
empty_trash_confirmation: `Czy chcesz nieodwracalnie usunąć pliki z kosza?`,
|
||||
emptying_trash: 'Opróżnianie Kosza...',
|
||||
enable_2fa: 'Włącz uwierzytelnianie dwuskładnikowe',
|
||||
end_hard: "Wymuś zakończenie",
|
||||
end_process_force_confirm: "Czy jesteś pewien, że chcesz wymusić zakończenie tego procesu?",
|
||||
end_soft: "Zakończ łagodnie",
|
||||
enlarged_qr_code: "Powiększony kod QR",
|
||||
enter_password_to_confirm_delete_user: "Wpisz swoje hasło aby potwierdzić skasowanie konta",
|
||||
error_message_is_missing: "Brak komunikatu błędu.",
|
||||
error_unknown_cause: "Wystąpił nieznany błąd.",
|
||||
error_uploading_files: "Wgrywanie plików nie powiodło się",
|
||||
favorites: "Ulubione",
|
||||
feedback: "Opinie",
|
||||
feedback_c2a: "Prosimy, aby użyć poniższego formularza do zwracania opinii, komentarzy i zgłaszania błędów.",
|
||||
feedback_sent_confirmation: "Thank you for contacting us. If you have an email associated with your account, you will hear back from us as soon as possible.",
|
||||
feedback_sent_confirmation: "Dziękujemy za kontakt. Jeżeli z twoim kontem powiązany jest adres email, skontaktujemy się z tobą tak szybko jak to możliwe.",
|
||||
fit: "Dopasuj",
|
||||
folder: 'Folder',
|
||||
force_quit: 'Wymuś zakończenie',
|
||||
forgot_pass_c2a: "Zapomniałeś hasła?",
|
||||
from: "Od",
|
||||
general: "Ogólne",
|
||||
get_a_copy_of_on_puter: `Pobierz kopię '%%' na Puter.com!`,
|
||||
get_copy_link: 'Pobierz skopiowany link',
|
||||
hide_all_windows: "Zamknij wszystkie okna",
|
||||
home: 'Folder domowy',
|
||||
html_document: 'dokument HTML',
|
||||
hue: 'Odcień',
|
||||
image: 'Obraz',
|
||||
incorrect_password: "Nieprawidłowe hasło",
|
||||
invite_link: "Link zaproszeniowy",
|
||||
item: 'przedmiot',
|
||||
items_in_trash_cannot_be_renamed: `Nazwa tego przedmiotu nie może zostać zmieniona, ponieważ znajduje się on w koszu. Aby zmienić jego nazwę, wyciągnij go z kosza.`,
|
||||
jpeg_image: 'Obraz JPEG',
|
||||
keep_in_taskbar: 'Zachowaj na pasku zadań',
|
||||
language: "Język",
|
||||
license: "Licencja",
|
||||
lightness: 'Jasność',
|
||||
link_copied: "Link skopiowany",
|
||||
loading: 'Ładowanie',
|
||||
log_in: "Zaloguj się",
|
||||
log_into_another_account_anyway: 'Zaloguj się do innego konta mimo wszystko',
|
||||
log_out: 'Wyloguj się',
|
||||
looks_good: "W porządku!",
|
||||
manage_sessions: "Zarządzaj sesjami",
|
||||
menubar_style: "Styl paska menu",
|
||||
menubar_style_desktop: "Pulpit",
|
||||
menubar_style_system: "Jak w systemie",
|
||||
menubar_style_window: "Okno",
|
||||
modified: 'Zmodyfikowany',
|
||||
move: 'Przenieś',
|
||||
moving_file: "Przenoszenie %%",
|
||||
my_websites: "Moje strony",
|
||||
@@ -104,6 +177,7 @@ const pl = {
|
||||
name_must_be_string: "Nazwa musi być napisem",
|
||||
name_too_long: `Nazwa nie może być dłuższa niż %% znaków.`,
|
||||
new: 'Nowy',
|
||||
new_email: 'Nowy email',
|
||||
new_folder: 'Nowy folder',
|
||||
new_password: "Nowe hasło",
|
||||
new_username: "Nowa nazwa użytkownika",
|
||||
@@ -115,22 +189,45 @@ const pl = {
|
||||
open_in_new_tab: "Otwórz w nowej karcie",
|
||||
open_in_new_window: "Otwórz w nowym oknie",
|
||||
open_with: "Otwórz za pomocą",
|
||||
original_name: 'Oryginalna nazwa',
|
||||
original_path: 'Oryginalna ścieżka',
|
||||
oss_code_and_content: "Oprogramowanie i treści open source",
|
||||
password: "Hasło",
|
||||
password_changed: "Hasło zostało zmienione.",
|
||||
password_recovery_rate_limit: "Osiągnąłeś limit szybkości powtórzeń; poczekaj kilka minut. Aby zapobiec temu w przyszłości, unikaj wielokrotnego przeładowywania strony.",
|
||||
password_recovery_token_invalid: "Ten kod odzyskiwania hasła nie jest już ważny.",
|
||||
password_recovery_unknown_error: "Wystąpił nieznany błąd. Proszę spróbować później.",
|
||||
password_required: 'Wymagane jest hasło.',
|
||||
password_strength_error: "Hasło musi mieć co najmniej 8 znaków i musi zawierać co najmniej jedną dużą literę, małą literę, cyfrę i znak specjalny.",
|
||||
passwords_do_not_match: 'Pola `Nowe hasło` i `Potwierdź nowe hasło` nie są takie same.',
|
||||
paste: 'Wklej',
|
||||
paste_into_folder: "Wklej do folderu",
|
||||
path: 'Ścieżka',
|
||||
personalization: "Personalizacja",
|
||||
pick_name_for_website: "Wybierz nazwę dla swojej strony:",
|
||||
picture: "Obraz",
|
||||
pictures: 'Obrazy',
|
||||
plural_suffix: '', //In polish there is a ton of plural suffixes, so I just left it empty
|
||||
powered_by_puter_js: `Zasilane za pomocą {{link=docs}}Puter.js{{/link}}`,
|
||||
preparing: "Przygotowywanie...",
|
||||
preparing_for_upload: "Przygotowywanie do wgrania...",
|
||||
print: 'Drukuj',
|
||||
privacy: "Prywatność",
|
||||
proceed_to_login: 'Przejdź do logowania',
|
||||
proceed_with_account_deletion: "Przejdź do kasowania konta",
|
||||
process_status_initializing: "Rozpoczynanie",
|
||||
process_status_running: "Działanie",
|
||||
process_type_app: 'Apka',
|
||||
process_type_init: 'Start',
|
||||
process_type_ui: 'UI',
|
||||
properties: "Właściwości",
|
||||
public: 'Publiczne',
|
||||
publish: "Opublikuj",
|
||||
publish_as_website: 'Opublikuj jako stronę',
|
||||
plural_suffix: '', //In polish there is a ton of plural suffixes, so I just left it empty
|
||||
recent: "Ostatni",
|
||||
puter_description: `Puter to zachowująca twoją prywatność osobista chmura, służąca do przechowywania wszystkich twoich plików, aplikacji i gier w jednym, bezpiecznym miejscu, dostępnym z dowolnego miejsca w dowolnej chwili.`,
|
||||
reading_file: "Odczyt %strong%",
|
||||
recent: "Ostatnie",
|
||||
recommended: "Polecane",
|
||||
recover_password: "Odzyskaj hasło",
|
||||
refer_friends_c2a: "Zdobądź 1 GB za każdego znajomego, który założy konto na Puter! On również otrzyma 1 GB.",
|
||||
refer_friends_social_media_c2a: `Zdobądź 1 GB darmowego miejsca na Puter.com!`,
|
||||
@@ -138,25 +235,39 @@ const pl = {
|
||||
release_address_confirmation: `Jesteś pewien, że chcesz wypuścić ten adres?`,
|
||||
remove_from_taskbar:'Usuń z paska zadań',
|
||||
rename: 'Zmień nazwę',
|
||||
repeat: 'Powtórz',
|
||||
repeat: 'Powtarzaj',
|
||||
replace: 'Zamień',
|
||||
replace_all: 'Zamień wszystkie',
|
||||
resend_confirmation_code: "Wyślij kod potwierdzający ponownie.",
|
||||
reset_colors: "Przywróc kolory",
|
||||
restart_puter_confirm: "Na pewno zrestartować Puter?",
|
||||
restore: "Odzyskaj",
|
||||
save: 'Zapisz',
|
||||
saturation: 'Nasycenie',
|
||||
save_account: 'Zapisz konto',
|
||||
save_account_to_get_copy_link: "Zapisz konto, aby uzyskać link do skopiowania",
|
||||
save_account_to_publish: 'Zapisz konto, aby opublikować',
|
||||
save_session: 'Zapisz sesję',
|
||||
save_session_c2a: 'Stwórz konto, żeby zapisać aktualną sesję i nie utracić swojej pracy.',
|
||||
scan_qr_c2a: 'Zeskanuj kod poniżej, żeby zalogować się na tą sesję z innych urządzeń.',
|
||||
scan_qr_c2a: 'Zeskanuj poniższy kod, aby zalogować się do tej sesji z innego urządzenia.',
|
||||
scan_qr_2fa: 'Zeskanuj kod QR za pomocą apki autentykującej',
|
||||
scan_qr_generic: 'Zeskanuj ten kod QR za pomocą swojego telefonu albo innego urządzenia',
|
||||
search: 'Szukaj',
|
||||
seconds: 'sekund',
|
||||
security: "Bezpieczeństwo",
|
||||
select: "Wybierz",
|
||||
selected: 'Wybrany',
|
||||
select_color: 'Wybierz kolor…',
|
||||
sessions: "Sesje",
|
||||
send: "Wyślij",
|
||||
send_password_recovery_email: "Wyślij email do odzyskania hasła",
|
||||
session_saved: "Dziękujemy za stworzenie konta. Ta sesja została zapisana. ",
|
||||
settings: "Ustawienia",
|
||||
set_new_password: "Ustaw nowe hasło.",
|
||||
share: "Udostępnij",
|
||||
share_to: "Udostępnij do",
|
||||
share_with: "Udostępnij dla:",
|
||||
shortcut_to: "Skrót do",
|
||||
show_all_windows: "Pokaż wszystkie okna",
|
||||
show_hidden: 'Pokaż ukryte',
|
||||
sign_in_with_puter: "Zaloguj się z Puter",
|
||||
@@ -164,25 +275,77 @@ const pl = {
|
||||
signing_in: "Logowanie…",
|
||||
size: 'Rozmiar',
|
||||
skip: 'Pomiń',
|
||||
something_went_wrong: "Coś poszło nie tak.",
|
||||
sort_by: 'Sortuj',
|
||||
start: 'Start',
|
||||
status: "Status",
|
||||
storage_usage: "Wykorzystanie miejsca",
|
||||
storage_puter_used: 'wykorzystane przez Puter',
|
||||
taking_longer_than_usual: 'To trwa chwilę dłużej niż zwyklę. Prosimy poczekać...',
|
||||
task_manager: "Menedżer zadań",
|
||||
taskmgr_header_name: "Nazwa",
|
||||
taskmgr_header_status: "Status",
|
||||
taskmgr_header_type: "Typ",
|
||||
terms: "Warunki",
|
||||
text_document: 'Dokument tekstowy',
|
||||
tos_fineprint: `Klikając 'Stwórz darmowe konto' Zgadzasz się z {{link=terms}}Warunkami Obsługi{{/link}} i {{link=privacy}}Polityką Prywatności{{/link}}.`,
|
||||
transparency: "Przezroczystość",
|
||||
trash: 'Kosz',
|
||||
two_factor: 'Uwierzytelnianie dwuetapowe',
|
||||
two_factor_disabled: 'Uwierzytelnianie dwuetapowe zablokowane',
|
||||
two_factor_enabled: 'Uwierzytelnianie dwuetapowe odblokowane',
|
||||
type: 'Wpisz',
|
||||
type_confirm_to_delete_account: "Wpisz 'potwierdzam', aby skasować swoje konto.",
|
||||
ui_colors: "Kolory interfejsu użytkownika",
|
||||
ui_manage_sessions: "Menedżer sesji",
|
||||
ui_revoke: "Unieważnij",
|
||||
undo: 'Cofnij',
|
||||
unlimited: 'Nieograniczone',
|
||||
unzip: "Rozpakuj",
|
||||
upload: 'Wgraj',
|
||||
upload_here: 'Wgraj tutaj',
|
||||
usage: 'Wykorzystanie',
|
||||
username: "Nazwa użytkownika",
|
||||
username_changed: 'Nazwa użytkownika została zmieniona pomyślnie.',
|
||||
username_required: 'Nazwa użytkownika jest wymagana.',
|
||||
versions: "Wersje",
|
||||
videos: 'Wideo',
|
||||
visibility: 'Widoczność',
|
||||
yes: 'Tak',
|
||||
yes_release_it: 'Tak, Opublikuj',
|
||||
you_have_been_referred_to_puter_by_a_friend: "Zostałeś wspomniany od znajomego!",
|
||||
zip: "Spakuj",
|
||||
zipping_file: "Pakowanie %strong%",
|
||||
|
||||
// === 2FA Setup ===
|
||||
setup2fa_1_step_heading: 'Otwórz swoją aplikację autentykującą',
|
||||
setup2fa_1_instructions: `
|
||||
Możesz użyć dowolnej aplikacji autentykującej, która wspiera protokół haseł jednorazowych opartych o czas (TOTP).
|
||||
Jest ich wiele, ale jeżeli nie masz pewności,
|
||||
<a target="_blank" href="https://authy.com/download">Authy</a>
|
||||
to solidny wybór dla systemów Android i iOS.
|
||||
`,
|
||||
setup2fa_2_step_heading: 'Zeskanuj kod QR',
|
||||
setup2fa_3_step_heading: 'Wprowadź 6-cyfrowy kod',
|
||||
setup2fa_4_step_heading: 'Skopiuj swoje kody odzyskiwania',
|
||||
setup2fa_4_instructions: `
|
||||
Te kody odzyskiwania są jedynym sposobem aby uzyskać dostęp do twojego konta jeżeli stracisz swój telefon lub nie jesteś w stanie użyć aplikacji autentykującej.
|
||||
Upewnij się, że przechowujesz je w bezpiecznym miejscu
|
||||
`,
|
||||
setup2fa_5_step_heading: 'Potwierdź ustawienia autentykacji dwuetapowej',
|
||||
setup2fa_5_confirmation_1: 'Zachowałem moje kody odzyskiwania w bezpiecznym miejscu',
|
||||
setup2fa_5_confirmation_2: 'Jestem gotów aby włączyć autentykację dwuetapową',
|
||||
setup2fa_5_button: 'Włącz autentykację dwuetapową',
|
||||
|
||||
// === 2FA Login ===
|
||||
login2fa_otp_title: 'Wprowadź kod autentykacji dwuetapowej',
|
||||
login2fa_otp_instructions: 'Wprowadź 6-cyfrowy kod ze swojej aplikacji autentykującej.',
|
||||
login2fa_recovery_title: 'Wprowadź kod odzyskiwania',
|
||||
login2fa_recovery_instructions: 'Wprowadź jeden ze swoich kodów odzyskiwania aby uzyskać dostęp do swojego konta.',
|
||||
login2fa_use_recovery_code: 'Użyj kod odzyskiwania',
|
||||
login2fa_recovery_back: 'Powrót',
|
||||
login2fa_recovery_placeholder: 'XXXXXXXX',
|
||||
}
|
||||
};
|
||||
|
||||
export default pl;
|
||||
export default pl;
|
||||
@@ -0,0 +1,350 @@
|
||||
/**
|
||||
* Copyright (C) 2024 Puter Technologies Inc.
|
||||
*
|
||||
* This file is part of Puter.
|
||||
*
|
||||
* Puter is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
const ta = {
|
||||
name: "ஆங்கிலம்",
|
||||
english_name: "Tamil",
|
||||
code: "ta",
|
||||
dictionary: {
|
||||
about: "பற்றி",
|
||||
account: "கணக்கு",
|
||||
account_password: "கணக்கு கடவுச்சொல்லை சரிபார்க்கவும்",
|
||||
access_granted_to: "அனுமதி வழங்கப்பட்ட",
|
||||
add_existing_account: "ஏற்கனவே உள்ள கணக்கைச் சேர்க்கவும்",
|
||||
all_fields_required: 'அனைத்து புலங்களும் தேவை.',
|
||||
allow: 'அனுமதி',
|
||||
apply: "விண்ணப்பிக்கவும்",
|
||||
ascending: 'ஏறுமுகம்',
|
||||
associated_websites: "தொடர்புடைய இணையதளங்கள்",
|
||||
auto_arrange: 'ஆட்டோ ஏற்பாடு',
|
||||
background: "பின்னணி",
|
||||
browse: "உலாவவும்",
|
||||
cancel: 'ரத்து செய்',
|
||||
center: 'மையம்',
|
||||
change_desktop_background: 'டெஸ்க்டாப் பின்னணியை மாற்றவும்…',
|
||||
change_email: "மின்னஞ்சலை மாற்றவும்",
|
||||
change_language: "மொழியை மாற்றவும்",
|
||||
change_password: "கடவுச்சொல்லை மாற்றவும்",
|
||||
change_ui_colors: "யுஐ நிறங்களை மாற்றவும்",
|
||||
change_username: "பயனர் பெயரை மாற்றவும்",
|
||||
close: 'மூடு',
|
||||
close_all_windows: "அனைத்து விண்டோஸ் மூடு",
|
||||
close_all_windows_confirm: "எல்லா சாளரங்களையும் நிச்சயமாக மூட விரும்புகிறீர்களா?",
|
||||
close_all_windows_and_log_out: 'விண்டோஸை மூடிவிட்டு வெளியேறவும்',
|
||||
change_always_open_with: "இந்த வகையான கோப்பை எப்போதும் திறக்க விரும்புகிறீர்களா?",
|
||||
color: 'நிறம்',
|
||||
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: "உங்கள் அங்கீகரிப்பு பயன்பாட்டிலிருந்து 6 இலக்கக் குறியீட்டை உள்ளிடவும்.",
|
||||
confirm_code_2fa_submit_btn: "சமர்ப்பிக்கவும்",
|
||||
confirm_code_2fa_title: "2FA குறியீட்டை உள்ளிடவும்",
|
||||
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: "உங்கள் மின்னஞ்சல் முகவரியை உறுதிப்படுத்தவும்",
|
||||
contact_us: "எங்களை தொடர்பு கொள்ள",
|
||||
contact_us_verification_required: "இதைப் பயன்படுத்த, சரிபார்க்கப்பட்ட மின்னஞ்சல் முகவரி உங்களிடம் இருக்க வேண்டும்.",
|
||||
contain: 'கொண்டிருக்கும்',
|
||||
continue: "தொடரவும்",
|
||||
copy: 'நகலெடுக்கவும்',
|
||||
copy_link: "இணைப்பை நகலெடுக்கவும்",
|
||||
copying: "நகலெடுக்கிறது",
|
||||
copying_file: "நகலெடுக்கிறது %%",
|
||||
cover: 'கவர்',
|
||||
create_account: "உங்கள் கணக்கை துவங்குங்கள்",
|
||||
create_free_account: "இலவச கணக்கை உருவாக்கவும்",
|
||||
create_shortcut: "குறுக்குவழியை உருவாக்க",
|
||||
credits: "கடன்கள்",
|
||||
current_password: "தற்போதைய கடவுச்சொல்",
|
||||
cut: 'வெட்டு',
|
||||
clock: "கடிகாரம்",
|
||||
clock_visible_hide: 'மறை - எப்போதும் மறைந்திருக்கும்',
|
||||
clock_visible_show: 'காட்டு - எப்போதும் தெரியும்',
|
||||
clock_visible_auto: 'தானியங்கு - இயல்புநிலை, முழுத்திரை பயன்முறையில் மட்டுமே தெரியும்.',
|
||||
close_all: 'அனைத்தையும் மூடு',
|
||||
created: 'உருவாக்கப்பட்டது',
|
||||
date_modified: 'தேதி மாற்றப்பட்டது',
|
||||
default: 'இயல்புநிலை',
|
||||
delete: 'அழி',
|
||||
delete_account: "கணக்கை நீக்குக",
|
||||
delete_permanently: "நிரந்தரமாக நீக்குக",
|
||||
deleting_file: "நீக்குகிறது %%",
|
||||
deploy_as_app: 'பயன்பாடாக வரிசைப்படுத்து',
|
||||
descending: 'இறங்குதல்',
|
||||
desktop: 'டெஸ்க்டாப்',
|
||||
desktop_background_fit: "பொருத்தம்",
|
||||
developers: "டெவலப்பர்கள்",
|
||||
dir_published_as_website: `%strong% வெளியிடப்பட்டது:`,
|
||||
disable_2fa: '2FA ஐ முடக்கு',
|
||||
disable_2fa_confirm: "2FA ஐ நிச்சயமாக முடக்க விரும்புகிறீர்களா?",
|
||||
disable_2fa_instructions: "2FA ஐ முடக்க உங்கள் கடவுச்சொல்லை உள்ளிடவும்.",
|
||||
disassociate_dir: "டிஸ்ஸோசியேட் டைரக்டரி",
|
||||
documents: 'ஆவணங்கள்',
|
||||
dont_allow: 'அனுமதிக்காதே',
|
||||
download: 'பதிவிறக்கவும்',
|
||||
download_file: 'பதிவிறக்க கோப்பு',
|
||||
downloading: "பதிவிறக்குகிறது",
|
||||
email: "மின்னஞ்சல்",
|
||||
email_change_confirmation_sent: "உங்கள் புதிய மின்னஞ்சல் முகவரிக்கு உறுதிப்படுத்தல் மின்னஞ்சல் அனுப்பப்பட்டுள்ளது. செயல்முறையை முடிக்க உங்கள் இன்பாக்ஸைச் சரிபார்த்து, வழிமுறைகளைப் பின்பற்றவும்.",
|
||||
email_invalid: 'மின்னஞ்சல் தவறானது.',
|
||||
email_or_username: "மின்னஞ்சல் அல்லது பயனர் பெயர்",
|
||||
email_required: 'மின்னஞ்சல் தேவை.',
|
||||
empty_trash: 'வெற்று குப்பை',
|
||||
empty_trash_confirmation: `குப்பையில் உள்ள உருப்படிகளை நிரந்தரமாக நீக்க விரும்புகிறீர்களா?`,
|
||||
emptying_trash: 'குப்பையைக் காலியாக்குகிறது…',
|
||||
enable_2fa: '2FA ஐ இயக்கவும்',
|
||||
end_hard: "கடினமாக முடிக்கவும்",
|
||||
end_process_force_confirm: "இந்தச் செயல்முறையை கட்டாயப்படுத்தி வெளியேற விரும்புகிறீர்களா?",
|
||||
end_soft: "மென்மையான முடிக்கவும்",
|
||||
enlarged_qr_code: "விரிவாக்கப்பட்ட QR குறியீடு",
|
||||
enter_password_to_confirm_delete_user: "கணக்கு நீக்குதலை உறுதிப்படுத்த உங்கள் கடவுச்சொல்லை உள்ளிடவும்",
|
||||
error_message_is_missing: "பிழை செய்தி காணவில்லை.",
|
||||
error_unknown_cause: "அறியப்படாத பிழை ஏற்பட்டது.",
|
||||
error_uploading_files: "கோப்புகளைப் பதிவேற்றுவதில் தோல்வி",
|
||||
favorites: "பிடித்தவை",
|
||||
feedback: "பின்னூட்டம்",
|
||||
feedback_c2a: "உங்கள் கருத்து, கருத்துகள் மற்றும் பிழை அறிக்கைகளை எங்களுக்கு அனுப்ப கீழே உள்ள படிவத்தைப் பயன்படுத்தவும்.",
|
||||
feedback_sent_confirmation: "எங்களை தொடர்பு கொண்டதற்கு நன்றி. உங்கள் கணக்குடன் தொடர்புடைய மின்னஞ்சலை நீங்கள் வைத்திருந்தால், கூடிய விரைவில் எங்களிடமிருந்து பதிலளிப்பீர்கள்.",
|
||||
fit: "பொருத்தம்",
|
||||
folder: 'கோப்புறை',
|
||||
force_quit: 'கட்டாயம் வெளியேறு',
|
||||
forgot_pass_c2a: "கடவுச்சொல்லை மறந்துவிட்டீர்களா?",
|
||||
from: "இருந்து",
|
||||
general: "பொது",
|
||||
get_a_copy_of_on_puter: `Puter.com இல் '%%' நகலைப் பெறுங்கள்!`,
|
||||
get_copy_link: 'நகல் இணைப்பைப் பெறவும்',
|
||||
hide_all_windows: "அனைத்து விண்டோஸையும் மறைக்கவும்",
|
||||
home: 'வீடு',
|
||||
html_document: 'HTML ஆவணம்',
|
||||
hue: 'சாயல்',
|
||||
image: 'படம்',
|
||||
incorrect_password: "தவறான கடவுச்சொல்",
|
||||
invite_link: "அழைப்பு இணைப்பு",
|
||||
item: 'பொருள்',
|
||||
items_in_trash_cannot_be_renamed: `இந்த உருப்படி குப்பையில் இருப்பதால் மறுபெயரிட முடியாது. இந்த உருப்படியை மறுபெயரிட, முதலில் அதை குப்பையிலிருந்து வெளியே இழுக்கவும்.`,
|
||||
jpeg_image: 'JPEG படம்',
|
||||
keep_in_taskbar: 'பணிப்பட்டியில் வைக்கவும்',
|
||||
language: "மொழி",
|
||||
license: "உரிமம்",
|
||||
lightness: 'லேசான தன்மை',
|
||||
link_copied: "இணைப்பு நகலெடுக்கப்பட்டது",
|
||||
loading: 'ஏற்றுகிறது',
|
||||
log_in: "உள்நுழைய",
|
||||
log_into_another_account_anyway: 'எப்படியும் மற்றொரு கணக்கில் உள்நுழைக',
|
||||
log_out: 'வெளியேறு',
|
||||
looks_good: "நன்றாக இருக்கிறது!",
|
||||
manage_sessions: "அமர்வுகளை நிர்வகிக்கவும்",
|
||||
menubar_style: "மெனுபார் உடை",
|
||||
menubar_style_desktop: "டெஸ்க்டாப்",
|
||||
menubar_style_system: "அமைப்பு",
|
||||
menubar_style_window: "ஜன்னல்",
|
||||
modified: 'மாற்றியமைக்கப்பட்டது',
|
||||
move: 'நகர்வு',
|
||||
moving_file: "நகரும் %%",
|
||||
my_websites: "எனது இணையதளங்கள்",
|
||||
name: 'பெயர்',
|
||||
name_cannot_be_empty: 'பெயர் காலியாக இருக்கக்கூடாது.',
|
||||
name_cannot_contain_double_period: "பெயர் '..' எழுத்தாக இருக்க முடியாது.",
|
||||
name_cannot_contain_period: "பெயர் '.' எழுத்தாக இருக்க முடியாது.",
|
||||
name_cannot_contain_slash: "பெயரில் '/' எழுத்து இருக்கக்கூடாது.",
|
||||
name_must_be_string: "பெயர் ஒரு சரமாக மட்டுமே இருக்க முடியும்.",
|
||||
name_too_long: `பெயர் %% எழுத்துகளுக்கு மேல் இருக்கக்கூடாது.`,
|
||||
new: 'புதியது',
|
||||
new_email: 'புதிய மின்னஞ்சல்',
|
||||
new_folder: 'புதிய அடைவை',
|
||||
new_password: "புதிய கடவுச்சொல்",
|
||||
new_username: "புதிய பயனர் பெயர்",
|
||||
no: 'இல்லை',
|
||||
no_dir_associated_with_site: 'இந்த முகவரியுடன் எந்த கோப்பகமும் இணைக்கப்படவில்லை.',
|
||||
no_websites_published: "நீங்கள் இதுவரை எந்த இணையதளத்தையும் வெளியிடவில்லை.",
|
||||
ok: 'சரி',
|
||||
open: "திற",
|
||||
open_in_new_tab: "புதிய தாவலில் திறக்கவும்",
|
||||
open_in_new_window: "Open in New Window",
|
||||
open_with: "உடன் திற",
|
||||
original_name: 'அசல் பெயர்',
|
||||
original_path: 'அசல் பாதை',
|
||||
oss_code_and_content: "திறந்த மூல மென்பொருள் மற்றும் உள்ளடக்கம்",
|
||||
password: "கடவுச்சொல்",
|
||||
password_changed: "கடவுச்சொல் மாற்றப்பட்டது.",
|
||||
password_recovery_rate_limit: "எங்கள் கட்டண வரம்பை அடைந்துவிட்டீர்கள்; தயவுசெய்து சில நிமிடங்கள் காத்திருக்கவும். எதிர்காலத்தில் இதைத் தடுக்க, பக்கத்தை பல முறை மீண்டும் ஏற்றுவதைத் தவிர்க்கவும்.",
|
||||
password_recovery_token_invalid: "இந்த கடவுச்சொல் மீட்பு டோக்கன் இனி செல்லுபடியாகாது.",
|
||||
password_recovery_unknown_error: "அறியப்படாத பிழை ஏற்பட்டது. பிறகு முயற்சிக்கவும்.",
|
||||
password_required: 'கடவுச்சொல் தேவை.',
|
||||
password_strength_error: "கடவுச்சொல் குறைந்தபட்சம் 8 எழுத்துக்கள் நீளமாக இருக்க வேண்டும் மற்றும் குறைந்தபட்சம் ஒரு பெரிய எழுத்து, ஒரு சிறிய எழுத்து, ஒரு எண் மற்றும் ஒரு சிறப்பு எழுத்து ஆகியவற்றைக் கொண்டிருக்க வேண்டும்.",
|
||||
passwords_do_not_match: '`புதிய கடவுச்சொல்` மற்றும் `புதிய கடவுச்சொல்லை உறுதிப்படுத்து` ஆகியவை பொருந்தவில்லை.',
|
||||
paste: 'ஒட்டவும்',
|
||||
paste_into_folder: "கோப்புறையில் ஒட்டவும்",
|
||||
path: 'பாதை',
|
||||
personalization: "தனிப்பயனாக்கம்",
|
||||
pick_name_for_website: "உங்கள் வலைத்தளத்திற்கு ஒரு பெயரைத் தேர்ந்தெடுக்கவும்:",
|
||||
picture: "படம்",
|
||||
pictures: 'படங்கள்',
|
||||
plural_suffix: 'கள்',
|
||||
powered_by_puter_js: `மூலம் இயக்கப்படுகிறது {{link=docs}}Puter.js{{/link}}`,
|
||||
preparing: "தயாராகிறது...",
|
||||
preparing_for_upload: "பதிவேற்றம் செய்ய தயாராகிறது...",
|
||||
print: 'அச்சிடுக',
|
||||
privacy: "தனியுரிமை",
|
||||
proceed_to_login: 'உள்நுழைய தொடரவும்',
|
||||
proceed_with_account_deletion: "கணக்கு நீக்குதலைத் தொடரவும்",
|
||||
process_status_initializing: "துவக்குதல்",
|
||||
process_status_running: "ஓடுதல்",
|
||||
process_type_app: 'செயலி',
|
||||
process_type_init: 'Init',
|
||||
process_type_ui: 'யுஐ',
|
||||
properties: "பண்புகள்",
|
||||
public: 'பொது',
|
||||
publish: "வெளியிடு",
|
||||
publish_as_website: 'இணையதளமாக வெளியிடவும்',
|
||||
puter_description: `உங்கள் கோப்புகள், பயன்பாடுகள் மற்றும் கேம்கள் அனைத்தையும் ஒரே பாதுகாப்பான இடத்தில் வைத்திருக்க, எந்த நேரத்திலும் எங்கிருந்தும் அணுகக்கூடிய தனியுரிமை-முதல் தனிப்பட்ட கிளவுட் புட்டர் ஆகும்.`,
|
||||
reading_file: "படித்தல் %strong%",
|
||||
recent: "அண்மையில்",
|
||||
recommended: "பரிந்துரைக்கப்படுகிறது",
|
||||
recover_password: "கடவுச்சொல்லை மீட்டெடுக்கவும்",
|
||||
refer_friends_c2a: "புட்டர் இல் கணக்கை உருவாக்கி உறுதிப்படுத்தும் ஒவ்வொரு நண்பருக்கும் 1 GB கிடைக்கும். உங்கள் நண்பருக்கும் 1 ஜிபி கிடைக்கும்!",
|
||||
refer_friends_social_media_c2a: `Puter.com இல் 1 GB இலவச சேமிப்பிடத்தைப் பெறுங்கள்!`,
|
||||
refresh: 'புதுப்பிப்பு',
|
||||
release_address_confirmation: `இந்த முகவரியை நிச்சயமாக வெளியிட விரும்புகிறீர்களா?`,
|
||||
remove_from_taskbar:'பணிப்பட்டியில் இருந்து அகற்று',
|
||||
rename: 'மறுபெயரிடவும்',
|
||||
repeat: 'மீண்டும் செய்யவும்',
|
||||
replace: 'மாற்றவும்',
|
||||
replace_all: 'அனைத்தையும் மாற்றவும்',
|
||||
resend_confirmation_code: "உறுதிப்படுத்தல் குறியீட்டை மீண்டும் அனுப்பவும்",
|
||||
reset_colors: "வண்ணங்களை மீட்டமைக்கவும்",
|
||||
restart_puter_confirm: "நிச்சயமாக புட்டர்-ஐ மீண்டும் தொடங்க விரும்புகிறீர்களா?",
|
||||
restore: "மீட்டமை",
|
||||
save: 'சேமிக்கவும்',
|
||||
saturation: 'செறிவூட்டல்',
|
||||
save_account: 'கணக்கைச் சேமிக்கவும்',
|
||||
save_account_to_get_copy_link: "தொடர ஒரு கணக்கை உருவாக்கவும்.",
|
||||
save_account_to_publish: 'தொடர ஒரு கணக்கை உருவாக்கவும்.',
|
||||
save_session: 'அமர்வை சேமிக்கவும்',
|
||||
save_session_c2a: 'உங்கள் தற்போதைய அமர்வைச் சேமிக்க ஒரு கணக்கை உருவாக்கவும் மற்றும் உங்கள் வேலையை இழப்பதைத் தவிர்க்கவும்.',
|
||||
scan_qr_c2a: 'பிற சாதனங்களிலிருந்து இந்த அமர்வில் உள்நுழைய, \nகீழே உள்ள குறியீட்டை ஸ்கேன் செய்யவும்',
|
||||
scan_qr_2fa: 'உங்கள் அங்கீகரிப்பு பயன்பாட்டின் மூலம் QR குறியீட்டை ஸ்கேன் செய்யவும்',
|
||||
scan_qr_generic: 'உங்கள் தொலைபேசி அல்லது மற்றொரு சாதனத்தைப் பயன்படுத்தி இந்த QR குறியீட்டை ஸ்கேன் செய்யவும்',
|
||||
search: 'தேடு',
|
||||
seconds: 'வினாடிகள்',
|
||||
security: "பாதுகாப்பு",
|
||||
select: "தேர்ந்தெடு",
|
||||
selected: 'தேர்ந்தெடுக்கப்பட்டது',
|
||||
select_color: 'வண்ணத்தைத் தேர்ந்தெடுக்கவும்…',
|
||||
sessions: "அமர்வுகள்",
|
||||
send: "அனுப்பு",
|
||||
send_password_recovery_email: "கடவுச்சொல் மீட்பு மின்னஞ்சலை அனுப்பவும்",
|
||||
session_saved: "கணக்கை உருவாக்கியதற்கு நன்றி. இந்த அமர்வு சேமிக்கப்பட்டது.",
|
||||
settings: "அமைப்புகள்",
|
||||
set_new_password: "புதிய கடவுச்சொல்லை அமை",
|
||||
share: "பகிர்",
|
||||
share_to: "பகிரவும்",
|
||||
share_with: "இவர்களுடன் பகிரவும்:",
|
||||
shortcut_to: "குறுக்குவழி",
|
||||
show_all_windows: "அனைத்து விண்டோஸையும் காட்டு",
|
||||
show_hidden: 'மறைக்கப்பட்டதைக் காட்டு',
|
||||
sign_in_with_puter: "புட்டர் மூலம் உள்நுழையவும்",
|
||||
sign_up: "பதிவு செய்யவும்",
|
||||
signing_in: "உள்நுழைகிறேன்…",
|
||||
size: 'அளவு',
|
||||
skip: 'தவிர்க்கவும்',
|
||||
something_went_wrong: "ஏதோ தவறு நடந்துவிட்டது.",
|
||||
sort_by: 'வரிசைப்படுத்து',
|
||||
start: 'தொடங்கு',
|
||||
status: "நிலை",
|
||||
storage_usage: "சேமிப்பக பயன்பாடு",
|
||||
storage_puter_used: 'புட்டரால் பயன்படுத்தப்பட்டது',
|
||||
taking_longer_than_usual: 'வழக்கத்தை விட சிறிது நேரம் எடுக்கும். தயவுசெய்து காத்திருங்கள்...',
|
||||
task_manager: "பணி மேலாளர்",
|
||||
taskmgr_header_name: "பெயர்",
|
||||
taskmgr_header_status: "நிலை",
|
||||
taskmgr_header_type: "வகை",
|
||||
terms: "விதிமுறை",
|
||||
text_document: 'உரை ஆவணம்',
|
||||
tos_fineprint: `'இலவச கணக்கை உருவாக்கு' என்பதைக் கிளிக் செய்வதன் மூலம், புட்டர் இன் {{link=terms}}சேவை விதிமுறைகள்{{/link}} மற்றும் {{link=privacy}}தனியுரிமைக் கொள்கையை{{/link}} ஏற்கிறீர்கள்.`,
|
||||
transparency: "வெளிப்படைத்தன்மை",
|
||||
trash: 'குப்பை',
|
||||
two_factor: 'இரண்டு காரணி அங்கீகாரம்',
|
||||
two_factor_disabled: '2FA முடக்கப்பட்டது',
|
||||
two_factor_enabled: '2FA இயக்கப்பட்டது',
|
||||
type: 'வகை',
|
||||
type_confirm_to_delete_account: "உங்கள் கணக்கை நீக்க, 'உறுதிப்படுத்து' என தட்டச்சு செய்யவும்.",
|
||||
ui_colors: "UI நிறங்கள்",
|
||||
ui_manage_sessions: "அமர்வு மேலாளர்",
|
||||
ui_revoke: "திரும்பப் பெறு",
|
||||
undo: 'செயல்தவிர்',
|
||||
unlimited: 'வரம்பற்ற',
|
||||
unzip: "அன்ஜிப்",
|
||||
upload: 'பதிவேற்றவும்',
|
||||
upload_here: 'இங்கே பதிவேற்றவும்',
|
||||
usage: 'பயன்பாடு',
|
||||
username: "பயனர் பெயர்",
|
||||
username_changed: 'பயனர்பெயர் வெற்றிகரமாக புதுப்பிக்கப்பட்டது.',
|
||||
username_required: 'பயனர் பெயர் தேவை.',
|
||||
versions: "Versions",
|
||||
videos: 'வீடியோக்கள்',
|
||||
visibility: 'தெரிவுநிலை',
|
||||
yes: 'ஆம்',
|
||||
yes_release_it: 'ஆம், வெளியிடு',
|
||||
you_have_been_referred_to_puter_by_a_friend: "நீங்கள் ஒரு நண்பரால் புட்டருக்கு பரிந்துரைக்கப்பட்டீர்கள்!",
|
||||
zip: "ஜிப்",
|
||||
zipping_file: "ஜிப்பிங் %strong%",
|
||||
|
||||
// === 2FA Setup ===
|
||||
setup2fa_1_step_heading: 'உங்கள் அங்கீகரிப்பு பயன்பாட்டைத் திறக்கவும்',
|
||||
setup2fa_1_instructions: `
|
||||
Time-based One-Time Password (TOTP) நெறிமுறையை ஆதரிக்கும் எந்த அங்கீகார பயன்பாட்டையும் நீங்கள் பயன்படுத்தலாம்.
|
||||
தேர்வு செய்ய பல உள்ளன, ஆனால் நீங்கள் உறுதியாக தெரியவில்லை என்றால்
|
||||
<a target="_blank" href="https://authy.com/download">Authy</a>
|
||||
ஆண்ட்ராய்டு மற்றும் iOSக்கு ஒரு திடமான தேர்வாகும்.
|
||||
`,
|
||||
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 ஐ இயக்கவும்',
|
||||
|
||||
// === 2FA Login ===
|
||||
login2fa_otp_title: '2FA குறியீட்டை உள்ளிடவும்',
|
||||
login2fa_otp_instructions: 'உங்கள் அங்கீகரிப்பு பயன்பாட்டிலிருந்து 6 இலக்கக் குறியீட்டை உள்ளிடவும்.',
|
||||
login2fa_recovery_title: 'மீட்புக் குறியீட்டை உள்ளிடவும்',
|
||||
login2fa_recovery_instructions: 'உங்கள் கணக்கை அணுக, உங்கள் மீட்புக் குறியீடுகளில் ஒன்றை உள்ளிடவும்.',
|
||||
login2fa_use_recovery_code: 'மீட்புக் குறியீட்டைப் பயன்படுத்தவும்',
|
||||
login2fa_recovery_back: 'மீண்டும்',
|
||||
login2fa_recovery_placeholder: 'XXXXXXXX',
|
||||
}
|
||||
};
|
||||
|
||||
export default ta;
|
||||
@@ -41,12 +41,15 @@ import pt from './pt.js';
|
||||
import ro from './ro.js';
|
||||
import ru from './ru.js';
|
||||
import sv from './sv.js';
|
||||
import ta from './ta.js';
|
||||
import th from './th.js';
|
||||
import tr from './tr.js';
|
||||
import ur from './ur.js';
|
||||
import ua from './ua.js';
|
||||
import zh from './zh.js';
|
||||
import hu from './hu.js';
|
||||
import zhtw from './zhtw.js';
|
||||
import vi from "./vi.js";
|
||||
import emoji from './emoji.js';
|
||||
|
||||
|
||||
@@ -76,11 +79,14 @@ export default {
|
||||
pl,
|
||||
pt,
|
||||
sv,
|
||||
ta,
|
||||
th,
|
||||
tr,
|
||||
ua,
|
||||
zh,
|
||||
hu,
|
||||
zhtw,
|
||||
ur,
|
||||
vi,
|
||||
emoji,
|
||||
};
|
||||
@@ -0,0 +1,352 @@
|
||||
/**
|
||||
* Copyright (C) 2024 Puter Technologies Inc.
|
||||
*
|
||||
* This file is part of Puter.
|
||||
*
|
||||
* Puter is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published
|
||||
* by the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
|
||||
const vi = {
|
||||
name: "Tiếng Việt",
|
||||
english_name: "Vietnamese",
|
||||
code: "vi",
|
||||
dictionary: {
|
||||
about: "Giới thiệu",
|
||||
account: "Tài khoản",
|
||||
account_password: "Xác minh mật khẩu tài khoản",
|
||||
access_granted_to: "Đã cấp quyền truy cập cho",
|
||||
add_existing_account: "Thêm tài khoản hiện có",
|
||||
all_fields_required: 'Tất cả các trường đều bắt buộc.',
|
||||
allow: 'Cho phép',
|
||||
apply: "Áp dụng",
|
||||
ascending: 'Tăng dần',
|
||||
associated_websites: "Các trang web liên kết",
|
||||
auto_arrange: 'Tự động sắp xếp',
|
||||
background: "Nền",
|
||||
browse: "Duyệt",
|
||||
cancel: 'Hủy',
|
||||
center: 'Giữa',
|
||||
change_desktop_background: 'Thay đổi hình nền màn hình…',
|
||||
change_email: "Thay đổi email",
|
||||
change_language: "Thay đổi ngôn ngữ",
|
||||
change_password: "Thay đổi mật khẩu",
|
||||
change_ui_colors: "Thay đổi màu sắc giao diện",
|
||||
change_username: "Thay đổi tên người dùng",
|
||||
close: 'Đóng',
|
||||
close_all_windows: "Đóng tất cả cửa sổ",
|
||||
close_all_windows_confirm: "Bạn có chắc chắn muốn đóng tất cả cửa sổ không?",
|
||||
close_all_windows_and_log_out: 'Đóng cửa sổ và đăng xuất',
|
||||
change_always_open_with: "Bạn có muốn luôn mở loại tệp này bằng",
|
||||
color: 'Màu sắc',
|
||||
confirm: 'Xác nhận',
|
||||
confirm_2fa_setup: 'Tôi đã thêm mã vào ứng dụng xác thực của mình',
|
||||
confirm_2fa_recovery: 'Tôi đã lưu mã khôi phục của mình ở một nơi an toàn',
|
||||
confirm_account_for_free_referral_storage_c2a: 'Tạo tài khoản và xác nhận địa chỉ email của bạn để nhận 1 GB dung lượng lưu trữ miễn phí. Bạn của bạn cũng sẽ nhận được 1 GB dung lượng lưu trữ miễn phí.',
|
||||
confirm_code_generic_incorrect: "Mã không chính xác.",
|
||||
confirm_code_generic_too_many_requests: "Quá nhiều yêu cầu. Vui lòng đợi vài phút.",
|
||||
confirm_code_generic_submit: "Gửi mã",
|
||||
confirm_code_generic_try_again: "Thử lại",
|
||||
confirm_code_generic_title: "Nhập mã xác nhận",
|
||||
confirm_code_2fa_instruction: "Nhập mã 6 chữ số từ ứng dụng xác thực của bạn.",
|
||||
confirm_code_2fa_submit_btn: "Gửi",
|
||||
confirm_code_2fa_title: "Nhập mã 2FA",
|
||||
confirm_delete_multiple_items: 'Bạn có chắc chắn muốn xóa vĩnh viễn những mục này không?',
|
||||
confirm_delete_single_item: 'Bạn có muốn xóa vĩnh viễn mục này không?',
|
||||
confirm_open_apps_log_out: 'Bạn có ứng dụng đang mở. Bạn có chắc chắn muốn đăng xuất không?',
|
||||
confirm_new_password: "Xác nhận mật khẩu mới",
|
||||
confirm_delete_user: "Bạn có chắc chắn muốn xóa tài khoản của mình không? Tất cả các tệp và dữ liệu của bạn sẽ bị xóa vĩnh viễn. Hành động này không thể hoàn tác.",
|
||||
confirm_delete_user_title: "Xóa tài khoản?",
|
||||
confirm_session_revoke: "Bạn có chắc chắn muốn thu hồi phiên này không?",
|
||||
confirm_your_email_address: "Xác nhận địa chỉ email của bạn",
|
||||
contact_us: "Liên hệ chúng tôi",
|
||||
contact_us_verification_required: "Bạn phải có địa chỉ email đã xác minh để sử dụng tính năng này.",
|
||||
contain: 'Chứa',
|
||||
continue: "Tiếp tục",
|
||||
copy: 'Sao chép',
|
||||
copy_link: "Sao chép liên kết",
|
||||
copying: "Đang sao chép",
|
||||
copying_file: "Đang sao chép %%",
|
||||
cover: 'Che phủ',
|
||||
create_account: "Tạo tài khoản",
|
||||
create_free_account: "Tạo tài khoản miễn phí",
|
||||
create_shortcut: "Tạo lối tắt",
|
||||
credits: "Tín dụng",
|
||||
current_password: "Mật khẩu hiện tại",
|
||||
cut: 'Cắt',
|
||||
clock: "Đồng hồ",
|
||||
clock_visible_hide: 'Ẩn - Luôn ẩn',
|
||||
clock_visible_show: 'Hiện - Luôn hiển thị',
|
||||
clock_visible_auto: 'Tự động - Mặc định, chỉ hiển thị ở chế độ toàn màn hình.',
|
||||
close_all: 'Đóng tất cả',
|
||||
created: 'Đã tạo',
|
||||
date_modified: 'Ngày sửa đổi',
|
||||
default: 'Mặc định',
|
||||
delete: 'Xóa',
|
||||
delete_account: "Xóa tài khoản",
|
||||
delete_permanently: "Xóa vĩnh viễn",
|
||||
deleting_file: "Đang xóa %%",
|
||||
deploy_as_app: 'Triển khai như ứng dụng',
|
||||
descending: 'Giảm dần',
|
||||
desktop: 'Màn hình chính',
|
||||
desktop_background_fit: "Vừa khít",
|
||||
developers: "Nhà phát triển",
|
||||
dir_published_as_website: `%strong% đã được xuất bản tại:`,
|
||||
disable_2fa: 'Tắt 2FA',
|
||||
disable_2fa_confirm: "Bạn có chắc chắn muốn tắt 2FA không?",
|
||||
disable_2fa_instructions: "Nhập mật khẩu của bạn để tắt 2FA.",
|
||||
disassociate_dir: "Hủy liên kết thư mục",
|
||||
documents: 'Tài liệu',
|
||||
dont_allow: 'Không cho phép',
|
||||
download: 'Tải xuống',
|
||||
download_file: 'Tải xuống tệp',
|
||||
downloading: "Đang tải xuống",
|
||||
email: "Email",
|
||||
email_change_confirmation_sent: "Một email xác nhận đã được gửi đến địa chỉ email mới của bạn. Vui lòng kiểm tra hộp thư đến và làm theo hướng dẫn để hoàn tất quy trình.",
|
||||
email_invalid: 'Email không hợp lệ.',
|
||||
email_or_username: "Email hoặc tên người dùng",
|
||||
email_required: 'Email là bắt buộc.',
|
||||
empty_trash: 'Dọn sạch thùng rác',
|
||||
empty_trash_confirmation: `Bạn có chắc chắn muốn xóa vĩnh viễn các mục trong Thùng rác không?`,
|
||||
emptying_trash: 'Đang dọn sạch Thùng rác…',
|
||||
enable_2fa: 'Bật 2FA',
|
||||
end_hard: "Kết thúc cứng",
|
||||
end_process_force_confirm: "Bạn có chắc chắn muốn buộc kết thúc quá trình này không?",
|
||||
end_soft: "Kết thúc mềm",
|
||||
enlarged_qr_code: "Mã QR phóng to",
|
||||
enter_password_to_confirm_delete_user: "Nhập mật khẩu của bạn để xác nhận xóa tài khoản",
|
||||
error_message_is_missing: "Thiếu thông báo lỗi.",
|
||||
error_unknown_cause: "Đã xảy ra lỗi không xác định.",
|
||||
error_uploading_files: "Không thể tải lên tệp",
|
||||
favorites: "Yêu thích",
|
||||
feedback: "Phản hồi",
|
||||
feedback_c2a: "Vui lòng sử dụng biểu mẫu dưới đây để gửi phản hồi, nhận xét và báo cáo lỗi của bạn.",
|
||||
feedback_sent_confirmation: "Cảm ơn bạn đã liên hệ với chúng tôi. Nếu bạn có email liên kết với tài khoản của mình, chúng tôi sẽ phản hồi bạn trong thời gian sớm nhất.",
|
||||
fit: "Vừa khít",
|
||||
folder: 'Thư mục',
|
||||
force_quit: 'Buộc thoát',
|
||||
forgot_pass_c2a: "Quên mật khẩu?",
|
||||
from: "Từ",
|
||||
general: "Chung",
|
||||
get_a_copy_of_on_puter: `Nhận một bản sao của '%%' trên Puter.com!`,
|
||||
get_copy_link: 'Lấy liên kết sao chép',
|
||||
hide_all_windows: "Ẩn tất cả cửa sổ",
|
||||
home: 'Trang chủ',
|
||||
html_document: 'Tài liệu HTML',
|
||||
hue: 'Màu sắc',
|
||||
image: 'Hình ảnh',
|
||||
incorrect_password: "Mật khẩu không chính xác",
|
||||
invite_link: "Liên kết mời",
|
||||
item: 'mục',
|
||||
items_in_trash_cannot_be_renamed: `Mục này không thể đổi tên vì nó đang ở trong thùng rác. Để đổi tên mục này, trước tiên hãy kéo nó ra khỏi Thùng rác.`,
|
||||
jpeg_image: 'Hình ảnh JPEG',
|
||||
keep_in_taskbar: 'Giữ trong thanh tác vụ',
|
||||
language: "Ngôn ngữ",
|
||||
license: "Giấy phép",
|
||||
lightness: 'Độ sáng',
|
||||
link_copied: "Đã sao chép liên kết",
|
||||
loading: 'Đang tải',
|
||||
log_in: "Đăng nhập",
|
||||
log_into_another_account_anyway: 'Vẫn đăng nhập vào tài khoản khác',
|
||||
log_out: 'Đăng xuất',
|
||||
looks_good: "Trông tốt!",
|
||||
manage_sessions: "Quản lý phiên",
|
||||
menubar_style: "Kiểu thanh menu",
|
||||
menubar_style_desktop: "Màn hình chính",
|
||||
menubar_style_system: "Hệ thống",
|
||||
menubar_style_window: "Cửa sổ",
|
||||
modified: 'Đã sửa đổi',
|
||||
move: 'Di chuyển',
|
||||
moving_file: "Đang di chuyển %%",
|
||||
my_websites: "Trang web của tôi",
|
||||
name: 'Tên',
|
||||
name_cannot_be_empty: 'Tên không thể để trống.',
|
||||
name_cannot_contain_double_period: "Tên không thể là ký tự '..'.",
|
||||
name_cannot_contain_period: "Tên không thể là ký tự '.'.",
|
||||
name_cannot_contain_slash: "Tên không thể chứa ký tự '/'.",
|
||||
name_must_be_string: "Tên chỉ có thể là chuỗi.",
|
||||
name_too_long: `Tên không thể dài hơn %% ký tự.`,
|
||||
new: 'Mới',
|
||||
new_email: 'Email mới',
|
||||
new_folder: 'Thư mục mới',
|
||||
new_password: "Mật khẩu mới",
|
||||
new_username: "Tên người dùng mới",
|
||||
no: 'Không',
|
||||
no_dir_associated_with_site: 'Không có thư mục nào liên kết với địa chỉ này.',
|
||||
no_websites_published: "Bạn chưa xuất bản trang web nào. Nhấp chuột phải vào một thư mục để bắt đầu.",
|
||||
ok: 'OK',
|
||||
open: "Mở",
|
||||
open_in_new_tab: "Mở trong tab mới",
|
||||
open_in_new_window: "Mở trong cửa sổ mới",
|
||||
open_with: "Mở bằng",
|
||||
original_name: 'Tên gốc',
|
||||
original_path: 'Đường dẫn gốc',
|
||||
oss_code_and_content: "Phần mềm mã nguồn mở và nội dung",
|
||||
password: "Mật khẩu",
|
||||
password_changed: "Đã thay đổi mật khẩu.",
|
||||
password_recovery_rate_limit: "Bạn đã đạt đến giới hạn tốc độ của chúng tôi; vui lòng đợi vài phút. Để tránh điều này trong tương lai, hãy tránh tải lại trang quá nhiều lần.",
|
||||
password_recovery_token_invalid: "Mã khôi phục mật khẩu này không còn hợp lệ.",
|
||||
password_recovery_unknown_error: "Đã xảy ra lỗi không xác định. Vui lòng thử lại sau.",
|
||||
password_required: 'Mật khẩu là bắt buộc.',
|
||||
password_strength_error: "Mật khẩu phải có ít nhất 8 ký tự và chứa ít nhất một chữ cái viết hoa, một chữ cái viết thường, một số và một ký tự đặc biệt.",
|
||||
passwords_do_not_match: '`Mật khẩu mới` và `Xác nhận mật khẩu mới` không khớp.',
|
||||
paste: 'Dán',
|
||||
paste_into_folder: "Dán vào thư mục",
|
||||
path: 'Đường dẫn',
|
||||
personalization: "Cá nhân hóa",
|
||||
pick_name_for_website: "Chọn một tên cho trang web của bạn:",
|
||||
picture: "Hình ảnh",
|
||||
pictures: 'Hình ảnh',
|
||||
plural_suffix: '',
|
||||
powered_by_puter_js: `Được hỗ trợ bởi {{link=docs}}Puter.js{{/link}}`,
|
||||
preparing: "Đang chuẩn bị...",
|
||||
preparing_for_upload: "Đang chuẩn bị để tải lên...",
|
||||
print: 'In',
|
||||
privacy: "Quyền riêng tư",
|
||||
proceed_to_login: 'Tiếp tục đăng nhập',
|
||||
proceed_with_account_deletion: "Tiếp tục xóa tài khoản",
|
||||
process_status_initializing: "Đang khởi tạo",
|
||||
process_status_running: "Đang chạy",
|
||||
process_type_app: 'Ứng dụng',
|
||||
process_type_init: 'Khởi tạo',
|
||||
process_type_ui: 'Giao diện',
|
||||
properties: "Thuộc tính",
|
||||
public: 'Công khai',
|
||||
publish: "Xuất bản",
|
||||
publish_as_website: 'Xuất bản như trang web',
|
||||
puter_description: `Puter là một đám mây cá nhân đặt quyền riêng tư lên hàng đầu để lưu trữ tất cả các tệp, ứng dụng và trò chơi của bạn trong một nơi an toàn, có thể truy cập từ mọi nơi vào bất kỳ lúc nào.`,
|
||||
reading_file: "Đang đọc %strong%",
|
||||
recent: "Gần đây",
|
||||
recommended: "Được đề xuất",
|
||||
recover_password: "Khôi phục mật khẩu",
|
||||
refer_friends_c2a: "Nhận 1 GB cho mỗi người bạn tạo và xác nhận tài khoản trên Puter. Bạn của bạn cũng sẽ nhận được 1 GB!",
|
||||
refer_friends_social_media_c2a: `Nhận 1 GB dung lượng lưu trữ miễn phí trên Puter.com!`,
|
||||
refresh: 'Làm mới',
|
||||
release_address_confirmation: `Bạn có chắc chắn muốn giải phóng địa chỉ này không?`,
|
||||
remove_from_taskbar: 'Xóa khỏi thanh tác vụ',
|
||||
rename: 'Đổi tên',
|
||||
repeat: 'Lặp lại',
|
||||
replace: 'Thay thế',
|
||||
replace_all: 'Thay thế tất cả',
|
||||
resend_confirmation_code: "Gửi lại mã xác nhận",
|
||||
reset_colors: "Đặt lại màu sắc",
|
||||
restart_puter_confirm: "Bạn có chắc chắn muốn khởi động lại Puter không?",
|
||||
restore: "Khôi phục",
|
||||
save: 'Lưu',
|
||||
saturation: 'Độ bão hòa',
|
||||
save_account: 'Lưu tài khoản',
|
||||
save_account_to_get_copy_link: "Vui lòng tạo một tài khoản để tiếp tục.",
|
||||
save_account_to_publish: 'Vui lòng tạo một tài khoản để tiếp tục.',
|
||||
save_session: 'Lưu phiên',
|
||||
save_session_c2a: 'Tạo một tài khoản để lưu phiên hiện tại của bạn và tránh mất công việc của bạn.',
|
||||
scan_qr_c2a: 'Quét mã bên dưới\nđể đăng nhập vào phiên này từ các thiết bị khác',
|
||||
scan_qr_2fa: 'Quét mã QR bằng ứng dụng xác thực của bạn',
|
||||
scan_qr_generic: 'Quét mã QR này bằng điện thoại hoặc thiết bị khác của bạn',
|
||||
search: 'Tìm kiếm',
|
||||
seconds: 'giây',
|
||||
security: "Bảo mật",
|
||||
select: "Chọn",
|
||||
selected: 'đã chọn',
|
||||
select_color: 'Chọn màu…',
|
||||
sessions: "Phiên",
|
||||
send: "Gửi",
|
||||
send_password_recovery_email: "Gửi email khôi phục mật khẩu",
|
||||
session_saved: "Cảm ơn bạn đã tạo tài khoản. Phiên này đã được lưu.",
|
||||
settings: "Cài đặt",
|
||||
set_new_password: "Đặt mật khẩu mới",
|
||||
share: "Chia sẻ",
|
||||
share_to: "Chia sẻ đến",
|
||||
share_with: "Chia sẻ với:",
|
||||
shortcut_to: "Lối tắt đến",
|
||||
show_all_windows: "Hiển thị tất cả cửa sổ",
|
||||
show_hidden: 'Hiển thị mục ẩn',
|
||||
sign_in_with_puter: "Đăng nhập bằng Puter",
|
||||
sign_up: "Đăng ký",
|
||||
signing_in: "Đang đăng nhập…",
|
||||
size: 'Kích thước',
|
||||
skip: 'Bỏ qua',
|
||||
something_went_wrong: "Đã xảy ra lỗi.",
|
||||
sort_by: 'Sắp xếp theo',
|
||||
start: 'Bắt đầu',
|
||||
status: "Trạng thái",
|
||||
storage_usage: "Sử dụng bộ nhớ",
|
||||
storage_puter_used: 'đã sử dụng bởi Puter',
|
||||
taking_longer_than_usual: 'Đang mất nhiều thời gian hơn bình thường. Vui lòng đợi...',
|
||||
task_manager: "Trình quản lý tác vụ",
|
||||
taskmgr_header_name: "Tên",
|
||||
taskmgr_header_status: "Trạng thái",
|
||||
taskmgr_header_type: "Loại",
|
||||
terms: "Điều khoản",
|
||||
text_document: 'Tài liệu văn bản',
|
||||
tos_fineprint: `Bằng cách nhấp vào 'Tạo tài khoản miễn phí', bạn đồng ý với {{link=terms}}Điều khoản dịch vụ{{/link}} và {{link=privacy}}Chính sách quyền riêng tư{{/link}} của Puter.`,
|
||||
transparency: "Độ trong suốt",
|
||||
trash: 'Thùng rác',
|
||||
two_factor: 'Xác thực hai yếu tố',
|
||||
two_factor_disabled: '2FA đã tắt',
|
||||
two_factor_enabled: '2FA đã bật',
|
||||
type: 'Loại',
|
||||
type_confirm_to_delete_account: "Gõ 'confirm' để xóa tài khoản của bạn.",
|
||||
ui_colors: "Màu sắc giao diện",
|
||||
ui_manage_sessions: "Quản lý phiên",
|
||||
ui_revoke: "Thu hồi",
|
||||
undo: 'Hoàn tác',
|
||||
unlimited: 'Không giới hạn',
|
||||
unzip: "Giải nén",
|
||||
upload: 'Tải lên',
|
||||
upload_here: 'Tải lên tại đây',
|
||||
usage: 'Sử dụng',
|
||||
username: "Tên người dùng",
|
||||
username_changed: 'Đã cập nhật tên người dùng thành công.',
|
||||
username_required: 'Tên người dùng là bắt buộc.',
|
||||
versions: "Phiên bản",
|
||||
videos: 'Video',
|
||||
visibility: 'Hiển thị',
|
||||
yes: 'Có',
|
||||
yes_release_it: 'Có, giải phóng nó',
|
||||
you_have_been_referred_to_puter_by_a_friend: "Bạn đã được giới thiệu đến Puter bởi một người bạn!",
|
||||
zip: "Nén",
|
||||
zipping_file: "Đang nén %strong%",
|
||||
|
||||
// === 2FA Setup ===
|
||||
setup2fa_1_step_heading: 'Mở ứng dụng xác thực của bạn',
|
||||
setup2fa_1_instructions: `
|
||||
Bạn có thể sử dụng bất kỳ ứng dụng xác thực nào hỗ trợ giao thức Mật khẩu một lần dựa trên thời gian (TOTP).
|
||||
Có nhiều lựa chọn, nhưng nếu bạn không chắc chắn
|
||||
<a target="_blank" href="https://authy.com/download">Authy</a>
|
||||
là một lựa chọn tốt cho Android và iOS.
|
||||
`,
|
||||
setup2fa_2_step_heading: 'Quét mã QR',
|
||||
setup2fa_3_step_heading: 'Nhập mã 6 chữ số',
|
||||
setup2fa_4_step_heading: 'Sao chép mã khôi phục của bạn',
|
||||
setup2fa_4_instructions: `
|
||||
Những mã khôi phục này là cách duy nhất để truy cập tài khoản của bạn nếu bạn mất điện thoại hoặc không thể sử dụng ứng dụng xác thực.
|
||||
Hãy đảm bảo lưu trữ chúng ở một nơi an toàn.
|
||||
`,
|
||||
setup2fa_5_step_heading: 'Xác nhận thiết lập 2FA',
|
||||
setup2fa_5_confirmation_1: 'Tôi đã lưu mã khôi phục của mình ở một nơi an toàn',
|
||||
setup2fa_5_confirmation_2: 'Tôi đã sẵn sàng để bật 2FA',
|
||||
setup2fa_5_button: 'Bật 2FA',
|
||||
|
||||
// === 2FA Login ===
|
||||
login2fa_otp_title: 'Nhập mã 2FA',
|
||||
login2fa_otp_instructions: 'Nhập mã 6 chữ số từ ứng dụng xác thực của bạn.',
|
||||
login2fa_recovery_title: 'Nhập mã khôi phục',
|
||||
login2fa_recovery_instructions: 'Nhập một trong các mã khôi phục của bạn để truy cập tài khoản.',
|
||||
login2fa_use_recovery_code: 'Sử dụng mã khôi phục',
|
||||
login2fa_recovery_back: 'Quay lại',
|
||||
login2fa_recovery_placeholder: 'XXXXXXXX',
|
||||
}
|
||||
};
|
||||
|
||||
export default vi;
|
||||
@@ -23,169 +23,251 @@ const zhtw = {
|
||||
code: "zhtw",
|
||||
dictionary: {
|
||||
about: "關於",
|
||||
account: "帳號",
|
||||
access_granted_to: "已授予存取權限給",
|
||||
add_existing_account: "新增現有帳號",
|
||||
all_fields_required: '所有欄位都必須填寫。',
|
||||
account: "帳戶",
|
||||
account_password: "驗證帳戶密碼",
|
||||
access_granted_to: "已授予存取權給",
|
||||
add_existing_account: "新增現有帳戶",
|
||||
all_fields_required: '所有欄位都是必填的。',
|
||||
allow: '允許',
|
||||
apply: "套用",
|
||||
ascending: '升序',
|
||||
associated_websites: "關聯的網站",
|
||||
auto_arrange: '自動排列',
|
||||
background: "背景",
|
||||
browse: "瀏覽",
|
||||
cancel: '取消',
|
||||
center: '中心',
|
||||
center: '置中',
|
||||
change_desktop_background: '更改桌面背景…',
|
||||
change_email: "更改電子郵件",
|
||||
change_language: "更改語言",
|
||||
change_password: "更改密碼",
|
||||
change_ui_colors: "更改 UI 顏色",
|
||||
change_ui_colors: "更改使用者介面顏色",
|
||||
change_username: "更改使用者名稱",
|
||||
close: '關閉',
|
||||
close_all_windows: "關閉所有視窗",
|
||||
close_all_windows_confirm: "您確定要關閉所有視窗嗎?",
|
||||
close_all_windows_and_log_out: '關閉視窗並登出',
|
||||
change_always_open_with: "您是否希望總是用此程式開啟這類型的檔案",
|
||||
change_always_open_with: "您是否要始終使用以下程式開啟此類型的檔案",
|
||||
color: '顏色',
|
||||
hue: '色調',
|
||||
confirm_account_for_free_referral_storage_c2a: '建立帳號並確認您的電子郵件地址以獲得 1 GB 的免費儲存空間。您的朋友也將獲得 1 GB 的免費儲存空間。',
|
||||
confirm: '確認',
|
||||
confirm_2fa_setup: '我已將驗證碼新增到我的驗證器應用程式中',
|
||||
confirm_2fa_recovery: '我已將我的恢復碼儲存在安全的位置',
|
||||
confirm_account_for_free_referral_storage_c2a: '建立帳戶並確認您的電子郵件地址,即可獲得 1 GB 的免費儲存空間。您的朋友也會獲得 1 GB 的免費儲存空間。',
|
||||
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_delete_single_item: '您要永久刪除此項目嗎?',
|
||||
confirm_open_apps_log_out: '您有開啟的應用程式。您確定要登出嗎?',
|
||||
confirm_new_password: "確認新密碼",
|
||||
confirm_delete_user: "您確定要刪除您的帳號嗎?您的所有檔案和資料將被永久刪除。此操作無法復原。",
|
||||
confirm_delete_user_title: "刪除帳號?",
|
||||
confirm_delete_user: "您確定要刪除您的帳戶嗎?所有您的檔案和資料將被永久刪除。此操作無法撤銷。",
|
||||
confirm_delete_user_title: "刪除帳戶?",
|
||||
confirm_session_revoke: "您確定要撤銷此工作階段嗎?",
|
||||
confirm_your_email_address: "確認您的電子郵件地址",
|
||||
contact_us: "聯絡我們",
|
||||
contact_us_verification_required: "您必須有一個已驗證的電子郵件地址才能使用此功能。",
|
||||
contain: '包含',
|
||||
continue: "繼續",
|
||||
copy: '複製',
|
||||
copy_link: "複製連結",
|
||||
copying: "正在複製",
|
||||
copying_file: "正在複製 %%",
|
||||
cover: '覆蓋',
|
||||
create_account: "建立帳號",
|
||||
create_free_account: "建立免費帳號",
|
||||
create_account: "建立帳戶",
|
||||
create_free_account: "建立免費帳戶",
|
||||
create_shortcut: "建立捷徑",
|
||||
credits: "鳴謝",
|
||||
current_password: "目前的密碼",
|
||||
credits: "製作群",
|
||||
current_password: "目前密碼",
|
||||
cut: '剪下',
|
||||
clock: "時鐘",
|
||||
clock_visible_hide: '隱藏 - 總是隱藏',
|
||||
clock_visible_show: '顯示 - 總是顯示',
|
||||
clock_visible_hide: '隱藏 - 始終隱藏',
|
||||
clock_visible_show: '顯示 - 始終可見',
|
||||
clock_visible_auto: '自動 - 預設,僅在全螢幕模式下可見。',
|
||||
close_all: '全部關閉',
|
||||
created: '已建立',
|
||||
date_modified: '修改日期',
|
||||
default: '預設',
|
||||
delete: '刪除',
|
||||
delete_account: "刪除帳號",
|
||||
delete_account: "刪除帳戶",
|
||||
delete_permanently: "永久刪除",
|
||||
deleting_file: "正在刪除 %%",
|
||||
deploy_as_app: '部署為應用程式',
|
||||
descending: '降序',
|
||||
desktop: '桌面',
|
||||
desktop_background_fit: "適應",
|
||||
developers: "開發者",
|
||||
dir_published_as_website: `%strong% 已發布到:`,
|
||||
disassociate_dir: "取消關聯目錄",
|
||||
disable_2fa: '停用雙重驗證',
|
||||
disable_2fa_confirm: "您確定要停用雙重驗證嗎?",
|
||||
disable_2fa_instructions: "輸入您的密碼以停用雙重驗證。",
|
||||
disassociate_dir: "解除關聯目錄",
|
||||
documents: '文件',
|
||||
dont_allow: '不允許',
|
||||
download: '下載',
|
||||
download_file: '下載檔案',
|
||||
downloading: "正在下載",
|
||||
email: "電子郵件",
|
||||
email_change_confirmation_sent: "確認電子郵件已發送到您的新電子郵件地址。請查看您的收件匣並按照指示完成此過程。",
|
||||
email_invalid: '電子郵件無效。',
|
||||
email_or_username: "電子郵件或使用者名稱",
|
||||
email_required: '電子郵件是必填的。',
|
||||
empty_trash: '清空垃圾桶',
|
||||
empty_trash_confirmation: `您確定要永久刪除垃圾桶中的項目嗎?`,
|
||||
emptying_trash: '正在清空垃圾桶…',
|
||||
enter_password_to_confirm_delete_user: "輸入您的密碼以確認刪除帳號",
|
||||
feedback: "回饋",
|
||||
feedback_c2a: "請使用下面的表單向我們傳送您的回饋、評論和錯誤報告。",
|
||||
feedback_sent_confirmation: "感謝您聯絡我們。如果您的帳號有關聯的電子郵件,我們將盡快回覆您。",
|
||||
enable_2fa: '啟用雙重驗證',
|
||||
end_hard: "強制結束",
|
||||
end_process_force_confirm: "您確定要強制結束此程序嗎?",
|
||||
end_soft: "正常結束",
|
||||
enlarged_qr_code: "放大的 QR 碼",
|
||||
enter_password_to_confirm_delete_user: "輸入您的密碼以確認刪除帳戶",
|
||||
error_message_is_missing: "錯誤訊息缺失。",
|
||||
error_unknown_cause: "發生未知錯誤。",
|
||||
error_uploading_files: "上傳檔案失敗",
|
||||
favorites: "收藏",
|
||||
feedback: "意見回饋",
|
||||
feedback_c2a: "請使用以下表單向我們發送您的意見、評論和錯誤報告。",
|
||||
feedback_sent_confirmation: "感謝您聯絡我們。如果您的帳戶有關聯的電子郵件,我們將盡快回覆您。",
|
||||
fit: "適應",
|
||||
folder: '資料夾',
|
||||
force_quit: '強制退出',
|
||||
forgot_pass_c2a: "忘記密碼?",
|
||||
from: "從",
|
||||
from: "來自",
|
||||
general: "一般",
|
||||
get_a_copy_of_on_puter: `在 Puter.com 上取得 '%%' 的副本!`,
|
||||
get_copy_link: '取得複製連結',
|
||||
get_a_copy_of_on_puter: `在 Puter.com 上獲取 '%%' 的副本!`,
|
||||
get_copy_link: '獲取副本連結',
|
||||
hide_all_windows: "隱藏所有視窗",
|
||||
home: '首頁',
|
||||
html_document: 'HTML 文件',
|
||||
hue: '色相',
|
||||
image: '圖片',
|
||||
incorrect_password: "密碼錯誤",
|
||||
incorrect_password: "密碼不正確",
|
||||
invite_link: "邀請連結",
|
||||
item: '項目',
|
||||
items_in_trash_cannot_be_renamed: `此項目無法重新命名,因為它在垃圾桶中。要重新命名此項目,請先將其從垃圾桶中拖出。`,
|
||||
jpeg_image: 'JPEG 圖片',
|
||||
keep_in_taskbar: '保留在工作列',
|
||||
language: "語言",
|
||||
license: "許可證",
|
||||
license: "授權",
|
||||
lightness: '亮度',
|
||||
link_copied: "連結已複製",
|
||||
loading: '載入中',
|
||||
log_in: "登入",
|
||||
log_into_another_account_anyway: '無論如何都要登入另一個帳號',
|
||||
log_into_another_account_anyway: '仍然登入另一個帳戶',
|
||||
log_out: '登出',
|
||||
looks_good: "看起來不錯!",
|
||||
manage_sessions: "管理工作階段",
|
||||
menubar_style: "選單列樣式",
|
||||
menubar_style_desktop: "桌面",
|
||||
menubar_style_system: "系統",
|
||||
menubar_style_window: "視窗",
|
||||
modified: '已修改',
|
||||
move: '移動',
|
||||
moving_file: "正在移動 %%",
|
||||
my_websites: "我的網站",
|
||||
name: '名稱',
|
||||
name_cannot_be_empty: '名稱不能為空。',
|
||||
name_cannot_contain_double_period: "名稱不能為 '..' 字元。",
|
||||
name_cannot_contain_period: "名稱不能為 '.' 字元。",
|
||||
name_cannot_contain_slash: "名稱不能包含 '/' 字元。",
|
||||
name_cannot_contain_double_period: "名稱不能是 '..' 字符。",
|
||||
name_cannot_contain_period: "名稱不能是 '.' 字符。",
|
||||
name_cannot_contain_slash: "名稱不能包含 '/' 字符。",
|
||||
name_must_be_string: "名稱只能是字串。",
|
||||
name_too_long: `名稱不能超過 %% 個字元。`,
|
||||
new: '新建',
|
||||
name_too_long: `名稱不能超過 %% 個字符。`,
|
||||
new: '新增',
|
||||
new_email: '新電子郵件',
|
||||
new_folder: '新資料夾',
|
||||
new_password: "新密碼",
|
||||
new_username: "新使用者名稱",
|
||||
no: '否',
|
||||
no_dir_associated_with_site: '此地址沒有關聯的目錄。',
|
||||
no_websites_published: "您尚未發布任何網站。",
|
||||
no_dir_associated_with_site: '沒有與此地址關聯的目錄。',
|
||||
no_websites_published: "您還沒有發布任何網站。右鍵點擊資料夾以開始。",
|
||||
ok: '確定',
|
||||
open: "開啟",
|
||||
open_in_new_tab: "在新標籤頁中開啟",
|
||||
open_in_new_tab: "在新分頁中開啟",
|
||||
open_in_new_window: "在新視窗中開啟",
|
||||
open_with: "開啟方式",
|
||||
original_name: '原始名稱',
|
||||
original_path: '原始路徑',
|
||||
oss_code_and_content: "開源軟體和內容",
|
||||
password: "密碼",
|
||||
password_changed: "密碼已更改。",
|
||||
passwords_do_not_match: '`新密碼` 和 `確認新密碼` 不符。',
|
||||
password_recovery_rate_limit: "您已達到我們的速率限制;請稍等幾分鐘。為了避免將來發生這種情況,請避免過於頻繁地重新載入頁面。",
|
||||
password_recovery_token_invalid: "此密碼恢復令牌已不再有效。",
|
||||
password_recovery_unknown_error: "發生未知錯誤。請稍後再試。",
|
||||
password_required: '密碼是必填的。',
|
||||
password_strength_error: "密碼必須至少 8 個字符長,並且包含至少一個大寫字母、一個小寫字母、一個數字和一個特殊字符。",
|
||||
passwords_do_not_match: '`新密碼`和`確認新密碼`不匹配。',
|
||||
paste: '貼上',
|
||||
paste_into_folder: "貼入資料夾",
|
||||
paste_into_folder: "貼上到資料夾",
|
||||
path: '路徑',
|
||||
personalization: "個人化",
|
||||
pick_name_for_website: "為您的網站選擇一個名稱:",
|
||||
picture: "圖片",
|
||||
pictures: '圖片',
|
||||
plural_suffix: '個',
|
||||
powered_by_puter_js: `由 {{link=docs}}Puter.js{{/link}} 提供技術支援`,
|
||||
powered_by_puter_js: `由 {{link=docs}}Puter.js{{/link}} 提供支援`,
|
||||
preparing: "準備中...",
|
||||
preparing_for_upload: "準備上傳...",
|
||||
privacy: "隱私",
|
||||
print: '列印',
|
||||
privacy: "隱私權",
|
||||
proceed_to_login: '繼續登入',
|
||||
proceed_with_account_deletion: "繼續刪除帳號",
|
||||
proceed_with_account_deletion: "繼續刪除帳戶",
|
||||
process_status_initializing: "初始化中",
|
||||
process_status_running: "運行中",
|
||||
process_type_app: '應用程式',
|
||||
process_type_init: '初始化',
|
||||
process_type_ui: '使用者介面',
|
||||
properties: "屬性",
|
||||
public: '公開',
|
||||
publish: "發布",
|
||||
publish_as_website: '發布為網站',
|
||||
puter_description: `Puter 是一個以隱私為首的個人雲端,將您的所有檔案、應用程式和遊戲保留在一個
|
||||
安全的地方,隨時隨地都可以存取。`,
|
||||
puter_description: `Puter 是一個以隱私為先的個人雲端,可將您所有的檔案、應用程式和遊戲保存在一個安全的地方,隨時隨地都能存取。`,
|
||||
reading_file: "正在讀取 %strong%",
|
||||
recent: "最近",
|
||||
recover_password: "找回密碼",
|
||||
refer_friends_c2a: "每推薦一位朋友在 Puter 上建立並確認帳號,您就可以獲得 1 GB 的儲存空間。您的朋友也會獲得 1 GB 的儲存空間!",
|
||||
refer_friends_social_media_c2a: `在 Puter.com 上獲得 1 GB 的免費儲存空間!`,
|
||||
recommended: "推薦",
|
||||
recover_password: "恢復密碼",
|
||||
refer_friends_c2a: "每邀請一位朋友在 Puter 上建立並確認帳戶,您就可獲得 1 GB 空間。您的朋友也會獲得 1 GB!",
|
||||
refer_friends_social_media_c2a: `在 Puter.com 上獲得 1 GB 免費儲存空間!`,
|
||||
refresh: '重新整理',
|
||||
release_address_confirmation: `您確定要釋放此地址嗎?`,
|
||||
remove_from_taskbar:'從工作列移除',
|
||||
remove_from_taskbar: '從工作列移除',
|
||||
rename: '重新命名',
|
||||
repeat: '重複',
|
||||
replace: '取代',
|
||||
replace_all: '全部取代',
|
||||
resend_confirmation_code: "重新傳送確認碼",
|
||||
resend_confirmation_code: "重新發送確認碼",
|
||||
reset_colors: "重設顏色",
|
||||
restart_puter_confirm: "您確定要重新啟動 Puter 嗎?",
|
||||
restore: "還原",
|
||||
save: '儲存',
|
||||
saturation: '飽和度',
|
||||
save_account: '儲存帳號',
|
||||
save_account_to_get_copy_link: "請建立帳號以繼續。",
|
||||
save_account_to_publish: '請建立帳號以繼續。',
|
||||
save_account: '儲存帳戶',
|
||||
save_account_to_get_copy_link: "請建立帳戶以繼續。",
|
||||
save_account_to_publish: '請建立帳戶以繼續。',
|
||||
save_session: '儲存工作階段',
|
||||
save_session_c2a: '建立帳號以儲存您目前的工作階段,避免遺失您的工作。',
|
||||
scan_qr_c2a: '掃描下方的 QR Code,從其他裝置登入此工作階段',
|
||||
save_session_c2a: '建立帳戶以儲存您目前的工作階段並避免失去您的工作。',
|
||||
scan_qr_c2a: '掃描下方的代碼\n以從其他裝置登入此工作階段',
|
||||
scan_qr_2fa: '使用您的驗證器應用程式掃描 QR 碼',
|
||||
scan_qr_generic: '使用您的手機或其他裝置掃描此 QR 碼',
|
||||
search: '搜尋',
|
||||
seconds: '秒',
|
||||
security: "安全性",
|
||||
select: "選擇",
|
||||
selected: '已選擇',
|
||||
select_color: '選擇顏色…',
|
||||
send: "傳送",
|
||||
send_password_recovery_email: "傳送密碼恢復電子郵件",
|
||||
session_saved: "感謝您建立帳號。此工作階段已儲存。",
|
||||
sessions: "工作階段",
|
||||
send: "發送",
|
||||
send_password_recovery_email: "發送密碼恢復電子郵件",
|
||||
session_saved: "感謝您建立帳戶。此工作階段已儲存。",
|
||||
settings: "設定",
|
||||
set_new_password: "設定新密碼",
|
||||
share: "分享",
|
||||
share_to: "分享到",
|
||||
share_with: "分享給:",
|
||||
shortcut_to: "捷徑到",
|
||||
show_all_windows: "顯示所有視窗",
|
||||
show_hidden: '顯示隱藏項目',
|
||||
sign_in_with_puter: "使用 Puter 登入",
|
||||
@@ -193,34 +275,76 @@ const zhtw = {
|
||||
signing_in: "正在登入…",
|
||||
size: '大小',
|
||||
skip: '跳過',
|
||||
sort_by: '排序方式',
|
||||
something_went_wrong: "發生了一些錯誤。",
|
||||
sort_by: '排序依據',
|
||||
start: '開始',
|
||||
status: "狀態",
|
||||
storage_usage: "儲存空間使用情況",
|
||||
taking_longer_than_usual: '花費的時間比預期的還長。請稍候...',
|
||||
storage_usage: "儲存空間使用量",
|
||||
storage_puter_used: '由 Puter 使用',
|
||||
taking_longer_than_usual: '正在花費比平常更長的時間。請稍候...',
|
||||
task_manager: "工作管理員",
|
||||
taskmgr_header_name: "名稱",
|
||||
taskmgr_header_status: "狀態",
|
||||
taskmgr_header_type: "類型",
|
||||
terms: "條款",
|
||||
text_document: '文字文件',
|
||||
tos_fineprint: `點選 '建立免費帳號' 即表示您同意 Puter 的 {{link=terms}}服務條款{{/link}} 和 {{link=privacy}}隱私政策{{/link}}。`,
|
||||
tos_fineprint: `點擊「建立免費帳戶」即表示您同意 Puter 的{{link=terms}}服務條款{{/link}}和{{link=privacy}}隱私政策{{/link}}`,
|
||||
transparency: "透明度",
|
||||
trash: '垃圾桶',
|
||||
two_factor: '雙重驗證',
|
||||
two_factor_disabled: '雙重驗證已停用',
|
||||
two_factor_enabled: '雙重驗證已啟用',
|
||||
type: '類型',
|
||||
type_confirm_to_delete_account: "輸入 'confirm' 以刪除您的帳號。",
|
||||
ui_colors: "UI 顏色",
|
||||
type_confirm_to_delete_account: "輸入「confirm」以刪除您的帳戶。",
|
||||
ui_colors: "使用者介面顏色",
|
||||
ui_manage_sessions: "工作階段管理器",
|
||||
ui_revoke: "撤銷",
|
||||
undo: '復原',
|
||||
unlimited: '無限',
|
||||
unlimited: '無限制',
|
||||
unzip: "解壓縮",
|
||||
upload: '上傳',
|
||||
upload_here: '在此上傳',
|
||||
usage: '使用情況',
|
||||
upload_here: '上傳到這裡',
|
||||
usage: '使用量',
|
||||
username: "使用者名稱",
|
||||
username_changed: '使用者名稱已成功更新。',
|
||||
username_changed: '使用者名稱更新成功。',
|
||||
username_required: '使用者名稱是必填的。',
|
||||
versions: "版本",
|
||||
visibility: '可視性',
|
||||
videos: '影片',
|
||||
visibility: '可見性',
|
||||
yes: '是',
|
||||
yes_release_it: '是的,釋放它',
|
||||
you_have_been_referred_to_puter_by_a_friend: "您的朋友推薦您使用 Puter!",
|
||||
you_have_been_referred_to_puter_by_a_friend: "您已被朋友推薦到 Puter!",
|
||||
zip: "壓縮",
|
||||
storage_puter_used: "由 Puter 使用",
|
||||
zipping_file: "正在壓縮 %strong%",
|
||||
|
||||
// === 2FA Setup ===
|
||||
setup2fa_1_step_heading: '開啟您的驗證器應用程式',
|
||||
setup2fa_1_instructions: `
|
||||
您可以使用任何支援基於時間的一次性密碼(TOTP)協議的驗證器應用程式。
|
||||
有許多選擇,但如果您不確定,
|
||||
<a target="_blank" href="https://authy.com/download">Authy</a>
|
||||
是 Android 和 iOS 的一個不錯的選擇。
|
||||
`,
|
||||
setup2fa_2_step_heading: '掃描 QR 碼',
|
||||
setup2fa_3_step_heading: '輸入 6 位數驗證碼',
|
||||
setup2fa_4_step_heading: '複製您的恢復碼',
|
||||
setup2fa_4_instructions: `
|
||||
如果您遺失手機或無法使用驗證器應用程式,這些恢復碼是存取您帳戶的唯一方法。
|
||||
請確保將它們儲存在安全的地方。
|
||||
`,
|
||||
setup2fa_5_step_heading: '確認雙重驗證設置',
|
||||
setup2fa_5_confirmation_1: '我已將恢復碼儲存在安全的位置',
|
||||
setup2fa_5_confirmation_2: '我已準備好啟用雙重驗證',
|
||||
setup2fa_5_button: '啟用雙重驗證',
|
||||
|
||||
// === 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',
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path opacity="0.2" d="M10 5C8.892 5 8 5.892 8 7V43C8 44.108 8.892 45 10 45H38C39.108 45 40 44.108 40 43V17L28 5H10Z" fill="black"/>
|
||||
<path d="M10 4C8.892 4 8 4.892 8 6V42C8 43.108 8.892 44 10 44H38C39.108 44 40 43.108 40 42V16L30 14L28 4H10Z" fill="#E4E4E4"/>
|
||||
<path opacity="0.2" d="M40 17L28 5V15C28 16.108 28.892 17 30 17H40Z" fill="black"/>
|
||||
<path d="M40 16L28 4V14C28 15.108 28.892 16 30 16H40Z" fill="#FAFAFA"/>
|
||||
<path opacity="0.2" d="M10 4C8.892 4 8 4.892 8 6V7C8 5.892 8.892 5 10 5H28V4H10Z" fill="white"/>
|
||||
<path opacity="0.2" d="M23.5294 42.4706L14 36.827V24.3529L14.4706 23.8178L24 18L33.5294 23.8235L34 24.3529V36.7094L24.4706 42.4706L24 42.7647L23.5294 42.4706Z" fill="black"/>
|
||||
<path d="M14 24.3529L23.5294 30.2353V41.7647L14 36.1176V24.3529Z" fill="#2664EB"/>
|
||||
<path d="M34 24.3529L24.4706 30.2353V41.7647L34 36.1176V24.3529Z" fill="#2664EB"/>
|
||||
<path d="M24 18L14.4706 23.8235L24 29.6471L33.5294 23.8235L24 18Z" fill="#2664EB"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -31,6 +31,7 @@ window.puter_gui_enabled = true;
|
||||
* @param {string} [options.api_origin='https://api.puter.com'] - The origin URL for the API.
|
||||
* @param {number} [options.max_item_name_length=500] - Maximum allowed length for an item name.
|
||||
* @param {boolean} [options.require_email_verification_to_publish_website=true] - Flag to decide whether email verification is required to publish a website.
|
||||
* @param {boolean} [options.disable_temp_users=false] - Flag to disable auto-generated temporary users.
|
||||
*
|
||||
* @property {string} [options.app_domain] - Extracted domain name from gui_origin. It's derived automatically if not provided.
|
||||
* @property {string} [window.gui_env] - The environment in which the GUI is running (e.g., "dev" or "prod").
|
||||
@@ -54,6 +55,8 @@ window.gui = async function(options){
|
||||
window.api_origin = options.api_origin ?? "https://api.puter.com";
|
||||
window.max_item_name_length = options.max_item_name_length ?? 500;
|
||||
window.require_email_verification_to_publish_website = options.require_email_verification_to_publish_website ?? true;
|
||||
window.disable_temp_users = options.disable_temp_users ?? false;
|
||||
window.co_isolation_enabled = options.co_isolation_enabled;
|
||||
|
||||
// DEV: Load the initgui.js file if we are in development mode
|
||||
if(!window.gui_env || window.gui_env === "dev"){
|
||||
@@ -73,6 +76,7 @@ window.gui = async function(options){
|
||||
|
||||
// 🚀 Launch the GUI 🚀
|
||||
window.initgui(options);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -831,7 +831,7 @@ window.initgui = async function(options){
|
||||
// -------------------------------------------------------------------------------------
|
||||
// Un-authed but not first visit -> try to log in/sign up
|
||||
// -------------------------------------------------------------------------------------
|
||||
if(!window.is_auth() && !window.first_visit_ever){
|
||||
if(!window.is_auth() && (!window.first_visit_ever || window.disable_temp_users)){
|
||||
if(window.logged_in_users.length > 0){
|
||||
UIWindowSessionList();
|
||||
}
|
||||
@@ -849,7 +849,7 @@ window.initgui = async function(options){
|
||||
// -------------------------------------------------------------------------------------
|
||||
// Un-authed and first visit ever -> create temp user
|
||||
// -------------------------------------------------------------------------------------
|
||||
else if(!window.is_auth() && window.first_visit_ever){
|
||||
else if(!window.is_auth() && window.first_visit_ever && !window.disable_temp_users){
|
||||
let referrer;
|
||||
try{
|
||||
referrer = new URL(window.location.href).pathname;
|
||||
|
||||
@@ -3,6 +3,51 @@
|
||||
"short_name": "Puter",
|
||||
"display": "standalone",
|
||||
"start_url": "/",
|
||||
"id": "puter",
|
||||
"description": "Personal Cloud Computer: All your files, apps, and games in one place accessible from anywhere at any time.",
|
||||
"dir": "auto",
|
||||
"lang": "en",
|
||||
"orientation": "any",
|
||||
"scope": "/",
|
||||
"categories": [
|
||||
"productivity",
|
||||
"entertainment",
|
||||
"games",
|
||||
"navigation",
|
||||
"utilities"
|
||||
],
|
||||
"shortcuts": [
|
||||
{
|
||||
"name": "Notepad",
|
||||
"short_name": "Notepad",
|
||||
"description": "Cloud Notepad",
|
||||
"url": "/app/editor"
|
||||
},
|
||||
{
|
||||
"name": "Dev Center",
|
||||
"short_name": "Dev Center",
|
||||
"description": "Publish your apps and games on the Puter",
|
||||
"url": "/app/dev-center"
|
||||
},
|
||||
{
|
||||
"name": "Camera",
|
||||
"short_name": "Camera",
|
||||
"description": "Take a picture or record a video",
|
||||
"url": "/app/camera"
|
||||
},
|
||||
{
|
||||
"name":"Recorder",
|
||||
"short_name":"Recorder",
|
||||
"description":"Record audio notes and voice memos",
|
||||
"url":"/app/recorder"
|
||||
},
|
||||
{
|
||||
"name": "Terminal",
|
||||
"short_name": "Terminal",
|
||||
"description": "Terminal",
|
||||
"url": "/app/terminal"
|
||||
}
|
||||
],
|
||||
"icons": [
|
||||
{
|
||||
"src": "/favicons/android-icon-36x36.png",
|
||||
@@ -40,5 +85,7 @@
|
||||
"type": "image/png",
|
||||
"density": "4.0"
|
||||
}
|
||||
]
|
||||
],
|
||||
"theme_color": "#000000",
|
||||
"background_color": "#000000"
|
||||
}
|
||||
@@ -4,7 +4,7 @@
|
||||
"description": "ANSI Terminal for Puter",
|
||||
"main": "exports.js",
|
||||
"scripts": {
|
||||
"test": "mocha ./test"
|
||||
"test": "npx mocha"
|
||||
},
|
||||
"author": "Puter Technologies Inc.",
|
||||
"license": "AGPL-3.0-only",
|
||||
@@ -13,7 +13,7 @@
|
||||
"@rollup/plugin-commonjs": "^24.1.0",
|
||||
"@rollup/plugin-node-resolve": "^15.0.2",
|
||||
"@rollup/plugin-replace": "^5.0.2",
|
||||
"mocha": "^10.2.0",
|
||||
"mocha": "^10.6.0",
|
||||
"rollup": "^3.21.4",
|
||||
"rollup-plugin-copy": "^3.4.0"
|
||||
},
|
||||
|
||||
@@ -22,7 +22,7 @@ export const CreateEnvProvider = ({ config }) => {
|
||||
return {
|
||||
USER: config['puter.auth.username'],
|
||||
HOME: '/' + config['puter.auth.username'],
|
||||
HOSTNAME: config['puter.domain'],
|
||||
HOSTNAME: config['puter.domain'] ?? 'puter.com',
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -19,12 +19,12 @@
|
||||
// This doesn't go in ./bases because it logically depends on
|
||||
// both ./bases and ./traits, and ./traits depends on ./bases.
|
||||
|
||||
const { TraitBase } = require("./bases/TraitBase");
|
||||
const { FeatureBase } = require("./bases/FeatureBase");
|
||||
|
||||
class AdvancedBase extends TraitBase {
|
||||
static TRAITS = [
|
||||
require('./traits/NodeModuleDITrait'),
|
||||
require('./traits/PropertiesTrait'),
|
||||
class AdvancedBase extends FeatureBase {
|
||||
static FEATURES = [
|
||||
require('./features/NodeModuleDIFeature'),
|
||||
require('./features/PropertiesFeature'),
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
+6
-6
@@ -18,11 +18,11 @@
|
||||
*/
|
||||
const { BasicBase } = require("./BasicBase");
|
||||
|
||||
class TraitBase extends BasicBase {
|
||||
class FeatureBase extends BasicBase {
|
||||
constructor (parameters, ...a) {
|
||||
super(parameters, ...a);
|
||||
for ( const trait of this.traits ) {
|
||||
trait.install_in_instance(
|
||||
for ( const feature of this.features ) {
|
||||
feature.install_in_instance(
|
||||
this,
|
||||
{
|
||||
parameters: parameters || {},
|
||||
@@ -31,11 +31,11 @@ class TraitBase extends BasicBase {
|
||||
}
|
||||
}
|
||||
|
||||
get traits () {
|
||||
return this._get_merged_static_array('TRAITS');
|
||||
get features () {
|
||||
return this._get_merged_static_array('FEATURES');
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
TraitBase,
|
||||
FeatureBase,
|
||||
};
|
||||
+1
-1
@@ -45,7 +45,7 @@ module.exports = {
|
||||
}
|
||||
|
||||
instance.modules = modules;
|
||||
|
||||
|
||||
// This "require" function can shadow the real one so
|
||||
// that editor tools are aware of the modules that
|
||||
// are being used.
|
||||
File renamed without changes.
@@ -21,17 +21,17 @@ import { simpleGit } from 'simple-git';
|
||||
const REPO_URL = 'https://github.com/HeyPuter/puter';
|
||||
|
||||
const params = {
|
||||
from: 'v2.3.0',
|
||||
from: 'v2.4.1',
|
||||
// from: 'v2.4.0',
|
||||
to: 'v2.5.0',
|
||||
date: '2024-07-08',
|
||||
to: 'v2.4.2',
|
||||
date: '2024-07-22',
|
||||
};
|
||||
|
||||
const git = simpleGit();
|
||||
const log = await git.log({ from: params.from });
|
||||
const commits = log.all;
|
||||
|
||||
const CC_REGEX = /^([a-z]+)(\([a-z]+\))?:\s(.*)/;
|
||||
const CC_REGEX = /^([a-z0-9]+)(\([a-z0-9]+\))?:\s(.*)/;
|
||||
const parse_conventional_commit = message => {
|
||||
const parts = CC_REGEX.exec(message);
|
||||
if ( ! parts ) return null;
|
||||
@@ -45,9 +45,12 @@ const types = {
|
||||
feat: {
|
||||
label: 'Features'
|
||||
},
|
||||
i18n: {
|
||||
label: 'Translations'
|
||||
},
|
||||
fix: {
|
||||
label: 'Bug Fixes'
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
const scopes = {
|
||||
@@ -66,6 +69,12 @@ const scopes = {
|
||||
gui: {
|
||||
label: 'GUI'
|
||||
},
|
||||
tools: {
|
||||
ignore: true,
|
||||
},
|
||||
security: {
|
||||
label: 'Security',
|
||||
},
|
||||
};
|
||||
|
||||
const scope_aliases = {
|
||||
@@ -74,6 +83,77 @@ const scope_aliases = {
|
||||
parsely: 'phoenix',
|
||||
};
|
||||
|
||||
const complicated_cases = [
|
||||
function fix_i18n ({ commit, meta }) {
|
||||
if ( meta.type === 'fix' && meta.scope === 'i18n' ) {
|
||||
meta.type = 'i18n';
|
||||
meta.scope = undefined;
|
||||
}
|
||||
}
|
||||
];
|
||||
|
||||
const retro_prefixes_0 = {
|
||||
i18n: [
|
||||
'883601142873f10d69c84874499065a7d29af054',
|
||||
'17145d0be6a9a1445947cc0c4bec8f16a475144c',
|
||||
'e61039faf409b0ad85c7513b0123f3f2e92ebe32',
|
||||
'bffa192805216fc17045cd8d629f34784dca7f3f',
|
||||
'fe5be7f3cf7f336730137293ba86a637e8d8591d',
|
||||
'78a0acea6980b6d491da4874edbd98e17c0d9577',
|
||||
'a96abb5793528d0dc56d75f95d771e1dcf5960d1',
|
||||
'f5a8ee1c6ab950d62c90b6257791f026a508b4e4',
|
||||
'47ec74f0aa6adb3952e6460909029a4acb0c3039',
|
||||
'473b6512c697854e3f3badae1eb7b87742954da5',
|
||||
'8440f566b91c9eb4f01addcb850061e3fbe3afc7',
|
||||
'92abc9947f811f94f17a5ee5a4b73ee2b210900a',
|
||||
'cff488f4f4378ca6c7568a585a665f2a3b87b89c',
|
||||
'3b8af7cc5c1be8ed67be827360bbfe0f0b5027e9',
|
||||
'84e31eff2f58584d8fab7dd10606f2f6ced933a2',
|
||||
'81781f80afc07cd1e6278906cdc68c8092fbfedf',
|
||||
'56820cf6ee56ff810a6b495a281ccbb2e7f9d8fb',
|
||||
'69a80ab3d2c94ee43d96021c3bcbdab04a4b5dc6',
|
||||
'8e297cd7e30757073e2f96593c363a273b639466',
|
||||
'151527825f1eb4b060aaf97feb7d18af4fcddbf2',
|
||||
'8bece96f6224a060d5b408e08c58865fadb8b79c',
|
||||
'333d6e3b651e460caca04a896cbc8c175555b79b',
|
||||
'8a3d0430f39f872b8a460c344cce652c340b700b',
|
||||
'b9e73b7288aebb14e6bbf1915743e9157fc950b1',
|
||||
'c2d3d69dbe33f36fcae13bcbc8e2a31a86025af9',
|
||||
'382fb24dbb1737a8a54ed2491f80b2e2276cde61',
|
||||
],
|
||||
fix: [
|
||||
'535475b3c36a37e3319ed067a24fb671790dcda3',
|
||||
'45f131f8eaf94cf3951ca7ffeb6f311590233b8a',
|
||||
'02e1b1e8f5f8e22d7ab39ebff99f7dd8e08a4221',
|
||||
],
|
||||
doc: [
|
||||
'338004474f078a00608af1d0ebf8a7f9534bad28',
|
||||
'6c4c73a9e85ff8eb5e7663dcce11f4d1f824032b',
|
||||
'c19c18bfcf163b37e3d173b8fa50393dfb9f540f',
|
||||
],
|
||||
feat: [
|
||||
'8e7306c23be01ee6c31cdb4c99f2fb1f71a2247f',
|
||||
],
|
||||
meta: [
|
||||
'b3c1b128e2d8519bc816cdcd3220c8f40e05bb01',
|
||||
'452b7495b1736df90bc748dbf818407488875754',
|
||||
],
|
||||
};
|
||||
|
||||
const message_changes = {
|
||||
'1f7f094282fae915a2436701cfb756444cd3f781': 'feat: add new file templates',
|
||||
'64e4299ac0a4c9e1de7a9d089e2d7529a9530818': 'doc: docker instructions for Windows',
|
||||
'f897e844989083b0b369ba0ce4d2c5a9f3db5ad8': 'fix: #432',
|
||||
};
|
||||
|
||||
const retro_prefixes = {};
|
||||
for ( const prefix in retro_prefixes_0 ) {
|
||||
for ( const commit_hash of retro_prefixes_0[prefix] ) {
|
||||
console.log('PREFIX', commit_hash, prefix);
|
||||
retro_prefixes[commit_hash] = prefix;
|
||||
}
|
||||
}
|
||||
|
||||
const data = {};
|
||||
const ensure_scope = name => {
|
||||
if ( data[name] ) return;
|
||||
@@ -82,17 +162,28 @@ const ensure_scope = name => {
|
||||
};
|
||||
|
||||
for ( const commit of commits ) {
|
||||
if ( message_changes.hasOwnProperty(commit.hash) ) {
|
||||
commit.message = message_changes[commit.hash];
|
||||
}
|
||||
if ( retro_prefixes.hasOwnProperty(commit.hash) ) {
|
||||
commit.message = retro_prefixes[commit.hash] + ': ' +
|
||||
commit.message;
|
||||
}
|
||||
const meta = parse_conventional_commit(commit.message);
|
||||
if ( ! meta ) continue;
|
||||
for ( const transformer of complicated_cases ) {
|
||||
transformer({ commit, meta });
|
||||
}
|
||||
let scope = meta.scope ?? 'puter';
|
||||
while ( scope in scope_aliases ) {
|
||||
scope = scope_aliases[scope];
|
||||
}
|
||||
ensure_scope(scope);
|
||||
if ( ! scopes[scope] ) {
|
||||
console.log(commit);
|
||||
throw new Error(`missing scope: ${scope}`);
|
||||
}
|
||||
if ( scopes[scope].ignore ) continue;
|
||||
ensure_scope(scope);
|
||||
|
||||
if ( types.hasOwnProperty(meta.type) ) {
|
||||
data[scope][meta.type].push({ meta, commit });
|
||||
@@ -100,7 +191,7 @@ for ( const commit of commits ) {
|
||||
}
|
||||
|
||||
let s = '';
|
||||
s += `## ${params.from} (${params.date})\n\n`;
|
||||
s += `## ${params.to} (${params.date})\n\n`;
|
||||
for ( const scope_name in data ) {
|
||||
const scope = data[scope_name];
|
||||
s += `### ${scopes[scope_name].label}\n\n`;
|
||||
@@ -108,7 +199,7 @@ for ( const scope_name in data ) {
|
||||
const type = types[type_name];
|
||||
const items = scope[type_name];
|
||||
if ( items.length == 0 ) continue;
|
||||
s += `#### ${type.label}\n\n`;
|
||||
s += `\n#### ${type.label}\n\n`;
|
||||
for ( const { meta, commit } of items ) {
|
||||
const shorthash = commit.hash.slice(0,7)
|
||||
s += `- ${meta.summary} ([${shorthash}](${REPO_URL}/commit/${commit.hash}))\n`;
|
||||
|
||||
Reference in new issue
Block a user