Compare commits

..

13 Commits

Author SHA1 Message Date
nivedin
01200c9e5f fix: duplicate tab reference bug 2023-09-18 11:11:16 +05:30
Yuri Grand
75193a7aa8 i18n: translate locales to russian (#3312)
chore: translate locales to russian
2023-09-13 12:53:10 +05:30
tyo
b269c239d9 chore(i18n): update translation for Indonesian (#3284) 2023-09-13 12:48:46 +05:30
Liyas Thomas
72b4a1fc4e fix: typo in "twitter link" and "invite to hoppscotch" action (#3346) 2023-09-13 11:55:58 +05:30
DNT
d2d1674d31 i18n: update vi.json (#3241) 2023-09-13 11:52:37 +05:30
Joel Jacob Stephen
a6b57777e3 refactor: remove font sizes from the app (#3341)
* refactor: remove font size from settings

* refactor: remove font size from themes

* refactor: remove font size from spotlight

* refactor: remove default font size

* chore: clean up

---------

Co-authored-by: Liyas Thomas <liyascthomas@gmail.com>
2023-09-13 11:45:38 +05:30
Joel Jacob Stephen
65ef4db86f refactor: remove zen mode from the app (#3337)
* refactor: remove zen mode from settings

* refactor: remove zen mode from footer and options
2023-09-12 14:10:38 +05:30
Nivedin
7201147b55 fix: context-menu position fixed while scrolling (#3340) 2023-09-12 12:43:10 +05:30
Anwarul Islam
dd143c95a9 fix: unusual behavior while scrolling through spotlight entries (#3324)
* fix: spotlight scroll issue

* fix: entry hidden issue

* chore: back to loop mode
2023-09-12 12:42:44 +05:30
James George
005581ee7d fix: broken link to REST API Testing docs (#3333)
fix: broken link to REST API Testing docs
2023-09-12 12:32:10 +05:30
Joel Jacob Stephen
1431ecc6d7 refactor: keyboard shortcuts now supports different keyboard layouts including Dvorak (#3332)
* refactor: support mulitple keyboard layouts such as dvorak

* chore: replace redundant variable usage
2023-09-08 22:02:39 +05:30
Liyas Thomas
f34d896095 docs: updated screenshots and features list (#3310) 2023-09-05 12:06:47 +05:30
Andrew Bastin
e95ebb9226 chore: add release tag ci pipeline to push to docker hub 2023-08-31 15:49:32 +05:30
35 changed files with 1205 additions and 1520 deletions

View File

@@ -29,8 +29,8 @@ jobs:
target: backend target: backend
push: true push: true
tags: | tags: |
${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}:latest ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}:latest
${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}:${{ github.ref }} ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_BACKEND_CONTAINER_NAME }}:${{ github.ref_name }}
- name: Build and push `${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}` - name: Build and push `${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}`
uses: docker/build-push-action@v4 uses: docker/build-push-action@v4
@@ -40,8 +40,8 @@ jobs:
target: app target: app
push: true push: true
tags: | tags: |
${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}:latest ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}:latest
${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}:${{ github.ref }} ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_FRONTEND_CONTAINER_NAME }}:${{ github.ref_name }}
- name: Build and push `${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}` - name: Build and push `${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}`
uses: docker/build-push-action@v4 uses: docker/build-push-action@v4
@@ -51,8 +51,8 @@ jobs:
target: sh_admin target: sh_admin
push: true push: true
tags: | tags: |
${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}:latest ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}:latest
${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}:${{ github.ref }} ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_SH_ADMIN_CONTAINER_NAME }}:${{ github.ref_name }}
- name: Build and push `${{ secrets.DOCKER_AIO_CONTAINER_NAME }}` - name: Build and push `${{ secrets.DOCKER_AIO_CONTAINER_NAME }}`
uses: docker/build-push-action@v4 uses: docker/build-push-action@v4
@@ -62,5 +62,5 @@ jobs:
target: aio target: aio
push: true push: true
tags: | tags: |
${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}:latest ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}:latest
${{ secrets.DOCKER_USERNAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}:${{ github.ref }} ${{ secrets.DOCKER_ORG_NAME }}/${{ secrets.DOCKER_AIO_CONTAINER_NAME }}:${{ github.ref_name }}

View File

@@ -6,8 +6,8 @@ We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status, identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity nationality, personal appearance, race, caste, color, religion, or sexual
and orientation. identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming, We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community. diverse, inclusive, and healthy community.
@@ -22,17 +22,17 @@ community include:
* Giving and gracefully accepting constructive feedback * Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes, * Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience and learning from the experience
* Focusing on what is best not just for us as individuals, but for the * Focusing on what is best not just for us as individuals, but for the overall
overall community community
Examples of unacceptable behavior include: Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or * The use of sexualized language or imagery, and sexual attention or advances of
advances of any kind any kind
* Trolling, insulting or derogatory comments, and personal or political attacks * Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment * Public or private harassment
* Publishing others' private information, such as a physical or email * Publishing others' private information, such as a physical or email address,
address, without their explicit permission without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a * Other conduct which could reasonably be considered inappropriate in a
professional setting professional setting
@@ -82,15 +82,15 @@ behavior was inappropriate. A public apology may be requested.
### 2. Warning ### 2. Warning
**Community Impact**: A violation through a single incident or series **Community Impact**: A violation through a single incident or series of
of actions. actions.
**Consequence**: A warning with consequences for continued behavior. No **Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or like social media. Violating these terms may lead to a temporary or permanent
permanent ban. ban.
### 3. Temporary Ban ### 3. Temporary Ban
@@ -106,23 +106,27 @@ Violating these terms may lead to a permanent ban.
### 4. Permanent Ban ### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community **Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals. individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within **Consequence**: A permanent ban from any sort of public interaction within the
the community. community.
## Attribution ## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at version 2.1, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by [Mozilla's code of conduct Community Impact Guidelines were inspired by
enforcement ladder](https://github.com/mozilla/diversity). [Mozilla's code of conduct enforcement ladder][Mozilla CoC].
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
https://www.contributor-covenant.org/translations. [https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

190
README.md
View File

@@ -2,23 +2,18 @@
<a href="https://hoppscotch.io"> <a href="https://hoppscotch.io">
<img <img
src="https://avatars.githubusercontent.com/u/56705483" src="https://avatars.githubusercontent.com/u/56705483"
alt="Hoppscotch Logo" alt="Hoppscotch"
height="64" height="64"
/> />
</a> </a>
<br /> <h3>
<p>
<h3>
<b>
Hoppscotch
</b>
</h3>
</p>
<p>
<b> <b>
Open source API development ecosystem Hoppscotch
</b> </b>
</p> </h3>
<b>
Open Source API Development Ecosystem
</b>
<p> <p>
[![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen?logo=github)](CODE_OF_CONDUCT.md) [![Website](https://img.shields.io/website?url=https%3A%2F%2Fhoppscotch.io&logo=hoppscotch)](https://hoppscotch.io) [![Tests](https://github.com/hoppscotch/hoppscotch/actions/workflows/tests.yml/badge.svg)](https://github.com/hoppscotch/hoppscotch/actions) [![Tweet](https://img.shields.io/twitter/url?url=https%3A%2F%2Fhoppscotch.io%2F)](https://twitter.com/share?text=%F0%9F%91%BD%20Hoppscotch%20%E2%80%A2%20Open%20source%20API%20development%20ecosystem%20-%20Helps%20you%20create%20requests%20faster,%20saving%20precious%20time%20on%20development.&url=https://hoppscotch.io&hashtags=hoppscotch&via=hoppscotch_io) [![contributions welcome](https://img.shields.io/badge/contributions-welcome-brightgreen?logo=github)](CODE_OF_CONDUCT.md) [![Website](https://img.shields.io/website?url=https%3A%2F%2Fhoppscotch.io&logo=hoppscotch)](https://hoppscotch.io) [![Tests](https://github.com/hoppscotch/hoppscotch/actions/workflows/tests.yml/badge.svg)](https://github.com/hoppscotch/hoppscotch/actions) [![Tweet](https://img.shields.io/twitter/url?url=https%3A%2F%2Fhoppscotch.io%2F)](https://twitter.com/share?text=%F0%9F%91%BD%20Hoppscotch%20%E2%80%A2%20Open%20source%20API%20development%20ecosystem%20-%20Helps%20you%20create%20requests%20faster,%20saving%20precious%20time%20on%20development.&url=https://hoppscotch.io&hashtags=hoppscotch&via=hoppscotch_io)
@@ -34,23 +29,18 @@
</p> </p>
<br /> <br />
<p> <p>
<a href="https://hoppscotch.io/#gh-light-mode-only" target="_blank"> <a href="https://hoppscotch.io">
<img <picture>
src="./packages/hoppscotch-common/public/images/banner-light.png" <source media="(prefers-color-scheme: dark)" srcset="./packages/hoppscotch-common/public/images/banner-dark.png">
alt="Hoppscotch" <source media="(prefers-color-scheme: light)" srcset="./packages/hoppscotch-common/public/images/banner-light.png">
width="100%" <img alt="Hoppscotch" src="./packages/hoppscotch-common/public/images/banner-dark.png">
/> </picture>
</a>
<a href="https://hoppscotch.io/#gh-dark-mode-only" target="_blank">
<img
src="./packages/hoppscotch-common/public/images/banner-dark.png"
alt="Hoppscotch"
width="100%"
/>
</a> </a>
</p> </p>
</div> </div>
_We highly recommend you take a look at the [**Hoppscotch Documentation**](https://docs.hoppscotch.io) to learn more about the app._
#### **Support** #### **Support**
[![Chat on Discord](https://img.shields.io/badge/chat-Discord-7289DA?logo=discord)](https://hoppscotch.io/discord) [![Chat on Telegram](https://img.shields.io/badge/chat-Telegram-2CA5E0?logo=telegram)](https://hoppscotch.io/telegram) [![Discuss on GitHub](https://img.shields.io/badge/discussions-GitHub-333333?logo=github)](https://github.com/hoppscotch/hoppscotch/discussions) [![Chat on Discord](https://img.shields.io/badge/chat-Discord-7289DA?logo=discord)](https://hoppscotch.io/discord) [![Chat on Telegram](https://img.shields.io/badge/chat-Telegram-2CA5E0?logo=telegram)](https://hoppscotch.io/telegram) [![Discuss on GitHub](https://img.shields.io/badge/discussions-GitHub-333333?logo=github)](https://github.com/hoppscotch/hoppscotch/discussions)
@@ -59,9 +49,9 @@
❤️ **Lightweight:** Crafted with minimalistic UI design. ❤️ **Lightweight:** Crafted with minimalistic UI design.
⚡️ **Fast:** Send requests and get/copy responses in real-time. ⚡️ **Fast:** Send requests and get responses in real time.
**HTTP Methods** 🗄️ **HTTP Methods:** Request methods define the type of action you are requesting to be performed.
- `GET` - Requests retrieve resource information - `GET` - Requests retrieve resource information
- `POST` - The server creates a new entry in a database - `POST` - The server creates a new entry in a database
@@ -74,17 +64,15 @@
- `TRACE` - Performs a message loop-back test along the path to the target resource - `TRACE` - Performs a message loop-back test along the path to the target resource
- `<custom>` - Some APIs use custom request methods such as `LIST`. Type in your custom methods. - `<custom>` - Some APIs use custom request methods such as `LIST`. Type in your custom methods.
🌈 **Make it yours:** Customizable combinations for background, foreground, and accent colors — [customize now](https://hoppscotch.io/settings). 🌈 **Theming:** Customizable combinations for background, foreground, and accent colors — [customize now](https://hoppscotch.io/settings).
**Theming** - Choose a theme: System preference, Light, Dark, and Black
- Choose accent colors: Green, Teal, Blue, Indigo, Purple, Yellow, Orange, Red, and Pink
- Choose a theme: System (default), Light, Dark, and Black
- Choose accent color: Green (default), Teal, Blue, Indigo, Purple, Yellow, Orange, Red, and Pink
- Distraction-free Zen mode - Distraction-free Zen mode
_Customized themes are synced with cloud / local session_ _Customized themes are synced with your cloud/local session._
🔥 **PWA:** Install as a [PWA](https://web.dev/what-are-pwas/) on your device. 🔥 **PWA:** Install as a [Progressive Web App](https://web.dev/progressive-web-apps) on your device.
- Instant loading with Service Workers - Instant loading with Service Workers
- Offline support - Offline support
@@ -107,7 +95,7 @@ _Customized themes are synced with cloud / local session_
📡 **Server-Sent Events:** Receive a stream of updates from a server over an HTTP connection without resorting to polling. 📡 **Server-Sent Events:** Receive a stream of updates from a server over an HTTP connection without resorting to polling.
🌩 **Socket.IO:** Send and Receive data with SocketIO server. 🌩 **Socket.IO:** Send and Receive data with the SocketIO server.
🦟 **MQTT:** Subscribe and Publish to topics of an MQTT Broker. 🦟 **MQTT:** Subscribe and Publish to topics of an MQTT Broker.
@@ -127,7 +115,7 @@ _Customized themes are synced with cloud / local session_
- OAuth 2.0 - OAuth 2.0
- OIDC Access Token/PKCE - OIDC Access Token/PKCE
📢 **Headers:** Describes the format the body of your request is being sent as. 📢 **Headers:** Describes the format the body of your request is being sent in.
📫 **Parameters:** Use request parameters to set varying parts in simulated requests. 📫 **Parameters:** Use request parameters to set varying parts in simulated requests.
@@ -137,14 +125,14 @@ _Customized themes are synced with cloud / local session_
- FormData, JSON, and many more - FormData, JSON, and many more
- Toggle between key-value and RAW input parameter list - Toggle between key-value and RAW input parameter list
👋 **Response:** Contains the status line, headers, and the message/response body. 📮 **Response:** Contains the status line, headers, and the message/response body.
- Copy response to clipboard - Copy the response to the clipboard
- Download response as a file - Download the response as a file
- View response headers - View response headers
- View raw and preview of HTML, image, JSON, XML responses - View raw and preview HTML, image, JSON, and XML responses
**History:** Request entries are synced with cloud / local session storage to restore with a single click. **History:** Request entries are synced with your cloud/local session storage.
📁 **Collections:** Keep your API requests organized with collections and folders. Reuse them with a single click. 📁 **Collections:** Keep your API requests organized with collections and folders. Reuse them with a single click.
@@ -152,7 +140,32 @@ _Customized themes are synced with cloud / local session_
- Nested folders - Nested folders
- Export and import as a file or GitHub gist - Export and import as a file or GitHub gist
_Collections are synced with cloud / local session storage_ _Collections are synced with your cloud/local session storage._
📜 **Pre-Request Scripts:** Snippets of code associated with a request that is executed before the request is sent.
- Set environment variables
- Include timestamp in the request headers
- Send a random alphanumeric string in the URL parameters
- Any JavaScript functions
👨‍👩‍👧‍👦 **Teams:** Helps you collaborate across your teams to design, develop, and test APIs faster.
- Create unlimited teams
- Create unlimited shared collections
- Create unlimited team members
- Role-based access control
- Cloud sync
- Multiple devices
👥 **Workspaces:** Organize your personal and team collections environments into workspaces. Easily switch between workspaces to manage multiple projects.
- Create unlimited workspaces
- Switch between personal and team workspaces
⌨️ **Keyboard Shortcuts:** Optimized for efficiency.
> **[Read our documentation on Keyboard Shortcuts](https://docs.hoppscotch.io/documentation/features/shortcuts)**
🌐 **Proxy:** Enable Proxy Mode from Settings to access blocked APIs. 🌐 **Proxy:** Enable Proxy Mode from Settings to access blocked APIs.
@@ -161,60 +174,31 @@ _Collections are synced with cloud / local session storage_
- Access APIs served in non-HTTPS (`http://`) endpoints - Access APIs served in non-HTTPS (`http://`) endpoints
- Use your Proxy URL - Use your Proxy URL
_Official proxy server is hosted by Hoppscotch - **[GitHub](https://github.com/hoppscotch/proxyscotch)** - **[Privacy Policy](https://docs.hoppscotch.io/support/privacy)**_ _Official proxy server is hosted by Hoppscotch - **[GitHub](https://github.com/hoppscotch/proxyscotch)** - **[Privacy Policy](https://docs.hoppscotch.io/support/privacy)**._
📜 **Pre-Request Scripts β:** Snippets of code associated with a request that is executed before the request is sent.
- Set environment variables
- Include timestamp in the request headers
- Send a random alphanumeric string in the URL parameters
- Any JavaScript functions
📄 **API Documentation:** Create and share dynamic API documentation easily, quickly.
1. Add your requests to Collections and Folders
2. Export Collections and easily share your APIs with the rest of your team
3. Import Collections and Generate Documentation on-the-go
⌨️ **Keyboard Shortcuts:** Optimized for efficiency.
> **[Read our documentation on Keyboard Shortcuts](https://docs.hoppscotch.io/documentation/features/shortcuts)**
🌎 **i18n:** Experience the app in your language. 🌎 **i18n:** Experience the app in your language.
Help us to translate Hoppscotch. Please read [`TRANSLATIONS`](TRANSLATIONS.md) for details on our [`CODE OF CONDUCT`](CODE_OF_CONDUCT.md), and the process for submitting pull requests to us. Help us to translate Hoppscotch. Please read [`TRANSLATIONS`](TRANSLATIONS.md) for details on our [`CODE OF CONDUCT`](CODE_OF_CONDUCT.md) and the process for submitting pull requests to us.
📦 **Add-ons:** Official add-ons for hoppscotch. ☁️ **Auth + Sync:** Sign in and sync your data in real-time across all your devices.
- **[Proxy](https://github.com/hoppscotch/proxyscotch)** - A simple proxy server created for Hoppscotch **Sign in with:**
- **[CLI β](https://github.com/hoppscotch/hopp-cli)** - A CLI solution for Hoppscotch
- **[Browser Extensions](https://github.com/hoppscotch/hoppscotch-extension)** - Browser extensions that simplifies access to Hoppscotch
[![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_16x16.png) **Firefox**](https://addons.mozilla.org/en-US/firefox/addon/hoppscotch) &nbsp;|&nbsp; [![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_16x16.png) **Chrome**](https://chrome.google.com/webstore/detail/hoppscotch-extension-for-c/amknoiejhlmhancpahfcfcfhllgkpbld)
> **Extensions fixes `CORS` issues.**
- **[Hopp-Doc-Gen](https://github.com/hoppscotch/hopp-doc-gen)** - An API doc generator CLI for Hoppscotch
_Add-ons are developed and maintained under **[Hoppscotch Organization](https://github.com/hoppscotch)**._
☁️ **Auth + Sync:** Sign in and sync your data in real-time.
**Sign in with**
- GitHub - GitHub
- Google - Google
- Microsoft - Microsoft
- Email - Email
- SSO (Single Sign-On)[^EE]
**Synchronize your data** **🔄 Synchronize your data:** Handoff to continue tasks on your other devices.
- Workspaces
- History - History
- Collections - Collections
- Environments - Environments
- Settings - Settings
**Post-Request Tests β:** Write tests associated with a request that is executed after the request's response. **Post-Request Tests:** Write tests associated with a request that is executed after the request's response.
- Check the status code as an integer - Check the status code as an integer
- Filter response headers - Filter response headers
@@ -222,7 +206,7 @@ _Add-ons are developed and maintained under **[Hoppscotch Organization](https://
- Set environment variables - Set environment variables
- Write JavaScript code - Write JavaScript code
🌱 **Environments** : Environment variables allow you to store and reuse values in your requests and scripts. 🌱 **Environments:** Environment variables allow you to store and reuse values in your requests and scripts.
- Unlimited environments and variables - Unlimited environments and variables
- Initialize through the pre-request script - Initialize through the pre-request script
@@ -241,22 +225,31 @@ _Add-ons are developed and maintained under **[Hoppscotch Organization](https://
</details> </details>
👨‍👩‍👧‍👦 **Teams β:** Helps you collaborate across your team to design, develop, and test APIs faster.
- Unlimited teams
- Unlimited shared collections
- Unlimited team members
- Role-based access control
- Cloud sync
- Multiple devices
🚚 **Bulk Edit:** Edit key-value pairs in bulk. 🚚 **Bulk Edit:** Edit key-value pairs in bulk.
- Entries are separated by newline - Entries are separated by newline
- Keys and values are separated by `:` - Keys and values are separated by `:`
- Prepend `#` to any row you want to add but keep disabled - Prepend `#` to any row you want to add but keep disabled
**For more features, please read our [documentation](https://docs.hoppscotch.io).** 🎛️ **Admin dashboard:** Manage your team and invite members.
- Insights
- Manage users
- Manage teams
📦 **Add-ons:** Official add-ons for hoppscotch.
- **[Hoppscotch CLI](https://github.com/hoppscotch/hopp-cli)** - Command-line interface for Hoppscotch.
- **[Proxy](https://github.com/hoppscotch/proxyscotch)** - A simple proxy server created for Hoppscotch.
- **[Browser Extensions](https://github.com/hoppscotch/hoppscotch-extension)** - Browser extensions that enhance your Hoppscotch experience.
[![Firefox](https://raw.github.com/alrra/browser-logos/master/src/firefox/firefox_16x16.png) **Firefox**](https://addons.mozilla.org/en-US/firefox/addon/hoppscotch) &nbsp;|&nbsp; [![Chrome](https://raw.github.com/alrra/browser-logos/master/src/chrome/chrome_16x16.png) **Chrome**](https://chrome.google.com/webstore/detail/hoppscotch-extension-for-c/amknoiejhlmhancpahfcfcfhllgkpbld)
> **Extensions fix `CORS` issues.**
_Add-ons are developed and maintained under **[Hoppscotch Organization](https://github.com/hoppscotch)**._
**For a complete list of features, please read our [documentation](https://docs.hoppscotch.io).**
## **Demo** ## **Demo**
@@ -268,18 +261,9 @@ _Add-ons are developed and maintained under **[Hoppscotch Organization](https://
2. Click "Send" to simulate the request 2. Click "Send" to simulate the request
3. View the response 3. View the response
## **Built with**
- [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML)
- [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS), [SCSS](https://sass-lang.com), [Windi CSS](https://windicss.org)
- [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript)
- [TypeScript](https://www.typescriptlang.org)
- [Vue](https://vuejs.org)
- [Vite](https://vitejs.dev)
## **Developing** ## **Developing**
Follow our [self-hosting guide](https://docs.hoppscotch.io/documentation/self-host/getting-started) to get started with the development environment. Follow our [self-hosting documentation](https://docs.hoppscotch.io/documentation/self-host/getting-started) to get started with the development environment.
## **Contributing** ## **Contributing**
@@ -297,7 +281,7 @@ See the [`CHANGELOG`](CHANGELOG.md) file for details.
## **Authors** ## **Authors**
This project exists thanks to all the people who contribute — [contribute](CONTRIBUTING.md). This project owes its existence to the collective efforts of all those who contribute — [contribute now](CONTRIBUTING.md).
<div align="center"> <div align="center">
<a href="https://github.com/hoppscotch/hoppscotch/graphs/contributors"> <a href="https://github.com/hoppscotch/hoppscotch/graphs/contributors">
@@ -309,4 +293,6 @@ This project exists thanks to all the people who contribute — [contribute](CON
## **License** ## **License**
This project is licensed under the [MIT License](https://opensource.org/licenses/MIT) - see the [`LICENSE`](LICENSE) file for details. This project is licensed under the [MIT License](https://opensource.org/licenses/MIT) see the [`LICENSE`](LICENSE) file for details.
[^EE]: Enterprise edition feature. [Learn more](https://docs.hoppscotch.io/documentation/self-host/getting-started).

View File

@@ -2,8 +2,9 @@
This document outlines security procedures and general policies for the Hoppscotch project. This document outlines security procedures and general policies for the Hoppscotch project.
1. [Reporting a security vulnerability](#reporting-a-security-vulnerability) - [Security Policy](#security-policy)
3. [Incident response process](#incident-response-process) - [Reporting a security vulnerability](#reporting-a-security-vulnerability)
- [Incident response process](#incident-response-process)
## Reporting a security vulnerability ## Reporting a security vulnerability

View File

@@ -9,26 +9,24 @@ Before you start working on a new language, please look through the [open pull r
if there is no existing translation, you can create a new one by following these steps: if there is no existing translation, you can create a new one by following these steps:
1. **[Fork the repository](https://github.com/hoppscotch/hoppscotch/fork).** 1. **[Fork the repository](https://github.com/hoppscotch/hoppscotch/fork).**
2. **Checkout the `i18n` branch for latest translations.** 2. **Checkout the `main` branch for latest translations.**
3. **Create a new branch for your translation with base branch `i18n`.** 3. **Create a new branch for your translation with base branch `main`.**
4. **Create target language file in the [`/packages/hoppscotch-common/locales`](https://github.com/hoppscotch/hoppscotch/tree/main/packages/hoppscotch-common/locales) directory.** 4. **Create target language file in the [`/packages/hoppscotch-common/locales`](https://github.com/hoppscotch/hoppscotch/tree/main/packages/hoppscotch-common/locales) directory.**
5. **Copy the contents of the source file [`/packages/hoppscotch-common/locales/en.json`](https://github.com/hoppscotch/hoppscotch/blob/main/packages/hoppscotch-common/locales/en.json) to the target language file.** 5. **Copy the contents of the source file [`/packages/hoppscotch-common/locales/en.json`](https://github.com/hoppscotch/hoppscotch/blob/main/packages/hoppscotch-common/locales/en.json) to the target language file.**
6. **Translate the strings in the target language file.** 6. **Translate the strings in the target language file.**
7. **Add your language entry to [`/packages/hoppscotch-common/languages.json`](https://github.com/hoppscotch/hoppscotch/blob/main/packages/hoppscotch-common/languages.json).** 7. **Add your language entry to [`/packages/hoppscotch-common/languages.json`](https://github.com/hoppscotch/hoppscotch/blob/main/packages/hoppscotch-common/languages.json).**
8. **Save & commit changes.** 8. **Save and commit changes.**
9. **Send a pull request.** 9. **Send a pull request.**
_You may send a pull request before all steps above are complete: e.g., you may want to ask for help with translations, or getting tests to pass. However, your pull request will not be merged until all steps above are complete._ _You may send a pull request before all steps above are complete: e.g., you may want to ask for help with translations, or getting tests to pass. However, your pull request will not be merged until all steps above are complete._
`i18n` branch will be merged into `main` branch once every week.
Completing an initial translation of the whole site is a fairly large task. One way to break that task up is to work with other translators through pull requests on your fork. You can also [add collaborators to your fork](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/inviting-collaborators-to-a-personal-repository) if you'd like to invite other translators to commit directly to your fork and share responsibility for merging pull requests. Completing an initial translation of the whole site is a fairly large task. One way to break that task up is to work with other translators through pull requests on your fork. You can also [add collaborators to your fork](https://help.github.com/en/github/setting-up-and-managing-your-github-user-account/inviting-collaborators-to-a-personal-repository) if you'd like to invite other translators to commit directly to your fork and share responsibility for merging pull requests.
## Updating a translation ## Updating a translation
### Corrections ### Corrections
If you notice spelling or grammar errors, typos, or opportunities for better phrasing, open a pull request with your suggested fix. If you see a problem that you aren't sure of or don't have time to fix, open an issue. If you notice spelling or grammar errors, typos, or opportunities for better phrasing, open a pull request with your suggested fix. If you see a problem that you aren't sure of or don't have time to fix, [open an issue](https://github.com/hoppscotch/hoppscotch/issues/new/choose).
### Broken links ### Broken links

View File

@@ -1,128 +0,0 @@
# Contributor Covenant Code of Conduct
## Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, religion, or sexual identity
and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
- Demonstrating empathy and kindness toward other people
- Being respectful of differing opinions, viewpoints, and experiences
- Giving and gracefully accepting constructive feedback
- Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
- Focusing on what is best not just for us as individuals, but for the
overall community
Examples of unacceptable behavior include:
- The use of sexualized language or imagery, and sexual attention or
advances of any kind
- Trolling, insulting or derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or email
address, without their explicit permission
- Other conduct which could reasonably be considered inappropriate in a
professional setting
## Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
support@hoppscotch.io.
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series
of actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or
permanent ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within
the community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.0, available at
https://www.contributor-covenant.org/version/2/0/code_of_conduct.html.
Community Impact Guidelines were inspired by [Mozilla's code of conduct
enforcement ladder](https://github.com/mozilla/diversity).
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View File

@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2022
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@@ -1,29 +1,19 @@
<div align="center">
<a href="https://hoppscotch.io">
<img
src="https://avatars.githubusercontent.com/u/56705483"
alt="Hoppscotch Logo"
height="64"
/>
</a>
</div>
<div align="center">
# Hoppscotch CLI <font size=2><sup>ALPHA</sup></font> # Hoppscotch CLI <font size=2><sup>ALPHA</sup></font>
</div> A CLI to run Hoppscotch Test Scripts in CI environments.
A CLI to run Hoppscotch test scripts in CI environments.
### **Commands:** ### **Commands:**
- `hopp test [options] [file]`: testing hoppscotch collection.json file - `hopp test [options] [file]`: testing hoppscotch collection.json file
### **Usage:** ### **Usage:**
```
```bash
hopp [options or commands] arguments hopp [options or commands] arguments
``` ```
### **Options:** ### **Options:**
- `-v`, `--ver`: see the current version of the CLI - `-v`, `--ver`: see the current version of the CLI
- `-h`, `--help`: display help for command - `-h`, `--help`: display help for command
@@ -45,17 +35,21 @@ hopp [options or commands] arguments
- Executes and outputs test-script response. - Executes and outputs test-script response.
#### Options: #### Options:
##### `-e <file_path>` / `--env <file_path>` ##### `-e <file_path>` / `--env <file_path>`
- Accepts path to env.json with contents in below format: - Accepts path to env.json with contents in below format:
```json ```json
{ {
"ENV1":"value1", "ENV1":"value1",
"ENV2":"value2" "ENV2":"value2"
} }
``` ```
- You can now access those variables using `pw.env.get('<var_name>')` - You can now access those variables using `pw.env.get('<var_name>')`
Taking the above example, `pw.env.get("ENV1")` will return `"value1"` Taking the above example, `pw.env.get("ENV1")` will return `"value1"`
## Install ## Install
@@ -75,4 +69,59 @@ npm i -g @hoppscotch/cli
## **Contributing:** ## **Contributing:**
To get started contributing to the repository, please read **[CONTRIBUTING.md](./CONTRIBUTING.md)** When contributing to this repository, please first discuss the change you wish to make via issue,
email, or any other method with the owners of this repository before making a change.
Please note we have a code of conduct, please follow it in all your interactions with the project.
## Pull Request Process
1. Ensure any install or build dependencies are removed before the end of the layer when doing a
build.
2. Update the README.md with details of changes to the interface, this includes new environment
variables, exposed ports, useful file locations and container parameters.
3. Increase the version numbers in any examples files and the README.md to the new version that this
Pull Request would represent. The versioning scheme we use is [SemVer](https://semver.org).
4. You may merge the Pull Request once you have the sign-off of two other developers, or if you
do not have permission to do that, you may request the second reviewer merge it for you.
## Set Up The Development Environment
1. After cloning the repository, execute the following commands:
```bash
pnpm install
pnpm run build
```
2. In order to test locally, you can use two types of package linking:
1. The 'pnpm exec' way (preferred since it does not hamper your original installation of the CLI):
```bash
pnpm link @hoppscotch/cli
// Then to use or test the CLI:
pnpm exec hopp
// After testing, to remove the package linking:
pnpm rm @hoppscotch/cli
```
2. The 'global' way (warning: this might override the globally installed CLI, if exists):
```bash
sudo pnpm link --global
// Then to use or test the CLI:
hopp
// After testing, to remove the package linking:
sudo pnpm rm --global @hoppscotch/cli
```
3. To use the Typescript watch scripts:
```bash
pnpm run dev
```

View File

@@ -2,7 +2,20 @@
--font-sans: "Inter Variable", sans-serif; --font-sans: "Inter Variable", sans-serif;
--font-icon: "Material Symbols Rounded Variable"; --font-icon: "Material Symbols Rounded Variable";
--font-mono: "Roboto Mono Variable", monospace; --font-mono: "Roboto Mono Variable", monospace;
--font-size-tiny: calc(var(--font-size-body) - 0.062rem); --font-size-body: 0.75rem;
--font-size-tiny: 0.688rem;
--line-height-body: 1rem;
--upper-primary-sticky-fold: 4.125rem;
--upper-secondary-sticky-fold: 6.188rem;
--upper-tertiary-sticky-fold: 8.25rem;
--upper-mobile-primary-sticky-fold: 6.625rem;
--upper-mobile-secondary-sticky-fold: 8.688rem;
--upper-mobile-sticky-fold: 10.75rem;
--upper-mobile-tertiary-sticky-fold: 8.25rem;
--lower-primary-sticky-fold: 3rem;
--lower-secondary-sticky-fold: 5.063rem;
--lower-tertiary-sticky-fold: 7.125rem;
--sidebar-primary-sticky-fold: 2rem;
} }
@mixin dark-theme { @mixin dark-theme {
@@ -200,8 +213,8 @@
:root { :root {
@include base-theme; @include base-theme;
@include dark-theme; @include dark-theme;
@include green-theme;
@include dark-editor-theme; @include dark-editor-theme;
@include green-theme;
} }
:root.light { :root.light {
@@ -257,63 +270,3 @@
:root[data-accent="yellow"] { :root[data-accent="yellow"] {
@include yellow-theme; @include yellow-theme;
} }
@mixin font-small {
--font-size-body: 0.75rem;
--line-height-body: 1rem;
--upper-primary-sticky-fold: 4.125rem;
--upper-secondary-sticky-fold: 6.188rem;
--upper-tertiary-sticky-fold: 8.25rem;
--upper-mobile-primary-sticky-fold: 6.625rem;
--upper-mobile-secondary-sticky-fold: 8.688rem;
--upper-mobile-sticky-fold: 10.75rem;
--upper-mobile-tertiary-sticky-fold: 8.25rem;
--lower-primary-sticky-fold: 3rem;
--lower-secondary-sticky-fold: 5.063rem;
--lower-tertiary-sticky-fold: 7.125rem;
--sidebar-primary-sticky-fold: 2rem;
}
@mixin font-medium {
--font-size-body: 0.875rem;
--line-height-body: 1.25rem;
--upper-primary-sticky-fold: 4.375rem;
--upper-secondary-sticky-fold: 6.688rem;
--upper-tertiary-sticky-fold: 9rem;
--upper-mobile-primary-sticky-fold: 7.125rem;
--upper-mobile-secondary-sticky-fold: 9.438rem;
--upper-mobile-sticky-fold: 11.75rem;
--upper-mobile-tertiary-sticky-fold: 9rem;
--lower-primary-sticky-fold: 3.25rem;
--lower-secondary-sticky-fold: 5.563rem;
--lower-tertiary-sticky-fold: 7.875rem;
--sidebar-primary-sticky-fold: 2.25rem;
}
@mixin font-large {
--font-size-body: 1rem;
--line-height-body: 1.5rem;
--upper-primary-sticky-fold: 4.625rem;
--upper-secondary-sticky-fold: 7.188rem;
--upper-tertiary-sticky-fold: 9.75rem;
--upper-mobile-primary-sticky-fold: 7.625rem;
--upper-mobile-secondary-sticky-fold: 10.188rem;
--upper-mobile-sticky-fold: 12.75rem;
--upper-mobile-tertiary-sticky-fold: 9.75rem;
--lower-primary-sticky-fold: 3.5rem;
--lower-secondary-sticky-fold: 6.063rem;
--lower-tertiary-sticky-fold: 8.625rem;
--sidebar-primary-sticky-fold: 2.5rem;
}
:root[data-font-size="small"] {
@include font-small;
}
:root[data-font-size="medium"] {
@include font-medium;
}
:root[data-font-size="large"] {
@include font-large;
}

View File

@@ -118,22 +118,22 @@
}, },
"collection": { "collection": {
"created": "Koleksi dibuat", "created": "Koleksi dibuat",
"different_parent": "Cannot reorder collection with different parent", "different_parent": "Tidak dapat mengubah urutan koleksi dengan induk yang berbeda",
"edit": "Mengubah Koleksi", "edit": "Mengubah Koleksi",
"invalid_name": "Berikan nama untuk Koleksi", "invalid_name": "Berikan nama untuk Koleksi",
"invalid_root_move": "Collection already in the root", "invalid_root_move": "Koleksi sudah berada di akar direktori",
"moved": "Moved Successfully", "moved": "Berhasil Dipindahkan",
"my_collections": "Koleksi Saya", "my_collections": "Koleksi Saya",
"name": "Koleksi Baru Saya", "name": "Koleksi Baru Saya",
"name_length_insufficient": "Nama koleksi harus minimal 3 karakter", "name_length_insufficient": "Nama koleksi harus minimal 3 karakter",
"new": "Koleksi baru", "new": "Koleksi baru",
"order_changed": "Collection Order Updated", "order_changed": "Pembaruan Urutan Koleksi",
"renamed": "Koleksi berganti nama", "renamed": "Koleksi berganti nama",
"request_in_use": "Permintaan sedang digunakan", "request_in_use": "Permintaan sedang digunakan",
"save_as": "Simpan Sebagai", "save_as": "Simpan Sebagai",
"select": "Pilih Koleksi", "select": "Pilih Koleksi",
"select_location": "Pilih lokasi", "select_location": "Pilih lokasi",
"select_team": "Pilih team", "select_team": "Pilih tim",
"team_collections": "Koleksi Tim" "team_collections": "Koleksi Tim"
}, },
"confirm": { "confirm": {
@@ -147,7 +147,7 @@
"remove_team": "Apakah Anda yakin ingin menghapus tim ini?", "remove_team": "Apakah Anda yakin ingin menghapus tim ini?",
"remove_telemetry": "Apakah Anda yakin ingin menyisih dari Telemetri?", "remove_telemetry": "Apakah Anda yakin ingin menyisih dari Telemetri?",
"request_change": "Apakah Anda yakin ingin membuang permintaan saat ini, perubahan yang belum disimpan akan hilang.", "request_change": "Apakah Anda yakin ingin membuang permintaan saat ini, perubahan yang belum disimpan akan hilang.",
"save_unsaved_tab": "Do you want to save changes made in this tab?", "save_unsaved_tab": "Apakah Anda ingin menyimpan perubahan yang dibuat di tab ini?",
"sync": "Apakah Anda ingin memulihkan ruang kerja Anda dari cloud? Ini akan membuang kemajuan lokal Anda." "sync": "Apakah Anda ingin memulihkan ruang kerja Anda dari cloud? Ini akan membuang kemajuan lokal Anda."
}, },
"count": { "count": {
@@ -180,8 +180,8 @@
"profile": "Masuk untuk melihat profil Anda", "profile": "Masuk untuk melihat profil Anda",
"protocols": "Protokol kosong", "protocols": "Protokol kosong",
"schema": "Hubungkan ke endpoint GraphQL untuk melihat skema", "schema": "Hubungkan ke endpoint GraphQL untuk melihat skema",
"shortcodes": "Shortcodes are empty", "shortcodes": "Shortcodes kosong",
"subscription": "Subscriptions are empty", "subscription": "Langganan kosong",
"team_name": "Nama team kosong", "team_name": "Nama team kosong",
"teams": "Kamu bukan di team manapun", "teams": "Kamu bukan di team manapun",
"tests": "Tidak ada tes untuk permintaan ini" "tests": "Tidak ada tes untuk permintaan ini"
@@ -189,19 +189,19 @@
"environment": { "environment": {
"add_to_global": "Tambahkan ke Global", "add_to_global": "Tambahkan ke Global",
"added": "Tambahan Environment", "added": "Tambahan Environment",
"create_new": "Membuat baru environment", "create_new": "Membuat environment baru",
"created": "Environment dibuat", "created": "Environment dibuat",
"deleted": "Environment dihapus", "deleted": "Environment dihapus",
"edit": "Sunting Environment", "edit": "Sunting Environment",
"invalid_name": "Tolong beri nama untuk environment", "invalid_name": "Tolong beri nama untuk environment",
"my_environments": "My Environments", "my_environments": "Environment Saya",
"nested_overflow": "variabel environment bersarang dibatasi hingga 10 level", "nested_overflow": "Variabel environment bersarang dibatasi hingga 10 level",
"new": "Environment Baru", "new": "Environment Baru",
"no_environment": "No environment", "no_environment": "No environment",
"no_environment_description": "Tidak ada environment yang dipilih. Pilih apa yang harus dilakukan dengan variabel berikut.", "no_environment_description": "Tidak ada environment yang dipilih. Pilih apa yang harus dilakukan dengan variabel berikut.",
"select": "Pilih environment", "select": "Pilih environment",
"team_environments": "Team Environments", "team_environments": "Environment Tim",
"title": "Environments", "title": "Environment",
"updated": "Environment diperbarui", "updated": "Environment diperbarui",
"variable_list": "Daftar Variable" "variable_list": "Daftar Variable"
}, },
@@ -210,8 +210,8 @@
"check_console_details": "Periksa console log untuk detailnya.", "check_console_details": "Periksa console log untuk detailnya.",
"curl_invalid_format": "cURL tidak diformat dengan benar", "curl_invalid_format": "cURL tidak diformat dengan benar",
"danger_zone": "Danger zone", "danger_zone": "Danger zone",
"delete_account": "Your account is currently an owner in these teams:", "delete_account": "Akun Anda saat ini merupakan pemilik dalam tim-tim ini:",
"delete_account_description": "You must either remove yourself, transfer ownership, or delete these teams before you can delete your account.", "delete_account_description": "Anda harus menghapus diri Anda dari tim-tim ini, mentransfer kepemilikan, atau menghapus tim-tim ini sebelum Anda dapat menghapus akun Anda.",
"empty_req_name": "Nama Permintaan Kosong", "empty_req_name": "Nama Permintaan Kosong",
"f12_details": "(F12 untuk detailnya)", "f12_details": "(F12 untuk detailnya)",
"gql_prettify_invalid_query": "Tidak dapat prettify kueri yang tidak valid, menyelesaikan kesalahan sintaksis kueri, dan coba lagi", "gql_prettify_invalid_query": "Tidak dapat prettify kueri yang tidak valid, menyelesaikan kesalahan sintaksis kueri, dan coba lagi",
@@ -294,7 +294,7 @@
"from_json_description": "Impor dari Hoppscotch berkas koleksi", "from_json_description": "Impor dari Hoppscotch berkas koleksi",
"from_my_collections": "Impor dari Koleksi Saya", "from_my_collections": "Impor dari Koleksi Saya",
"from_my_collections_description": "Impor dari Berkas Koleksi Saya", "from_my_collections_description": "Impor dari Berkas Koleksi Saya",
"from_openapi": "Import dari OpenAPI", "from_openapi": "Impor dari OpenAPI",
"from_openapi_description": "Impor dari OpenAPI syarat berkas (YML/JSON)", "from_openapi_description": "Impor dari OpenAPI syarat berkas (YML/JSON)",
"from_postman": "Impor dari Postman", "from_postman": "Impor dari Postman",
"from_postman_description": "Impor dari Koleksi Postman", "from_postman_description": "Impor dari Koleksi Postman",
@@ -316,23 +316,23 @@
"zen_mode": "Zen mode" "zen_mode": "Zen mode"
}, },
"modal": { "modal": {
"close_unsaved_tab": "You have unsaved changes", "close_unsaved_tab": "Anda memiliki perubahan yang belum disimpan",
"collections": "Koleksi", "collections": "Koleksi",
"confirm": "Mengonfirmasi", "confirm": "Mengonfirmasi",
"edit_request": "Edit Request", "edit_request": "Edit Request",
"import_export": "Impor / Ekspor" "import_export": "Impor / Ekspor"
}, },
"mqtt": { "mqtt": {
"already_subscribed": "You are already subscribed to this topic.", "already_subscribed": "Anda sudah berlangganan topik ini.",
"clean_session": "Clean Session", "clean_session": "Sesi Bersih",
"clear_input": "Clear input", "clear_input": "Hapus input",
"clear_input_on_send": "Clear input on send", "clear_input_on_send": "Hapus input saat mengirim",
"client_id": "Client ID", "client_id": "Client ID",
"color": "Pick a color", "color": "Pilih warna",
"communication": "Komunikasi", "communication": "Komunikasi",
"connection_config": "Connection Config", "connection_config": "Konfigurasi Koneksi",
"connection_not_authorized": "This MQTT connection does not use any authentication.", "connection_not_authorized": "Koneksi MQTT ini tidak menggunakan otentikasi",
"invalid_topic": "Please provide a topic for the subscription", "invalid_topic": "Harap berikan topik untuk langganan",
"keep_alive": "Keep Alive", "keep_alive": "Keep Alive",
"log": "Log", "log": "Log",
"lw_message": "Last-Will Message", "lw_message": "Last-Will Message",
@@ -340,8 +340,8 @@
"lw_retain": "Last-Will Retain", "lw_retain": "Last-Will Retain",
"lw_topic": "Last-Will Topic", "lw_topic": "Last-Will Topic",
"message": "Pesan", "message": "Pesan",
"new": "New Subscription", "new": "Langganan Baru",
"not_connected": "Please start a MQTT connection first.", "not_connected": "Mulai koneksi MQTT terlebih dahulu",
"publish": "Menerbitkan", "publish": "Menerbitkan",
"qos": "QoS", "qos": "QoS",
"ssl": "SSL", "ssl": "SSL",
@@ -396,19 +396,19 @@
"text": "Text" "text": "Text"
}, },
"copy_link": "Salin tautan", "copy_link": "Salin tautan",
"different_collection": "Cannot reorder requests from different collections", "different_collection": "Tidak dapat mengubah urutan permintaan dari koleksi yang berbeda",
"duplicated": "Request duplicated", "duplicated": "Request duplicated",
"duration": "Durasi", "duration": "Durasi",
"enter_curl": "Masukkan cURL", "enter_curl": "Masukkan cURL",
"generate_code": "Generate code", "generate_code": "Hasilkan kode",
"generated_code": "Generated code", "generated_code": "Hasilkan kode",
"header_list": "Daftar Header", "header_list": "Daftar Header",
"invalid_name": "Harap berikan nama untuk request", "invalid_name": "Harap berikan nama untuk request",
"method": "Method", "method": "Method",
"moved": "Request moved", "moved": "Request moved",
"name": "Request nama", "name": "Request nama",
"new": "Request baru", "new": "Request baru",
"order_changed": "Request Order Updated", "order_changed": "Urutan Request Diperbarui",
"override": "Membatalkan", "override": "Membatalkan",
"override_help": "Set <kbd>Content-Type</kbd> in Headers", "override_help": "Set <kbd>Content-Type</kbd> in Headers",
"overriden": "Diganti", "overriden": "Diganti",
@@ -453,7 +453,7 @@
"settings": { "settings": {
"accent_color": "Accent color", "accent_color": "Accent color",
"account": "Akun", "account": "Akun",
"account_deleted": "Your account has been deleted", "account_deleted": "Akun Anda telah dihapus",
"account_description": "Sesuaikan pengaturan akun Anda.", "account_description": "Sesuaikan pengaturan akun Anda.",
"account_email_description": "Alamat surel utama Anda.", "account_email_description": "Alamat surel utama Anda.",
"account_name_description": "Ini adalah nama tampilan Anda.", "account_name_description": "Ini adalah nama tampilan Anda.",
@@ -609,7 +609,7 @@
"file_imported": "File diimpor", "file_imported": "File diimpor",
"finished_in": "Selesai dalam {duration} ms", "finished_in": "Selesai dalam {duration} ms",
"history_deleted": "Riwayat dihapus", "history_deleted": "Riwayat dihapus",
"linewrap": "Wrap lines", "linewrap": "Bungkus baris",
"loading": "Memuat...", "loading": "Memuat...",
"message_received": "Pesan: {message} tiba di topik: {topic}", "message_received": "Pesan: {message} tiba di topik: {topic}",
"mqtt_subscription_failed": "Terjadi masalah saat berlangganan topik: {topic}", "mqtt_subscription_failed": "Terjadi masalah saat berlangganan topik: {topic}",
@@ -666,7 +666,7 @@
"email_do_not_match": "Surel tidak cocok dengan detail akun Anda. Hubungi pemilik tim Anda.", "email_do_not_match": "Surel tidak cocok dengan detail akun Anda. Hubungi pemilik tim Anda.",
"exit": "Keluar dari Tim", "exit": "Keluar dari Tim",
"exit_disabled": "Hanya pemilik yang tidak dapat keluar dari tim", "exit_disabled": "Hanya pemilik yang tidak dapat keluar dari tim",
"invalid_coll_id": "Invalid collection ID", "invalid_coll_id": "ID koleksi tidak valid",
"invalid_email_format": "Format surel tidak valid", "invalid_email_format": "Format surel tidak valid",
"invalid_id": "ID tim tidak valid. Hubungi pemilik tim Anda.", "invalid_id": "ID tim tidak valid. Hubungi pemilik tim Anda.",
"invalid_invite_link": "Tautan undangan tidak valid", "invalid_invite_link": "Tautan undangan tidak valid",
@@ -690,7 +690,7 @@
"member_removed": "Pengguna dihapus", "member_removed": "Pengguna dihapus",
"member_role_updated": "Peran pengguna diperbarui", "member_role_updated": "Peran pengguna diperbarui",
"members": "Anggota", "members": "Anggota",
"more_members": "+{count} more", "more_members": "+{count} lebih",
"name_length_insufficient": "Nama tim harus setidaknya 6 karakter", "name_length_insufficient": "Nama tim harus setidaknya 6 karakter",
"name_updated": "Nama tim diperbarui", "name_updated": "Nama tim diperbarui",
"new": "Tim Baru", "new": "Tim Baru",
@@ -698,13 +698,13 @@
"new_name": "Tim baru saya", "new_name": "Tim baru saya",
"no_access": "Anda tidak memiliki akses edit ke collections ini", "no_access": "Anda tidak memiliki akses edit ke collections ini",
"no_invite_found": "Undangan tidak ditemukan. Hubungi pemilik tim Anda.", "no_invite_found": "Undangan tidak ditemukan. Hubungi pemilik tim Anda.",
"no_request_found": "Request not found.", "no_request_found": "Request tidak ditemukan.",
"not_found": "Tim tidak ditemukan. Hubungi pemilik tim Anda.", "not_found": "Tim tidak ditemukan. Hubungi pemilik tim Anda.",
"not_valid_viewer": "Anda bukan penonton yang valid. Hubungi pemilik tim Anda.", "not_valid_viewer": "Anda bukan penonton yang valid. Hubungi pemilik tim Anda.",
"parent_coll_move": "Cannot move collection to a child collection", "parent_coll_move": "Tidak dapat memindahkan koleksi ke dalam koleksi anak",
"pending_invites": "Undangan tertunda", "pending_invites": "Undangan tertunda",
"permissions": "Izin", "permissions": "Izin",
"same_target_destination": "Same target and destination", "same_target_destination": "Sama tujuan dan destinasi",
"saved": "Tim disimpan", "saved": "Tim disimpan",
"select_a_team": "Pilih tim", "select_a_team": "Pilih tim",
"title": "tim", "title": "tim",
@@ -712,9 +712,9 @@
"we_sent_invite_link_description": "Minta semua undangan untuk memeriksa kotak masuk mereka. Klik tautan untuk bergabung dengan tim." "we_sent_invite_link_description": "Minta semua undangan untuk memeriksa kotak masuk mereka. Klik tautan untuk bergabung dengan tim."
}, },
"team_environment": { "team_environment": {
"deleted": "Environment Deleted", "deleted": "Environment dihapus",
"duplicate": "Environment Duplicated", "duplicate": "Environment diduplikasi",
"not_found": "Environment not found." "not_found": "Environment tidak ditemukan."
}, },
"test": { "test": {
"failed": "Tes gagal", "failed": "Tes gagal",
@@ -734,9 +734,9 @@
"url": "URL" "url": "URL"
}, },
"workspace": { "workspace": {
"change": "Change workspace", "change": "Beralih workspace",
"personal": "My Workspace", "personal": "Workspace Saya",
"team": "Team Workspace", "team": "Workspace Tim",
"title": "Workspaces" "title": "Workspaces"
} }
} }

View File

@@ -1,48 +1,50 @@
{ {
"action": { "action": {
"autoscroll": "Autoscroll", "autoscroll": "Автоскрол",
"cancel": "Отменить", "cancel": "Отменить",
"choose_file": "Выберите файл", "choose_file": "Выберите файл",
"clear": "Очистить", "clear": "Очистить",
"clear_all": "Очистить все", "clear_all": "Очистить все",
"close": "Close", "clear_history": "Очистить всю историю",
"close": "Закрыть",
"connect": "Подключиться", "connect": "Подключиться",
"connecting": "Connecting", "connecting": "Соединение...",
"copy": "Скопировать", "copy": "Скопировать",
"delete": "Удалить", "delete": "Удалить",
"disconnect": "Отключиться", "disconnect": "Отключиться",
"dismiss": "Скрыть", "dismiss": "Скрыть",
"dont_save": "Don't save", "dont_save": "Не сохранять",
"download_file": "Скачать файл", "download_file": "Скачать файл",
"drag_to_reorder": "Drag to reorder", "drag_to_reorder": "Перетягивайте для сортировки",
"duplicate": "Дублировать", "duplicate": "Дублировать",
"edit": "Редактировать", "edit": "Редактировать",
"filter": "Filter", "filter": "Фильтр",
"go_back": "Вернуться", "go_back": "Вернуться",
"go_forward": "Go forward", "go_forward": "Вперёд",
"group_by": "Group by", "group_by": "Сгруппировать по",
"label": "Название", "label": "Название",
"learn_more": "Узнать больше", "learn_more": "Узнать больше",
"less": "Less", "less": "Меньше",
"more": "Больше", "more": "Больше",
"new": "Создать новый", "new": "Создать новый",
"no": "Нет", "no": "Нет",
"open_workspace": "Open workspace", "open_workspace": "Открыть пространство",
"paste": "Paste", "paste": "Вставить",
"prettify": "Форматировать", "prettify": "Форматировать",
"rename": "Переименовать",
"remove": "Удалить", "remove": "Удалить",
"restore": "Восстановить", "restore": "Восстановить",
"save": "Сохранить", "save": "Сохранить",
"scroll_to_bottom": "Scroll to bottom", "scroll_to_bottom": "Вниз",
"scroll_to_top": "Scroll to top", "scroll_to_top": "Вверх",
"search": "Поиск", "search": "Поиск",
"send": "Отправить", "send": "Отправить",
"start": "Начать", "start": "Начать",
"starting": "Starting", "starting": "Запускаю",
"stop": "Стоп", "stop": "Стоп",
"to_close": "to close", "to_close": "что бы закрыть",
"to_navigate": "to navigate", "to_navigate": "для навигации",
"to_select": "to select", "to_select": "выборать",
"turn_off": "Выключить", "turn_off": "Выключить",
"turn_on": "Включить", "turn_on": "Включить",
"undo": "Отменить", "undo": "Отменить",
@@ -56,9 +58,9 @@
"chat_with_us": "Связаться с нами", "chat_with_us": "Связаться с нами",
"contact_us": "Свяжитесь с нами", "contact_us": "Свяжитесь с нами",
"copy": "Копировать", "copy": "Копировать",
"copy_user_id": "Copy User Auth Token", "copy_user_id": "Копировать токен пользователя",
"developer_option": "Developer options", "developer_option": "Настройки разработчика",
"developer_option_description": "Developer tools which helps in development and maintenance of Hoppscotch.", "developer_option_description": "Инструмент разработчика помогает обслуживить и развивить Hoppscotch",
"discord": "Discord", "discord": "Discord",
"documentation": "Документация", "documentation": "Документация",
"github": "GitHub", "github": "GitHub",
@@ -67,11 +69,13 @@
"invite": "Пригласить", "invite": "Пригласить",
"invite_description": "В Hoppscotch мы разработали простой и интуитивно понятный интерфейс для создания и управления вашими API. Hoppscotch - это инструмент, который помогает создавать, тестировать, документировать и делиться своими API.", "invite_description": "В Hoppscotch мы разработали простой и интуитивно понятный интерфейс для создания и управления вашими API. Hoppscotch - это инструмент, который помогает создавать, тестировать, документировать и делиться своими API.",
"invite_your_friends": "Пригласить своих друзей", "invite_your_friends": "Пригласить своих друзей",
"social_links": "Социальные сети",
"social_description": "Подписывайся на наши соц. сети и оставайся всегда в курсе последних новостей, обновлений и релизов.",
"join_discord_community": "Присоединяйтесь к нашему сообществу Discord", "join_discord_community": "Присоединяйтесь к нашему сообществу Discord",
"keyboard_shortcuts": "Горячие клавиши", "keyboard_shortcuts": "Горячие клавиши",
"name": "Hoppscotch", "name": "Hoppscotch",
"new_version_found": "Найдена новая версия. Перезагрузите для обновления.", "new_version_found": "Найдена новая версия. Перезагрузите для обновления.",
"options": "Options", "options": "Настройки",
"proxy_privacy_policy": "Политика конфиденциальности прокси", "proxy_privacy_policy": "Политика конфиденциальности прокси",
"reload": "Перезагрузить", "reload": "Перезагрузить",
"search": "Поиск", "search": "Поиск",
@@ -79,7 +83,7 @@
"shortcuts": "Ярлыки", "shortcuts": "Ярлыки",
"spotlight": "Прожектор", "spotlight": "Прожектор",
"status": "Статус", "status": "Статус",
"status_description": "Check the status of the website", "status_description": "Проверить состояние сайта",
"terms_and_privacy": "Условия и конфиденциальность", "terms_and_privacy": "Условия и конфиденциальность",
"twitter": "Twitter", "twitter": "Twitter",
"type_a_command_search": "Введите команду или выполните поиск…", "type_a_command_search": "Введите команду или выполните поиск…",
@@ -93,7 +97,7 @@
"continue_with_email": "Продолжить с электронной почтой", "continue_with_email": "Продолжить с электронной почтой",
"continue_with_github": "Продолжить с GitHub", "continue_with_github": "Продолжить с GitHub",
"continue_with_google": "Продолжить с Google", "continue_with_google": "Продолжить с Google",
"continue_with_microsoft": "Continue with Microsoft", "continue_with_microsoft": "Продолжить с Microsoft",
"email": "Электронное письмо", "email": "Электронное письмо",
"logged_out": "Вышли из", "logged_out": "Вышли из",
"login": "Авторизоваться", "login": "Авторизоваться",
@@ -118,19 +122,20 @@
}, },
"collection": { "collection": {
"created": "Коллекция создана", "created": "Коллекция создана",
"different_parent": "Cannot reorder collection with different parent", "different_parent": "Нельзя сортировать коллекцию с разной родительской коллекцией",
"edit": "Редактировать коллекцию", "edit": "Редактировать коллекцию",
"invalid_name": "Укажите допустимое название коллекции", "invalid_name": "Укажите допустимое название коллекции",
"invalid_root_move": "Collection already in the root", "invalid_root_move": "Коллекция уже в корне",
"moved": "Moved Successfully", "moved": "Перемещено успешно",
"my_collections": "Мои коллекции", "my_collections": "Мои коллекции",
"name": "Новая коллекция", "name": "Новая коллекция",
"name_length_insufficient": "Collection name should be at least 3 characters long", "name_length_insufficient": "Имя коллекции должно иметь 3 или более символов",
"new": "Создать коллекцию", "new": "Создать коллекцию",
"order_changed": "Collection Order Updated", "order_changed": "Порядок коллекции обновлён",
"renamed": "Коллекция переименована", "renamed": "Коллекция переименована",
"request_in_use": "Запрос обрабатывается", "request_in_use": "Запрос обрабатывается",
"save_as": "Сохранить как", "save_as": "Сохранить как",
"save_to_collection": "Сохранить в коллекцию",
"select": "Выбрать коллекцию", "select": "Выбрать коллекцию",
"select_location": "Выберите местоположение", "select_location": "Выберите местоположение",
"select_team": "Выберите команду", "select_team": "Выберите команду",
@@ -146,10 +151,17 @@
"remove_request": "Вы уверены, что хотите навсегда удалить этот запрос?", "remove_request": "Вы уверены, что хотите навсегда удалить этот запрос?",
"remove_team": "Вы уверены, что хотите удалить эту команду?", "remove_team": "Вы уверены, что хотите удалить эту команду?",
"remove_telemetry": "Вы действительно хотите отказаться от телеметрии?", "remove_telemetry": "Вы действительно хотите отказаться от телеметрии?",
"request_change": "Are you sure you want to discard current request, unsaved changes will be lost.", "request_change": "Вы уверены что хотите сбросить текущий запрос, все не сохранённые данные будт утеряны?",
"save_unsaved_tab": "Do you want to save changes made in this tab?", "save_unsaved_tab": "Вы хотите сохранить изменения в этой вкладке?",
"close_unsaved_tab": "Вы уверены что хотите закрыть эту вкладку?",
"close_unsaved_tabs": "ВЫ уверены что хотите закрыть все эти вкладки? Несохранённые данные {count} вкладок будут утеряны.",
"sync": "Вы уверены, что хотите синхронизировать это рабочее пространство?" "sync": "Вы уверены, что хотите синхронизировать это рабочее пространство?"
}, },
"context_menu": {
"set_environment_variable": "Назначить как переменную",
"add_parameters": "Добавить в параметры",
"open_request_in_new_tab": "Открыть в новой вкладке"
},
"count": { "count": {
"header": "Заголовок {count}", "header": "Заголовок {count}",
"message": "Тело {count}", "message": "Тело {count}",
@@ -180,83 +192,102 @@
"profile": "Войдите, чтобы просмотреть свой профиль", "profile": "Войдите, чтобы просмотреть свой профиль",
"protocols": "Протоколы пустые", "protocols": "Протоколы пустые",
"schema": "Подключиться к конечной точке GraphQL", "schema": "Подключиться к конечной точке GraphQL",
"shortcodes": "Shortcodes are empty", "shortcodes": "Нет коротких ссылок",
"subscription": "Subscriptions are empty", "subscription": "Нет подписок",
"team_name": "Название команды пусто", "team_name": "Название команды пусто",
"teams": "Команды пустые", "teams": "Команды пустые",
"tests": "Для этого запроса нет тестов" "tests": "Для этого запроса нет тестов"
}, },
"environment": { "environment": {
"add_to_global": "Add to Global", "add_to_global": "Добавить в глобальное окружение",
"added": "Environment addition", "added": "Окружение добавлено",
"create_new": "Создать новую среду", "create_new": "Создать новое окружение",
"created": "Environment created", "created": "Окружение создано",
"deleted": "Environment deletion", "deleted": "Окружение удалено",
"edit": "Редактировать среду", "duplicated": "Окружение скопировано",
"invalid_name": "Укажите допустимое имя для среды", "global": "Глобальное окружение",
"my_environments": "My Environments", "empty_variables": "Нет переменных",
"nested_overflow": "nested environment variables are limited to 10 levels", "global_variables": "Глобальные переменные",
"edit": "Редактировать окружение",
"invalid_name": "Укажите допустимое имя для окружения",
"list": "Переменные окружения",
"my_environments": "Мои окружения",
"name": "Название",
"nested_overflow": "максимальный уровень вложения переменных окружения - 10",
"new": "Новая среда", "new": "Новая среда",
"no_environment": "Нет окружающей среды", "no_active_environment": "Нет активных окружений",
"no_environment_description": "No environments were selected. Choose what to do with the following variables.", "no_environment": "Нет окружения",
"no_environment_description": "Не выбрано окружение, выберите что делать с переменными.",
"quick_peek": "Быстрый просмотр окружения",
"replace_with_variable": "Заменить переменной",
"scope": "Scope",
"select": "Выберите среду", "select": "Выберите среду",
"team_environments": "Team Environments", "set": "Выбрать окружение",
"title": "Среды", "set_as_environment": "Установить как окружение",
"updated": "Environment updation", "team_environments": "Окружения команды",
"title": "Окружения",
"updated": "Окружение обновлено",
"value": "Значение",
"variable": "Переменная",
"variable_list": "Список переменных" "variable_list": "Список переменных"
}, },
"error": { "error": {
"browser_support_sse": "Похоже, в этом браузере нет поддержки событий, отправленных сервером.", "browser_support_sse": "Похоже, в этом браузере нет поддержки событий, отправленных сервером.",
"check_console_details": "Подробности смотрите в журнале консоли.", "check_console_details": "Подробности смотрите в журнале консоли.",
"curl_invalid_format": "cURL неправильно отформатирован", "curl_invalid_format": "cURL неправильно отформатирован",
"danger_zone": "Danger zone", "danger_zone": "Опасная зона",
"delete_account": "Your account is currently an owner in these teams:", "delete_account": "Вы являетесь владельцем этой команды:",
"delete_account_description": "You must either remove yourself, transfer ownership, or delete these teams before you can delete your account.", "delete_account_description": "Прежде чем удалить аккаунт вам необходимо либо назначить владельцом другого пользователя, либо удалить команды в которых вы являетесь владельцем.",
"empty_req_name": "Пустое имя запроса", "empty_req_name": "Пустое имя запроса",
"f12_details": "(F12 для подробностей)", "f12_details": "(F12 для подробностей)",
"gql_prettify_invalid_query": "Не удалось определить недопустимый запрос, устранить синтаксические ошибки запроса и повторить попытку.", "gql_prettify_invalid_query": "Не удалось определить недопустимый запрос, устранить синтаксические ошибки запроса и повторить попытку.",
"incomplete_config_urls": "Incomplete configuration URLs", "incomplete_config_urls": "Не заполнены URL конфигурации",
"incorrect_email": "Incorrect email", "incorrect_email": "Не корректный Email",
"invalid_link": "Invalid link", "invalid_link": "Не корректная ссылка",
"invalid_link_description": "Ссылка, по которой вы перешли, - недействительна, либо срок ее действия истек.", "invalid_link_description": "Ссылка, по которой вы перешли, - недействительна, либо срок ее действия истек.",
"json_parsing_failed": "Invalid JSON", "json_parsing_failed": "Не корректный JSON",
"json_prettify_invalid_body": "Не удалось определить недопустимое тело, устранить синтаксические ошибки json и повторить попытку.", "json_prettify_invalid_body": "Не удалось определить недопустимое тело, устранить синтаксические ошибки json и повторить попытку.",
"network_error": "Похоже, возникла проблема с соединением. Попробуйте еще раз.", "network_error": "Похоже, возникла проблема с соединением. Попробуйте еще раз.",
"network_fail": "Не удалось отправить запрос", "network_fail": "Не удалось отправить запрос",
"no_duration": "Без продолжительности", "no_duration": "Без продолжительности",
"no_results_found": "No matches found", "no_results_found": "Совпадения не найдены",
"page_not_found": "This page could not be found", "page_not_found": "Эта страница не найдена",
"proxy_error": "Ошибка прокси",
"script_fail": "Не удалось выполнить сценарий предварительного запроса", "script_fail": "Не удалось выполнить сценарий предварительного запроса",
"something_went_wrong": "Что-то пошло не так", "something_went_wrong": "Что-то пошло не так",
"test_script_fail": "Could not execute post-request script" "test_script_fail": "Не удалось выполнить тестирование запроса"
}, },
"export": { "export": {
"as_json": "Экспорт как JSON", "as_json": "Экспорт как JSON",
"create_secret_gist": "Создать секретный Gist", "create_secret_gist": "Создать секретный Gist",
"gist_created": "Gist создан", "gist_created": "Gist создан",
"require_github": "Войдите через GitHub, чтобы создать секретную суть", "require_github": "Войдите через GitHub, чтобы создать секретную суть",
"title": "Export" "title": "Экспорт"
}, },
"filter": { "filter": {
"all": "All", "all": "Все",
"none": "None", "none": "Не указано",
"starred": "Starred" "starred": "Отмечено"
}, },
"folder": { "folder": {
"created": "Папка создана", "created": "Папка создана",
"edit": "Редактировать папку", "edit": "Редактировать папку",
"invalid_name": "Укажите имя для папки", "invalid_name": "Укажите имя для папки",
"name_length_insufficient": "Folder name should be at least 3 characters long", "name_length_insufficient": "Имя папки должно содержать 3 или более символов",
"new": "Новая папка", "new": "Новая папка",
"renamed": "Папка переименована" "renamed": "Папка переименована"
}, },
"graphql": { "graphql": {
"mutations": "Мутации", "mutations": "Мутации",
"schema": "Схема", "schema": "Схема",
"subscriptions": "Подписки" "subscriptions": "Подписки",
"switch_connection": "Изменить соединение",
"connection_switch_url": "Вы присоединились к GraphQL, URL соединения",
"connection_switch_new_url": "Смена вкладки разорвёт текущее GraphQL соединение. Новый URL соединения будет",
"connection_switch_confirm": "Вы желаете соединиться с последним GraphQL сервером?"
}, },
"group": { "group": {
"time": "Time", "time": "Время",
"url": "URL" "url": "URL"
}, },
"header": { "header": {
@@ -273,11 +304,11 @@
"post_request_tests": "Сценарии тестирования написаны на JavaScript и запускаются после получения ответа.", "post_request_tests": "Сценарии тестирования написаны на JavaScript и запускаются после получения ответа.",
"pre_request_script": "Скрипты предварительного запроса написаны на JavaScript и запускаются перед отправкой запроса.", "pre_request_script": "Скрипты предварительного запроса написаны на JavaScript и запускаются перед отправкой запроса.",
"script_fail": "Похоже, в скрипте предварительного запроса есть сбой. Проверьте ошибку ниже и исправьте скрипт соответствующим образом.", "script_fail": "Похоже, в скрипте предварительного запроса есть сбой. Проверьте ошибку ниже и исправьте скрипт соответствующим образом.",
"test_script_fail": "There seems to be an error with test script. Please fix the errors and run tests again", "test_script_fail": "Похоже, что скрипт тестирования содержит ошибку. Пожалуйста исправьте её и попробуйте снова",
"tests": "Напишите тестовый сценарий для автоматизации отладки." "tests": "Напишите тестовый сценарий для автоматизации отладки."
}, },
"hide": { "hide": {
"collection": "Collapse Collection Panel", "collection": "Свернуть панель соединения",
"more": "Скрыть больше", "more": "Скрыть больше",
"preview": "Скрыть предварительный просмотр", "preview": "Скрыть предварительный просмотр",
"sidebar": "Скрыть боковую панель" "sidebar": "Скрыть боковую панель"
@@ -287,61 +318,85 @@
"curl": "Импортировать cURL", "curl": "Импортировать cURL",
"failed": "Ошибка импорта", "failed": "Ошибка импорта",
"from_gist": "Импорт из Gist", "from_gist": "Импорт из Gist",
"from_gist_description": "Import from Gist URL", "from_gist_description": "Импортировать через Gist URL",
"from_insomnia": "Import from Insomnia", "from_insomnia": "Импортировать с Insomnia",
"from_insomnia_description": "Import from Insomnia collection", "from_insomnia_description": "Импортировать из коллекции Insomnia",
"from_json": "Import from Hoppscotch", "from_json": "Импортировать из Hoppscotch",
"from_json_description": "Import from Hoppscotch collection file", "from_json_description": "Импортировать из файла коллекции Hoppscotch",
"from_my_collections": "Импортировать из моих коллекций", "from_my_collections": "Импортировать из моих коллекций",
"from_my_collections_description": "Import from My Collections file", "from_my_collections_description": "Импортировать коллекции из моего файла",
"from_openapi": "Import from OpenAPI", "from_openapi": "Импортировать из OpenAPI",
"from_openapi_description": "Import from OpenAPI specification file (YML/JSON)", "from_openapi_description": "Импортировать из OpenAPI файла описания API (YML/JSON)",
"from_postman": "Import from Postman", "from_postman": "Импортировать из Postman",
"from_postman_description": "Import from Postman collection", "from_postman_description": "Импортировать из коллекции Postman",
"from_url": "Import from URL", "from_url": "Импортировать из URL",
"gist_url": "Введите URL-адрес Gist", "gist_url": "Введите URL-адрес Gist",
"import_from_url_invalid_fetch": "Couldn't get data from the url", "import_from_url_invalid_fetch": "Не удалить получить данные по этому URL",
"import_from_url_invalid_file_format": "Error while importing collections", "import_from_url_invalid_file_format": "Ошибка при импорте коллекций",
"import_from_url_invalid_type": "Unsupported type. accepted values are 'hoppscotch', 'openapi', 'postman', 'insomnia'", "import_from_url_invalid_type": "Неподдерживаемый тип. Поддерживаемые типы: 'hoppscotch', 'openapi', 'postman', 'insomnia'",
"import_from_url_success": "Collections Imported", "import_from_url_success": "Коллекция импортирована",
"json_description": "Import collections from a Hoppscotch Collections JSON file", "json_description": "Импортировать из коллекции Hoppscotch",
"title": "Импортировать" "title": "Импортировать"
}, },
"inspections": {
"title": "Инспектор",
"description": "Помогает обноружить возможные проблемы",
"environment": {
"add_environment": "Добавить в окружение",
"not_found": "Переменная окружения “{environment}” не найдена."
},
"header": {
"cookie": "Браузерная версия Hoppscotch не может использовать Cookie Header. Пока мы работаем над созданием десктоп версии Hoppscotch, пожалуйста используйте Authorization Header."
},
"response": {
"401_error": "Пожалуйста проверьте ваши параметры авторизации",
"404_error": "Пожалуйста проверьте URL и Метод вашего запроса",
"network_error": "Пожалуйста проверьте соединение",
"cors_error": "Пожалуйста проверьте вашу Cross-Origin Resource Sharing настройку сервера.",
"default_error": "Проверьте ваш запрос."
},
"url": {
"extension_not_installed": "Расширение не установлено",
"extention_not_enabled": "Расширение не включено",
"extention_enable_action": "Включить расширение браузера",
"extension_unknown_origin": "Убедитесь что вы добавили адрес сервера в Hoppscotch расширение."
}
},
"layout": { "layout": {
"collapse_collection": "Collapse or Expand Collections", "collapse_collection": "Свернуть или развернуть коллекции",
"collapse_sidebar": "Collapse or Expand the sidebar", "collapse_sidebar": "Свернуть или развернуть боковую панель",
"column": "Вертикальное оформление", "column": "Вертикальная развёртка",
"name": "Layout", "name": "Развёртка",
"row": "Горизонтальное оформление", "row": "Горизонтальная развертка",
"zen_mode": "Спокойный режим" "zen_mode": "Спокойный режим"
}, },
"modal": { "modal": {
"close_unsaved_tab": "You have unsaved changes", "close_unsaved_tab": "У вас есть не сохранённые изменения",
"collections": "Коллекции", "collections": "Коллекции",
"confirm": "Подтверждать", "confirm": "Подтверждать",
"edit_request": "Изменить запрос", "edit_request": "Изменить запрос",
"import_export": "Импорт Экспорт" "import_export": "Импорт Экспорт"
}, },
"mqtt": { "mqtt": {
"already_subscribed": "You are already subscribed to this topic.", "already_subscribed": "Вы уже подписаны на этот топик",
"clean_session": "Clean Session", "clean_session": "Очистить сессию",
"clear_input": "Clear input", "clear_input": "Очистить ввод",
"clear_input_on_send": "Clear input on send", "clear_input_on_send": "Очистить ввод перед отправкой",
"client_id": "Client ID", "client_id": "Client ID",
"color": "Pick a color", "color": "Выбрать цвет",
"communication": "Коммуникация", "communication": "Коммуникация",
"connection_config": "Connection Config", "connection_config": "Конфигурация соединения",
"connection_not_authorized": "This MQTT connection does not use any authentication.", "connection_not_authorized": "Это соединение MQTT не использует какую-либо авторизацию.",
"invalid_topic": "Please provide a topic for the subscription", "invalid_topic": "Пожалуйста выберите topic для подписки",
"keep_alive": "Keep Alive", "keep_alive": "Поддерживать соединение",
"log": "Лог", "log": "Лог",
"lw_message": "Last-Will Message", "lw_message": "Last-Will Message",
"lw_qos": "Last-Will QoS", "lw_qos": "Last-Will QoS",
"lw_retain": "Last-Will Retain", "lw_retain": "Last-Will Retain",
"lw_topic": "Last-Will Topic", "lw_topic": "Last-Will Topic",
"message": "Сообщение", "message": "Сообщение",
"new": "New Subscription", "new": "Новая подписка",
"not_connected": "Please start a MQTT connection first.", "not_connected": "Пожалуйста, сначала запустите MQTT соединение.",
"publish": "Публиковать", "publish": "Публиковать",
"qos": "QoS", "qos": "QoS",
"ssl": "SSL", "ssl": "SSL",
@@ -355,7 +410,7 @@
"navigation": { "navigation": {
"doc": "Документы", "doc": "Документы",
"graphql": "GraphQL", "graphql": "GraphQL",
"profile": "Profile", "profile": "Профиль",
"realtime": "В реальном времени", "realtime": "В реальном времени",
"rest": "REST", "rest": "REST",
"settings": "Настройки" "settings": "Настройки"
@@ -363,12 +418,12 @@
"preRequest": { "preRequest": {
"javascript_code": "Код JavaScript", "javascript_code": "Код JavaScript",
"learn": "Читать документацию", "learn": "Читать документацию",
"script": "Сценарий предварительного запроса", "script": "Предворительный скрипт запроса",
"snippets": "Фрагменты" "snippets": "Готовый код"
}, },
"profile": { "profile": {
"app_settings": "Настройки приложения", "app_settings": "Настройки приложения",
"default_hopp_displayname": "Unnamed User", "default_hopp_displayname": "Безымянный",
"editor": "Редактор", "editor": "Редактор",
"editor_description": "Редакторы могут добавлять, редактировать, а так же удалять запросы.", "editor_description": "Редакторы могут добавлять, редактировать, а так же удалять запросы.",
"email_verification_mail": "На вашу электронную почту отправлено письмо для подтверждения. Перейдите по ссылке из письма, чтобы подтвердить свой электронный адрес.", "email_verification_mail": "На вашу электронную почту отправлено письмо для подтверждения. Перейдите по ссылке из письма, чтобы подтвердить свой электронный адрес.",
@@ -391,13 +446,13 @@
"choose_language": "Выберите язык", "choose_language": "Выберите язык",
"content_type": "Тип содержимого", "content_type": "Тип содержимого",
"content_type_titles": { "content_type_titles": {
"others": "Others", "others": "Другие",
"structured": "Structured", "structured": "Структурированный",
"text": "Text" "text": "Текст"
}, },
"copy_link": "Копировать ссылку", "copy_link": "Копировать ссылку",
"different_collection": "Cannot reorder requests from different collections", "different_collection": "Нельзя изменять порядок запросов из разных коллекций",
"duplicated": "Request duplicated", "duplicated": "Запрос скопирован",
"duration": "Продолжительность", "duration": "Продолжительность",
"enter_curl": "Введите cURL", "enter_curl": "Введите cURL",
"generate_code": "Сгенерировать код", "generate_code": "Сгенерировать код",
@@ -405,13 +460,13 @@
"header_list": "Список заголовков", "header_list": "Список заголовков",
"invalid_name": "Укажите имя для запроса", "invalid_name": "Укажите имя для запроса",
"method": "Методика", "method": "Методика",
"moved": "Request moved", "moved": "Запрос перемещён",
"name": "Имя запроса", "name": "Имя запроса",
"new": "New Request", "new": "Новый запрос",
"order_changed": "Request Order Updated", "order_changed": "Порядок запроса изменён",
"override": "Override", "override": "Переопределить",
"override_help": "Set <kbd>Content-Type</kbd> in Headers", "override_help": "Установить <kbd>Content-Type</kbd> в Заголовках",
"overriden": "Overridden", "overriden": "Переопределено",
"parameter_list": "Параметры запроса", "parameter_list": "Параметры запроса",
"parameters": "Параметры", "parameters": "Параметры",
"path": "Путь", "path": "Путь",
@@ -424,17 +479,17 @@
"save_as": "Сохранить как", "save_as": "Сохранить как",
"saved": "Запрос сохранен", "saved": "Запрос сохранен",
"share": "Делиться", "share": "Делиться",
"share_description": "Share Hoppscotch with your friends", "share_description": "Поделиться Hoppscotch с друзьями",
"title": "Запрос", "title": "Запрос",
"type": "Тип запроса", "type": "Тип запроса",
"url": "URL", "url": "URL",
"variables": "Переменные", "variables": "Переменные",
"view_my_links": "View my links" "view_my_links": "Посмотреть мои ссылки"
}, },
"response": { "response": {
"audio": "Audio", "audio": "Аудио",
"body": "Тело ответа", "body": "Тело ответа",
"filter_response_body": "Filter JSON response body (uses JSONPath syntax)", "filter_response_body": "Отфильтровать ответ в формате JSON (используется синтаксис JSONPath)",
"headers": "Заголовки", "headers": "Заголовки",
"html": "HTML", "html": "HTML",
"image": "Изображение", "image": "Изображение",
@@ -446,14 +501,14 @@
"status": "Статус", "status": "Статус",
"time": "Время", "time": "Время",
"title": "Ответ", "title": "Ответ",
"video": "Video", "video": "Видео",
"waiting_for_connection": "Ожидание соединения", "waiting_for_connection": "Ожидание соединения",
"xml": "XML" "xml": "XML"
}, },
"settings": { "settings": {
"accent_color": "Основной цвет", "accent_color": "Основной цвет",
"account": "Счет", "account": "Счет",
"account_deleted": "Your account has been deleted", "account_deleted": "Ваш аккаунт был удалён",
"account_description": "Настройте параметры своей учетной записи.", "account_description": "Настройте параметры своей учетной записи.",
"account_email_description": "Ваш основной адрес электронной почты.", "account_email_description": "Ваш основной адрес электронной почты.",
"account_name_description": "Это ваше отображаемое имя.", "account_name_description": "Это ваше отображаемое имя.",
@@ -462,8 +517,8 @@
"change_font_size": "Изменить размер шрифта", "change_font_size": "Изменить размер шрифта",
"choose_language": "Выберите язык", "choose_language": "Выберите язык",
"dark_mode": "Темный", "dark_mode": "Темный",
"delete_account": "Delete account", "delete_account": "Удалить аккаунт",
"delete_account_description": "Once you delete your account, all your data will be permanently deleted. This action cannot be undone.", "delete_account_description": "Удаление аккаунта нельзя отменить",
"expand_navigation": "Раскрыть панель навигации", "expand_navigation": "Раскрыть панель навигации",
"experiments": "Эксперименты", "experiments": "Эксперименты",
"experiments_notice": "Это набор экспериментов, над которыми мы работаем, которые могут оказаться полезными, интересными, и тем, и другим, или ни тем, ни другим. Они не окончательные и могут быть нестабильными, поэтому, если произойдет что-то слишком странное, не паникуйте. Просто выключи эту чертову штуку. Шутки в сторону,", "experiments_notice": "Это набор экспериментов, над которыми мы работаем, которые могут оказаться полезными, интересными, и тем, и другим, или ни тем, ни другим. Они не окончательные и могут быть нестабильными, поэтому, если произойдет что-то слишком странное, не паникуйте. Просто выключи эту чертову штуку. Шутки в сторону,",
@@ -490,8 +545,8 @@
"proxy_use_toggle": "Используйте промежуточное ПО прокси для отправки запросов", "proxy_use_toggle": "Используйте промежуточное ПО прокси для отправки запросов",
"read_the": "Прочтите", "read_the": "Прочтите",
"reset_default": "Восстановление значений по умолчанию", "reset_default": "Восстановление значений по умолчанию",
"short_codes": "Short codes", "short_codes": "Короткие ссылки",
"short_codes_description": "Short codes which were created by you.", "short_codes_description": "Короткие ссылки, созданные вами",
"sidebar_on_left": "Панель слева", "sidebar_on_left": "Панель слева",
"sync": "Синхронизировать", "sync": "Синхронизировать",
"sync_collections": "Коллекции", "sync_collections": "Коллекции",
@@ -505,16 +560,16 @@
"theme_description": "Настройте тему своего приложения.", "theme_description": "Настройте тему своего приложения.",
"use_experimental_url_bar": "Использовать экспериментальную строку URL с выделением среды", "use_experimental_url_bar": "Использовать экспериментальную строку URL с выделением среды",
"user": "Пользователь", "user": "Пользователь",
"verified_email": "Verified email", "verified_email": "Проверенный Email",
"verify_email": "Подтвердить почту" "verify_email": "Подтвердить Email"
}, },
"shortcodes": { "shortcodes": {
"actions": "Actions", "actions": "Действия",
"created_on": "Created on", "created_on": "Создано",
"deleted": "Shortcode deleted", "deleted": "Удалёна",
"method": "Method", "method": "Метод",
"not_found": "Shortcode not found", "not_found": "Короткая ссылка не найдена",
"short_code": "Short code", "short_code": "Короткая ссылка",
"url": "URL" "url": "URL"
}, },
"shortcut": { "shortcut": {
@@ -525,6 +580,10 @@
"show_all": "Горячие клавиши", "show_all": "Горячие клавиши",
"title": "Общий" "title": "Общий"
}, },
"others": {
"title": "Другие",
"prettify": "Прекрасные редакторы"
},
"miscellaneous": { "miscellaneous": {
"invite": "Пригласите людей в Hoppscotch", "invite": "Пригласите людей в Hoppscotch",
"title": "Разное" "title": "Разное"
@@ -545,6 +604,9 @@
"delete_method": "Выберите метод DELETE", "delete_method": "Выберите метод DELETE",
"get_method": "Выберите метод GET", "get_method": "Выберите метод GET",
"head_method": "Выберите метод HEAD", "head_method": "Выберите метод HEAD",
"rename": "Переименовать запрос",
"import_curl": "Импорт из cURL",
"show_code": "Сгенерировать готовый код",
"method": "Методика", "method": "Методика",
"next_method": "Выберите следующий метод", "next_method": "Выберите следующий метод",
"post_method": "Выберите метод POST", "post_method": "Выберите метод POST",
@@ -553,35 +615,120 @@
"reset_request": "Сбросить запрос", "reset_request": "Сбросить запрос",
"save_to_collections": "Сохранить в коллекции", "save_to_collections": "Сохранить в коллекции",
"send_request": "Послать запрос", "send_request": "Послать запрос",
"save_request": "Сохарнить запрос",
"title": "Запрос" "title": "Запрос"
}, },
"response": { "response": {
"copy": "Copy response to clipboard", "copy": "Копировать запрос в буфер обмена",
"download": "Download response as file", "download": "Скачать запрос как файл",
"title": "Response" "title": "Запрос"
}, },
"theme": { "theme": {
"black": "Switch theme to black mode", "black": "Черный режим",
"dark": "Switch theme to dark mode", "dark": "Тёмный режим",
"light": "Switch theme to light mode", "light": "Светлый режим",
"system": "Switch theme to system mode", "system": "Определяется системой",
"title": "Theme" "title": "Тема"
} }
}, },
"show": { "show": {
"code": "Показать код", "code": "Показать код",
"collection": "Expand Collection Panel", "collection": "Развернуть панель коллекций",
"more": "Показать больше", "more": "Показать больше",
"sidebar": "Показать боковую панель" "sidebar": "Показать боковую панель"
}, },
"socketio": { "socketio": {
"communication": "Коммуникация", "communication": "Коммуникация",
"connection_not_authorized": "This SocketIO connection does not use any authentication.", "connection_not_authorized": "Это SocketIO соединение не использует какую-либо авторизацию.",
"event_name": "Название события", "event_name": "Название события",
"events": "События", "events": "События",
"log": "Лог", "log": "Лог",
"url": "URL" "url": "URL"
}, },
"spotlight": {
"general": {
"help_menu": "Помощь и поддержка",
"chat": "Чат с поддержкой",
"open_docs": "Прочитать документацию",
"open_keybindings": "Горячие клавиши",
"open_github": "Открыть GitHub репозиторий",
"social": "Соц. сети",
"title": "Основное"
},
"miscellaneous": {
"invite": "Пригласите друзей в Hoppscotch",
"title": "Разное"
},
"request": {
"switch_to": "Перейти к",
"select_method": "Выбрать метод",
"save_as_new": "Сохранить как новый запрос",
"tab_parameters": "Параметры",
"tab_body": "Тело",
"tab_headers": "Заголовки",
"tab_authorization": "Авторизация",
"tab_pre_request_script": "Пред-скрипт",
"tab_tests": "Тесты",
"tab_query": "Запрос",
"tab_variables": "Переменные"
},
"graphql": {
"connect": "Соединиться",
"disconnect": "Разъединить"
},
"response": {
"copy": "Копировать ответ",
"download": "Скачать ответ",
"title": "Ответ"
},
"environments": {
"new": "Создать новое окружение",
"new_variable": "Создать новую переменную в окружении",
"edit": "Изменить текущее окружение",
"delete": "Удалить текущее окружение",
"duplicate": "Скопировать текущее окружение",
"edit_global": "Изменить глобальное окружение",
"duplicate_global": "Скопировать глобальное окружение",
"title": "Окружения"
},
"workspace": {
"new": "Создать новую команду",
"edit": "Изменить текущую команду",
"delete": "Удалить текущую команду",
"invite": "Пригласить людей в команду",
"switch_to_personal": "Переключиться на личное пространство",
"title": "Команды"
},
"tab": {
"duplicate": "Скопировать вкладку",
"close_current": "Закрыть вкладку",
"close_others": "Закрыть все кроме этой",
"new_tab": "Открыть в новой вкладке",
"title": "Вкладки"
},
"section": {
"user": "Пользователь",
"theme": "Тема",
"interface": "Интерфейс",
"interceptor": "Перехватчик"
},
"change_language": "Изменить язык",
"settings": {
"theme": {
"black": "Чёрная",
"dark": "Тёмная",
"light": "Светлая",
"system": "Определяется системой"
},
"font": {
"size_sm": "Маленький",
"size_md": "Средний",
"size_lg": "Большой"
},
"change_interceptor": "Изменить перехватчик",
"change_language": "Изменить язык"
}
},
"sse": { "sse": {
"event_type": "Тип события", "event_type": "Тип события",
"log": "Лог", "log": "Лог",
@@ -589,14 +736,14 @@
}, },
"state": { "state": {
"bulk_mode": "Множественное редактирование", "bulk_mode": "Множественное редактирование",
"bulk_mode_placeholder": "Entries are separated by newline\nKeys and values are separated by :\nPrepend # to any row you want to add but keep disabled", "bulk_mode_placeholder": "Каждый параметр должен начинаться с новой строки\nКлючи и значения разедляются двоеточием\nИспользуйте # для комментария",
"cleared": "Очищено", "cleared": "Очищено",
"connected": "Связаны", "connected": "Связаны",
"connected_to": "Подключено к {name}", "connected_to": "Подключено к {name}",
"connecting_to": "Подключение к {name} ...", "connecting_to": "Подключение к {name} ...",
"connection_error": "Failed to connect", "connection_error": "Ошибка подключения",
"connection_failed": "Connection failed", "connection_failed": "Не удалось установить соединение",
"connection_lost": "Connection lost", "connection_lost": "Соединение утеряно",
"copied_to_clipboard": "Скопировано в буфер обмена", "copied_to_clipboard": "Скопировано в буфер обмена",
"deleted": "Удалено", "deleted": "Удалено",
"deprecated": "УСТАРЕЛО", "deprecated": "УСТАРЕЛО",
@@ -611,17 +758,17 @@
"history_deleted": "История удалена", "history_deleted": "История удалена",
"linewrap": "Обернуть линии", "linewrap": "Обернуть линии",
"loading": "Загрузка...", "loading": "Загрузка...",
"message_received": "Message: {message} arrived on topic: {topic}", "message_received": "Сообщение: {message} получено по топику: {topic}",
"mqtt_subscription_failed": "Something went wrong while subscribing to topic: {topic}", "mqtt_subscription_failed": "Что-то пошло не так, при попытке подписаться на топик: {topic}",
"none": "Никто", "none": "Никто",
"nothing_found": "Ничего не найдено для", "nothing_found": "Ничего не найдено для",
"published_error": "Something went wrong while publishing msg: {topic} to topic: {message}", "published_error": "Что-то пошло не так при попытке опубликовать сообщение в топик {topic}: {message}",
"published_message": "Published message: {message} to topic: {topic}", "published_message": "Опубликовано сообщение: {message} в топик: {topic}",
"reconnection_error": "Failed to reconnect", "reconnection_error": "Не удалось переподключиться",
"subscribed_failed": "Failed to subscribe to topic: {topic}", "subscribed_failed": "Не удалось подписаться на топик: {topic}",
"subscribed_success": "Successfully subscribed to topic: {topic}", "subscribed_success": "Успешно подписался на топик: {topic}",
"unsubscribed_failed": "Failed to unsubscribe from topic: {topic}", "unsubscribed_failed": "Не удалось отписаться от топика: {topic}",
"unsubscribed_success": "Successfully unsubscribed from topic: {topic}", "unsubscribed_success": "Успешно отписался от топика: {topic}",
"waiting_send_request": "Ожидание отправки запроса" "waiting_send_request": "Ожидание отправки запроса"
}, },
"support": { "support": {
@@ -630,7 +777,7 @@
"community": "Задавайте вопросы и помогайте другим", "community": "Задавайте вопросы и помогайте другим",
"documentation": "Узнать больше о Hoppscotch", "documentation": "Узнать больше о Hoppscotch",
"forum": "Задавайте вопросы и получайте ответы", "forum": "Задавайте вопросы и получайте ответы",
"github": "Follow us on Github", "github": "Подпишитесь на нас на Github",
"shortcuts": "Просматривайте приложение быстрее", "shortcuts": "Просматривайте приложение быстрее",
"team": "Свяжитесь с командой", "team": "Свяжитесь с командой",
"title": "Служба поддержки", "title": "Служба поддержки",
@@ -641,15 +788,15 @@
"body": "Тело", "body": "Тело",
"collections": "Коллекции", "collections": "Коллекции",
"documentation": "Документация", "documentation": "Документация",
"environments": "Environments", "environments": "Окружения",
"headers": "Заголовки", "headers": "Заголовки",
"history": "История", "history": "История",
"mqtt": "MQTT", "mqtt": "MQTT",
"parameters": "Параметры", "parameters": "Параметры",
"pre_request_script": "Скрипт предварительного запроса", "pre_request_script": "Пред-скрипт",
"queries": "Запросы", "queries": "Запросы",
"query": "Запрос", "query": "Запрос",
"schema": "Schema", "schema": "Схема",
"socketio": "Socket.IO", "socketio": "Socket.IO",
"sse": "SSE", "sse": "SSE",
"tests": "Тесты", "tests": "Тесты",
@@ -666,7 +813,7 @@
"email_do_not_match": "Электронная почта, которой Вы воспользовались не соответсвует указанной в данных Вашей учетной записи.", "email_do_not_match": "Электронная почта, которой Вы воспользовались не соответсвует указанной в данных Вашей учетной записи.",
"exit": "Выйти из команды", "exit": "Выйти из команды",
"exit_disabled": "Только владелец не может выйти из команды", "exit_disabled": "Только владелец не может выйти из команды",
"invalid_coll_id": "Invalid collection ID", "invalid_coll_id": "Не верный идентификатор коллекции",
"invalid_email_format": "Формат электронной почты недействителен", "invalid_email_format": "Формат электронной почты недействителен",
"invalid_id": "Некорректный ID команды. Свяжитесь с руководителем команды.", "invalid_id": "Некорректный ID команды. Свяжитесь с руководителем команды.",
"invalid_invite_link": "Ссылка недействительна", "invalid_invite_link": "Ссылка недействительна",
@@ -690,7 +837,7 @@
"member_removed": "Пользователь удален", "member_removed": "Пользователь удален",
"member_role_updated": "Роли пользователей обновлены", "member_role_updated": "Роли пользователей обновлены",
"members": "Участники", "members": "Участники",
"more_members": "+{count} more", "more_members": "+{count}",
"name_length_insufficient": "Название команды должно быть не менее 6 символов.", "name_length_insufficient": "Название команды должно быть не менее 6 символов.",
"name_updated": "Название команды обновлено", "name_updated": "Название команды обновлено",
"new": "Новая команда", "new": "Новая команда",
@@ -698,13 +845,13 @@
"new_name": "Моя новая команда", "new_name": "Моя новая команда",
"no_access": "У вас нет прав на редактирование этих коллекций", "no_access": "У вас нет прав на редактирование этих коллекций",
"no_invite_found": "Такое приглашение мы не смогли найти. Свяжитесь с руководителем команды.", "no_invite_found": "Такое приглашение мы не смогли найти. Свяжитесь с руководителем команды.",
"no_request_found": "Request not found.", "no_request_found": "Запрос не найден",
"not_found": "Team not found. Contact your team owner.", "not_found": "Команда не найдена, свяжитесь с владельцем команды",
"not_valid_viewer": "У Вас нет прав просматривать это. Свяжитесь с руководителем команды.", "not_valid_viewer": "У Вас нет прав просматривать это. Свяжитесь с руководителем команды.",
"parent_coll_move": "Cannot move collection to a child collection", "parent_coll_move": "Не удалось переместить коллекцию в дочернюю",
"pending_invites": "Ожидающие приглашения", "pending_invites": "Ожидающие приглашения",
"permissions": "Разрешения", "permissions": "Разрешения",
"same_target_destination": "Same target and destination", "same_target_destination": "Таже цель и конечная точка",
"saved": "Команда сохранена", "saved": "Команда сохранена",
"select_a_team": "Выбрать команду", "select_a_team": "Выбрать команду",
"title": "Команды", "title": "Команды",
@@ -712,9 +859,9 @@
"we_sent_invite_link_description": "Попросите тех, кого Вы пригласили, проверить их почтовые ящики. Им нужно перейди по ссылке, чтобы подтвердить вступление в эту команду." "we_sent_invite_link_description": "Попросите тех, кого Вы пригласили, проверить их почтовые ящики. Им нужно перейди по ссылке, чтобы подтвердить вступление в эту команду."
}, },
"team_environment": { "team_environment": {
"deleted": "Environment Deleted", "deleted": "Окружение удалено",
"duplicate": "Environment Duplicated", "duplicate": "Окружение скопировано",
"not_found": "Environment not found." "not_found": "Окружение не найдено"
}, },
"test": { "test": {
"failed": "Тест не пройден", "failed": "Тест не пройден",
@@ -734,9 +881,9 @@
"url": "URL" "url": "URL"
}, },
"workspace": { "workspace": {
"change": "Change workspace", "change": "Изменить пространство",
"personal": "My Workspace", "personal": "Моё пространство",
"team": "Team Workspace", "team": "Пространство команды",
"title": "Workspaces" "title": "Рабочие пространства"
} }
} }

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 666 KiB

After

Width:  |  Height:  |  Size: 926 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 358 KiB

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 382 KiB

After

Width:  |  Height:  |  Size: 535 KiB

View File

@@ -10,18 +10,6 @@
:class="{ '-rotate-180': !EXPAND_NAVIGATION }" :class="{ '-rotate-180': !EXPAND_NAVIGATION }"
@click="EXPAND_NAVIGATION = !EXPAND_NAVIGATION" @click="EXPAND_NAVIGATION = !EXPAND_NAVIGATION"
/> />
<HoppButtonSecondary
v-tippy="{ theme: 'tooltip' }"
:title="`${ZEN_MODE ? t('action.turn_off') : t('action.turn_on')} ${t(
'layout.zen_mode'
)}`"
:icon="ZEN_MODE ? IconMinimize : IconMaximize"
:class="{
'!text-accent !focus-visible:text-accentDark !hover:text-accentDark':
ZEN_MODE,
}"
@click="ZEN_MODE = !ZEN_MODE"
/>
<tippy interactive trigger="click" theme="popover"> <tippy interactive trigger="click" theme="popover">
<HoppButtonSecondary <HoppButtonSecondary
v-tippy="{ theme: 'tooltip' }" v-tippy="{ theme: 'tooltip' }"
@@ -211,11 +199,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, watch } from "vue" import { ref } from "vue"
import { version } from "~/../package.json" import { version } from "~/../package.json"
import IconSidebar from "~icons/lucide/sidebar" import IconSidebar from "~icons/lucide/sidebar"
import IconMinimize from "~icons/lucide/minimize"
import IconMaximize from "~icons/lucide/maximize"
import IconZap from "~icons/lucide/zap" import IconZap from "~icons/lucide/zap"
import IconShare2 from "~icons/lucide/share-2" import IconShare2 from "~icons/lucide/share-2"
import IconColumns from "~icons/lucide/columns" import IconColumns from "~icons/lucide/columns"
@@ -241,7 +227,6 @@ const showDeveloperOptions = ref(false)
const EXPAND_NAVIGATION = useSetting("EXPAND_NAVIGATION") const EXPAND_NAVIGATION = useSetting("EXPAND_NAVIGATION")
const SIDEBAR = useSetting("SIDEBAR") const SIDEBAR = useSetting("SIDEBAR")
const ZEN_MODE = useSetting("ZEN_MODE")
const COLUMN_LAYOUT = useSetting("COLUMN_LAYOUT") const COLUMN_LAYOUT = useSetting("COLUMN_LAYOUT")
const SIDEBAR_ON_LEFT = useSetting("SIDEBAR_ON_LEFT") const SIDEBAR_ON_LEFT = useSetting("SIDEBAR_ON_LEFT")
@@ -252,13 +237,6 @@ const currentUser = useReadonlyStream(
platform.auth.getCurrentUser() platform.auth.getCurrentUser()
) )
watch(
() => ZEN_MODE.value,
() => {
EXPAND_NAVIGATION.value = !ZEN_MODE.value
}
)
const nativeShare = () => { const nativeShare = () => {
if (navigator.share) { if (navigator.share) {
navigator navigator

View File

@@ -67,7 +67,6 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { watch } from "vue"
import IconSidebar from "~icons/lucide/sidebar" import IconSidebar from "~icons/lucide/sidebar"
import IconSidebarOpen from "~icons/lucide/sidebar-open" import IconSidebarOpen from "~icons/lucide/sidebar-open"
import IconChevronRight from "~icons/lucide/chevron-right" import IconChevronRight from "~icons/lucide/chevron-right"
@@ -77,17 +76,9 @@ import { platform } from "~/platform"
const t = useI18n() const t = useI18n()
const ZEN_MODE = useSetting("ZEN_MODE")
const EXPAND_NAVIGATION = useSetting("EXPAND_NAVIGATION") const EXPAND_NAVIGATION = useSetting("EXPAND_NAVIGATION")
const SIDEBAR = useSetting("SIDEBAR") const SIDEBAR = useSetting("SIDEBAR")
watch(
() => ZEN_MODE.value,
() => {
EXPAND_NAVIGATION.value = !ZEN_MODE.value
}
)
defineProps<{ defineProps<{
show: boolean show: boolean
}>() }>()

View File

@@ -119,5 +119,8 @@ watch(
&.active { &.active {
@apply after:bg-accentLight; @apply after:bg-accentLight;
} }
scroll-padding: 4rem !important;
scroll-margin: 4rem !important;
} }
</style> </style>

View File

@@ -40,7 +40,7 @@
:key="`result-${result.id}`" :key="`result-${result.id}`"
:entry="result" :entry="result"
:active="isEqual(selectedEntry, [sectionIndex, entryIndex])" :active="isEqual(selectedEntry, [sectionIndex, entryIndex])"
@mouseover="selectedEntry = [sectionIndex, entryIndex]" @mouseover="onMouseOver($event, sectionIndex, entryIndex)"
@action="runAction(sectionID, result)" @action="runAction(sectionID, result)"
/> />
</div> </div>
@@ -178,6 +178,24 @@ function runAction(searcherID: string, result: SpotlightSearcherResult) {
emit("hide-modal") emit("hide-modal")
} }
let lastMousePosition: { x: number; y: number }
const onMouseOver = (
e: MouseEvent,
sectionIndex: number,
entryIndex: number
) => {
const mousePosition = {
x: e.clientX,
y: e.clientY,
}
// if the position is same, do nothing
if (isEqual(lastMousePosition, mousePosition)) return
selectedEntry.value = [sectionIndex, entryIndex]
lastMousePosition = mousePosition
}
function newUseArrowKeysForNavigation() { function newUseArrowKeysForNavigation() {
const selectedEntry = ref<[number, number]>([0, 0]) // [sectionIndex, entryIndex] const selectedEntry = ref<[number, number]>([0, 0]) // [sectionIndex, entryIndex]

View File

@@ -9,7 +9,7 @@
<div class="flex"> <div class="flex">
<HoppButtonSecondary <HoppButtonSecondary
v-tippy="{ theme: 'tooltip' }" v-tippy="{ theme: 'tooltip' }"
to="https://docs.hoppscotch.io/documentation/getting-started/rest/using-parameters" to="https://docs.hoppscotch.io/documentation/features/rest-api-testing"
blank blank
:title="t('app.wiki')" :title="t('app.wiki')"
:icon="IconHelpCircle" :icon="IconHelpCircle"

View File

@@ -17,7 +17,7 @@
<span <span
v-tippy="{ theme: 'tooltip' }" v-tippy="{ theme: 'tooltip' }"
:title="relativeTime" :title="relativeTime"
class="mx-auto truncate ts-font text-secondaryLight hover:text-secondary hover:text-center" class="mx-auto truncate text-tiny text-secondaryLight hover:text-secondary hover:text-center"
> >
{{ shortDateTime(entry.ts) }} {{ shortDateTime(entry.ts) }}
</span> </span>
@@ -406,8 +406,4 @@ const icon = computed(() => markRaw(ICONS[props.entry.source].icon))
@apply transition; @apply transition;
@apply hover: text-secondary; @apply hover: text-secondary;
} }
.ts-font {
font-size: 0.6rem;
}
</style> </style>

View File

@@ -311,35 +311,36 @@ const envVars = computed(() =>
const envTooltipPlugin = new HoppReactiveEnvPlugin(envVars, view) const envTooltipPlugin = new HoppReactiveEnvPlugin(envVars, view)
const initView = (el: any) => { function handleTextSelection() {
function handleTextSelection() { const selection = view.value?.state.selection.main
const selection = view.value?.state.selection.main if (selection) {
if (selection) { const from = selection.from
const from = selection.from const to = selection.to
const to = selection.to if (from === to) return
const text = view.value?.state.doc.sliceString(from, to) const text = view.value?.state.doc.sliceString(from, to)
const { top, left } = view.value?.coordsAtPos(from) const { top, left } = view.value?.coordsAtPos(from)
if (text) { if (text) {
invokeAction("contextmenu.open", { invokeAction("contextmenu.open", {
position: { position: {
top, top,
left, left,
}, },
text, text,
}) })
showSuggestionPopover.value = false showSuggestionPopover.value = false
} else { } else {
invokeAction("contextmenu.open", { invokeAction("contextmenu.open", {
position: { position: {
top, top,
left, left,
}, },
text: null, text: null,
}) })
}
} }
} }
}
const initView = (el: any) => {
// Debounce to prevent double click from selecting the word // Debounce to prevent double click from selecting the word
const debounceFn = useDebounceFn(() => { const debounceFn = useDebounceFn(() => {
handleTextSelection() handleTextSelection()
@@ -381,6 +382,11 @@ const initView = (el: any) => {
drop(ev) { drop(ev) {
ev.preventDefault() ev.preventDefault()
}, },
scroll(event) {
if (event.target) {
handleTextSelection()
}
},
}), }),
ViewPlugin.fromClass( ViewPlugin.fromClass(
class { class {

View File

@@ -1,71 +0,0 @@
<template>
<span class="inline-flex">
<tippy
interactive
trigger="click"
theme="popover"
:on-shown="() => tippyActions.focus()"
>
<span class="select-wrapper">
<HoppButtonSecondary
v-tippy="{ theme: 'tooltip' }"
:title="t('settings.change_font_size')"
class="pr-8"
:icon="IconType"
outline
:label="`${getFontSizeName(
fontSizes.find((size) => size === active)
)}`"
/>
</span>
<template #content="{ hide }">
<div
ref="tippyActions"
class="flex flex-col focus:outline-none"
tabindex="0"
@keyup.escape="hide()"
>
<HoppSmartItem
v-for="(size, index) in fontSizes"
:key="`size-${index}`"
:label="`${getFontSizeName(size)}`"
:icon="size === active ? IconCircleDot : IconCircle"
:active="size === active"
@click="
() => {
setActiveFont(size)
hide()
}
"
/>
</div>
</template>
</tippy>
</span>
</template>
<script setup lang="ts">
import IconCircleDot from "~icons/lucide/circle-dot"
import IconCircle from "~icons/lucide/circle"
import IconType from "~icons/lucide/type"
import { HoppFontSizes, HoppFontSize, applySetting } from "~/newstore/settings"
import { useSetting } from "@composables/settings"
import { useI18n } from "@composables/i18n"
import { ref } from "vue"
const t = useI18n()
const fontSizes = HoppFontSizes
const active = useSetting("FONT_SIZE")
const getFontSizeName = (size: HoppFontSize) => {
return t(`settings.font_size_${size}`)
}
const setActiveFont = (size: HoppFontSize) => {
applySetting("FONT_SIZE", size)
}
// Template refs
const tippyActions = ref<any | null>(null)
</script>

View File

@@ -216,6 +216,33 @@ export function useCodemirror(
? new HoppEnvironmentPlugin(subscribeToStream, view) ? new HoppEnvironmentPlugin(subscribeToStream, view)
: null : null
function handleTextSelection() {
const selection = view.value?.state.selection.main
if (selection) {
const from = selection.from
const to = selection.to
const text = view.value?.state.doc.sliceString(from, to)
const { top, left } = view.value?.coordsAtPos(from)
if (text) {
invokeAction("contextmenu.open", {
position: {
top,
left,
},
text,
})
} else {
invokeAction("contextmenu.open", {
position: {
top,
left,
},
text: null,
})
}
}
}
const initView = (el: any) => { const initView = (el: any) => {
if (el) platform.ui?.onCodemirrorInstanceMount?.(el) if (el) platform.ui?.onCodemirrorInstanceMount?.(el)
@@ -226,33 +253,6 @@ export function useCodemirror(
ViewPlugin.fromClass( ViewPlugin.fromClass(
class { class {
update(update: ViewUpdate) { update(update: ViewUpdate) {
function handleTextSelection() {
const selection = view.value?.state.selection.main
if (selection) {
const from = selection.from
const to = selection.to
const text = view.value?.state.doc.sliceString(from, to)
const { top, left } = view.value?.coordsAtPos(from)
if (text) {
invokeAction("contextmenu.open", {
position: {
top,
left,
},
text,
})
} else {
invokeAction("contextmenu.open", {
position: {
top,
left,
},
text: null,
})
}
}
}
// Debounce to prevent double click from selecting the word // Debounce to prevent double click from selecting the word
const debounceFn = useDebounceFn(() => { const debounceFn = useDebounceFn(() => {
handleTextSelection() handleTextSelection()
@@ -296,6 +296,13 @@ export function useCodemirror(
} }
} }
), ),
EditorView.domEventHandlers({
scroll(event) {
if (event.target) {
handleTextSelection()
}
},
}),
EditorView.updateListener.of((update) => { EditorView.updateListener.of((update) => {
if (options.extendedEditorConfig.readOnly) { if (options.extendedEditorConfig.readOnly) {
update.view.contentDOM.inputMode = "none" update.view.contentDOM.inputMode = "none"

View File

@@ -56,7 +56,7 @@ export const bindings: {
"alt-x": "request.method.delete", "alt-x": "request.method.delete",
"ctrl-k": "modals.search.toggle", "ctrl-k": "modals.search.toggle",
"ctrl-/": "flyouts.keybinds.toggle", "ctrl-/": "flyouts.keybinds.toggle",
"?": "modals.support.toggle", "shift-/": "modals.support.toggle",
"ctrl-m": "modals.share.toggle", "ctrl-m": "modals.share.toggle",
"alt-r": "navigation.jump.rest", "alt-r": "navigation.jump.rest",
"alt-q": "navigation.jump.graphql", "alt-q": "navigation.jump.graphql",
@@ -120,7 +120,8 @@ function generateKeybindingString(ev: KeyboardEvent): ShortcutKey | null {
} }
function getPressedKey(ev: KeyboardEvent): Key | null { function getPressedKey(ev: KeyboardEvent): Key | null {
const val = ev.key.toLowerCase() const val = ev.code.toLowerCase()
// Check arrow keys // Check arrow keys
if (val === "arrowup") return "up" if (val === "arrowup") return "up"
else if (val === "arrowdown") return "down" else if (val === "arrowdown") return "down"
@@ -128,21 +129,20 @@ function getPressedKey(ev: KeyboardEvent): Key | null {
else if (val === "arrowright") return "right" else if (val === "arrowright") return "right"
// Check letter keys // Check letter keys
const isLetter = ev.code.toLowerCase().startsWith("key") const isLetter = val.startsWith("key")
if (isLetter) return ev.code.toLowerCase().substring(3) as Key if (isLetter) return val.substring(3) as Key
// Check if number keys // Check if number keys
if (val.length === 1 && !isNaN(val as any)) return val as Key const isDigit = val.startsWith("digit")
if (isDigit) return val.substring(5) as Key
// Check if question mark // Check if slash
if (val === "?") return "?" if (val === "slash") return "/"
// Check if question mark
if (val === "/") return "/"
// Check if period // Check if period
if (val === ".") return "." if (val === "period") return "."
// Check if enter
if (val === "enter") return "enter" if (val === "enter") return "enter"
// If no other cases match, this is not a valid key // If no other cases match, this is not a valid key

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="flex w-screen h-screen"> <div class="flex w-screen h-screen">
<Splitpanes class="no-splitter" :dbl-click-splitter="false" horizontal> <Splitpanes class="no-splitter" :dbl-click-splitter="false" horizontal>
<Pane v-if="!zenMode" style="height: auto"> <Pane style="height: auto">
<AppHeader /> <AppHeader />
</Pane> </Pane>
<Pane :class="spacerClass" class="flex flex-1 !overflow-auto md:mb-0"> <Pane :class="spacerClass" class="flex flex-1 !overflow-auto md:mb-0">
@@ -79,9 +79,7 @@ const router = useRouter()
const showSearch = ref(false) const showSearch = ref(false)
const showSupport = ref(false) const showSupport = ref(false)
const fontSize = useSetting("FONT_SIZE")
const expandNavigation = useSetting("EXPAND_NAVIGATION") const expandNavigation = useSetting("EXPAND_NAVIGATION")
const zenMode = useSetting("ZEN_MODE")
const rightSidebar = useSetting("SIDEBAR") const rightSidebar = useSetting("SIDEBAR")
const columnLayout = useSetting("COLUMN_LAYOUT") const columnLayout = useSetting("COLUMN_LAYOUT")
@@ -133,24 +131,9 @@ watch(mdAndLarger, () => {
columnLayout.value = true columnLayout.value = true
} }
}) })
const spacerClass = computed(() =>
const spacerClass = computed(() => { expandNavigation.value ? "spacer-small" : "spacer-expand"
if (fontSize.value === "small" && expandNavigation.value) )
return "spacer-small"
if (fontSize.value === "medium" && expandNavigation.value)
return "spacer-medium"
if (fontSize.value === "large" && expandNavigation.value)
return "spacer-large"
if (
(fontSize.value === "small" ||
fontSize.value === "medium" ||
fontSize.value === "large") &&
!expandNavigation.value
)
return "spacer-expand"
return ""
})
defineActionHandler("modals.search.toggle", () => { defineActionHandler("modals.search.toggle", () => {
showSearch.value = !showSearch.value showSearch.value = !showSearch.value

View File

@@ -68,23 +68,9 @@ const applyAccentColor = (_app: App) => {
) )
} }
// eslint-disable-next-line @typescript-eslint/no-unused-vars
const applyFontSize = (_app: App) => {
const [pref] = useSettingStatic("FONT_SIZE")
watch(
pref,
(newPref) => {
document.documentElement.setAttribute("data-font-size", newPref)
},
{ immediate: true }
)
}
export default <HoppModule>{ export default <HoppModule>{
onVueAppInit(app) { onVueAppInit(app) {
applyColorMode(app) applyColorMode(app)
applyAccentColor(app) applyAccentColor(app)
applyFontSize(app)
}, },
} }

View File

@@ -23,10 +23,6 @@ export const HoppAccentColors = [
export type HoppAccentColor = (typeof HoppAccentColors)[number] export type HoppAccentColor = (typeof HoppAccentColors)[number]
export const HoppFontSizes = ["small", "medium", "large"] as const
export type HoppFontSize = (typeof HoppFontSizes)[number]
export type SettingsDef = { export type SettingsDef = {
syncCollections: boolean syncCollections: boolean
syncHistory: boolean syncHistory: boolean
@@ -49,8 +45,6 @@ export type SettingsDef = {
EXPAND_NAVIGATION: boolean EXPAND_NAVIGATION: boolean
SIDEBAR: boolean SIDEBAR: boolean
SIDEBAR_ON_LEFT: boolean SIDEBAR_ON_LEFT: boolean
ZEN_MODE: boolean
FONT_SIZE: HoppFontSize
COLUMN_LAYOUT: boolean COLUMN_LAYOUT: boolean
} }
@@ -76,8 +70,6 @@ export const getDefaultSettings = (): SettingsDef => ({
EXPAND_NAVIGATION: true, EXPAND_NAVIGATION: true,
SIDEBAR: true, SIDEBAR: true,
SIDEBAR_ON_LEFT: true, SIDEBAR_ON_LEFT: true,
ZEN_MODE: false,
FONT_SIZE: "small",
COLUMN_LAYOUT: true, COLUMN_LAYOUT: true,
}) })

View File

@@ -141,6 +141,7 @@ import { InspectionService } from "~/services/inspection"
import { HeaderInspectorService } from "~/services/inspection/inspectors/header.inspector" import { HeaderInspectorService } from "~/services/inspection/inspectors/header.inspector"
import { EnvironmentInspectorService } from "~/services/inspection/inspectors/environment.inspector" import { EnvironmentInspectorService } from "~/services/inspection/inspectors/environment.inspector"
import { ResponseInspectorService } from "~/services/inspection/inspectors/response.inspector" import { ResponseInspectorService } from "~/services/inspection/inspectors/response.inspector"
import { cloneDeep } from "lodash-es"
const savingRequest = ref(false) const savingRequest = ref(false)
const confirmingCloseForTabID = ref<string | null>(null) const confirmingCloseForTabID = ref<string | null>(null)
@@ -243,7 +244,7 @@ const duplicateTab = (tabID: string) => {
const tab = getTabRef(tabID) const tab = getTabRef(tabID)
if (tab.value) { if (tab.value) {
const newTab = createNewTab({ const newTab = createNewTab({
request: tab.value.document.request, request: cloneDeep(tab.value.document.request),
isDirty: true, isDirty: true,
}) })
currentTabID.value = newTab.id currentTabID.value = newTab.id

View File

@@ -1,6 +1,6 @@
<template> <template>
<div> <div>
<div class="container space-y-8 divide-y divide-dividerLight"> <div class="container divide-y divide-dividerLight">
<div class="md:grid md:gap-4 md:grid-cols-3"> <div class="md:grid md:gap-4 md:grid-cols-3">
<div class="p-8 md:col-span-1"> <div class="p-8 md:col-span-1">
<h3 class="heading"> <h3 class="heading">
@@ -36,14 +36,6 @@
<SmartAccentModePicker /> <SmartAccentModePicker />
</div> </div>
</section> </section>
<section>
<h4 class="font-semibold text-secondaryDark">
{{ t("settings.font_size") }}
</h4>
<div class="mt-4">
<SmartFontSizePicker />
</div>
</section>
<section> <section>
<h4 class="font-semibold text-secondaryDark"> <h4 class="font-semibold text-secondaryDark">
{{ t("settings.language") }} {{ t("settings.language") }}
@@ -90,14 +82,6 @@
{{ t("settings.sidebar_on_left") }} {{ t("settings.sidebar_on_left") }}
</HoppSmartToggle> </HoppSmartToggle>
</div> </div>
<div class="flex items-center">
<HoppSmartToggle
:on="ZEN_MODE"
@change="toggleSetting('ZEN_MODE')"
>
{{ t("layout.zen_mode") }}
</HoppSmartToggle>
</div>
</div> </div>
</section> </section>
</div> </div>
@@ -178,7 +162,6 @@ const PROXY_URL = useSetting("PROXY_URL")
const TELEMETRY_ENABLED = useSetting("TELEMETRY_ENABLED") const TELEMETRY_ENABLED = useSetting("TELEMETRY_ENABLED")
const EXPAND_NAVIGATION = useSetting("EXPAND_NAVIGATION") const EXPAND_NAVIGATION = useSetting("EXPAND_NAVIGATION")
const SIDEBAR_ON_LEFT = useSetting("SIDEBAR_ON_LEFT") const SIDEBAR_ON_LEFT = useSetting("SIDEBAR_ON_LEFT")
const ZEN_MODE = useSetting("ZEN_MODE")
const confirmRemove = ref(false) const confirmRemove = ref(false)
@@ -186,10 +169,6 @@ const proxySettings = computed(() => ({
url: PROXY_URL.value, url: PROXY_URL.value,
})) }))
watch(ZEN_MODE, (mode) => {
applySetting("EXPAND_NAVIGATION", !mode)
})
watch( watch(
proxySettings, proxySettings,
({ url }) => { ({ url }) => {

View File

@@ -72,7 +72,7 @@ export const twitter: HoppSupportOptionsMenuItem = {
icon: IconTwitter, icon: IconTwitter,
action: { action: {
type: "link", type: "link",
href: "https://hoppscotch.io/discord", href: "https://hoppscotch.io/twitter",
}, },
} }
@@ -84,17 +84,7 @@ export const invite: HoppSupportOptionsMenuItem = {
action: { action: {
type: "custom", type: "custom",
do() { do() {
if (navigator.share) { invokeAction("modals.share.toggle")
navigator
.share({
title: "Hoppscotch",
text: "Hoppscotch • Open source API development ecosystem - Helps you create requests faster, saving precious time on development.",
url: "https://hoppscotch.io",
})
.catch(console.error)
} else {
// fallback
}
}, },
}, },
} }

View File

@@ -14,7 +14,6 @@ import IconGlobe from "~icons/lucide/globe"
import IconMonitor from "~icons/lucide/monitor" import IconMonitor from "~icons/lucide/monitor"
import IconMoon from "~icons/lucide/moon" import IconMoon from "~icons/lucide/moon"
import IconSun from "~icons/lucide/sun" import IconSun from "~icons/lucide/sun"
import IconCircle from "~icons/lucide/circle"
import IconCheckCircle from "~icons/lucide/check-circle" import IconCheckCircle from "~icons/lucide/check-circle"
type Doc = { type Doc = {
@@ -34,7 +33,6 @@ export class SettingsSpotlightSearcherService extends StaticSpotlightSearcherSer
private t = getI18n() private t = getI18n()
private activeFontSize = useSetting("FONT_SIZE")
private activeTheme = useSetting("BG_COLOR") private activeTheme = useSetting("BG_COLOR")
public readonly searcherID = "settings" public readonly searcherID = "settings"
@@ -91,60 +89,7 @@ export class SettingsSpotlightSearcherService extends StaticSpotlightSearcherSer
: markRaw(IconMoon) : markRaw(IconMoon)
), ),
}, },
font_size_sm: {
text: [
this.t("settings.font_size"),
this.t("spotlight.settings.font.size_sm"),
],
onClick: () => {
console.log("clicked")
},
alternates: [
"font size",
"change font size",
"change font",
"increase font",
],
icon: computed(() =>
this.activeFontSize.value === "small"
? markRaw(IconCheckCircle)
: markRaw(IconCircle)
),
},
font_size_md: {
text: [
this.t("settings.font_size"),
this.t("spotlight.settings.font.size_md"),
],
alternates: [
"font size",
"change font size",
"change font",
"increase font",
],
icon: computed(() =>
this.activeFontSize.value === "medium"
? markRaw(IconCheckCircle)
: markRaw(IconCircle)
),
},
font_size_lg: {
text: [
this.t("settings.font_size"),
this.t("spotlight.settings.font.size_lg"),
],
alternates: [
"font size",
"change font size",
"change font",
"increase font",
],
icon: computed(() =>
this.activeFontSize.value === "large"
? markRaw(IconCheckCircle)
: markRaw(IconCircle)
),
},
change_lang: { change_lang: {
text: [ text: [
this.t("spotlight.section.interface"), this.t("spotlight.section.interface"),
@@ -202,17 +147,6 @@ export class SettingsSpotlightSearcherService extends StaticSpotlightSearcherSer
case "theme_black": case "theme_black":
invokeAction("settings.theme.black") invokeAction("settings.theme.black")
break break
// font size actions
case "font_size_sm":
this.activeFontSize.value = "small"
break
case "font_size_md":
this.activeFontSize.value = "medium"
break
case "font_size_lg":
this.activeFontSize.value = "large"
break
} }
} }
} }

View File

@@ -1,8 +1,21 @@
@mixin base-theme { @mixin base-theme {
--font-sans: "Inter Variable", sans-serif; --font-sans: 'Inter Variable', sans-serif;
--font-icon: "Material Symbols Rounded Variable"; --font-icon: 'Material Symbols Rounded Variable';
--font-mono: "Roboto Mono Variable", monospace; --font-mono: 'Roboto Mono Variable', monospace;
--font-size-tiny: calc(var(--font-size-body) - 0.062rem); --font-size-body: 0.75rem;
--font-size-tiny: 0.688rem;
--line-height-body: 1rem;
--upper-primary-sticky-fold: 4.125rem;
--upper-secondary-sticky-fold: 6.188rem;
--upper-tertiary-sticky-fold: 8.25rem;
--upper-mobile-primary-sticky-fold: 6.625rem;
--upper-mobile-secondary-sticky-fold: 8.688rem;
--upper-mobile-sticky-fold: 10.75rem;
--upper-mobile-tertiary-sticky-fold: 8.25rem;
--lower-primary-sticky-fold: 3rem;
--lower-secondary-sticky-fold: 5.063rem;
--lower-tertiary-sticky-fold: 7.125rem;
--sidebar-primary-sticky-fold: 2rem;
} }
@mixin dark-theme { @mixin dark-theme {
@@ -200,8 +213,8 @@
:root { :root {
@include base-theme; @include base-theme;
@include dark-theme; @include dark-theme;
@include green-theme;
@include dark-editor-theme; @include dark-editor-theme;
@include green-theme;
} }
:root.light { :root.light {
@@ -257,63 +270,3 @@
:root[data-accent='yellow'] { :root[data-accent='yellow'] {
@include yellow-theme; @include yellow-theme;
} }
@mixin font-small {
--font-size-body: 0.75rem;
--line-height-body: 1rem;
--upper-primary-sticky-fold: 4.125rem;
--upper-secondary-sticky-fold: 6.188rem;
--upper-tertiary-sticky-fold: 8.25rem;
--upper-mobile-primary-sticky-fold: 6.625rem;
--upper-mobile-secondary-sticky-fold: 8.688rem;
--upper-mobile-sticky-fold: 10.75rem;
--upper-mobile-tertiary-sticky-fold: 8.25rem;
--lower-primary-sticky-fold: 3rem;
--lower-secondary-sticky-fold: 5.063rem;
--lower-tertiary-sticky-fold: 7.125rem;
--sidebar-primary-sticky-fold: 2rem;
}
@mixin font-medium {
--font-size-body: 0.875rem;
--line-height-body: 1.25rem;
--upper-primary-sticky-fold: 4.375rem;
--upper-secondary-sticky-fold: 6.688rem;
--upper-tertiary-sticky-fold: 9rem;
--upper-mobile-primary-sticky-fold: 7.125rem;
--upper-mobile-secondary-sticky-fold: 9.438rem;
--upper-mobile-sticky-fold: 11.75rem;
--upper-mobile-tertiary-sticky-fold: 9rem;
--lower-primary-sticky-fold: 3.25rem;
--lower-secondary-sticky-fold: 5.563rem;
--lower-tertiary-sticky-fold: 7.875rem;
--sidebar-primary-sticky-fold: 2.25rem;
}
@mixin font-large {
--font-size-body: 1rem;
--line-height-body: 1.5rem;
--upper-primary-sticky-fold: 4.625rem;
--upper-secondary-sticky-fold: 7.188rem;
--upper-tertiary-sticky-fold: 9.75rem;
--upper-mobile-primary-sticky-fold: 7.625rem;
--upper-mobile-secondary-sticky-fold: 10.188rem;
--upper-mobile-sticky-fold: 12.75rem;
--upper-mobile-tertiary-sticky-fold: 9.75rem;
--lower-primary-sticky-fold: 3.5rem;
--lower-secondary-sticky-fold: 6.063rem;
--lower-tertiary-sticky-fold: 8.625rem;
--sidebar-primary-sticky-fold: 2.5rem;
}
:root[data-font-size='small'] {
@include font-small;
}
:root[data-font-size='medium'] {
@include font-medium;
}
:root[data-font-size='large'] {
@include font-large;
}

View File

@@ -1,20 +1,17 @@
<!DOCTYPE html> <!DOCTYPE html>
<html lang="en" data-font-size="medium"> <html lang="en">
<head>
<head> <script>
<script> globalThis.import_meta_env = JSON.parse('"import_meta_env_placeholder"');
globalThis.import_meta_env = JSON.parse('"import_meta_env_placeholder"') </script>
</script> <meta charset="UTF-8" />
<meta charset="UTF-8"> <link rel="icon" href="/favicon.ico" />
<link rel="icon" href="/favicon.ico" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Hoppscotch Admin</title>
<title>Hoppscotch Admin</title> <meta property="og:image" content="/cover.jpg" />
<meta property="og:image" content="/cover.jpg" /> </head>
</head> <body>
<div id="app"></div>
<body> <script type="module" src="/src/main.ts"></script>
<div id="app"></div> </body>
<script type="module" src="/src/main.ts"></script> </html>
</body>
</html>

View File

@@ -2,7 +2,20 @@
--font-sans: "Inter Variable", sans-serif; --font-sans: "Inter Variable", sans-serif;
--font-icon: "Material Symbols Rounded Variable"; --font-icon: "Material Symbols Rounded Variable";
--font-mono: "Roboto Mono Variable", monospace; --font-mono: "Roboto Mono Variable", monospace;
--font-size-tiny: calc(var(--font-size-body) - 0.062rem); --font-size-body: 0.75rem;
--font-size-tiny: 0.688rem;
--line-height-body: 1rem;
--upper-primary-sticky-fold: 4.125rem;
--upper-secondary-sticky-fold: 6.188rem;
--upper-tertiary-sticky-fold: 8.25rem;
--upper-mobile-primary-sticky-fold: 6.625rem;
--upper-mobile-secondary-sticky-fold: 8.688rem;
--upper-mobile-sticky-fold: 10.75rem;
--upper-mobile-tertiary-sticky-fold: 8.25rem;
--lower-primary-sticky-fold: 3rem;
--lower-secondary-sticky-fold: 5.063rem;
--lower-tertiary-sticky-fold: 7.125rem;
--sidebar-primary-sticky-fold: 2rem;
} }
@mixin dark-theme { @mixin dark-theme {
@@ -200,8 +213,8 @@
:root { :root {
@include base-theme; @include base-theme;
@include dark-theme; @include dark-theme;
@include green-theme;
@include dark-editor-theme; @include dark-editor-theme;
@include green-theme;
} }
:root.light { :root.light {
@@ -257,63 +270,3 @@
:root[data-accent="yellow"] { :root[data-accent="yellow"] {
@include yellow-theme; @include yellow-theme;
} }
@mixin font-small {
--font-size-body: 0.75rem;
--line-height-body: 1rem;
--upper-primary-sticky-fold: 4.125rem;
--upper-secondary-sticky-fold: 6.188rem;
--upper-tertiary-sticky-fold: 8.25rem;
--upper-mobile-primary-sticky-fold: 6.625rem;
--upper-mobile-secondary-sticky-fold: 8.688rem;
--upper-mobile-sticky-fold: 10.75rem;
--upper-mobile-tertiary-sticky-fold: 8.25rem;
--lower-primary-sticky-fold: 3rem;
--lower-secondary-sticky-fold: 5.063rem;
--lower-tertiary-sticky-fold: 7.125rem;
--sidebar-primary-sticky-fold: 2rem;
}
@mixin font-medium {
--font-size-body: 0.875rem;
--line-height-body: 1.25rem;
--upper-primary-sticky-fold: 4.375rem;
--upper-secondary-sticky-fold: 6.688rem;
--upper-tertiary-sticky-fold: 9rem;
--upper-mobile-primary-sticky-fold: 7.125rem;
--upper-mobile-secondary-sticky-fold: 9.438rem;
--upper-mobile-sticky-fold: 11.75rem;
--upper-mobile-tertiary-sticky-fold: 9rem;
--lower-primary-sticky-fold: 3.25rem;
--lower-secondary-sticky-fold: 5.563rem;
--lower-tertiary-sticky-fold: 7.875rem;
--sidebar-primary-sticky-fold: 2.25rem;
}
@mixin font-large {
--font-size-body: 1rem;
--line-height-body: 1.5rem;
--upper-primary-sticky-fold: 4.625rem;
--upper-secondary-sticky-fold: 7.188rem;
--upper-tertiary-sticky-fold: 9.75rem;
--upper-mobile-primary-sticky-fold: 7.625rem;
--upper-mobile-secondary-sticky-fold: 10.188rem;
--upper-mobile-sticky-fold: 12.75rem;
--upper-mobile-tertiary-sticky-fold: 9.75rem;
--lower-primary-sticky-fold: 3.5rem;
--lower-secondary-sticky-fold: 6.063rem;
--lower-tertiary-sticky-fold: 8.625rem;
--sidebar-primary-sticky-fold: 2.5rem;
}
:root[data-font-size="small"] {
@include font-small;
}
:root[data-font-size="medium"] {
@include font-medium;
}
:root[data-font-size="large"] {
@include font-large;
}