mirror of
https://github.com/louislam/uptime-kuma.git
synced 2025-05-20 06:02:33 +02:00
Merge branch 'master' into smtp
This commit is contained in:
commit
2619d4021b
76 changed files with 4772 additions and 1511 deletions
75
.github/ISSUE_TEMPLATE/ask-for-help.yaml
vendored
75
.github/ISSUE_TEMPLATE/ask-for-help.yaml
vendored
|
@ -1,75 +0,0 @@
|
|||
name: "❓ Ask for help"
|
||||
description: "Submit any question related to Uptime Kuma"
|
||||
#title: "[Help] "
|
||||
labels: [help]
|
||||
body:
|
||||
- type: checkboxes
|
||||
id: no-duplicate-issues
|
||||
attributes:
|
||||
label: "⚠️ Please verify that this question has NOT been raised before."
|
||||
description: "Search in the issues sections by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=)"
|
||||
options:
|
||||
- label: "I checked and didn't find similar issue"
|
||||
required: true
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: "🛡️ Security Policy"
|
||||
description: Please review the security policy before reporting security related issues/bugs.
|
||||
options:
|
||||
- label: I agree to have read this project [Security Policy](https://github.com/louislam/uptime-kuma/security/policy)
|
||||
required: true
|
||||
- type: textarea
|
||||
id: steps-to-reproduce
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: "📝 Describe your problem"
|
||||
description: "Please walk us through it step by step. Include all important details and add screenshots where appropriate"
|
||||
placeholder: "Describe what are you asking for..."
|
||||
- type: textarea
|
||||
id: error-msg
|
||||
validations:
|
||||
required: false
|
||||
attributes:
|
||||
label: "📝 Error Message(s) or Log"
|
||||
- type: input
|
||||
id: uptime-kuma-version
|
||||
attributes:
|
||||
label: "🐻 Uptime-Kuma Version"
|
||||
description: "Which version of Uptime-Kuma are you running? Please do NOT provide the docker tag such as latest or 1"
|
||||
placeholder: "Ex. 1.10.0"
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: operating-system
|
||||
attributes:
|
||||
label: "💻 Operating System and Arch"
|
||||
description: "Which OS is your server/device running on? (For Replit, please do not report this bug)"
|
||||
placeholder: "Ex. Ubuntu 20.04 x86"
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: browser-vendor
|
||||
attributes:
|
||||
label: "🌐 Browser"
|
||||
description: "Which browser are you running on? (For Replit, please do not report this bug)"
|
||||
placeholder: "Ex. Google Chrome 95.0.4638.69"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: deployment-info
|
||||
attributes:
|
||||
label: "🖥️ Deployment Environment"
|
||||
description: |
|
||||
examples:
|
||||
- **Runtime**: Docker 20.10.9 / nodejs 14.18.0 / K8S via ... v1.3.3 / ..
|
||||
- **Database**: sqlite/embedded mariadb/external mariadb
|
||||
- **Filesystem used to store the database on**: Windows/ZFS/btrfs/NFSv3 on a SSD/HDD/eMMC
|
||||
- **number of monitors**: 42
|
||||
value: |
|
||||
- Runtime:
|
||||
- Database:
|
||||
- Filesystem used to store the database on:
|
||||
- number of monitors:
|
||||
validations:
|
||||
required: true
|
120
.github/ISSUE_TEMPLATE/ask_for_help.yml
vendored
Normal file
120
.github/ISSUE_TEMPLATE/ask_for_help.yml
vendored
Normal file
|
@ -0,0 +1,120 @@
|
|||
---
|
||||
name: ❓ Ask for help
|
||||
description: |
|
||||
Submit any question related to Uptime Kuma
|
||||
#title: "[Help]"
|
||||
labels: ["help", "P3-low"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
🚫 **We kindly ask you to refrain from pinging maintainers unless absolutely necessary. Pings are reserved for critical/urgent issues that require immediate attention.**
|
||||
|
||||
**Why**: Reserving pings for urgent matters ensures maintainers can prioritize critical tasks effectively
|
||||
|
||||
- type: checkboxes
|
||||
id: no-duplicate-question
|
||||
attributes:
|
||||
label: ⚠️ Please verify that your question has not already been reported
|
||||
description: |
|
||||
To avoid duplicate reports, please search for any existing issues before submitting a new one. You can find the list of existing issues **[HERE](https://github.com/louislam/uptime-kuma/issues?q=is%3Aissue%20sort%3Acreated-desc%20)**.
|
||||
options:
|
||||
- label: |
|
||||
I have searched the [existing issues](https://github.com/louislam/uptime-kuma/issues?q=is%3Aissue%20sort%3Acreated-desc%20) and found no similar reports.
|
||||
required: true
|
||||
|
||||
- type: checkboxes
|
||||
id: security-policy
|
||||
attributes:
|
||||
label: 🛡️ Security Policy
|
||||
description: |
|
||||
Please review and acknowledge the Security Policy before reporting any security-related issues or bugs. You can find the full Security Policy **[HERE](https://github.com/louislam/uptime-kuma/security/policy)**.
|
||||
options:
|
||||
- label: |
|
||||
I have read and agree to Uptime Kuma's [Security Policy](https://github.com/louislam/uptime-kuma/security/policy).
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: steps-to-reproduce
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: 📝 Describe your problem
|
||||
description: |
|
||||
Please walk us through it step by step. Include all important details and add screenshots where appropriate
|
||||
placeholder: |
|
||||
Describe what are you asking for ...
|
||||
|
||||
- type: textarea
|
||||
id: error-msg
|
||||
attributes:
|
||||
label: 📝 Error Message(s) or Log
|
||||
description: |
|
||||
Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||
render: bash session
|
||||
validations:
|
||||
required: false
|
||||
|
||||
- type: input
|
||||
id: uptime-kuma-version
|
||||
attributes:
|
||||
label: 🐻 Uptime-Kuma Version
|
||||
description: |
|
||||
What version of Uptime-Kuma are you running? Please do not provide Docker tags like `latest` or `1`.
|
||||
placeholder: |
|
||||
e.g., 1.23.16 or 2.0.0-beta.2
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: operating-system
|
||||
attributes:
|
||||
label: 💻 Operating System and Arch
|
||||
description: |
|
||||
Which OS is your server/device running on? (For Replit, please do not report this bug)
|
||||
placeholder: |
|
||||
e.g., Ubuntu Server 24.04.2 LTS (GNU/Linux 6.8.0-55-generic x86_64)
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: browser-vendor
|
||||
attributes:
|
||||
label: 🌐 Browser
|
||||
description: |
|
||||
Which browser are you running on? (For Replit, please do not report this bug)
|
||||
placeholder: |
|
||||
e.g., Google Chrome 134.0.6998.183 (Official Build) (64-bit)
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: deployment-info
|
||||
attributes:
|
||||
label: 🖥️ Deployment Environment
|
||||
description: |
|
||||
Provide details about the deployment environment, including runtime components, databases, and storage configurations. This will
|
||||
help assess the infrastructure and identify any potential compatibility requirements.
|
||||
|
||||
**Remove any fields that do not apply to your setup.**
|
||||
value: |
|
||||
- **Runtime Environment**:
|
||||
- Docker: Version `X.X.X` (Build `Y.Y.Y`)
|
||||
- Docker Compose: Version `X.X.X`
|
||||
- Portainer (BE/CE): Version `X.X.X` (LTS: Yes/No)
|
||||
- MariaDB: Version `X.X.X` (LTS: Yes/No)
|
||||
- Node.js: Version `X.X.X` (LTS: Yes/No)
|
||||
- Kubernetes (K3S/K8S): Version `X.X.X` (LTS: Yes/No, via `[method/tool]`)
|
||||
- **Database**:
|
||||
- SQLite: Embedded
|
||||
- MariaDB: Embedded/External
|
||||
- **Database Storage**:
|
||||
- **Filesystem**:
|
||||
- Linux: ext4/XFS/Btrfs/ZFS/F2FS
|
||||
- macOS: APFS/ HFS+
|
||||
- Windows: NTFS/ReFS
|
||||
- **Storage Medium**: HDD/eMMC/SSD/NVMe
|
||||
- **Uptime Kuma Setup**:
|
||||
- Number of monitors: `X`
|
||||
validations:
|
||||
required: true
|
100
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
100
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
|
@ -1,100 +0,0 @@
|
|||
name: "🐛 Bug Report"
|
||||
description: "Submit a bug report to help us improve"
|
||||
#title: "[Bug] "
|
||||
labels: [bug]
|
||||
body:
|
||||
- type: textarea
|
||||
id: related-issues
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: "📑 I have found these related issues/pull requests"
|
||||
description: "Search related issues by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=) and explain what the difference between them or explain that you are unable to find any related issues"
|
||||
placeholder: "Related to #1 by also touching the ... system. They should not be merged because ..."
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: "🛡️ Security Policy"
|
||||
description: Please review the security policy before reporting security related issues/bugs.
|
||||
options:
|
||||
- label: I agree to have read this project [Security Policy](https://github.com/louislam/uptime-kuma/security/policy)
|
||||
required: true
|
||||
- type: textarea
|
||||
id: description
|
||||
validations:
|
||||
required: false
|
||||
attributes:
|
||||
label: "Description"
|
||||
description: "You could also upload screenshots"
|
||||
- type: textarea
|
||||
id: steps-to-reproduce
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: "👟 Reproduction steps"
|
||||
description: "How do you trigger this bug? Please walk us through it step by step. Include all important details and add screenshots where appropriate"
|
||||
placeholder: "..."
|
||||
- type: textarea
|
||||
id: expected-behavior
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: "👀 Expected behavior"
|
||||
description: "What did you think would happen?"
|
||||
placeholder: "..."
|
||||
- type: textarea
|
||||
id: actual-behavior
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: "😓 Actual Behavior"
|
||||
description: "What actually happen?"
|
||||
placeholder: "..."
|
||||
- type: input
|
||||
id: uptime-kuma-version
|
||||
attributes:
|
||||
label: "🐻 Uptime-Kuma Version"
|
||||
description: "Which version of Uptime-Kuma are you running? Please do NOT provide the docker tag such as latest or 1"
|
||||
placeholder: "Ex. 1.10.0"
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: operating-system
|
||||
attributes:
|
||||
label: "💻 Operating System and Arch"
|
||||
description: "Which OS is your server/device running on? (For Replit, please do not report this bug)"
|
||||
placeholder: "Ex. Ubuntu 20.04 x64 "
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: browser-vendor
|
||||
attributes:
|
||||
label: "🌐 Browser"
|
||||
description: "Which browser are you running on?"
|
||||
placeholder: "Ex. Google Chrome 95.0.4638.69"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: deployment-info
|
||||
attributes:
|
||||
label: "🖥️ Deployment Environment"
|
||||
description: |
|
||||
examples:
|
||||
- **Runtime**: Docker 20.10.9 / nodejs 18.17.1 / K8S via ... v1.3.3 / ..
|
||||
- **Database**: sqlite/embedded mariadb/external mariadb
|
||||
- **Filesystem used to store the database on**: Windows/ZFS/btrfs/NFSv3 on a SSD/HDD/eMMC
|
||||
- **number of monitors**: 42
|
||||
value: |
|
||||
- Runtime:
|
||||
- Database:
|
||||
- Filesystem used to store the database on:
|
||||
- number of monitors:
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: "📝 Relevant log output"
|
||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||
render: shell
|
||||
validations:
|
||||
required: false
|
154
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
154
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
|
@ -0,0 +1,154 @@
|
|||
---
|
||||
name: 🐛 Bug Report
|
||||
description: |
|
||||
Submit a bug report to help us improve
|
||||
#title: "[Bug]"
|
||||
labels: ["bug", "P2-medium"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
🚫 **We kindly ask you to refrain from pinging maintainers unless absolutely necessary. Pings are reserved for critical/urgent issues that require immediate attention.**
|
||||
|
||||
**Why**: Reserving pings for urgent matters ensures maintainers can prioritize critical tasks effectively
|
||||
|
||||
- type: textarea
|
||||
id: related-issues
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: 📑 I have found these related issues/pull requests
|
||||
description: |
|
||||
Please search for related **[ISSUES](https://github.com/louislam/uptime-kuma/issues?q=is%3Aissue%20sort%3Acreated-desc)**
|
||||
and **[PULL REQUESTS](https://github.com/louislam/uptime-kuma/pulls?q=is%3Apr+sort%3Acreated-desc+)**.
|
||||
Explain the differences between them or clarify if you were unable to find any related issues/pull requests.
|
||||
placeholder: |
|
||||
Example: This relates to issue #1, which also affects the ... system. It should not be merged because ...
|
||||
|
||||
- type: checkboxes
|
||||
id: security-policy
|
||||
attributes:
|
||||
label: 🛡️ Security Policy
|
||||
description: |
|
||||
Please review and acknowledge the Security Policy before reporting any security-related issues or bugs. You can find the full Security Policy **[HERE](https://github.com/louislam/uptime-kuma/security/policy)**.
|
||||
options:
|
||||
- label: |
|
||||
I have read and agree to Uptime Kuma's [Security Policy](https://github.com/louislam/uptime-kuma/security/policy).
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: description
|
||||
validations:
|
||||
required: false
|
||||
attributes:
|
||||
label: 📝 Description
|
||||
description: |
|
||||
You could also upload screenshots
|
||||
|
||||
- type: textarea
|
||||
id: steps-to-reproduce
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: 👟 Reproduction steps
|
||||
description: |
|
||||
How do you trigger this bug? Please walk us through it step by step. Include all important details and add screenshots where appropriate
|
||||
placeholder: |
|
||||
...
|
||||
|
||||
- type: textarea
|
||||
id: expected-behavior
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: 👀 Expected behavior
|
||||
description: |
|
||||
What did you think would happen?
|
||||
placeholder: |
|
||||
...
|
||||
|
||||
- type: textarea
|
||||
id: actual-behavior
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: 😓 Actual Behavior
|
||||
description: |
|
||||
What actually happen?
|
||||
placeholder: |
|
||||
...
|
||||
|
||||
- type: input
|
||||
id: uptime-kuma-version
|
||||
attributes:
|
||||
label: 🐻 Uptime-Kuma Version
|
||||
description: |
|
||||
What version of Uptime-Kuma are you running? Please do not provide Docker tags like `latest` or `1`.
|
||||
placeholder: |
|
||||
e.g., 1.23.16 or 2.0.0-beta.2
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: operating-system
|
||||
attributes:
|
||||
label: 💻 Operating System and Arch
|
||||
description: |
|
||||
Which OS is your server/device running on? (For Replit, please do not
|
||||
report this bug)
|
||||
placeholder: |
|
||||
e.g., Ubuntu Server 24.04.2 LTS (GNU/Linux 6.8.0-55-generic x86_64)
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: input
|
||||
id: browser-vendor
|
||||
attributes:
|
||||
label: 🌐 Browser
|
||||
description: |
|
||||
Which browser are you running on?
|
||||
placeholder: |
|
||||
e.g., Google Chrome 134.0.6998.183 (Official Build) (64-bit)
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: deployment-info
|
||||
attributes:
|
||||
label: 🖥️ Deployment Environment
|
||||
description: |
|
||||
Provide details about the deployment environment, including runtime components, databases, and storage configurations. This will
|
||||
help assess the infrastructure and identify any potential compatibility requirements.
|
||||
|
||||
**Remove any fields that do not apply to your setup.**
|
||||
value: |
|
||||
- **Runtime Environment**:
|
||||
- Docker: Version `X.X.X` (Build `Y.Y.Y`)
|
||||
- Docker Compose: Version `X.X.X`
|
||||
- Portainer (BE/CE): Version `X.X.X` (LTS: Yes/No)
|
||||
- MariaDB: Version `X.X.X` (LTS: Yes/No)
|
||||
- Node.js: Version `X.X.X` (LTS: Yes/No)
|
||||
- Kubernetes (K3S/K8S): Version `X.X.X` (LTS: Yes/No, via `[method/tool]`)
|
||||
- **Database**:
|
||||
- SQLite: Embedded
|
||||
- MariaDB: Embedded/External
|
||||
- **Database Storage**:
|
||||
- **Filesystem**:
|
||||
- Linux: ext4/XFS/Btrfs/ZFS/F2FS
|
||||
- macOS: APFS/ HFS+
|
||||
- Windows: NTFS/ReFS
|
||||
- **Storage Medium**: HDD/eMMC/SSD/NVMe
|
||||
- **Uptime Kuma Setup**:
|
||||
- Number of monitors: `X`
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: 📝 Relevant log output
|
||||
description: |
|
||||
Please copy and paste any relevant log output. This will be automatically formatted into code, so no need for backticks.
|
||||
render: bash session
|
||||
validations:
|
||||
required: false
|
66
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
66
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
|
@ -1,66 +0,0 @@
|
|||
name: 🚀 Feature Request
|
||||
description: "Submit a proposal for a new feature"
|
||||
#title: "[Feature] "
|
||||
labels: [feature-request]
|
||||
body:
|
||||
- type: textarea
|
||||
id: related-issues
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: "📑 I have found these related issues/pull requests"
|
||||
description: "Search related issues by clicking [HERE](https://github.com/louislam/uptime-kuma/issues?q=) and explain what the difference between them or explain that you are unable to find any related issues"
|
||||
placeholder: "Related to #1 by also touching the ... system. They should not be merged because ..."
|
||||
- type: dropdown
|
||||
id: feature-area
|
||||
attributes:
|
||||
label: "🏷️ Feature Request Type"
|
||||
description: "What kind of feature request is this?"
|
||||
multiple: true
|
||||
options:
|
||||
- API / automation options
|
||||
- New notification-provider
|
||||
- Change to existing notification-provider
|
||||
- New monitor
|
||||
- Change to existing monitor
|
||||
- Dashboard
|
||||
- Status-page
|
||||
- Maintenance
|
||||
- Deployment
|
||||
- Certificate expiry
|
||||
- Settings
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: feature-description
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: "🔖 Feature description"
|
||||
description: "A clear and concise description of what the feature request is."
|
||||
placeholder: "You should add ..."
|
||||
- type: textarea
|
||||
id: solution
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: "✔️ Solution"
|
||||
description: "A clear and concise description of what you want to happen."
|
||||
placeholder: "In my use-case, ..."
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
validations:
|
||||
required: false
|
||||
attributes:
|
||||
label: "❓ Alternatives"
|
||||
description: "A clear and concise description of any alternative solutions or features you've considered."
|
||||
placeholder: "I have considered ..."
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
validations:
|
||||
required: false
|
||||
attributes:
|
||||
label: "📝 Additional Context"
|
||||
description: "Add any other context or screenshots about the feature request here."
|
||||
placeholder: "..."
|
106
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
106
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
Normal file
|
@ -0,0 +1,106 @@
|
|||
---
|
||||
name: 🚀 Feature Request
|
||||
description: |
|
||||
Submit a proposal for a new feature
|
||||
# title: "[Feature]"
|
||||
labels: ["feature-request", "P3-low"]
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
## ❗Important Announcement
|
||||
|
||||
### 🚧 Temporary Delay in Feature Requests and Pull Request Reviews
|
||||
|
||||
**At this time, we may be slower to respond to new feature requests and review pull requests. Existing requests and PRs will remain in the backlog but may not be prioritized immediately.**
|
||||
|
||||
- **Reason**: Our current focus is on addressing bugs, improving system performance, and implementing essential updates. This will help stabilize the project and ensure smoother management.
|
||||
- **Impact**: While no new feature requests or pull requests are being outright rejected, there may be significant delays in reviews. We encourage the community to help by reviewing PRs or assisting other users in the meantime.
|
||||
- **What You Can Do**: If you're interested in contributing, reviewing open PRs by following our [Review Guidelines](https://github.com/louislam/uptime-kuma/blob/master/.github/REVIEW_GUIDELINES.md) or offering help to other users is greatly appreciated. All feature requests and PRs will be revisited once the suspension period is lifted.
|
||||
|
||||
We appreciate your patience and understanding as we continue to improve Uptime Kuma.
|
||||
|
||||
### 🚫 Please Avoid Unnecessary Pinging of Maintainers
|
||||
|
||||
**We kindly ask you to refrain from pinging maintainers unless absolutely necessary. Pings are reserved for critical/urgent pull requests that require immediate attention.**
|
||||
|
||||
**Why**: Reserving pings for urgent matters ensures maintainers can prioritize critical tasks effectively.
|
||||
- type: textarea
|
||||
id: related-issues
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: 📑 I have found these related issues/pull requests
|
||||
description: |
|
||||
Please search for related **[ISSUES](https://github.com/louislam/uptime-kuma/issues?q=is%3Aissue%20sort%3Acreated-desc)**
|
||||
and **[PULL REQUESTS](https://github.com/louislam/uptime-kuma/pulls?q=is%3Apr+sort%3Acreated-desc+)**.
|
||||
Explain the differences between them or clarify if you were unable to find any related issues/pull requests.
|
||||
placeholder: |
|
||||
Example: This relates to issue #1, which also affects the ... system. It should not be merged because ...
|
||||
|
||||
- type: dropdown
|
||||
id: feature-area
|
||||
attributes:
|
||||
label: 🏷️ Feature Request Type
|
||||
description: |
|
||||
What kind of feature request is this?
|
||||
multiple: true
|
||||
options:
|
||||
- API / automation options
|
||||
- New notification-provider
|
||||
- Change to existing notification-provider
|
||||
- New monitor
|
||||
- Change to existing monitor
|
||||
- Dashboard
|
||||
- Status-page
|
||||
- Maintenance
|
||||
- Deployment
|
||||
- Certificate expiry
|
||||
- Settings
|
||||
- Other
|
||||
validations:
|
||||
required: true
|
||||
|
||||
- type: textarea
|
||||
id: feature-description
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: 🔖 Feature description
|
||||
description: |
|
||||
A clear and concise description of what the feature request is.
|
||||
placeholder: |
|
||||
You should add ...
|
||||
|
||||
- type: textarea
|
||||
id: solution
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: ✔️ Solution
|
||||
description: |
|
||||
A clear and concise description of what you want to happen.
|
||||
placeholder: |
|
||||
In my use-case, ...
|
||||
|
||||
- type: textarea
|
||||
id: alternatives
|
||||
validations:
|
||||
required: false
|
||||
attributes:
|
||||
label: ❓ Alternatives
|
||||
description: |
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
placeholder: |
|
||||
I have considered ...
|
||||
|
||||
- type: textarea
|
||||
id: additional-context
|
||||
validations:
|
||||
required: false
|
||||
attributes:
|
||||
label: 📝 Additional Context
|
||||
description: |
|
||||
Add any other context or screenshots about the feature request here.
|
||||
placeholder: |
|
||||
...
|
16
.github/ISSUE_TEMPLATE/security_issue.yml
vendored
16
.github/ISSUE_TEMPLATE/security_issue.yml
vendored
|
@ -1,19 +1,19 @@
|
|||
---
|
||||
name: "🛡️ Security Issue"
|
||||
name: 🛡️ Security Issue
|
||||
description: |
|
||||
Notify Louis Lam about a security concern. Please do NOT include any sensitive details in this issue.
|
||||
# title: "Security Issue"
|
||||
labels: [security]
|
||||
labels: ["security", "P1-high"]
|
||||
assignees: [louislam]
|
||||
body:
|
||||
- type: "markdown"
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
## **⚠️ Report a Security Vulnerability**
|
||||
## ❗ IMPORTANT: DO NOT SHARE VULNERABILITY DETAILS HERE
|
||||
|
||||
### **IMPORTANT: DO NOT SHARE VULNERABILITY DETAILS HERE**
|
||||
### ⚠️ Report a Security Vulnerability
|
||||
|
||||
If you have discovered a security vulnerability, please report it securely using the GitHub Security Advisory.
|
||||
**If you have discovered a security vulnerability, please report it securely using the GitHub Security Advisory.**
|
||||
|
||||
**Note**: This issue is only for notifying the maintainers of the repository, as the GitHub Security Advisory does not automatically send notifications.
|
||||
|
||||
|
@ -34,12 +34,12 @@ body:
|
|||
|
||||
Once you've created your advisory, please share the URL below. This will notify Louis Lam and enable them to take the appropriate action.
|
||||
|
||||
- type: "textarea"
|
||||
- type: textarea
|
||||
id: github-advisory-url
|
||||
validations:
|
||||
required: true
|
||||
attributes:
|
||||
label: "GitHub Advisory URL for @louislam"
|
||||
label: GitHub Advisory URL for @louislam
|
||||
placeholder: |
|
||||
Please paste the GitHub Advisory URL here. Only the URL is required.
|
||||
Example: https://github.com/louislam/uptime-kuma/security/advisories/GHSA-8h5r-7t6l-q3kz
|
||||
|
|
135
.github/PULL_REQUEST_TEMPLATE.md
vendored
135
.github/PULL_REQUEST_TEMPLATE.md
vendored
|
@ -1,33 +1,122 @@
|
|||
⚠️⚠️⚠️ Since we do not accept all types of pull requests and do not want to waste your time. Please be sure that you have read pull request rules:
|
||||
https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md#can-i-create-a-pull-request-for-uptime-kuma
|
||||
**⚠️ Please Note: We do not accept all types of pull requests, and we want to ensure we don’t waste your time. Before submitting, make sure you have read our pull request guidelines: [Pull Request Rules](https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md#can-i-create-a-pull-request-for-uptime-kuma)**
|
||||
|
||||
Tick the checkbox if you understand [x]:
|
||||
- [ ] I have read and understand the pull request rules.
|
||||
## ❗ Important Announcement
|
||||
|
||||
# Description
|
||||
<details><summary>Click here for more details:</summary>
|
||||
</p>
|
||||
|
||||
Fixes #(issue)
|
||||
### 🚧 Temporary Delay in Feature Requests and Pull Request Reviews
|
||||
|
||||
## Type of change
|
||||
**At this time, we may be slower to respond to new feature requests and review pull requests. Existing requests and PRs will remain in the backlog but may not be prioritized immediately.**
|
||||
|
||||
Please delete any options that are not relevant.
|
||||
- **Reason**: Our current focus is on addressing bugs, improving system performance, and implementing essential updates. This will help stabilize the project and ensure smoother management.
|
||||
- **Impact**: While no new feature requests or pull requests are being outright rejected, there may be significant delays in reviews. We encourage the community to help by reviewing PRs or assisting other users in the meantime.
|
||||
- **What You Can Do**: If you're interested in contributing, reviewing open PRs by following our [Review Guidelines](https://github.com/louislam/uptime-kuma/blob/master/.github/REVIEW_GUIDELINES.md) or offering support to other users is greatly appreciated. All feature requests and PRs will be revisited once the suspension period is lifted.
|
||||
|
||||
- Bug fix (non-breaking change which fixes an issue)
|
||||
- User interface (UI)
|
||||
- New feature (non-breaking change which adds functionality)
|
||||
- Breaking change (a fix or feature that would cause existing functionality to not work as expected)
|
||||
- Other
|
||||
- This change requires a documentation update
|
||||
We appreciate your patience and understanding as we continue to improve Uptime Kuma.
|
||||
|
||||
## Checklist
|
||||
### 🚫 Please Avoid Unnecessary Pinging of Maintainers
|
||||
|
||||
- [ ] My code follows the style guidelines of this project
|
||||
- [ ] I ran ESLint and other linters for modified files
|
||||
- [ ] I have performed a self-review of my own code and tested it
|
||||
- [ ] I have commented my code, particularly in hard-to-understand areas (including JSDoc for methods)
|
||||
- [ ] My changes generates no new warnings
|
||||
- [ ] My code needed automated testing. I have added them (this is optional task)
|
||||
**We kindly ask you to refrain from pinging maintainers unless absolutely necessary. Pings are reserved for critical/urgent pull requests that require immediate attention.**
|
||||
|
||||
## Screenshots (if any)
|
||||
**Why**: Reserving pings for urgent matters ensures maintainers can prioritize critical tasks effectively.
|
||||
|
||||
Please do not use any external image service. Instead, just paste in or drag and drop the image here, and it will be uploaded automatically.
|
||||
</p>
|
||||
</details>
|
||||
|
||||
## 📋 Overview
|
||||
|
||||
Provide a clear summary of the purpose and scope of this pull request:
|
||||
|
||||
- **What problem does this pull request address?**
|
||||
|
||||
- Please provide a detailed explanation here.
|
||||
|
||||
- **What features or functionality does this pull request introduce or enhance?**
|
||||
|
||||
- Please provide a detailed explanation here.
|
||||
|
||||
## 🔄 Changes
|
||||
|
||||
### 🛠️ Type of change
|
||||
|
||||
<!-- Please select all options that apply -->
|
||||
|
||||
- [ ] 🐛 Bugfix (a non-breaking change that resolves an issue)
|
||||
- [ ] ✨ New feature (a non-breaking change that adds new functionality)
|
||||
- [ ] ⚠️ Breaking change (a fix or feature that alters existing functionality in a way that could cause issues)
|
||||
- [ ] 🎨 User Interface (UI) updates
|
||||
- [ ] 📄 New Documentation (addition of new documentation)
|
||||
- [ ] 📄 Documentation Update (modification of existing documentation)
|
||||
- [ ] 📄 Documentation Update Required (the change requires updates to related documentation)
|
||||
- [ ] 🔧 Other (please specify):
|
||||
- Provide additional details here.
|
||||
|
||||
## 🔗 Related Issues
|
||||
|
||||
<!--
|
||||
Please link any GitHub issues or tasks that this pull request addresses. Use the appropriate issue numbers or links.
|
||||
|
||||
**Note**: Include only issues directly related to this PR. Remove any irrelevant reference.
|
||||
-->
|
||||
|
||||
- Relates to #issue-number
|
||||
- Resolves #issue-number
|
||||
- Fixes #issue-number
|
||||
|
||||
## 📄 Checklist *
|
||||
|
||||
<!-- Please select all options that apply -->
|
||||
|
||||
- [ ] 🔍 My code adheres to the style guidelines of this project.
|
||||
- [ ] ✅ I ran ESLint and other code linters for modified files.
|
||||
- [ ] 🛠️ I have reviewed and tested my code.
|
||||
- [ ] 📝 I have commented my code, especially in hard-to-understand areas (e.g., using JSDoc for methods).
|
||||
- [ ] ⚠️ My changes generate no new warnings.
|
||||
- [ ] 🤖 My code needed automated testing. I have added them (this is an optional task).
|
||||
- [ ] 📄 Documentation updates are included (if applicable).
|
||||
- [ ] 🔒 I have considered potential security impacts and mitigated risks.
|
||||
- [ ] 🧰 Dependency updates are listed and explained.
|
||||
- [ ] 📚 I have read and understood the [Pull Request guidelines](https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md#recommended-pull-request-guideline).
|
||||
|
||||
## 📷 Screenshots or Visual Changes
|
||||
|
||||
<!--
|
||||
Please upload the image directly here by pasting it or dragging and dropping. Avoid using external image services as the image will be uploaded automatically.
|
||||
|
||||
If this pull request introduces visual changes, please provide the following details.
|
||||
If not, remove this section.
|
||||
-->
|
||||
|
||||
- **UI Modifications**: Highlight any changes made to the user interface.
|
||||
- **Before & After**: Include screenshots or comparisons (if applicable).
|
||||
|
||||
| Event | Before | After |
|
||||
| ------------------ | --------------------- | -------------------- |
|
||||
| `UP` |  |  |
|
||||
| `DOWN` |  |  |
|
||||
| Certificate-expiry |  |  |
|
||||
| Testing |  |  |
|
||||
|
||||
## ℹ️ Additional Context
|
||||
|
||||
Provide any relevant details to assist reviewers in understanding the changes.
|
||||
|
||||
<details><summary>Click here for more details:</summary>
|
||||
</p>
|
||||
|
||||
**Key Considerations**:
|
||||
|
||||
- **Design decisions** – Key choices or trade-offs made during development.
|
||||
- **Alternative solutions** – Approaches considered but not implemented, along with reasons.
|
||||
- **Relevant links** – Specifications, discussions, or resources that provide context.
|
||||
- **Dependencies** – Related pull requests or issues that must be resolved before merging.
|
||||
- **Additional context** – Any other details that may help reviewers understand the changes.
|
||||
|
||||
Provide details here
|
||||
|
||||
## 💬 Requested Feedback
|
||||
|
||||
<!-- If a part of our docs is unclear, you are unsure how to do something/.. this is where we would appreciate your feedback -->
|
||||
|
||||
- `Mention documents needing feedback here`
|
||||
|
|
224
.github/REVIEW_GUIDELINES.md
vendored
Normal file
224
.github/REVIEW_GUIDELINES.md
vendored
Normal file
|
@ -0,0 +1,224 @@
|
|||
# Uptime Kuma Review Guidelines
|
||||
|
||||
> [!NOTE]
|
||||
> These review guidelines are a work in progress, and are frequently
|
||||
> updated and improved, so please check back frequently for the latest version.
|
||||
|
||||
## Preparing for a PR Review
|
||||
|
||||
### Read the PR description carefully
|
||||
|
||||
Make sure you understand what the PR is trying to solve or implement. This could
|
||||
be a bug fix, a new feature, or a refactor.
|
||||
|
||||
### Check the linked issues
|
||||
|
||||
If the PR has a linked issue, read it to better understand the context and the
|
||||
reason for the change.
|
||||
|
||||
### Check the test coverage
|
||||
|
||||
Make sure relevant tests have been added or modified. If the PR adds new
|
||||
functionality, there should be tests covering the change.
|
||||
|
||||
## General Review
|
||||
|
||||
### Code formatting and style
|
||||
|
||||
Check if the code adheres to the style guidelines of the project. Make sure
|
||||
there are no unused imports, variables, `console.log` for debugging in the PR.
|
||||
|
||||
- [Project Style](../CONTRIBUTING.md#project-styles)
|
||||
- [Coding Style](../CONTRIBUTING.md#coding-styles)
|
||||
|
||||
### Readability and maintainability
|
||||
|
||||
Is the code easy to understand for other developers? Make sure complex parts are
|
||||
explained with comments about **_why_** something is done, and use clear names
|
||||
to show **_how_**. Are variables and functions well-named, and is there a
|
||||
consistent naming style? Also, check if the code is maintainable:
|
||||
|
||||
- Is it unnecessarily complex? Could it be simplified?
|
||||
- Does it follow the **[Single Responsibility Principle (SRP)]**?
|
||||
|
||||
[Single Responsibility Principle (SRP)]: https://www.geeksforgeeks.org/single-responsibility-in-solid-design-principle/
|
||||
|
||||
### Documentation
|
||||
|
||||
Is the PR well documented? Check if the descriptions of functions, parameters,
|
||||
and return values are present. Are there any changes needed to the README or
|
||||
other documentation, for example, if new features or configurations are
|
||||
introduced?
|
||||
|
||||
## Functional Review
|
||||
|
||||
### Testing
|
||||
|
||||
Ensure that the new code is properly tested. This includes unit tests,
|
||||
integration tests, and if necessary, end-to-end tests.
|
||||
|
||||
### Test results
|
||||
|
||||
Did all tests pass in the CI pipeline (e.g., GitHub Actions, Travis, CircleCI)?
|
||||
|
||||
### Testing in different environments
|
||||
|
||||
If the changes depend on certain environments or configurations, verify that the
|
||||
code has been tested in various environments (e.g., local development, staging,
|
||||
production).
|
||||
|
||||
- [How to test Pull Requests](https://github.com/louislam/uptime-kuma/wiki/Test-Pull-Requests)
|
||||
|
||||
### Edge cases and regressions
|
||||
|
||||
- Are there test cases for possible edge cases?
|
||||
- Could this change introduce regressions in other parts of the system?
|
||||
|
||||
## Security
|
||||
|
||||
### Security issues
|
||||
|
||||
Check for potential security problems, such as SQL injection, XSS attacks, or
|
||||
unsafe API calls. Are there passwords, tokens, or other sensitive data left in
|
||||
the code by mistake?
|
||||
|
||||
### Authentication and authorization
|
||||
|
||||
Is access to sensitive data or functionality properly secured? Check that the
|
||||
correct authorization and authentication mechanisms are in place.
|
||||
|
||||
### Security Best Practices
|
||||
|
||||
- Ensure that the code is free from common vulnerabilities like **SQL
|
||||
injection**, **XSS attacks**, and **insecure API calls**.
|
||||
- Check for proper encryption of sensitive data, and ensure that **passwords**
|
||||
or **API tokens** are not hardcoded in the code.
|
||||
|
||||
## Performance
|
||||
|
||||
### Performance impact
|
||||
|
||||
Check if the changes negatively impact performance. This can include factors
|
||||
like load times, memory usage, or other performance aspects.
|
||||
|
||||
### Use of external libraries
|
||||
|
||||
- Have the right libraries been chosen?
|
||||
- Are there unnecessary dependencies that might reduce performance or increase
|
||||
code complexity?
|
||||
- Are these dependencies actively maintained and free of known vulnerabilities?
|
||||
|
||||
### Performance Best Practices
|
||||
|
||||
- **Measure performance** using tools like Lighthouse or profiling libraries.
|
||||
- **Avoid unnecessary dependencies** that may bloat the codebase.
|
||||
- Ensure that the **code does not degrade the user experience** (e.g., by
|
||||
increasing load times or memory consumption).
|
||||
|
||||
## Compliance and Integration
|
||||
|
||||
### Alignment with the project
|
||||
|
||||
Are the changes consistent with the project goals and requirements? Ensure the
|
||||
PR aligns with the architecture and design principles of the project.
|
||||
|
||||
### Integration
|
||||
|
||||
If the PR depends on other PRs or changes, verify that they integrate well with
|
||||
the rest of the project. Ensure the code does not cause conflicts with other
|
||||
active PRs.
|
||||
|
||||
### Backward compatibility
|
||||
|
||||
Does the change break compatibility with older versions of the software or
|
||||
dependencies? If so, is there a migration plan in place?
|
||||
|
||||
## Logging and Error Handling
|
||||
|
||||
### Proper error handling
|
||||
|
||||
- Are errors properly caught and handled instead of being silently ignored?
|
||||
- Are exceptions used appropriately?
|
||||
|
||||
### Logging
|
||||
|
||||
- Is sufficient logging included for debugging and monitoring?
|
||||
- Is there excessive logging that could affect performance?
|
||||
|
||||
## Accessibility (for UI-related changes)
|
||||
|
||||
If the PR affects the user interface, ensure that it meets accessibility
|
||||
standards:
|
||||
|
||||
- Can users navigate using only the keyboard?
|
||||
- Are screen readers supported?
|
||||
- Is there proper color contrast for readability?
|
||||
- Are there **WCAG** (Web Content Accessibility Guidelines) compliance issues?
|
||||
- Use tools like **Axe** or **Lighthouse** to evaluate accessibility.
|
||||
|
||||
## Providing Feedback
|
||||
|
||||
### Constructive feedback
|
||||
|
||||
Provide clear, constructive feedback on what is good and what can be improved.
|
||||
If improvements are needed, be specific about what should change.
|
||||
|
||||
### Clarity and collaboration
|
||||
|
||||
Ensure your feedback is friendly and open, so the team member who submitted the
|
||||
PR feels supported and motivated to make improvements.
|
||||
|
||||
<details><summary><b>For Maintainers only</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
## Go/No-Go Decision
|
||||
|
||||
### Go
|
||||
|
||||
If the code has no issues and meets the project requirements, approve it (and
|
||||
possibly merge it).
|
||||
|
||||
### No-Go
|
||||
|
||||
If there are significant issues, such as missing tests, security
|
||||
vulnerabilities, or performance problems, request the necessary changes before
|
||||
the PR can be approved. Some examples of **significant issues** include:
|
||||
|
||||
- Missing tests for new functionality.
|
||||
- Identified **security vulnerabilities**.
|
||||
- Code changes that break **backward compatibility** without a proper migration
|
||||
plan.
|
||||
- Code that causes **major performance regressions** (e.g., high CPU/memory
|
||||
usage).
|
||||
|
||||
## After the Review
|
||||
|
||||
### Reordering and merging
|
||||
|
||||
Once the necessary changes have been made and the PR is approved, the code can
|
||||
be merged into the main branch (e.g., `main` or `master`).
|
||||
|
||||
### Testing after merging
|
||||
|
||||
Ensure that the build passes after merging the PR, and re-test the functionality
|
||||
in the production environment if necessary.
|
||||
|
||||
## Follow-up
|
||||
|
||||
### Communication with team members
|
||||
|
||||
If the PR has long-term technical or functional implications, communicate the
|
||||
changes to the team.
|
||||
|
||||
### Monitoring
|
||||
|
||||
Continue monitoring the production environment for any unexpected issues that
|
||||
may arise after the code has been merged.
|
||||
|
||||
</p>
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
This process ensures that PRs are systematically and thoroughly reviewed,
|
||||
improving overall code quality.
|
|
@ -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
|
||||
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.
|
||||
nationality, personal appearance, race, caste, color, 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.
|
||||
|
@ -17,23 +17,23 @@ diverse, inclusive, and healthy community.
|
|||
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,
|
||||
- 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
|
||||
- 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
|
||||
- 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
|
||||
|
@ -52,7 +52,7 @@ decisions when appropriate.
|
|||
|
||||
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,
|
||||
Examples of representing our community include using an official email address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
|
@ -60,8 +60,8 @@ representative at an online or offline event.
|
|||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
uptime@kuma.pet.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
<uptime@kuma.pet>. 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.
|
||||
|
@ -82,15 +82,15 @@ behavior was inappropriate. A public apology may be requested.
|
|||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series
|
||||
of actions.
|
||||
**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.
|
||||
like social media. Violating these terms may lead to a temporary or permanent
|
||||
ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
|
@ -109,20 +109,24 @@ Violating these terms may lead to a permanent ban.
|
|||
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.
|
||||
**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.
|
||||
version 2.1, available at
|
||||
[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
|
||||
enforcement ladder](https://github.com/mozilla/diversity).
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
enforcement ladder][Mozilla CoC].
|
||||
|
||||
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.
|
||||
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
|
||||
[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
|
||||
|
|
704
CONTRIBUTING.md
704
CONTRIBUTING.md
|
@ -1,16 +1,18 @@
|
|||
# Project Info
|
||||
|
||||
First of all, I want to thank everyone who has submitted issues or shared pull requests for Uptime Kuma.
|
||||
I never thought the GitHub community would be so nice!
|
||||
Because of this, I also never thought that other people would actually read and edit my code.
|
||||
Parts of the code are not very well-structured or commented, sorry about that.
|
||||
First of all, I want to thank everyone who has submitted issues or shared pull
|
||||
requests for Uptime Kuma. I never thought the GitHub community would be so nice!
|
||||
Because of this, I also never thought that other people would actually read and
|
||||
edit my code. Parts of the code are not very well-structured or commented, sorry
|
||||
about that.
|
||||
|
||||
The project was created with `vite.js` and is written in `vue3`.
|
||||
Our backend lives in the `server`-directory and mostly communicates via websockets.
|
||||
Both frontend and backend share the same `package.json`.
|
||||
The project was created with `vite.js` and is written in `vue3`. Our backend
|
||||
lives in the `server`-directory and mostly communicates via websockets. Both
|
||||
frontend and backend share the same `package.json`.
|
||||
|
||||
For production, the frontend is built into the `dist`-directory and the server (`express.js`) exposes the `dist` directory as the root of the endpoint.
|
||||
For development, we run vite in development mode on another port.
|
||||
For production, the frontend is built into the `dist`-directory and the server
|
||||
(`express.js`) exposes the `dist` directory as the root of the endpoint. For
|
||||
development, we run vite in development mode on another port.
|
||||
|
||||
## Directories
|
||||
|
||||
|
@ -25,193 +27,437 @@ For development, we run vite in development mode on another port.
|
|||
- `src` (Frontend source code)
|
||||
- `test` (unit test)
|
||||
|
||||
## Can I create a pull request for Uptime Kuma?
|
||||
## Can I Create a Pull Request for Uptime Kuma?
|
||||
|
||||
Yes or no, it depends on what you will try to do.
|
||||
Both yours and our maintainers' time is precious, and we don't want to waste either.
|
||||
Whether or not you can create a pull request depends on the nature of your
|
||||
contribution. We value both your time and our maintainers' time, so we want to
|
||||
make sure it's spent efficiently.
|
||||
|
||||
If you have any questions about any process/.. is not clear, you are likely not alone => please ask them ^^
|
||||
If you're unsure about any process or step, you're probably not the only one
|
||||
with that question—please feel free to ask. We're happy to help!
|
||||
|
||||
Different guidelines exist for different types of pull requests (PRs):
|
||||
- <details><summary><b>security fixes</b></summary>
|
||||
Different types of pull requests (PRs) may have different guidelines, so be sure
|
||||
to review the appropriate one for your contribution.
|
||||
|
||||
- <details><summary><b>Security Fixes</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
|
||||
Submitting security fixes is something that may put the community at risk.
|
||||
Please read through our [security policy](SECURITY.md) and submit vulnerabilities via an [advisory](https://github.com/louislam/uptime-kuma/security/advisories/new) + [issue](https://github.com/louislam/uptime-kuma/issues/new?assignees=&labels=help&template=security.md) instead.
|
||||
We encourage you to submit how to fix a vulnerability if you know how to, this is not required.
|
||||
Following the security policy allows us to properly test, fix bugs.
|
||||
This review allows us to notice, if there are any changes necessary to unrelated parts like the documentation.
|
||||
Please read through our [security policy](SECURITY.md) and submit
|
||||
vulnerabilities via an [advisory] + [issue] instead. We encourage you to
|
||||
submit how to fix a vulnerability if you know how to, this is not required.
|
||||
Following the security policy allows us to properly test, fix bugs. This
|
||||
review allows us to notice, if there are any changes necessary to unrelated
|
||||
parts like the documentation.
|
||||
[**PLEASE SEE OUR SECURITY POLICY.**](SECURITY.md)
|
||||
|
||||
|
||||
[advisory]: https://github.com/louislam/uptime-kuma/security/advisories/new
|
||||
[issue]:
|
||||
https://github.com/louislam/uptime-kuma/issues/new?template=security_issue.yml
|
||||
|
||||
</p>
|
||||
</details>
|
||||
- <details><summary><b>small, non-breaking bug fixes</b></summary>
|
||||
|
||||
- <details><summary><b>Small, Non-Breaking Bug Fixes</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
|
||||
If you come across a bug and think you can solve, we appreciate your work.
|
||||
Please make sure that you follow these rules:
|
||||
- keep the PR as small as possible, fix only one thing at a time => keeping it reviewable
|
||||
- test that your code does what you claim it does.
|
||||
|
||||
<sub>Because maintainer time is precious, junior maintainers may merge uncontroversial PRs in this area.</sub>
|
||||
</p>
|
||||
</details>
|
||||
- <details><summary><b>translations / internationalisation (i18n)</b></summary>
|
||||
<p>
|
||||
|
||||
We use weblate to localise this project into many languages.
|
||||
If you are unhappy with a translation this is the best start.
|
||||
On how to translate using weblate, please see [these instructions](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md).
|
||||
|
||||
There are two cases in which a change cannot be done in weblate and requires a PR:
|
||||
- A text may not be currently localisable. In this case, **adding a new language key** via `$t("languageKey")` might be nessesary
|
||||
- language keys need to be **added to `en.json`** to be visible in weblate. If this has not happened, a PR is appreciated.
|
||||
- **Adding a new language** requires a new file see [these instructions](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md)
|
||||
|
||||
<sub>Because maintainer time is precious, junior maintainers may merge uncontroversial PRs in this area.</sub>
|
||||
</p>
|
||||
</details>
|
||||
- <details><summary><b>new notification providers</b></summary>
|
||||
<p>
|
||||
|
||||
To set up a new notification provider these files need to be modified/created:
|
||||
- `server/notification-providers/PROVIDER_NAME.js` is where the heart of the notification provider lives.
|
||||
- Both `monitorJSON` and `heartbeatJSON` can be `null` for some events.
|
||||
If both are `null`, this is a general testing message, but if just `heartbeatJSON` is `null` this is a certificate expiry.
|
||||
- Please wrap the axios call into a
|
||||
```js
|
||||
try {
|
||||
let result = await axios.post(...);
|
||||
if (result.status === ...) ...
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
```
|
||||
- `server/notification.js` is where the backend of the notification provider needs to be registered.
|
||||
*If you have an idea how we can skip this step, we would love to hear about it ^^*
|
||||
- `src/components/NotificationDialog.vue` you need to decide if the provider is a regional or a global one and add it with a name to the respective list
|
||||
- `src/components/notifications/PROVIDER_NAME.vue` is where the frontend of each provider lives.
|
||||
Please make sure that you have:
|
||||
- used `HiddenInput` for secret credentials
|
||||
- included all the necessary helptexts/placeholder/.. to make sure the notification provider is simple to setup for new users.
|
||||
- include all translations (`{{ $t("Translation key") }}`, [`i18n-t keypath="Translation key">`](https://vue-i18n.intlify.dev/guide/advanced/component.html)) in `src/lang/en.json` to enable our translators to translate this
|
||||
- `src/components/notifications/index.js` is where the frontend of the provider needs to be registered.
|
||||
*If you have an idea how we can skip this step, we would love to hear about it ^^*
|
||||
|
||||
Offering notifications is close to the core of what we are as an uptime monitor.
|
||||
Therefore, making sure that they work is also really important.
|
||||
Because testing notification providers is quite time intensive, we mostly offload this onto the person contributing a notification provider.
|
||||
|
||||
To make sure you have tested the notification provider, please include screenshots of the following events in the pull-request description:
|
||||
- `UP`/`DOWN`
|
||||
- Certificate Expiry via https://expired.badssl.com/
|
||||
- Testing (the test button on the notification provider setup page)
|
||||
|
||||
Using the following way to format this is encouraged:
|
||||
```md
|
||||
| Event | Before | After |
|
||||
------------------
|
||||
| `UP` | paste-image-here | paste-image-here |
|
||||
| `DOWN` | paste-image-here | paste-image-here |
|
||||
| Certificate-expiry | paste-image-here | paste-image-here |
|
||||
| Testing | paste-image-here | paste-image-here |
|
||||
- keep the PR as small as possible, fix only one thing at a time => keeping it
|
||||
reviewable
|
||||
- test that your code does what you claim it does.
|
||||
|
||||
<sub>Because maintainer time is precious, junior maintainers may merge
|
||||
uncontroversial PRs in this area.</sub>
|
||||
|
||||
</p>
|
||||
</details>
|
||||
|
||||
- <details><summary><b>Translations / Internationalisation (i18n)</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
We use weblate to localise this project into many languages. If you are
|
||||
unhappy with a translation this is the best start. On how to translate using
|
||||
weblate, please see
|
||||
[these instructions](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md).
|
||||
|
||||
There are two cases in which a change cannot be done in weblate and requires a
|
||||
PR:
|
||||
|
||||
- A text may not be currently localisable. In this case, **adding a new
|
||||
language key** via `$t("languageKey")` might be nessesary
|
||||
- language keys need to be **added to `en.json`** to be visible in weblate. If
|
||||
this has not happened, a PR is appreciated.
|
||||
- **Adding a new language** requires a new file see
|
||||
[these instructions](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md)
|
||||
|
||||
<sub>Because maintainer time is precious, junior maintainers may merge
|
||||
uncontroversial PRs in this area.</sub>
|
||||
|
||||
</p>
|
||||
</details>
|
||||
|
||||
- <details><summary><b>New Notification Providers</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
To set up a new notification provider these files need to be modified/created:
|
||||
|
||||
- `server/notification-providers/PROVIDER_NAME.js` is where the heart of the
|
||||
notification provider lives.
|
||||
|
||||
- Both `monitorJSON` and `heartbeatJSON` can be `null` for some events. If
|
||||
|
||||
both are `null`, this is a general testing message, but if just
|
||||
`heartbeatJSON` is `null` this is a certificate expiry.
|
||||
|
||||
- Please wrap the axios call into a
|
||||
|
||||
```js
|
||||
try {
|
||||
let result = await axios.post(...);
|
||||
if (result.status === ...) ...
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
```
|
||||
|
||||
<sub>Because maintainer time is precious, junior maintainers may merge uncontroversial PRs in this area.</sub>
|
||||
- `server/notification.js` is where the backend of the notification provider
|
||||
needs to be registered. _If you have an idea how we can skip this step, we
|
||||
would love to hear about it ^^_
|
||||
|
||||
- `src/components/NotificationDialog.vue` you need to decide if the provider
|
||||
is a regional or a global one and add it with a name to the respective list
|
||||
|
||||
- `src/components/notifications/PROVIDER_NAME.vue` is where the frontend of
|
||||
each provider lives. Please make sure that you have:
|
||||
|
||||
- used `HiddenInput` for secret credentials
|
||||
- included all the necessary helptexts/placeholder/.. to make sure the
|
||||
|
||||
notification provider is simple to setup for new users. - include all
|
||||
translations (`{{ $t("Translation key") }}`,
|
||||
[`i18n-t keypath="Translation key">`](https://vue-i18n.intlify.dev/guide/advanced/component.html))
|
||||
in `src/lang/en.json` to enable our translators to translate this
|
||||
|
||||
- `src/components/notifications/index.js` is where the frontend of the
|
||||
provider needs to be registered. _If you have an idea how we can skip this
|
||||
step, we would love to hear about it ^^_
|
||||
|
||||
Offering notifications is close to the core of what we are as an uptime
|
||||
monitor. Therefore, making sure that they work is also really important.
|
||||
Because testing notification providers is quite time intensive, we mostly
|
||||
offload this onto the person contributing a notification provider.
|
||||
|
||||
To make sure you have tested the notification provider, please include
|
||||
screenshots of the following events in the pull-request description:
|
||||
|
||||
- `UP`/`DOWN`
|
||||
- Certificate Expiry via <https://expired.badssl.com/>
|
||||
- Testing (the test button on the notification provider setup page)
|
||||
|
||||
<br/>
|
||||
|
||||
Using the following way to format this is encouraged:
|
||||
|
||||
```md
|
||||
| Event | Before | After |
|
||||
| ------------------ | --------------------- | -------------------- |
|
||||
| `UP` |  |  |
|
||||
| `DOWN` |  |  |
|
||||
| Certificate-expiry |  |  |
|
||||
| Testing |  |  |
|
||||
```
|
||||
|
||||
<sub>Because maintainer time is precious, junior maintainers may merge
|
||||
uncontroversial PRs in this area.</sub>
|
||||
|
||||
</p>
|
||||
</details>
|
||||
- <details><summary><b>new monitoring types</b></summary>
|
||||
|
||||
- <details><summary><b>New Monitoring Types</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
To set up a new notification provider these files need to be modified/created:
|
||||
- `server/monitor-types/MONITORING_TYPE.js` is the core of each monitor.
|
||||
the `async check(...)`-function should:
|
||||
- throw an error for each fault that is detected with an actionable error message
|
||||
- in the happy-path, you should set `heartbeat.msg` to a successful message and set `heartbeat.status = UP`
|
||||
- `server/uptime-kuma-server.js` is where the monitoring backend needs to be registered.
|
||||
*If you have an idea how we can skip this step, we would love to hear about it ^^*
|
||||
|
||||
- `server/monitor-types/MONITORING_TYPE.js` is the core of each monitor. the
|
||||
`async check(...)`-function should:
|
||||
|
||||
- throw an error for each fault that is detected with an actionable error
|
||||
|
||||
message - in the happy-path, you should set `heartbeat.msg` to a successful
|
||||
message and set `heartbeat.status = UP`
|
||||
|
||||
- `server/uptime-kuma-server.js` is where the monitoring backend needs to be
|
||||
registered. _If you have an idea how we can skip this step, we would love to
|
||||
hear about it ^^_
|
||||
|
||||
- `src/pages/EditMonitor.vue` is the shared frontend users interact with.
|
||||
Please make sure that you have:
|
||||
- used `HiddenInput` for secret credentials
|
||||
- included all the necessary helptexts/placeholder/.. to make sure the notification provider is simple to setup for new users.
|
||||
- include all translations (`{{ $t("Translation key") }}`, [`i18n-t keypath="Translation key">`](https://vue-i18n.intlify.dev/guide/advanced/component.html)) in `src/lang/en.json` to enable our translators to translate this
|
||||
-
|
||||
Please make sure that you have: - used `HiddenInput` for secret
|
||||
credentials - included all the necessary helptexts/placeholder/.. to make
|
||||
sure the notification provider is simple to setup for new users. - include
|
||||
all translations (`{{ $t("Translation key") }}`,
|
||||
[`i18n-t keypath="Translation key">`](https://vue-i18n.intlify.dev/guide/advanced/component.html))
|
||||
in `src/lang/en.json` to enable our translators to translate this
|
||||
|
||||
<sub>Because maintainer time is precious, junior maintainers may merge
|
||||
uncontroversial PRs in this area.</sub>
|
||||
|
||||
<sub>Because maintainer time is precious, junior maintainers may merge uncontroversial PRs in this area.</sub>
|
||||
</p>
|
||||
</details>
|
||||
- <details><summary><b>new features/ major changes / breaking bugfixes</b></summary>
|
||||
<p>
|
||||
|
||||
be sure to **create an empty draft pull request or open an issue, so we can have a discussion first**.
|
||||
This is especially important for a large pull request or when you don't know if it will be merged or not.
|
||||
|
||||
<sub>Because of the large impact of this work, only senior maintainers may merge PRs in this area.</sub>
|
||||
</p>
|
||||
</details>
|
||||
|
||||
The following rules are essential for making your PR mergable:
|
||||
- Merging multiple issues by a huge PR is more difficult to review and causes conflicts with other PRs. Please
|
||||
- <details><summary><b>New Features / Major Changes / Breaking Bugfixes</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
be sure to **create an empty draft pull request or open an issue, so we can
|
||||
have a discussion first**. This is especially important for a large pull
|
||||
request or when you don't know if it will be merged or not.
|
||||
|
||||
<sub>Because of the large impact of this work, only senior maintainers may
|
||||
merge PRs in this area. </sub>
|
||||
|
||||
</p>
|
||||
</details>
|
||||
|
||||
- <details><summary><b>Pull Request Guidelines</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
## Steps to Submit a Pull Request
|
||||
|
||||
1. **Fork** the [Uptime-Kuma repository].
|
||||
|
||||
[Uptime-Kuma repository]: https://github.com/louislam/uptime-kuma/
|
||||
|
||||
2. **Clone** your forked repository to your local machine.
|
||||
3. **Create a new branch** for your changes (e.g.,
|
||||
`feature/add-new-notification-provider-signal`).
|
||||
4. **Initiate a discussion before making major changes** by creating an empty
|
||||
commit:
|
||||
|
||||
```sh
|
||||
git commit -m "<YOUR TASK NAME>" --allow-empty
|
||||
```
|
||||
|
||||
5. **Push** your branch to your forked repository.
|
||||
6. **Open a pull request** using this link: [Compare & Pull Request].
|
||||
|
||||
[Compare & Pull Request]: https://github.com/louislam/uptime-kuma/compare/
|
||||
|
||||
7. **Select the correct source and target branches**.
|
||||
8. **Link to related issues** for context.
|
||||
9. **Provide a clear and concise description** explaining the changes and
|
||||
their purpose.
|
||||
|
||||
- **Type of changes**
|
||||
|
||||
- Bugfix (a non-breaking change that resolves an issue)
|
||||
- New feature (a non-breaking change that adds new functionality)
|
||||
- Breaking change (a fix or feature that alters existing functionality in a
|
||||
way that could cause issues)
|
||||
- User Interface (UI) updates
|
||||
- New Documentation (addition of new documentation)
|
||||
- Documentation Update (modification of existing documentation)
|
||||
- Documentation Update Required (the change requires updates to related
|
||||
documentation)
|
||||
- Other (please specify):
|
||||
- Provide additional details here.
|
||||
|
||||
- **Checklist**
|
||||
|
||||
- My code adheres to the style guidelines of this project.
|
||||
- I ran ESLint and other code linters for modified files.
|
||||
- I have reviewed and tested my code.
|
||||
- I have commented my code, especially in hard-to-understand areas (e.g.,
|
||||
using JSDoc for methods).
|
||||
- My changes generate no new warnings.
|
||||
- My code needed automated testing. I have added them (this is an optional
|
||||
task).
|
||||
- Documentation updates are included (if applicable).
|
||||
- I have considered potential security impacts and mitigated risks.
|
||||
- Dependency updates are listed and explained.
|
||||
- I have read and understood the
|
||||
[Pull Request guidelines](#recommended-pull-request-guideline).
|
||||
|
||||
10. **When publishing your PR, set it as a** `Draft pull request` **to allow
|
||||
for review and prevent automatic merging.**
|
||||
11. **Maintainers will assign relevant labels** (e.g., `A:maintenance`,
|
||||
`A:notifications`).
|
||||
12. **Complete the PR checklist**, ensuring that:
|
||||
|
||||
- Documentation is updated if necessary.
|
||||
- Tests are written or updated.
|
||||
- CI/CD checks pass successfully.
|
||||
|
||||
13. **Request feedback** from team members to refine your changes before the
|
||||
final review.
|
||||
|
||||
## When Can You Change the PR Status to "Ready for Review"?
|
||||
|
||||
A PR should remain in **draft status** until all tasks are completed. Only
|
||||
change the status to **Ready for Review** when:
|
||||
|
||||
- You have implemented all planned changes.
|
||||
- You have addressed all feedback.
|
||||
- Your code is fully tested and ready for integration.
|
||||
- You have updated or created the necessary tests.
|
||||
- You have verified that CI/CD checks pass successfully.
|
||||
|
||||
<br />
|
||||
|
||||
A **work-in-progress (WIP) PR** must stay in **draft status** until everything
|
||||
is finalized.
|
||||
|
||||
<sub>Since maintainer time is valuable, junior maintainers may merge
|
||||
uncontroversial PRs.</sub>
|
||||
|
||||
</p>
|
||||
</details>
|
||||
|
||||
## The following rules are essential for making your PR mergable
|
||||
|
||||
- Merging multiple issues by a huge PR is more difficult to review and causes
|
||||
conflicts with other PRs. Please
|
||||
|
||||
- (if possible) **create one PR for one issue** or
|
||||
- (if not possible) **explain which issues a PR addresses and why this PR should not be broken apart**
|
||||
- Make sure your **PR passes our continuous integration**.
|
||||
PRs will not be merged unless all CI-Checks are green.
|
||||
- **Breaking changes** (unless for a good reason and discussed beforehand) will not get merged / not get merged quickly.
|
||||
Such changes require a major version release.
|
||||
- **Test your code** before submitting a PR.
|
||||
Buggy PRs will not be merged.
|
||||
- (if not possible) **explain which issues a PR addresses and why this PR
|
||||
should not be broken apart**
|
||||
|
||||
- Make sure your **PR passes our continuous integration**. PRs will not be
|
||||
merged unless all CI-Checks are green.
|
||||
- **Breaking changes** (unless for a good reason and discussed beforehand) will
|
||||
not get merged / not get merged quickly. Such changes require a major version
|
||||
release.
|
||||
- **Test your code** before submitting a PR. Buggy PRs will not be merged.
|
||||
- Make sure the **UI/UX is close to Uptime Kuma**.
|
||||
- **Think about the maintainability**:
|
||||
Don't add functionality that is completely **out of scope**.
|
||||
Keep in mind that we need to be able to maintain the functionality.
|
||||
- **Think about the maintainability**: Don't add functionality that is
|
||||
completely **out of scope**. Keep in mind that we need to be able to maintain
|
||||
the functionality.
|
||||
- Don't modify or delete existing logic without a valid reason.
|
||||
- Don't convert existing code into other programming languages for no reason.
|
||||
|
||||
I ([@louislam](https://github.com/louislam)) have the final say.
|
||||
If your pull request does not meet my expectations, I will reject it, no matter how much time you spent on it.
|
||||
Therefore, it is essential to have a discussion beforehand.
|
||||
I ([@louislam](https://github.com/louislam)) have the final say. If your pull
|
||||
request does not meet my expectations, I will reject it, no matter how much time
|
||||
you spent on it. Therefore, it is essential to have a discussion beforehand.
|
||||
|
||||
I will assign your pull request to a [milestone](https://github.com/louislam/uptime-kuma/milestones), if I plan to review and merge it.
|
||||
I will assign your pull request to a [milestone], if I plan to review and merge
|
||||
it.
|
||||
|
||||
Please don't rush or ask for an ETA.
|
||||
We have to understand the pull request, make sure it has no breaking changes and stick to the vision of this project, especially for large pull requests.
|
||||
[milestone]: https://github.com/louislam/uptime-kuma/milestones
|
||||
|
||||
Please don't rush or ask for an ETA. We have to understand the pull request,
|
||||
make sure it has no breaking changes and stick to the vision of this project,
|
||||
especially for large pull requests.
|
||||
|
||||
## I'd like to work on an issue. How do I do that?
|
||||
## I'd Like to Work on an Issue. How Do I Do That?
|
||||
|
||||
We have found that assigning people to issues is management-overhead that we don't need.
|
||||
A short comment that you want to try your hand at this issue is appreciated to save other devs time.
|
||||
If you come across any problem during development, feel free to leave a comment with what you are stuck on.
|
||||
We have found that assigning people to issues is unnecessary management
|
||||
overhead. Instead, a short comment stating that you want to work on an issue is
|
||||
appreciated, as it saves time for other developers. If you encounter any
|
||||
problems during development, feel free to leave a comment describing what you
|
||||
are stuck on.
|
||||
|
||||
### Recommended Pull Request Guideline
|
||||
|
||||
Before diving deep into coding, having a discussion first by creating an empty pull request for discussion is preferred.
|
||||
The rationale behind this is that we can align the direction and scope of the feature to eliminate any conflicts with existing and planned work, and can help by pointing out any potential pitfalls.
|
||||
Before jumping into coding, it's recommended to initiate a discussion by
|
||||
creating an empty pull request. This approach allows us to align on the
|
||||
direction and scope of the feature, ensuring it doesn't conflict with existing
|
||||
or planned work. It also provides an opportunity to identify potential pitfalls
|
||||
early on, helping to avoid issues down the line.
|
||||
|
||||
1. Fork the project
|
||||
2. Clone your fork repo to local
|
||||
3. Create a new branch
|
||||
4. Create an empty commit: `git commit -m "<YOUR TASK NAME>" --allow-empty`
|
||||
5. Push to your fork repo
|
||||
6. Prepare a pull request: https://github.com/louislam/uptime-kuma/compare
|
||||
7. Write a proper description. You can mention @louislam in it, so @louislam will get the notification.
|
||||
8. Create your pull request as a Draft
|
||||
9. Wait for the discussion
|
||||
1. **Fork** the [Uptime-Kuma repository].
|
||||
2. **Clone** your forked repository to your local machine.
|
||||
3. **Create a new branch** for your changes (e.g.,
|
||||
`feature/add-new-notification-provider-signal`).
|
||||
4. **Initiate a discussion before making major changes** by creating an empty
|
||||
commit:
|
||||
|
||||
```sh
|
||||
git commit -m "<YOUR TASK NAME>" --allow-empty
|
||||
```
|
||||
|
||||
5. **Push** your branch to your forked repository.
|
||||
6. **Open a pull request** using this link: [Compare & Pull Request].
|
||||
7. **Select the correct source and target branches**.
|
||||
8. **Link to related issues** for context.
|
||||
9. **Provide a clear and concise description** explaining the changes and their
|
||||
purpose.
|
||||
|
||||
- **Type of changes**
|
||||
|
||||
- Bugfix (a non-breaking change that resolves an issue)
|
||||
- New feature (a non-breaking change that adds new functionality)
|
||||
- Breaking change (a fix or feature that alters existing functionality in a
|
||||
way that could cause issues)
|
||||
- User Interface (UI) updates
|
||||
- New Documentation (addition of new documentation)
|
||||
- Documentation Update (modification of existing documentation)
|
||||
- Documentation Update Required (the change requires updates to related
|
||||
documentation)
|
||||
- Other (please specify):
|
||||
- Provide additional details here.
|
||||
|
||||
- **Checklist**
|
||||
|
||||
- My code adheres to the style guidelines of this project.
|
||||
- I ran ESLint and other code linters for modified files.
|
||||
- I have reviewed and tested my code.
|
||||
- I have commented my code, especially in hard-to-understand areas (e.g.,
|
||||
using JSDoc for methods).
|
||||
- My changes generate no new warnings.
|
||||
- My code needed automated testing. I have added them (this is an optional
|
||||
task).
|
||||
- Documentation updates are included (if applicable).
|
||||
- I have considered potential security impacts and mitigated risks.
|
||||
- Dependency updates are listed and explained.
|
||||
- I have read and understood the
|
||||
[Pull Request guidelines](#recommended-pull-request-guideline).
|
||||
|
||||
10. **When publishing your PR, set it as a** `Draft pull request` **to allow for
|
||||
review and prevent automatic merging.**
|
||||
11. **Maintainers will assign relevant labels** (e.g., `A:maintenance`,
|
||||
`A:notifications`).
|
||||
12. **Complete the PR checklist**, ensuring that:
|
||||
|
||||
- Documentation is updated if necessary.
|
||||
- Tests are written or updated.
|
||||
- CI/CD checks pass successfully.
|
||||
|
||||
13. **Request feedback** from team members to refine your changes before the
|
||||
final review.
|
||||
|
||||
### When Can You Change the PR Status to "Ready for Review"?
|
||||
|
||||
A PR should remain in **draft status** until all tasks are completed. Only
|
||||
change the status to **Ready for Review** when:
|
||||
|
||||
- You have implemented all planned changes.
|
||||
- You have addressed all feedback.
|
||||
- Your code is fully tested and ready for integration.
|
||||
- You have updated or created the necessary tests.
|
||||
- You have verified that CI/CD checks pass successfully.
|
||||
|
||||
A **work-in-progress (WIP) PR** must stay in **draft status** until everything
|
||||
is finalized.
|
||||
|
||||
## Project Styles
|
||||
|
||||
I personally do not like something that requires a lot of configuration before you can finally start the app.
|
||||
The goal is to make the Uptime Kuma installation as easy as installing a mobile app.
|
||||
I personally do not like something that requires a lot of configuration before
|
||||
you can finally start the app. The goal is to make the Uptime Kuma installation
|
||||
as easy as installing a mobile app.
|
||||
|
||||
- Easy to install for non-Docker users
|
||||
|
||||
- no native build dependency is needed (for `x86_64`/`armv7`/`arm64`)
|
||||
- no extra configuration and
|
||||
- no extra effort required to get it running
|
||||
|
||||
- Single container for Docker users
|
||||
|
||||
- no complex docker-compose file
|
||||
- mapping the volume and exposing the port should be the only requirements
|
||||
- Settings should be configurable in the frontend. Environment variables are discouraged, unless it is related to startup such as `DATA_DIR`
|
||||
|
||||
- Settings should be configurable in the frontend. Environment variables are
|
||||
discouraged, unless it is related to startup such as `DATA_DIR`
|
||||
- Easy to use
|
||||
- The web UI styling should be consistent and nice
|
||||
|
||||
|
@ -233,13 +479,18 @@ The goal is to make the Uptime Kuma installation as easy as installing a mobile
|
|||
- [`Node.js`](https://nodejs.org/) >= 18
|
||||
- [`npm`](https://www.npmjs.com/) >= 9.3
|
||||
- [`git`](https://git-scm.com/)
|
||||
- IDE that supports [`ESLint`](https://eslint.org/) and EditorConfig (I am using [`IntelliJ IDEA`](https://www.jetbrains.com/idea/))
|
||||
- A SQLite GUI tool (f.ex. [`SQLite Expert Personal`](https://www.sqliteexpert.com/download.html) or [`DBeaver Community`](https://dbeaver.io/download/))
|
||||
- IDE that supports [`ESLint`](https://eslint.org/) and EditorConfig (I am using
|
||||
[`IntelliJ IDEA`](https://www.jetbrains.com/idea/))
|
||||
- A SQLite GUI tool (f.ex.
|
||||
[`SQLite Expert Personal`](https://www.sqliteexpert.com/download.html) or
|
||||
[`DBeaver Community`](https://dbeaver.io/download/))
|
||||
|
||||
## Git Branches
|
||||
|
||||
- `master`: 2.X.X development. If you want to add a new feature, your pull request should base on this.
|
||||
- `1.23.X`: 1.23.X development. If you want to fix a bug for v1 and v2, your pull request should base on this.
|
||||
- `master`: 2.X.X development. If you want to add a new feature, your pull
|
||||
request should base on this.
|
||||
- `1.23.X`: 1.23.X development. If you want to fix a bug for v1 and v2, your
|
||||
pull request should base on this.
|
||||
- All other branches are unused, outdated or for dev.
|
||||
|
||||
## Install Dependencies for Development
|
||||
|
@ -260,7 +511,8 @@ Port `3000` and port `3001` will be used.
|
|||
npm run dev
|
||||
```
|
||||
|
||||
But sometimes you may want to restart the server without restarting the frontend. In that case, you can run these commands in two terminals:
|
||||
But sometimes you may want to restart the server without restarting the
|
||||
frontend. In that case, you can run these commands in two terminals:
|
||||
|
||||
```bash
|
||||
npm run start-frontend-dev
|
||||
|
@ -271,9 +523,9 @@ npm run start-server-dev
|
|||
|
||||
It binds to `0.0.0.0:3001` by default.
|
||||
|
||||
The backend is an `express.js` server with `socket.io` integrated.
|
||||
It uses `socket.io` to communicate with clients, and most server logic is encapsulated in the `socket.io` handlers.
|
||||
`express.js` is also used to serve:
|
||||
The backend is an `express.js` server with `socket.io` integrated. It uses
|
||||
`socket.io` to communicate with clients, and most server logic is encapsulated
|
||||
in the `socket.io` handlers. `express.js` is also used to serve:
|
||||
|
||||
- as an entry point for redirecting to a status page or the dashboard
|
||||
- the frontend built files (`index.html`, `*.js`, `*.css`, etc.)
|
||||
|
@ -289,11 +541,13 @@ It uses `socket.io` to communicate with clients, and most server logic is encaps
|
|||
- `routers/` (Express Routers)
|
||||
- `socket-handler/` (Socket.io Handlers)
|
||||
- `server.js` (Server entry point)
|
||||
- `uptime-kuma-server.js` (UptimeKumaServer class, main logic should be here, but some still in `server.js`)
|
||||
- `uptime-kuma-server.js` (UptimeKumaServer class, main logic should be here,
|
||||
but some still in `server.js`)
|
||||
|
||||
## Frontend Dev Server
|
||||
|
||||
It binds to `0.0.0.0:3000` by default. The frontend dev server is used for development only.
|
||||
It binds to `0.0.0.0:3000` by default. The frontend dev server is used for
|
||||
development only.
|
||||
|
||||
For production, it is not used. It will be compiled to `dist` directory instead.
|
||||
|
||||
|
@ -307,17 +561,19 @@ npm run build
|
|||
|
||||
### Frontend Details
|
||||
|
||||
Uptime Kuma Frontend is a single page application (SPA). Most paths are handled by Vue Router.
|
||||
Uptime Kuma Frontend is a single page application (SPA). Most paths are handled
|
||||
by Vue Router.
|
||||
|
||||
The router is in `src/router.js`
|
||||
|
||||
As you can see, most data in the frontend is stored at the root level, even though you changed the current router to any other pages.
|
||||
As you can see, most data in the frontend is stored at the root level, even
|
||||
though you changed the current router to any other pages.
|
||||
|
||||
The data and socket logic are in `src/mixins/socket.js`.
|
||||
|
||||
## Database Migration
|
||||
|
||||
See: https://github.com/louislam/uptime-kuma/tree/master/db/knex_migrations
|
||||
See: <https://github.com/louislam/uptime-kuma/tree/master/db/knex_migrations>
|
||||
|
||||
## Unit Test
|
||||
|
||||
|
@ -328,11 +584,12 @@ npm test
|
|||
|
||||
## Dependencies
|
||||
|
||||
Both frontend and backend share the same `package.json`.
|
||||
However, the frontend dependencies are eventually not used in the production environment, because it is usually also baked into `dist` files. So:
|
||||
Both frontend and backend share the same `package.json`. However, the frontend
|
||||
dependencies are eventually not used in the production environment, because it
|
||||
is usually also baked into `dist` files. So:
|
||||
|
||||
- Frontend dependencies = "devDependencies"
|
||||
- Examples: `vue`, `chart.js`
|
||||
- Examples: - `vue`, `chart.js`
|
||||
- Backend dependencies = "dependencies"
|
||||
- Examples: `socket.io`, `sqlite3`
|
||||
- Development dependencies = "devDependencies"
|
||||
|
@ -340,31 +597,41 @@ However, the frontend dependencies are eventually not used in the production env
|
|||
|
||||
### Update Dependencies
|
||||
|
||||
Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely, from now on, it should update the patch release version only.
|
||||
Since previously updating Vite 2.5.10 to 2.6.0 broke the application completely,
|
||||
from now on, it should update the patch release version only.
|
||||
|
||||
Patch release = the third digit ([Semantic Versioning](https://semver.org/))
|
||||
|
||||
If for security / bug / other reasons, a library must be updated, breaking changes need to be checked by the person proposing the change.
|
||||
If for security / bug / other reasons, a library must be updated, breaking
|
||||
changes need to be checked by the person proposing the change.
|
||||
|
||||
## Translations
|
||||
|
||||
Please add **all** the strings which are translatable to `src/lang/en.json` (if translation keys are omitted, they can not be translated.)
|
||||
Please add **all** the strings which are translatable to `src/lang/en.json` (if
|
||||
translation keys are omitted, they can not be translated.)
|
||||
|
||||
**Don't include any other languages in your initial pull request** (even if this is your mother tongue), to avoid merge-conflicts between weblate and `master`.
|
||||
The translations can then (after merging a PR into `master`) be translated by awesome people donating their language skills.
|
||||
**Don't include any other languages in your initial pull request** (even if this
|
||||
is your mother tongue), to avoid merge-conflicts between weblate and `master`.
|
||||
The translations can then (after merging a PR into `master`) be translated by
|
||||
awesome people donating their language skills.
|
||||
|
||||
If you want to help by translating Uptime Kuma into your language, please visit the [instructions on how to translate using weblate](https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md).
|
||||
If you want to help by translating Uptime Kuma into your language, please visit
|
||||
the [instructions on how to translate using weblate].
|
||||
|
||||
[instructions on how to translate using weblate]:
|
||||
https://github.com/louislam/uptime-kuma/blob/master/src/lang/README.md
|
||||
|
||||
## Spelling & Grammar
|
||||
|
||||
Feel free to correct the grammar in the documentation or code.
|
||||
My mother language is not English and my grammar is not that great.
|
||||
Feel free to correct the grammar in the documentation or code. My mother
|
||||
language is not English and my grammar is not that great.
|
||||
|
||||
## Wiki
|
||||
|
||||
Since there is no way to make a pull request to the wiki, I have set up another repo to do that.
|
||||
Since there is no way to make a pull request to the wiki, I have set up another
|
||||
repo to do that.
|
||||
|
||||
https://github.com/louislam/uptime-kuma-wiki
|
||||
<https://github.com/louislam/uptime-kuma-wiki>
|
||||
|
||||
## Docker
|
||||
|
||||
|
@ -405,7 +672,7 @@ https://github.com/louislam/uptime-kuma-wiki
|
|||
## Maintainer
|
||||
|
||||
Check the latest issues and pull requests:
|
||||
https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc
|
||||
<https://github.com/louislam/uptime-kuma/issues?q=sort%3Aupdated-desc>
|
||||
|
||||
### What is a maintainer and what are their roles?
|
||||
|
||||
|
@ -413,7 +680,7 @@ This project has multiple maintainers who specialise in different areas.
|
|||
Currently, there are 3 maintainers:
|
||||
|
||||
| Person | Role | Main Area |
|
||||
|-------------------|-------------------|------------------|
|
||||
| ----------------- | ----------------- | ---------------- |
|
||||
| `@louislam` | senior maintainer | major features |
|
||||
| `@chakflying` | junior maintainer | fixing bugs |
|
||||
| `@commanderstorm` | junior maintainer | issue-management |
|
||||
|
@ -421,39 +688,49 @@ Currently, there are 3 maintainers:
|
|||
### Procedures
|
||||
|
||||
We have a few procedures we follow. These are documented here:
|
||||
- <details><summary>Set up a Docker Builder</summary>
|
||||
|
||||
- <details><summary><b>Set up a Docker Builder</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
- amd64, armv7 using local.
|
||||
- arm64 using remote arm64 cpu, as the emulator is too slow and can no longer pass the `npm ci` command.
|
||||
1. Add the public key to the remote server.
|
||||
2. Add the remote context. The remote machine must be arm64 and installed Docker CE.
|
||||
```
|
||||
docker context create oracle-arm64-jp --docker "host=ssh://root@100.107.174.88"
|
||||
```
|
||||
3. Create a new builder.
|
||||
```
|
||||
docker buildx create --name kuma-builder --platform linux/amd64,linux/arm/v7
|
||||
docker buildx use kuma-builder
|
||||
docker buildx inspect --bootstrap
|
||||
```
|
||||
4. Append the remote context to the builder.
|
||||
```
|
||||
docker buildx create --append --name kuma-builder --platform linux/arm64 oracle-arm64-jp
|
||||
```
|
||||
5. Verify the builder and check if the builder is using `kuma-builder`.
|
||||
```
|
||||
docker buildx inspect kuma-builder
|
||||
docker buildx ls
|
||||
```
|
||||
- arm64 using remote arm64 cpu, as the emulator is too slow and can no longer
|
||||
pass the `npm ci` command.
|
||||
|
||||
1. Add the public key to the remote server.
|
||||
2. Add the remote context. The remote machine must be arm64 and installed
|
||||
Docker CE.
|
||||
|
||||
```bash
|
||||
docker context create oracle-arm64-jp --docker "host=ssh://root@100.107.174.88"
|
||||
```
|
||||
|
||||
3. Create a new builder.
|
||||
|
||||
```bash
|
||||
docker buildx create --name kuma-builder --platform linux/amd64,linux/arm/v7
|
||||
docker buildx use kuma-builder
|
||||
docker buildx inspect --bootstrap
|
||||
```
|
||||
|
||||
4. Append the remote context to the builder.
|
||||
|
||||
```bash
|
||||
docker buildx create --append --name kuma-builder --platform linux/arm64 oracle-arm64-jp
|
||||
```
|
||||
|
||||
5. Verify the builder and check if the builder is using `kuma-builder`.
|
||||
`docker buildx inspect kuma-builder docker buildx ls`
|
||||
|
||||
</p>
|
||||
</details>
|
||||
- <details><summary>Release</summary>
|
||||
|
||||
- <details><summary><b>Release</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
1. Draft a release note
|
||||
2. Make sure the repo is cleared
|
||||
3. If the healthcheck is updated, remember to re-compile it: `npm run build-docker-builder-go`
|
||||
3. If the healthcheck is updated, remember to re-compile it:
|
||||
`npm run build-docker-builder-go`
|
||||
4. `npm run release-final` with env vars: `VERSION` and `GITHUB_TOKEN`
|
||||
5. Wait until the `Press any key to continue`
|
||||
6. `git push`
|
||||
|
@ -463,13 +740,16 @@ We have a few procedures we follow. These are documented here:
|
|||
|
||||
These Items need to be checked:
|
||||
|
||||
- [ ] Check all tags is fine on https://hub.docker.com/r/louislam/uptime-kuma/tags
|
||||
- [ ] Try the Docker image with tag 1.X.X (Clean install / amd64 / arm64 / armv7)
|
||||
- [ ] Check all tags is fine on
|
||||
<https://hub.docker.com/r/louislam/uptime-kuma/tags>
|
||||
- [ ] Try the Docker image with tag 1.X.X (Clean install / amd64 / arm64 /
|
||||
armv7)
|
||||
- [ ] Try clean installation with Node.js
|
||||
|
||||
|
||||
</p>
|
||||
</details>
|
||||
- <details><summary>Release Beta</summary>
|
||||
|
||||
- <details><summary><b>Release Beta</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
1. Draft a release note, check `This is a pre-release`
|
||||
|
@ -478,35 +758,37 @@ We have a few procedures we follow. These are documented here:
|
|||
4. Wait until the `Press any key to continue`
|
||||
5. Publish the release note as `1.X.X-beta.X`
|
||||
6. Press any key to continue
|
||||
|
||||
|
||||
</p>
|
||||
</details>
|
||||
- <details><summary>Release Wiki</summary>
|
||||
|
||||
- <details><summary><b>Release Wiki</b> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
**Setup Repo**
|
||||
|
||||
|
||||
```bash
|
||||
git clone https://github.com/louislam/uptime-kuma-wiki.git
|
||||
cd uptime-kuma-wiki
|
||||
git remote add production https://github.com/louislam/uptime-kuma.wiki.git
|
||||
```
|
||||
|
||||
|
||||
**Push to Production Wiki**
|
||||
|
||||
|
||||
```bash
|
||||
git pull
|
||||
git push production master
|
||||
```
|
||||
|
||||
|
||||
</p>
|
||||
</details>
|
||||
- <details><summary>Change the base of a pull request such as <code>master</code> to <code>1.23.X</code></summary>
|
||||
|
||||
- <details><summary>Change the base of a pull request such as <code>master</code> to <code>1.23.X</code> (click to expand)</summary>
|
||||
<p>
|
||||
|
||||
|
||||
```bash
|
||||
git rebase --onto <new parent> <old parent>
|
||||
```
|
||||
|
||||
|
||||
</p>
|
||||
</details>
|
||||
|
|
36
SECURITY.md
36
SECURITY.md
|
@ -2,29 +2,37 @@
|
|||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
1. Please report security issues to https://github.com/louislam/uptime-kuma/security/advisories/new.
|
||||
2. Please also create an empty security issue to alert me, as GitHub Advisories do not send a notification, I probably will miss it without this. https://github.com/louislam/uptime-kuma/issues/new?assignees=&labels=help&template=security.md
|
||||
1. Please report security issues to
|
||||
<https://github.com/louislam/uptime-kuma/security/advisories/new>.
|
||||
2. Please also create an empty security issue to alert me, as GitHub Advisories
|
||||
do not send a notification, I probably will miss it without this.
|
||||
<https://github.com/louislam/uptime-kuma/issues/new?assignees=&labels=help&template=security.md>
|
||||
|
||||
Do not use the public issue tracker or discuss it in public as it will cause more damage.
|
||||
Do not use the public issue tracker or discuss it in public as it will cause
|
||||
more damage.
|
||||
|
||||
## Do you accept other 3rd-party bug bounty platforms?
|
||||
|
||||
At this moment, I DO NOT accept other bug bounty platforms, because I am not familiar with these platforms and someone has tried to send a phishing link to me by doing this already. To minimize my own risk, please report through GitHub Advisories only. I will ignore all 3rd-party bug bounty platforms emails.
|
||||
At this moment, I DO NOT accept other bug bounty platforms, because I am not
|
||||
familiar with these platforms and someone has tried to send a phishing link to
|
||||
me by doing this already. To minimize my own risk, please report through GitHub
|
||||
Advisories only. I will ignore all 3rd-party bug bounty platforms emails.
|
||||
|
||||
## Supported Versions
|
||||
|
||||
### Uptime Kuma Versions
|
||||
|
||||
You should use or upgrade to the latest version of Uptime Kuma. All `1.X.X` versions are upgradable to the latest version.
|
||||
You should use or upgrade to the latest version of Uptime Kuma. All `1.X.X`
|
||||
versions are upgradable to the latest version.
|
||||
|
||||
### Upgradable Docker Tags
|
||||
|
||||
| Tag | Supported |
|
||||
|-|-|
|
||||
| 1 | :white_check_mark: |
|
||||
| 1-debian | :white_check_mark: |
|
||||
| latest | :white_check_mark: |
|
||||
| debian | :white_check_mark: |
|
||||
| 1-alpine | ⚠️ Deprecated |
|
||||
| alpine | ⚠️ Deprecated |
|
||||
| All other tags | ❌ |
|
||||
| Tag | Supported |
|
||||
| -------------- | ------------------ |
|
||||
| 1 | :white_check_mark: |
|
||||
| 1-debian | :white_check_mark: |
|
||||
| latest | :white_check_mark: |
|
||||
| debian | :white_check_mark: |
|
||||
| 1-alpine | ⚠️ Deprecated |
|
||||
| alpine | ⚠️ Deprecated |
|
||||
| All other tags | ❌ |
|
||||
|
|
|
@ -3,6 +3,7 @@ console.log("== Uptime Kuma Reset Password Tool ==");
|
|||
const Database = require("../server/database");
|
||||
const { R } = require("redbean-node");
|
||||
const readline = require("readline");
|
||||
const { passwordStrength } = require("check-password-strength");
|
||||
const { initJWTSecret } = require("../server/util-server");
|
||||
const User = require("../server/model/user");
|
||||
const { io } = require("socket.io-client");
|
||||
|
@ -42,8 +43,15 @@ const main = async () => {
|
|||
console.log("Using password from argument");
|
||||
console.warn("\x1b[31m%s\x1b[0m", "Warning: the password might be stored, in plain text, in your shell's history");
|
||||
password = confirmPassword = args["new-password"] + "";
|
||||
if (passwordStrength(password).value === "Too weak") {
|
||||
throw new Error("Password is too weak, please use a stronger password.");
|
||||
}
|
||||
} else {
|
||||
password = await question("New Password: ");
|
||||
if (passwordStrength(password).value === "Too weak") {
|
||||
console.log("Password is too weak, please try again.");
|
||||
continue;
|
||||
}
|
||||
confirmPassword = await question("Confirm New Password: ");
|
||||
}
|
||||
|
||||
|
|
1486
package-lock.json
generated
1486
package-lock.json
generated
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"name": "uptime-kuma",
|
||||
"version": "2.0.0-beta.1",
|
||||
"version": "2.0.0-beta.2",
|
||||
"license": "MIT",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -72,7 +72,7 @@
|
|||
"@louislam/sqlite3": "15.1.6",
|
||||
"@vvo/tzdb": "^6.125.0",
|
||||
"args-parser": "~1.3.0",
|
||||
"axios": "~0.29.0",
|
||||
"axios": "~0.30.0",
|
||||
"badge-maker": "~3.3.1",
|
||||
"bcryptjs": "~2.4.3",
|
||||
"chardet": "~1.4.0",
|
||||
|
@ -82,6 +82,7 @@
|
|||
"command-exists": "~1.2.9",
|
||||
"compare-versions": "~3.6.0",
|
||||
"compression": "~1.7.4",
|
||||
"country-flag-emoji-polyfill": "^0.1.8",
|
||||
"croner": "~8.1.0",
|
||||
"dayjs": "~1.11.5",
|
||||
"dev-null": "^0.1.1",
|
||||
|
@ -190,7 +191,7 @@
|
|||
"testcontainers": "^10.13.1",
|
||||
"typescript": "~4.4.4",
|
||||
"v-pagination-3": "~0.1.7",
|
||||
"vite": "~5.4.14",
|
||||
"vite": "~5.4.15",
|
||||
"vite-plugin-compression": "^0.5.1",
|
||||
"vite-plugin-vue-devtools": "^7.0.15",
|
||||
"vue": "~3.4.2",
|
||||
|
|
|
@ -381,39 +381,6 @@ class Monitor extends BeanModel {
|
|||
if (await Monitor.isUnderMaintenance(this.id)) {
|
||||
bean.msg = "Monitor under maintenance";
|
||||
bean.status = MAINTENANCE;
|
||||
} else if (this.type === "group") {
|
||||
const children = await Monitor.getChildren(this.id);
|
||||
|
||||
if (children.length > 0) {
|
||||
bean.status = UP;
|
||||
bean.msg = "All children up and running";
|
||||
for (const child of children) {
|
||||
if (!child.active) {
|
||||
// Ignore inactive childs
|
||||
continue;
|
||||
}
|
||||
const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
|
||||
|
||||
// Only change state if the monitor is in worse conditions then the ones before
|
||||
// lastBeat.status could be null
|
||||
if (!lastBeat) {
|
||||
bean.status = PENDING;
|
||||
} else if (bean.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
|
||||
bean.status = lastBeat.status;
|
||||
} else if (bean.status === PENDING && lastBeat.status === DOWN) {
|
||||
bean.status = lastBeat.status;
|
||||
}
|
||||
}
|
||||
|
||||
if (bean.status !== UP) {
|
||||
bean.msg = "Child inaccessible";
|
||||
}
|
||||
} else {
|
||||
// Set status pending if group is empty
|
||||
bean.status = PENDING;
|
||||
bean.msg = "Group empty";
|
||||
}
|
||||
|
||||
} else if (this.type === "http" || this.type === "keyword" || this.type === "json-query") {
|
||||
// Do not do any queries/high loading things before the "bean.ping"
|
||||
let startTime = dayjs().valueOf();
|
||||
|
@ -1328,7 +1295,8 @@ class Monitor extends BeanModel {
|
|||
try {
|
||||
const heartbeatJSON = bean.toJSON();
|
||||
const monitorData = [{ id: monitor.id,
|
||||
active: monitor.active
|
||||
active: monitor.active,
|
||||
name: monitor.name
|
||||
}];
|
||||
const preloadData = await Monitor.preparePreloadData(monitorData);
|
||||
// Prevent if the msg is undefined, notifications such as Discord cannot send out.
|
||||
|
@ -1626,7 +1594,7 @@ class Monitor extends BeanModel {
|
|||
/**
|
||||
* Gets all Children of the monitor
|
||||
* @param {number} monitorID ID of monitor to get
|
||||
* @returns {Promise<LooseObject<any>>} Children
|
||||
* @returns {Promise<LooseObject<any>[]>} Children
|
||||
*/
|
||||
static async getChildren(monitorID) {
|
||||
return await R.getAll(`
|
||||
|
|
|
@ -34,12 +34,16 @@ class DnsMonitorType extends MonitorType {
|
|||
switch (monitor.dns_resolve_type) {
|
||||
case "A":
|
||||
case "AAAA":
|
||||
case "TXT":
|
||||
case "PTR":
|
||||
dnsMessage = `Records: ${dnsRes.join(" | ")}`;
|
||||
conditionsResult = dnsRes.some(record => handleConditions({ record }));
|
||||
break;
|
||||
|
||||
case "TXT":
|
||||
dnsMessage = `Records: ${dnsRes.join(" | ")}`;
|
||||
conditionsResult = dnsRes.flat().some(record => handleConditions({ record }));
|
||||
break;
|
||||
|
||||
case "CNAME":
|
||||
dnsMessage = dnsRes[0];
|
||||
conditionsResult = handleConditions({ record: dnsRes[0] });
|
||||
|
|
49
server/monitor-types/group.js
Normal file
49
server/monitor-types/group.js
Normal file
|
@ -0,0 +1,49 @@
|
|||
const { UP, PENDING, DOWN } = require("../../src/util");
|
||||
const { MonitorType } = require("./monitor-type");
|
||||
const Monitor = require("../model/monitor");
|
||||
|
||||
class GroupMonitorType extends MonitorType {
|
||||
name = "group";
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
async check(monitor, heartbeat, _server) {
|
||||
const children = await Monitor.getChildren(monitor.id);
|
||||
|
||||
if (children.length > 0) {
|
||||
heartbeat.status = UP;
|
||||
heartbeat.msg = "All children up and running";
|
||||
for (const child of children) {
|
||||
if (!child.active) {
|
||||
// Ignore inactive childs
|
||||
continue;
|
||||
}
|
||||
const lastBeat = await Monitor.getPreviousHeartbeat(child.id);
|
||||
|
||||
// Only change state if the monitor is in worse conditions then the ones before
|
||||
// lastBeat.status could be null
|
||||
if (!lastBeat) {
|
||||
heartbeat.status = PENDING;
|
||||
} else if (heartbeat.status === UP && (lastBeat.status === PENDING || lastBeat.status === DOWN)) {
|
||||
heartbeat.status = lastBeat.status;
|
||||
} else if (heartbeat.status === PENDING && lastBeat.status === DOWN) {
|
||||
heartbeat.status = lastBeat.status;
|
||||
}
|
||||
}
|
||||
|
||||
if (heartbeat.status !== UP) {
|
||||
heartbeat.msg = "Child inaccessible";
|
||||
}
|
||||
} else {
|
||||
// Set status pending if group is empty
|
||||
heartbeat.status = PENDING;
|
||||
heartbeat.msg = "Group empty";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
GroupMonitorType,
|
||||
};
|
||||
|
73
server/notification-providers/onechat.js
Normal file
73
server/notification-providers/onechat.js
Normal file
|
@ -0,0 +1,73 @@
|
|||
const NotificationProvider = require("./notification-provider");
|
||||
const axios = require("axios");
|
||||
const { DOWN, UP } = require("../../src/util");
|
||||
|
||||
class OneChat extends NotificationProvider {
|
||||
name = "OneChat";
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||
const okMsg = "Sent Successfully.";
|
||||
const url = "https://chat-api.one.th/message/api/v1/push_message";
|
||||
|
||||
try {
|
||||
const config = {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
Authorization: "Bearer " + notification.accessToken,
|
||||
},
|
||||
};
|
||||
if (heartbeatJSON == null) {
|
||||
const testMessage = {
|
||||
to: notification.recieverId,
|
||||
bot_id: notification.botId,
|
||||
type: "text",
|
||||
message: "Test Successful!",
|
||||
};
|
||||
await axios.post(url, testMessage, config);
|
||||
} else if (heartbeatJSON["status"] === DOWN) {
|
||||
const downMessage = {
|
||||
to: notification.recieverId,
|
||||
bot_id: notification.botId,
|
||||
type: "text",
|
||||
message:
|
||||
`UptimeKuma Alert:
|
||||
[🔴 Down]
|
||||
Name: ${monitorJSON["name"]}
|
||||
${heartbeatJSON["msg"]}
|
||||
Time (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`,
|
||||
};
|
||||
await axios.post(url, downMessage, config);
|
||||
} else if (heartbeatJSON["status"] === UP) {
|
||||
const upMessage = {
|
||||
to: notification.recieverId,
|
||||
bot_id: notification.botId,
|
||||
type: "text",
|
||||
message:
|
||||
`UptimeKuma Alert:
|
||||
[🟢 Up]
|
||||
Name: ${monitorJSON["name"]}
|
||||
${heartbeatJSON["msg"]}
|
||||
Time (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`,
|
||||
};
|
||||
await axios.post(url, upMessage, config);
|
||||
}
|
||||
|
||||
return okMsg;
|
||||
} catch (error) {
|
||||
// Handle errors and throw a descriptive message
|
||||
if (error.response) {
|
||||
const errorMessage =
|
||||
error.response.data?.message ||
|
||||
"Unknown API error occurred.";
|
||||
throw new Error(`OneChat API Error: ${errorMessage}`);
|
||||
} else {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = OneChat;
|
48
server/notification-providers/pumble.js
Normal file
48
server/notification-providers/pumble.js
Normal file
|
@ -0,0 +1,48 @@
|
|||
const NotificationProvider = require("./notification-provider");
|
||||
const axios = require("axios");
|
||||
const { UP } = require("../../src/util");
|
||||
|
||||
class Pumble extends NotificationProvider {
|
||||
name = "pumble";
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||
const okMsg = "Sent Successfully.";
|
||||
|
||||
try {
|
||||
if (heartbeatJSON === null && monitorJSON === null) {
|
||||
let data = {
|
||||
"attachments": [
|
||||
{
|
||||
"title": "Uptime Kuma Alert",
|
||||
"text": msg,
|
||||
"color": "#5BDD8B"
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
await axios.post(notification.webhookURL, data);
|
||||
return okMsg;
|
||||
}
|
||||
|
||||
let data = {
|
||||
"attachments": [
|
||||
{
|
||||
"title": `${monitorJSON["name"]} is ${heartbeatJSON["status"] === UP ? "up" : "down"}`,
|
||||
"text": heartbeatJSON["msg"],
|
||||
"color": (heartbeatJSON["status"] === UP ? "#5BDD8B" : "#DC3645"),
|
||||
}
|
||||
]
|
||||
};
|
||||
|
||||
await axios.post(notification.webhookURL, data);
|
||||
return okMsg;
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Pumble;
|
|
@ -1,5 +1,6 @@
|
|||
const { getMonitorRelativeURL } = require("../../src/util");
|
||||
const { setting } = require("../util-server");
|
||||
const { UP } = require("../../src/util");
|
||||
|
||||
const NotificationProvider = require("./notification-provider");
|
||||
const axios = require("axios");
|
||||
|
@ -43,15 +44,20 @@ class Pushover extends NotificationProvider {
|
|||
if (heartbeatJSON == null) {
|
||||
await axios.post(url, data);
|
||||
return okMsg;
|
||||
} else {
|
||||
data.message += `\n<b>Time (${heartbeatJSON["timezone"]})</b>:${heartbeatJSON["localDateTime"]}`;
|
||||
await axios.post(url, data);
|
||||
return okMsg;
|
||||
}
|
||||
|
||||
if (heartbeatJSON.status === UP && notification.pushoversounds_up) {
|
||||
// default = DOWN => DOWN-sound is also played for non-UP/DOWN notiifcations
|
||||
data.sound = notification.pushoversounds_up;
|
||||
}
|
||||
|
||||
data.message += `\n<b>Time (${heartbeatJSON["timezone"]})</b>: ${heartbeatJSON["localDateTime"]}`;
|
||||
await axios.post(url, data);
|
||||
return okMsg;
|
||||
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
56
server/notification-providers/pushplus.js
Normal file
56
server/notification-providers/pushplus.js
Normal file
|
@ -0,0 +1,56 @@
|
|||
const NotificationProvider = require("./notification-provider");
|
||||
const axios = require("axios");
|
||||
const { DOWN, UP } = require("../../src/util");
|
||||
|
||||
class PushPlus extends NotificationProvider {
|
||||
name = "PushPlus";
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
* @param {BeanModel} notification Notification object
|
||||
* @param {string} msg Message content
|
||||
* @param {?object} monitorJSON Monitor details
|
||||
* @param {?object} heartbeatJSON Heartbeat details
|
||||
* @returns {Promise<string>} Success message
|
||||
*/
|
||||
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||
const okMsg = "Sent Successfully.";
|
||||
const url = "https://www.pushplus.plus/send";
|
||||
try {
|
||||
const config = {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
};
|
||||
const params = {
|
||||
"token": notification.pushPlusSendKey,
|
||||
"title": this.checkStatus(heartbeatJSON, monitorJSON),
|
||||
"content": msg,
|
||||
"template": "html"
|
||||
};
|
||||
await axios.post(url, params, config);
|
||||
return okMsg;
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the formatted title for message
|
||||
* @param {?object} heartbeatJSON Heartbeat details (For Up/Down only)
|
||||
* @param {?object} monitorJSON Monitor details (For Up/Down only)
|
||||
* @returns {string} Formatted title
|
||||
*/
|
||||
checkStatus(heartbeatJSON, monitorJSON) {
|
||||
let title = "UptimeKuma Message";
|
||||
if (heartbeatJSON != null && heartbeatJSON["status"] === UP) {
|
||||
title = "UptimeKuma Monitor Up " + monitorJSON["name"];
|
||||
}
|
||||
if (heartbeatJSON != null && heartbeatJSON["status"] === DOWN) {
|
||||
title = "UptimeKuma Monitor Down " + monitorJSON["name"];
|
||||
}
|
||||
return title;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = PushPlus;
|
40
server/notification-providers/sms-planet.js
Normal file
40
server/notification-providers/sms-planet.js
Normal file
|
@ -0,0 +1,40 @@
|
|||
const NotificationProvider = require("./notification-provider");
|
||||
const axios = require("axios");
|
||||
|
||||
class SMSPlanet extends NotificationProvider {
|
||||
name = "SMSPlanet";
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||
const okMsg = "Sent Successfully.";
|
||||
const url = "https://api2.smsplanet.pl/sms";
|
||||
|
||||
try {
|
||||
let config = {
|
||||
headers: {
|
||||
"Authorization": "Bearer " + notification.smsplanetApiToken,
|
||||
"content-type": "multipart/form-data"
|
||||
}
|
||||
};
|
||||
|
||||
let data = {
|
||||
"from": notification.smsplanetSenderName,
|
||||
"to": notification.smsplanetPhoneNumbers,
|
||||
"msg": msg.replace(/🔴/, "❌")
|
||||
};
|
||||
|
||||
let response = await axios.post(url, data, config);
|
||||
if (!response.data?.messageId) {
|
||||
throw new Error(response.data?.errorMsg ?? "SMSPlanet server did not respond with the expected result");
|
||||
}
|
||||
|
||||
return okMsg;
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = SMSPlanet;
|
|
@ -11,59 +11,127 @@ class SMSEagle extends NotificationProvider {
|
|||
const okMsg = "Sent Successfully.";
|
||||
|
||||
try {
|
||||
let config = {
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
if (notification.smseagleApiType === "smseagle-apiv1") { // according to https://www.smseagle.eu/apiv1/
|
||||
let config = {
|
||||
headers: {
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
}
|
||||
};
|
||||
|
||||
let sendMethod;
|
||||
let recipientType;
|
||||
let duration;
|
||||
let voiceId;
|
||||
|
||||
if (notification.smseagleRecipientType === "smseagle-contact") {
|
||||
recipientType = "contactname";
|
||||
sendMethod = "/send_tocontact";
|
||||
} else if (notification.smseagleRecipientType === "smseagle-group") {
|
||||
recipientType = "groupname";
|
||||
sendMethod = "/send_togroup";
|
||||
} else if (notification.smseagleRecipientType === "smseagle-to") {
|
||||
recipientType = "to";
|
||||
sendMethod = "/send_sms";
|
||||
if (notification.smseagleMsgType !== "smseagle-sms") {
|
||||
duration = notification.smseagleDuration ?? 10;
|
||||
|
||||
if (notification.smseagleMsgType === "smseagle-ring") {
|
||||
sendMethod = "/ring_call";
|
||||
} else if (notification.smseagleMsgType === "smseagle-tts") {
|
||||
sendMethod = "/tts_call";
|
||||
} else if (notification.smseagleMsgType === "smseagle-tts-advanced") {
|
||||
sendMethod = "/tts_adv_call";
|
||||
voiceId = notification.smseagleTtsModel ? notification.smseagleTtsModel : 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
let postData;
|
||||
let sendMethod;
|
||||
let recipientType;
|
||||
const url = new URL(notification.smseagleUrl + "/http_api" + sendMethod);
|
||||
|
||||
let encoding = (notification.smseagleEncoding) ? "1" : "0";
|
||||
let priority = (notification.smseaglePriority) ? notification.smseaglePriority : "0";
|
||||
|
||||
if (notification.smseagleRecipientType === "smseagle-contact") {
|
||||
recipientType = "contactname";
|
||||
sendMethod = "sms.send_tocontact";
|
||||
}
|
||||
if (notification.smseagleRecipientType === "smseagle-group") {
|
||||
recipientType = "groupname";
|
||||
sendMethod = "sms.send_togroup";
|
||||
}
|
||||
if (notification.smseagleRecipientType === "smseagle-to") {
|
||||
recipientType = "to";
|
||||
sendMethod = "sms.send_sms";
|
||||
}
|
||||
|
||||
let params = {
|
||||
access_token: notification.smseagleToken,
|
||||
[recipientType]: notification.smseagleRecipient,
|
||||
message: msg,
|
||||
responsetype: "extended",
|
||||
unicode: encoding,
|
||||
highpriority: priority
|
||||
};
|
||||
|
||||
postData = {
|
||||
method: sendMethod,
|
||||
params: params
|
||||
};
|
||||
|
||||
let resp = await axios.post(notification.smseagleUrl + "/jsonrpc/sms", postData, config);
|
||||
|
||||
if ((JSON.stringify(resp.data)).indexOf("message_id") === -1) {
|
||||
let error = "";
|
||||
if (resp.data.result && resp.data.result.error_text) {
|
||||
error = `SMSEagle API returned error: ${JSON.stringify(resp.data.result.error_text)}`;
|
||||
url.searchParams.append("access_token", notification.smseagleToken);
|
||||
url.searchParams.append(recipientType, notification.smseagleRecipient);
|
||||
if (!notification.smseagleRecipientType || notification.smseagleRecipientType === "smseagle-sms") {
|
||||
url.searchParams.append("unicode", (notification.smseagleEncoding) ? "1" : "0");
|
||||
url.searchParams.append("highpriority", notification.smseaglePriority ?? "0");
|
||||
} else {
|
||||
error = "SMSEagle API returned an unexpected response";
|
||||
url.searchParams.append("duration", duration);
|
||||
}
|
||||
if (notification.smseagleRecipientType !== "smseagle-ring") {
|
||||
url.searchParams.append("message", msg);
|
||||
}
|
||||
if (voiceId) {
|
||||
url.searchParams.append("voice_id", voiceId);
|
||||
}
|
||||
throw new Error(error);
|
||||
}
|
||||
|
||||
return okMsg;
|
||||
let resp = await axios.get(url.toString(), config);
|
||||
|
||||
if (resp.data.indexOf("OK") === -1) {
|
||||
let error = `SMSEagle API returned error: ${resp.data}`;
|
||||
throw new Error(error);
|
||||
}
|
||||
|
||||
return okMsg;
|
||||
} else if (notification.smseagleApiType === "smseagle-apiv2") { // according to https://www.smseagle.eu/docs/apiv2/
|
||||
let config = {
|
||||
headers: {
|
||||
"access-token": notification.smseagleToken,
|
||||
"Content-Type": "application/json",
|
||||
}
|
||||
};
|
||||
|
||||
let encoding = (notification.smseagleEncoding) ? "unicode" : "standard";
|
||||
let priority = (notification.smseaglePriority) ?? 0;
|
||||
|
||||
let postData = {
|
||||
text: msg,
|
||||
encoding: encoding,
|
||||
priority: priority
|
||||
};
|
||||
|
||||
if (notification.smseagleRecipientContact) {
|
||||
postData["contacts"] = notification.smseagleRecipientContact.split(",").map(Number);
|
||||
}
|
||||
if (notification.smseagleRecipientGroup) {
|
||||
postData["groups"] = notification.smseagleRecipientGroup.split(",").map(Number);
|
||||
}
|
||||
if (notification.smseagleRecipientTo) {
|
||||
postData["to"] = notification.smseagleRecipientTo.split(",");
|
||||
}
|
||||
|
||||
let endpoint = "/messages/sms";
|
||||
|
||||
if (notification.smseagleMsgType !== "smseagle-sms") {
|
||||
|
||||
postData["duration"] = notification.smseagleDuration ?? 10;
|
||||
|
||||
if (notification.smseagleMsgType === "smseagle-ring") {
|
||||
endpoint = "/calls/ring";
|
||||
} else if (notification.smseagleMsgType === "smseagle-tts") {
|
||||
endpoint = "/calls/tts";
|
||||
} else if (notification.smseagleMsgType === "smseagle-tts-advanced") {
|
||||
endpoint = "/calls/tts_advanced";
|
||||
postData["voice_id"] = notification.smseagleTtsModel ?? 1;
|
||||
}
|
||||
}
|
||||
|
||||
let resp = await axios.post(notification.smseagleUrl + "/api/v2" + endpoint, postData, config);
|
||||
|
||||
const queuedCount = resp.data.filter(x => x.status === "queued").length;
|
||||
const unqueuedCount = resp.data.length - queuedCount;
|
||||
|
||||
if (resp.status !== 200 || queuedCount === 0) {
|
||||
if (!resp.data.length) {
|
||||
throw new Error("SMSEagle API returned an empty response");
|
||||
}
|
||||
throw new Error(`SMSEagle API returned error: ${JSON.stringify(resp.data)}`);
|
||||
}
|
||||
|
||||
if (unqueuedCount) {
|
||||
return `Sent ${queuedCount}/${resp.data.length} Messages Successfully.`;
|
||||
}
|
||||
|
||||
return okMsg;
|
||||
}
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
|
|
|
@ -42,6 +42,7 @@ class SMTP extends NotificationProvider {
|
|||
// default values in case the user does not want to template
|
||||
let subject = msg;
|
||||
let body = msg;
|
||||
let useHTMLBody = false;
|
||||
if (heartbeatJSON) {
|
||||
body = `${msg}\nTime (${heartbeatJSON["timezone"]}): ${heartbeatJSON["localDateTime"]}`;
|
||||
}
|
||||
|
@ -50,11 +51,11 @@ class SMTP extends NotificationProvider {
|
|||
// cannot end with whitespace as this often raises spam scores
|
||||
const customSubject = notification.customSubject?.trim() || "";
|
||||
const customBody = notification.customBody?.trim() || "";
|
||||
|
||||
if (customSubject !== "") {
|
||||
subject = await this.renderTemplate(customSubject, msg, monitorJSON, heartbeatJSON);
|
||||
}
|
||||
if (customBody !== "") {
|
||||
useHTMLBody = notification.htmlBody || false;
|
||||
body = await this.renderTemplate(customBody, msg, monitorJSON, heartbeatJSON);
|
||||
}
|
||||
}
|
||||
|
@ -67,7 +68,8 @@ class SMTP extends NotificationProvider {
|
|||
bcc: notification.smtpBCC,
|
||||
to: notification.smtpTo,
|
||||
subject: subject,
|
||||
text: body,
|
||||
// If the email body is custom, and the user wants it, set the email body as HTML
|
||||
[useHTMLBody ? "html" : "text"]: body
|
||||
});
|
||||
|
||||
return okMsg;
|
||||
|
|
37
server/notification-providers/spugpush.js
Normal file
37
server/notification-providers/spugpush.js
Normal file
|
@ -0,0 +1,37 @@
|
|||
const NotificationProvider = require("./notification-provider");
|
||||
const axios = require("axios");
|
||||
const { DOWN, UP } = require("../../src/util");
|
||||
|
||||
class SpugPush extends NotificationProvider {
|
||||
|
||||
name = "SpugPush";
|
||||
|
||||
/**
|
||||
* @inheritdoc
|
||||
*/
|
||||
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
|
||||
let okMsg = "Sent Successfully.";
|
||||
try {
|
||||
let formData = {
|
||||
title: "Uptime Kuma Message",
|
||||
content: msg
|
||||
};
|
||||
if (heartbeatJSON) {
|
||||
if (heartbeatJSON["status"] === UP) {
|
||||
formData.title = `UptimeKuma 「${monitorJSON["name"]}」 is Up`;
|
||||
formData.content = `[✅ Up] ${heartbeatJSON["msg"]}`;
|
||||
} else if (heartbeatJSON["status"] === DOWN) {
|
||||
formData.title = `UptimeKuma 「${monitorJSON["name"]}」 is Down`;
|
||||
formData.content = `[🔴 Down] ${heartbeatJSON["msg"]}`;
|
||||
}
|
||||
}
|
||||
const apiUrl = `https://push.spug.cc/send/${notification.templateKey}`;
|
||||
await axios.post(apiUrl, formData);
|
||||
return okMsg;
|
||||
} catch (error) {
|
||||
this.throwGeneralAxiosError(error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = SpugPush;
|
|
@ -30,15 +30,18 @@ const Mattermost = require("./notification-providers/mattermost");
|
|||
const Nostr = require("./notification-providers/nostr");
|
||||
const Ntfy = require("./notification-providers/ntfy");
|
||||
const Octopush = require("./notification-providers/octopush");
|
||||
const OneChat = require("./notification-providers/onechat");
|
||||
const OneBot = require("./notification-providers/onebot");
|
||||
const Opsgenie = require("./notification-providers/opsgenie");
|
||||
const PagerDuty = require("./notification-providers/pagerduty");
|
||||
const Pumble = require("./notification-providers/pumble");
|
||||
const FlashDuty = require("./notification-providers/flashduty");
|
||||
const PagerTree = require("./notification-providers/pagertree");
|
||||
const PromoSMS = require("./notification-providers/promosms");
|
||||
const Pushbullet = require("./notification-providers/pushbullet");
|
||||
const PushDeer = require("./notification-providers/pushdeer");
|
||||
const Pushover = require("./notification-providers/pushover");
|
||||
const PushPlus = require("./notification-providers/pushplus");
|
||||
const Pushy = require("./notification-providers/pushy");
|
||||
const RocketChat = require("./notification-providers/rocket-chat");
|
||||
const SerwerSMS = require("./notification-providers/serwersms");
|
||||
|
@ -71,6 +74,8 @@ const Onesender = require("./notification-providers/onesender");
|
|||
const Wpush = require("./notification-providers/wpush");
|
||||
const SendGrid = require("./notification-providers/send-grid");
|
||||
const YZJ = require("./notification-providers/yzj");
|
||||
const SMSPlanet = require("./notification-providers/sms-planet");
|
||||
const SpugPush = require("./notification-providers/spugpush");
|
||||
|
||||
class Notification {
|
||||
|
||||
|
@ -118,6 +123,7 @@ class Notification {
|
|||
new Nostr(),
|
||||
new Ntfy(),
|
||||
new Octopush(),
|
||||
new OneChat(),
|
||||
new OneBot(),
|
||||
new Onesender(),
|
||||
new Opsgenie(),
|
||||
|
@ -125,9 +131,11 @@ class Notification {
|
|||
new FlashDuty(),
|
||||
new PagerTree(),
|
||||
new PromoSMS(),
|
||||
new Pumble(),
|
||||
new Pushbullet(),
|
||||
new PushDeer(),
|
||||
new Pushover(),
|
||||
new PushPlus(),
|
||||
new Pushy(),
|
||||
new RocketChat(),
|
||||
new ServerChan(),
|
||||
|
@ -158,7 +166,9 @@ class Notification {
|
|||
new Cellsynt(),
|
||||
new Wpush(),
|
||||
new SendGrid(),
|
||||
new YZJ()
|
||||
new YZJ(),
|
||||
new SMSPlanet(),
|
||||
new SpugPush(),
|
||||
];
|
||||
for (let item of list) {
|
||||
if (! item.name) {
|
||||
|
|
|
@ -89,7 +89,7 @@ router.get("/api/status-page/heartbeat/:slug", cache("1 minutes"), async (reques
|
|||
SELECT * FROM heartbeat
|
||||
WHERE monitor_id = ?
|
||||
ORDER BY time DESC
|
||||
LIMIT 50
|
||||
LIMIT 100
|
||||
`, [
|
||||
monitorID,
|
||||
]);
|
||||
|
|
|
@ -114,6 +114,7 @@ class UptimeKumaServer {
|
|||
UptimeKumaServer.monitorTypeList["dns"] = new DnsMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["mqtt"] = new MqttMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["smtp"] = new SMTPMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["group"] = new GroupMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["snmp"] = new SNMPMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["mongodb"] = new MongodbMonitorType();
|
||||
UptimeKumaServer.monitorTypeList["rabbitmq"] = new RabbitMqMonitorType();
|
||||
|
@ -553,6 +554,7 @@ const { TailscalePing } = require("./monitor-types/tailscale-ping");
|
|||
const { DnsMonitorType } = require("./monitor-types/dns");
|
||||
const { MqttMonitorType } = require("./monitor-types/mqtt");
|
||||
const { SMTPMonitorType } = require("./monitor-types/smtp");
|
||||
const { GroupMonitorType } = require("./monitor-types/group");
|
||||
const { SNMPMonitorType } = require("./monitor-types/snmp");
|
||||
const { MongodbMonitorType } = require("./monitor-types/mongodb");
|
||||
const { RabbitMqMonitorType } = require("./monitor-types/rabbitmq");
|
||||
|
|
|
@ -4,9 +4,11 @@
|
|||
|
||||
<script>
|
||||
import { setPageLocale } from "./util-frontend";
|
||||
import { polyfillCountryFlagEmojis } from "country-flag-emoji-polyfill";
|
||||
export default {
|
||||
created() {
|
||||
setPageLocale();
|
||||
},
|
||||
};
|
||||
polyfillCountryFlagEmojis();
|
||||
</script>
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
@import "node_modules/bootstrap/scss/bootstrap";
|
||||
|
||||
#app {
|
||||
font-family: BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, noto color emoji;
|
||||
font-family: "Twemoji Country Flags", BlinkMacSystemFont, segoe ui, Roboto, helvetica neue, Arial, noto sans, sans-serif, apple color emoji, segoe ui emoji, segoe ui symbol, noto color emoji;
|
||||
}
|
||||
|
||||
h1 {
|
||||
|
|
|
@ -42,6 +42,9 @@ export default {
|
|||
mounted() {
|
||||
this.modal = new Modal(this.$refs.modal);
|
||||
},
|
||||
beforeUnmount() {
|
||||
this.cleanupModal();
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* Show the confirm dialog
|
||||
|
@ -58,6 +61,19 @@ export default {
|
|||
this.$emit("added", this.groupName);
|
||||
this.modal.hide();
|
||||
},
|
||||
/**
|
||||
* Clean up modal and restore scroll behavior
|
||||
* @returns {void}
|
||||
*/
|
||||
cleanupModal() {
|
||||
if (this.modal) {
|
||||
try {
|
||||
this.modal.hide();
|
||||
} catch (e) {
|
||||
console.warn("Modal hide failed:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
<router-link :to="monitorURL(monitor.id)" class="item" :class="{ 'disabled': ! monitor.active }">
|
||||
<div class="row">
|
||||
<div class="col-9 col-md-8 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
|
||||
<div class="col-6 small-padding" :class="{ 'monitor-item': $root.userHeartbeatBar == 'bottom' || $root.userHeartbeatBar == 'none' }">
|
||||
<div class="info">
|
||||
<Uptime :monitor="monitor" type="24" :pill="true" />
|
||||
<span v-if="hasChildren" class="collapse-padding" @click.prevent="changeCollapsed">
|
||||
|
@ -22,11 +22,11 @@
|
|||
</span>
|
||||
{{ monitor.name }}
|
||||
</div>
|
||||
<div v-if="monitor.tags.length > 0" class="tags">
|
||||
<div v-if="monitor.tags.length > 0" class="tags gap-1">
|
||||
<Tag v-for="tag in monitor.tags" :key="tag" :item="tag" :size="'sm'" />
|
||||
</div>
|
||||
</div>
|
||||
<div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-3 col-md-4">
|
||||
<div v-show="$root.userHeartbeatBar == 'normal'" :key="$root.userHeartbeatBar" class="col-6">
|
||||
<HeartbeatBar ref="heartbeatBar" size="small" :monitor-id="monitor.id" />
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -135,11 +135,13 @@ export default {
|
|||
"nostr": "Nostr",
|
||||
"ntfy": "Ntfy",
|
||||
"octopush": "Octopush",
|
||||
"OneChat": "OneChat",
|
||||
"OneBot": "OneBot",
|
||||
"Onesender": "Onesender",
|
||||
"Opsgenie": "Opsgenie",
|
||||
"PagerDuty": "PagerDuty",
|
||||
"PagerTree": "PagerTree",
|
||||
"pumble": "Pumble",
|
||||
"pushbullet": "Pushbullet",
|
||||
"PushByTechulus": "Push by Techulus",
|
||||
"pushover": "Pushover",
|
||||
|
@ -182,9 +184,12 @@ export default {
|
|||
"SMSManager": "SmsManager (smsmanager.cz)",
|
||||
"WeCom": "WeCom (企业微信群机器人)",
|
||||
"ServerChan": "ServerChan (Server酱)",
|
||||
"PushPlus": "PushPlus (推送加)",
|
||||
"SpugPush": "SpugPush(Spug推送助手)",
|
||||
"smsc": "SMSC",
|
||||
"WPush": "WPush(wpush.cn)",
|
||||
"YZJ": "YZJ (云之家自定义机器人)"
|
||||
"YZJ": "YZJ (云之家自定义机器人)",
|
||||
"SMSPlanet": "SMSPlanet.pl"
|
||||
};
|
||||
|
||||
// Sort by notification name
|
||||
|
@ -234,6 +239,9 @@ export default {
|
|||
mounted() {
|
||||
this.modal = new Modal(this.$refs.modal);
|
||||
},
|
||||
beforeUnmount() {
|
||||
this.cleanupModal();
|
||||
},
|
||||
methods: {
|
||||
|
||||
/**
|
||||
|
@ -338,6 +346,20 @@ export default {
|
|||
});
|
||||
} while (this.$root.notificationList.find(it => it.name === name));
|
||||
return name;
|
||||
},
|
||||
|
||||
/**
|
||||
* Clean up modal and restore scroll behavior
|
||||
* @returns {void}
|
||||
*/
|
||||
cleanupModal() {
|
||||
if (this.modal) {
|
||||
try {
|
||||
this.modal.hide();
|
||||
} catch (e) {
|
||||
console.warn("Modal hide failed:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
@ -125,11 +125,12 @@ export default {
|
|||
}
|
||||
};
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.modal = new Modal(this.$refs.modal);
|
||||
},
|
||||
|
||||
beforeUnmount() {
|
||||
this.cleanupModal();
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* Show dialog to confirm deletion
|
||||
|
@ -209,6 +210,20 @@ export default {
|
|||
}
|
||||
});
|
||||
},
|
||||
|
||||
/**
|
||||
* Clean up modal and restore scroll behavior
|
||||
* @returns {void}
|
||||
*/
|
||||
cleanupModal() {
|
||||
if (this.modal) {
|
||||
try {
|
||||
this.modal.hide();
|
||||
} catch (e) {
|
||||
console.warn("Modal hide failed:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -33,7 +33,7 @@
|
|||
<template #item="monitor">
|
||||
<div class="item" data-testid="monitor">
|
||||
<div class="row">
|
||||
<div class="col-9 col-md-8 small-padding">
|
||||
<div class="col-6 small-padding">
|
||||
<div class="info">
|
||||
<font-awesome-icon v-if="editMode" icon="arrows-alt-v" class="action drag me-3" />
|
||||
<font-awesome-icon v-if="editMode" icon="times" class="action remove me-3" @click="removeMonitor(group.index, monitor.index)" />
|
||||
|
@ -71,7 +71,7 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div :key="$root.userHeartbeatBar" class="col-3 col-md-4">
|
||||
<div :key="$root.userHeartbeatBar" class="col-6">
|
||||
<HeartbeatBar size="mid" :monitor-id="monitor.element.id" />
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -6,7 +6,6 @@
|
|||
'm-2': size == 'normal',
|
||||
'px-2': size == 'sm',
|
||||
'py-0': size == 'sm',
|
||||
'mx-1': size == 'sm',
|
||||
}"
|
||||
:style="{ backgroundColor: item.color, fontSize: size == 'sm' ? '0.7em' : '1em' }"
|
||||
>
|
||||
|
@ -48,7 +47,7 @@ export default {
|
|||
},
|
||||
computed: {
|
||||
displayText() {
|
||||
if (this.item.value === "" || this.item.value === undefined) {
|
||||
if (this.item.value === "" || this.item.value === undefined || this.item.value === null) {
|
||||
return this.item.name;
|
||||
} else {
|
||||
return `${this.item.name}: ${this.item.value}`;
|
||||
|
|
|
@ -248,6 +248,9 @@ export default {
|
|||
this.modal = new Modal(this.$refs.modal);
|
||||
this.getExistingTags();
|
||||
},
|
||||
beforeUnmount() {
|
||||
this.cleanupModal();
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* Show the add tag dialog
|
||||
|
@ -459,6 +462,19 @@ export default {
|
|||
this.newTags = [];
|
||||
this.deleteTags = [];
|
||||
this.processing = false;
|
||||
},
|
||||
/**
|
||||
* Clean up modal and restore scroll behavior
|
||||
* @returns {void}
|
||||
*/
|
||||
cleanupModal() {
|
||||
if (this.modal) {
|
||||
try {
|
||||
this.modal.hide();
|
||||
} catch (e) {
|
||||
console.warn("Modal hide failed:", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
};
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
{{ $t("matrixDesc1") }}
|
||||
</p>
|
||||
<i18n-t tag="p" keypath="matrixDesc2" style="margin-top: 8px;">
|
||||
<code>curl -XPOST -d '{"type": "m.login.password", "identifier": {"user": "botusername", "type": "m.id.user"}, "password": "passwordforuser"}' "https://home.server/_matrix/client/r0/login"</code>.
|
||||
<code>curl -XPOST -d '{"type": "m.login.password", "identifier": {"user": "botusername", "type": "m.id.user"}, "password": "passwordforuser"}' "https://home.server/_matrix/client/v3/login"</code>.
|
||||
</i18n-t>
|
||||
</div>
|
||||
</template>
|
||||
|
|
64
src/components/notifications/OneChat.vue
Normal file
64
src/components/notifications/OneChat.vue
Normal file
|
@ -0,0 +1,64 @@
|
|||
<template>
|
||||
<div class="mb-3">
|
||||
<!-- Access Token Input -->
|
||||
<div class="mb-3">
|
||||
<label for="onechat-access-token" class="form-label">
|
||||
OneChat Access Token<span style="color: red;"><sup>*</sup></span>
|
||||
</label>
|
||||
<HiddenInput
|
||||
id="onechat-access-token"
|
||||
v-model="$parent.notification.accessToken"
|
||||
:required="true"
|
||||
>
|
||||
</HiddenInput>
|
||||
<div class="form-text">
|
||||
<p>{{ $t("OneChatAccessToken") }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Receiver ID Input -->
|
||||
<div class="mb-3">
|
||||
<label for="onechat-receiver-id" class="form-label">
|
||||
{{ $t("OneChatUserIdOrGroupId") }}<span style="color: red;"><sup>*</sup></span>
|
||||
</label>
|
||||
<input
|
||||
id="onechat-receiver-id"
|
||||
v-model="$parent.notification.recieverId"
|
||||
type="text"
|
||||
class="form-control"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Bot ID Input -->
|
||||
<div class="mb-3">
|
||||
<label for="onechat-bot-id" class="form-label">
|
||||
{{ $t("OneChatBotId") }}<span style="color: red;"><sup>*</sup></span>
|
||||
</label>
|
||||
<input
|
||||
id="onechat-bot-id"
|
||||
v-model="$parent.notification.botId"
|
||||
type="text"
|
||||
class="form-control"
|
||||
required
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- Document Link -->
|
||||
<div class="form-text">
|
||||
<i18n-t tag="p" keypath="Read more:">
|
||||
<a href="https://chat-develop.one.th/docs" target="_blank">https://chat-develop.one.th/docs</a>
|
||||
</i18n-t>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import HiddenInput from "../HiddenInput.vue";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
HiddenInput,
|
||||
},
|
||||
};
|
||||
</script>
|
9
src/components/notifications/Pumble.vue
Normal file
9
src/components/notifications/Pumble.vue
Normal file
|
@ -0,0 +1,9 @@
|
|||
<template>
|
||||
<div class="mb-3">
|
||||
<label for="pumble-webhook-url" class="form-label mb-2">{{ $t("Webhook URL") }}</label><span style="color: red;"><sup>*</sup></span>
|
||||
<input id="pumble-webhook-url" v-model="$parent.notification.webhookURL" type="url" class="form-control" required>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<a href="https://pumble.com/help/integrations/add-pumble-apps/incoming-webhooks-for-pumble/" target="_blank">{{ $t("documentationOf", ["Pumble Webbhook"]) }}</a>
|
||||
</div>
|
||||
</template>
|
19
src/components/notifications/PushPlus.vue
Normal file
19
src/components/notifications/PushPlus.vue
Normal file
|
@ -0,0 +1,19 @@
|
|||
<template>
|
||||
<div class="mb-3">
|
||||
<label for="pushPlus-sendkey" class="form-label">{{ $t("SendKey") }}</label>
|
||||
<HiddenInput id="pushPlus-sendkey" v-model="$parent.notification.pushPlusSendKey" :required="true" autocomplete="new-password"></HiddenInput>
|
||||
</div>
|
||||
<i18n-t tag="div" keypath="More info on:" class="mb-3 form-text">
|
||||
<a href="https://www.pushplus.plus/" target="_blank">https://www.pushplus.plus/</a>
|
||||
</i18n-t>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import HiddenInput from "../HiddenInput.vue";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
HiddenInput,
|
||||
},
|
||||
};
|
||||
</script>
|
|
@ -16,34 +16,24 @@
|
|||
<option>1</option>
|
||||
<option>2</option>
|
||||
</select>
|
||||
<label for="pushover-sound" class="form-label">{{ $t("Notification Sound") }}</label>
|
||||
<select id="pushover-sound" v-model="$parent.notification.pushoversounds" class="form-select">
|
||||
<option value="pushover">{{ $t("pushoversounds pushover") }}</option>
|
||||
<option value="bike">{{ $t("pushoversounds bike") }}</option>
|
||||
<option value="bugle">{{ $t("pushoversounds bugle") }}</option>
|
||||
<option value="cashregister">{{ $t("pushoversounds cashregister") }}</option>
|
||||
<option value="classical">{{ $t("pushoversounds classical") }}</option>
|
||||
<option value="cosmic">{{ $t("pushoversounds cosmic") }}</option>
|
||||
<option value="falling">{{ $t("pushoversounds falling") }}</option>
|
||||
<option value="gamelan">{{ $t("pushoversounds gamelan") }}</option>
|
||||
<option value="incoming">{{ $t("pushoversounds incoming") }}</option>
|
||||
<option value="intermission">{{ $t("pushoversounds intermission") }}</option>
|
||||
<option value="magic">{{ $t("pushoversounds magic") }}</option>
|
||||
<option value="mechanical">{{ $t("pushoversounds mechanical") }}</option>
|
||||
<option value="pianobar">{{ $t("pushoversounds pianobar") }}</option>
|
||||
<option value="siren">{{ $t("pushoversounds siren") }}</option>
|
||||
<option value="spacealarm">{{ $t("pushoversounds spacealarm") }}</option>
|
||||
<option value="tugboat">{{ $t("pushoversounds tugboat") }}</option>
|
||||
<option value="alien">{{ $t("pushoversounds alien") }}</option>
|
||||
<option value="climb">{{ $t("pushoversounds climb") }}</option>
|
||||
<option value="persistent">{{ $t("pushoversounds persistent") }}</option>
|
||||
<option value="echo">{{ $t("pushoversounds echo") }}</option>
|
||||
<option value="updown">{{ $t("pushoversounds updown") }}</option>
|
||||
<option value="vibrate">{{ $t("pushoversounds vibrate") }}</option>
|
||||
<option value="none">{{ $t("pushoversounds none") }}</option>
|
||||
|
||||
<label for="pushover-sound-down" class="form-label">{{ $t("Notification Sound") }} - Up</label>
|
||||
<select id="pushover-sound-down" v-model="$parent.notification.pushoversounds" class="form-select">
|
||||
<option v-for="sound in soundOptions" :key="sound" :value="sound">
|
||||
{{ $t(`pushoversounds ${sound}`) }}
|
||||
</option>
|
||||
</select>
|
||||
|
||||
<label for="pushover-sound-up" class="form-label">{{ $t("Notification Sound") }} - Down</label>
|
||||
<select id="pushover-sound-up" v-model="$parent.notification.pushoversounds_up" class="form-select">
|
||||
<option v-for="sound in soundOptions" :key="sound" :value="sound">
|
||||
{{ $t(`pushoversounds ${sound}`) }}
|
||||
</option>
|
||||
</select>
|
||||
|
||||
<label for="pushover-ttl" class="form-label">{{ $t("pushoverMessageTtl") }}</label>
|
||||
<input id="pushover-ttl" v-model="$parent.notification.pushoverttl" type="number" min="0" step="1" class="form-control">
|
||||
|
||||
<div class="form-text">
|
||||
<span style="color: red;"><sup>*</sup></span>{{ $t("Required") }}
|
||||
<i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
|
||||
|
@ -66,5 +56,34 @@ export default {
|
|||
components: {
|
||||
HiddenInput,
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
soundOptions: [
|
||||
"pushover",
|
||||
"bike",
|
||||
"bugle",
|
||||
"cashregister",
|
||||
"classical",
|
||||
"cosmic",
|
||||
"falling",
|
||||
"gamelan",
|
||||
"incoming",
|
||||
"intermission",
|
||||
"magic",
|
||||
"mechanical",
|
||||
"pianobar",
|
||||
"siren",
|
||||
"spacealarm",
|
||||
"tugboat",
|
||||
"alien",
|
||||
"climb",
|
||||
"persistent",
|
||||
"echo",
|
||||
"updown",
|
||||
"vibrate",
|
||||
"none",
|
||||
],
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
|
|
@ -1,31 +1,123 @@
|
|||
<template>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-url" class="form-label">{{ $t("smseagleUrl") }}</label>
|
||||
<input id="smseagle-url" v-model="$parent.notification.smseagleUrl" type="text" minlength="7" class="form-control" placeholder="http://127.0.0.1" required>
|
||||
<input
|
||||
id="smseagle-url" v-model="$parent.notification.smseagleUrl" type="text" minlength="7"
|
||||
class="form-control" placeholder="http://127.0.0.1" required
|
||||
>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-token" class="form-label">{{ $t("smseagleToken") }}</label>
|
||||
<HiddenInput id="smseagle-token" v-model="$parent.notification.smseagleToken" :required="true"></HiddenInput>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-recipient-type" class="form-label">{{ $t("smseagleRecipientType") }}</label>
|
||||
<select id="smseagle-recipient-type" v-model="$parent.notification.smseagleRecipientType" class="form-select">
|
||||
<option value="smseagle-to" selected>{{ $t("smseagleTo") }}</option>
|
||||
<option value="smseagle-group">{{ $t("smseagleGroup") }}</option>
|
||||
<option value="smseagle-contact">{{ $t("smseagleContact") }}</option>
|
||||
<label for="smseagle-api-type" class="form-label">{{ $t("smseagleApiType") }} </label>
|
||||
<select id="smseagle-api-type" v-model="$parent.notification.smseagleApiType" class="form-select">
|
||||
<option value="smseagle-apiv1" selected>{{ $t("smseagleApiv1") }} </option>
|
||||
<option value="smseagle-apiv2">{{ $t("smseagleApiv2") }} </option>
|
||||
</select>
|
||||
<i18n-t tag="div" keypath="smseagleDocs" class="form-text">
|
||||
<a href="https://www.smseagle.eu/api/" target="_blank">https://www.smseagle.eu/api/</a>
|
||||
</i18n-t>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-recipient" class="form-label">{{ $t("smseagleRecipient") }}</label>
|
||||
<input id="smseagle-recipient" v-model="$parent.notification.smseagleRecipient" type="text" class="form-control" required>
|
||||
<div v-if="$parent.notification.smseagleApiType === 'smseagle-apiv1'" class="mb-3">
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-recipient-type" class="form-label">{{ $t("smseagleRecipientType") }}</label>
|
||||
<select
|
||||
id="smseagle-recipient-type" v-model="$parent.notification.smseagleRecipientType"
|
||||
class="form-select"
|
||||
>
|
||||
<!-- phone number -->
|
||||
<option value="smseagle-to" selected>{{ $t("smseagleTo") }}</option>
|
||||
<option value="smseagle-group">{{ $t("smseagleGroup") }}</option>
|
||||
<option value="smseagle-contact">{{ $t("smseagleContact") }}</option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-recipient" class="form-label">{{ $t("smseagleRecipient") }}</label>
|
||||
<input id="smseagle-recipient" v-model="$parent.notification.smseagleRecipient" type="text" class="form-control" required>
|
||||
</div>
|
||||
<div
|
||||
v-if="$parent.notification.smseagleMsgType === 'smseagle-sms'
|
||||
|| $parent.notification.smseagleRecipientType !== 'smseagle-to'" class="mb-3"
|
||||
>
|
||||
<label for="smseagle-priority" class="form-label">{{ $t("smseaglePriority") }}</label>
|
||||
<input id="smseagle-priority" v-model="$parent.notification.smseaglePriority" type="number" class="form-control" min="0" max="9" step="1" placeholder="0" required>
|
||||
</div>
|
||||
<div
|
||||
v-if="$parent.notification.smseagleMsgType === 'smseagle-sms'
|
||||
|| $parent.notification.smseagleRecipientType !== 'smseagle-to'" class="mb-3 form-check form-switch"
|
||||
>
|
||||
<label for="smseagle-encoding" class="form-label">{{ $t("smseagleEncoding") }}</label>
|
||||
<input id="smseagle-encoding" v-model="$parent.notification.smseagleEncoding" type="checkbox" class="form-check-input">
|
||||
</div>
|
||||
<div v-if="$parent.notification.smseagleRecipientType === 'smseagle-to'" class="mb-3">
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-msg-type" class="form-label">{{ $t("smseagleMsgType") }} </label>
|
||||
<select id="smseagle-msg-type" v-model="$parent.notification.smseagleMsgType" class="form-select">
|
||||
<option value="smseagle-sms" selected>{{ $t("smseagleMsgSms") }} </option>
|
||||
<option value="smseagle-ring">{{ $t("smseagleMsgRing") }} </option>
|
||||
<option value="smseagle-tts">{{ $t("smseagleMsgTts") }} </option>
|
||||
<option value="smseagle-tts-advanced">{{ $t("smseagleMsgTtsAdvanced") }} </option>
|
||||
</select>
|
||||
</div>
|
||||
<div
|
||||
v-if="$parent.notification.smseagleMsgType === 'smseagle-ring'
|
||||
|| $parent.notification.smseagleMsgType === 'smseagle-tts'
|
||||
|| $parent.notification.smseagleMsgType === 'smseagle-tts-advanced'" class="mb-3"
|
||||
>
|
||||
<label for="smseagle-duration" class="form-label">{{ $t("smseagleDuration") }}</label>
|
||||
<input id="smseagle-duration" v-model="$parent.notification.smseagleDuration" type="number" class="form-control" min="0" max="30" step="1" placeholder="10">
|
||||
</div>
|
||||
<div v-if="$parent.notification.smseagleMsgType === 'smseagle-tts-advanced'" class="mb-3">
|
||||
<label for="smseagle-tts-model" class="form-label">{{ $t("smseagleTtsModel") }} </label>
|
||||
<input id="smseagle-tts-model" v-model="$parent.notification.smseagleTtsModel" type="number" class="form-control" placeholder="1" required>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-priority" class="form-label">{{ $t("smseaglePriority") }}</label>
|
||||
<input id="smseagle-priority" v-model="$parent.notification.smseaglePriority" type="number" class="form-control" min="0" max="9" step="1" placeholder="0">
|
||||
</div>
|
||||
<div class="mb-3 form-check form-switch">
|
||||
<label for="smseagle-encoding" class="form-label">{{ $t("smseagleEncoding") }}</label>
|
||||
<input id="smseagle-encoding" v-model="$parent.notification.smseagleEncoding" type="checkbox" class="form-check-input">
|
||||
|
||||
<div v-if="$parent.notification.smseagleApiType === 'smseagle-apiv2'" class="mb-3">
|
||||
<div class="mb-3">
|
||||
<!-- phone number -->
|
||||
<label for="smseagle-recipient-to" class="form-label">{{ $t("smseagleTo") }}</label>
|
||||
<input id="smseagle-recipient-to" v-model="$parent.notification.smseagleRecipientTo" type="text" class="form-control">
|
||||
<i18n-t tag="div" keypath="smseagleComma" class="form-text" />
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-recipient-group" class="form-label">{{ $t("smseagleGroupV2") }}</label>
|
||||
<input id="smseagle-recipient-group" v-model="$parent.notification.smseagleRecipientGroup" type="text" class="form-control">
|
||||
<i18n-t tag="div" keypath="smseagleComma" class="form-text" />
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-recipient-contact" class="form-label">{{ $t("smseagleContactV2") }}</label>
|
||||
<input id="smseagle-recipient-contact" v-model="$parent.notification.smseagleRecipientContact" type="text" class="form-control">
|
||||
<i18n-t tag="div" keypath="smseagleComma" class="form-text" />
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-priority-v2" class="form-label">{{ $t("smseaglePriority") }}</label>
|
||||
<input id="smseagle-priority-v2" v-model="$parent.notification.smseaglePriority" type="number" class="form-control" min="0" max="9" step="1" placeholder="0">
|
||||
</div>
|
||||
<div class="mb-3 form-check form-switch">
|
||||
<label for="smseagle-encoding-v2" class="form-label">{{ $t("smseagleEncoding") }}</label>
|
||||
<input id="smseagle-encoding-v2" v-model="$parent.notification.smseagleEncoding" type="checkbox" class="form-check-input">
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smseagle-msg-type-v2" class="form-label">{{ $t("smseagleMsgType") }} </label>
|
||||
<select id="smseagle-msg-type-v2" v-model="$parent.notification.smseagleMsgType" class="form-select">
|
||||
<option value="smseagle-sms" selected>{{ $t("smseagleMsgSms") }} </option>
|
||||
<option value="smseagle-ring">{{ $t("smseagleMsgRing") }} </option>
|
||||
<option value="smseagle-tts">{{ $t("smseagleMsgTts") }} </option>
|
||||
<option value="smseagle-tts-advanced">{{ $t("smseagleMsgTtsAdvanced") }} </option>
|
||||
</select>
|
||||
</div>
|
||||
<div v-if="$parent.notification.smseagleMsgType && $parent.notification.smseagleMsgType !== 'smseagle-sms'" class="mb-3">
|
||||
<label for="smseagle-duration-v2" class="form-label">{{ $t("smseagleDuration") }}</label>
|
||||
<input id="smseagle-duration-v2" v-model="$parent.notification.smseagleDuration" type="number" class="form-control" min="0" max="30" step="1" placeholder="10">
|
||||
</div>
|
||||
<div v-if="$parent.notification.smseagleMsgType === 'smseagle-tts-advanced'" class="mb-3">
|
||||
<label for="smseagle-tts-model-v2" class="form-label">{{ $t("smseagleTtsModel") }} </label>
|
||||
<input id="smseagle-tts-model-v2" v-model="$parent.notification.smseagleTtsModel" type="number" class="form-control" placeholder="1" required>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -36,5 +128,16 @@ export default {
|
|||
components: {
|
||||
HiddenInput,
|
||||
},
|
||||
mounted() {
|
||||
if (!this.$parent.notification.smseagleApiType) {
|
||||
this.$parent.notification.smseagleApiType = "smseagle-apiv1";
|
||||
}
|
||||
if (!this.$parent.notification.smseagleMsgType) {
|
||||
this.$parent.notification.smseagleMsgType = "smseagle-sms";
|
||||
}
|
||||
if (!this.$parent.notification.smseagleRecipientType) {
|
||||
this.$parent.notification.smseagleRecipientType = "smseagle-to";
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
|
46
src/components/notifications/SMSPlanet.vue
Normal file
46
src/components/notifications/SMSPlanet.vue
Normal file
|
@ -0,0 +1,46 @@
|
|||
<template>
|
||||
<div class="mb-3">
|
||||
<label for="smsplanet-api-token" class="form-label">{{ $t('smsplanetApiToken') }}</label>
|
||||
<HiddenInput id="smsplanet-api-token" v-model="$parent.notification.smsplanetApiToken" :required="true"></HiddenInput>
|
||||
<i18n-t tag="div" keypath="smsplanetApiDocs" class="form-text">
|
||||
<template #the_smsplanet_documentation>
|
||||
<a
|
||||
href="https://smsplanet.pl/doc/slate/index.html#introduction"
|
||||
target="_blank"
|
||||
>{{ $t("the smsplanet documentation") }}</a>
|
||||
</template>
|
||||
</i18n-t>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smsplanet-phone-numbers" class="form-label">{{ $t("Phone numbers") }}</label>
|
||||
<textarea
|
||||
id="smsplanet-phone-numbers"
|
||||
v-model="$parent.notification.smsplanetPhoneNumbers"
|
||||
class="form-control"
|
||||
:placeholder="smsplanetPhoneNumbers"
|
||||
required
|
||||
></textarea>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<label for="smsplanet-sender-name" class="form-label">{{ $t("Sender name") }}</label>
|
||||
<input id="smsplanet-sender-name" v-model="$parent.notification.smsplanetSenderName" type="text" minlength="3" maxlength="11" class="form-control">
|
||||
<div class="form-text">{{ $t("smsplanetNeedToApproveName") }}</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import HiddenInput from "../HiddenInput.vue";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
HiddenInput,
|
||||
},
|
||||
computed: {
|
||||
smsplanetPhoneNumbers() {
|
||||
return this.$t("Example:", [
|
||||
"+48123456789,+48111222333",
|
||||
]);
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -79,6 +79,15 @@
|
|||
<div class="form-text">{{ $t("leave blank for default body") }}</div>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<div class="form-check">
|
||||
<input id="use-html-body" v-model="$parent.notification.htmlBody" class="form-check-input" type="checkbox" value="">
|
||||
<label class="form-check-label" for="use-html-body">
|
||||
{{ $t("Use HTML for custom E-mail body") }}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<ToggleSection :heading="$t('smtpDkimSettings')">
|
||||
<i18n-t tag="div" keypath="smtpDkimDesc" class="form-text mb-3">
|
||||
<a href="https://nodemailer.com/dkim/" target="_blank">{{ $t("documentation") }}</a>
|
||||
|
|
19
src/components/notifications/SpugPush.vue
Normal file
19
src/components/notifications/SpugPush.vue
Normal file
|
@ -0,0 +1,19 @@
|
|||
<template>
|
||||
<div class="mb-3">
|
||||
<label for="spugpush-templateKey" class="form-label">{{ $t("SpugPush Template Code") }}</label>
|
||||
<HiddenInput id="spugpush-templateKey" v-model="$parent.notification.templateKey" :required="true" autocomplete="new-password"></HiddenInput>
|
||||
</div>
|
||||
<i18n-t tag="p" keypath="More info on:" style="margin-top: 8px;">
|
||||
<a href="https://push.spug.cc/guide/plugin/kuma" rel="noopener noreferrer" target="_blank">https://push.spug.cc</a>
|
||||
</i18n-t>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import HiddenInput from "../HiddenInput.vue";
|
||||
|
||||
export default {
|
||||
components: {
|
||||
HiddenInput,
|
||||
},
|
||||
};
|
||||
</script>
|
|
@ -29,6 +29,7 @@ import Mattermost from "./Mattermost.vue";
|
|||
import Nostr from "./Nostr.vue";
|
||||
import Ntfy from "./Ntfy.vue";
|
||||
import Octopush from "./Octopush.vue";
|
||||
import OneChat from "./OneChat.vue";
|
||||
import OneBot from "./OneBot.vue";
|
||||
import Onesender from "./Onesender.vue";
|
||||
import Opsgenie from "./Opsgenie.vue";
|
||||
|
@ -36,9 +37,11 @@ import PagerDuty from "./PagerDuty.vue";
|
|||
import FlashDuty from "./FlashDuty.vue";
|
||||
import PagerTree from "./PagerTree.vue";
|
||||
import PromoSMS from "./PromoSMS.vue";
|
||||
import Pumble from "./Pumble.vue";
|
||||
import Pushbullet from "./Pushbullet.vue";
|
||||
import PushDeer from "./PushDeer.vue";
|
||||
import Pushover from "./Pushover.vue";
|
||||
import PushPlus from "./PushPlus.vue";
|
||||
import Pushy from "./Pushy.vue";
|
||||
import RocketChat from "./RocketChat.vue";
|
||||
import ServerChan from "./ServerChan.vue";
|
||||
|
@ -61,6 +64,7 @@ import WeCom from "./WeCom.vue";
|
|||
import GoAlert from "./GoAlert.vue";
|
||||
import ZohoCliq from "./ZohoCliq.vue";
|
||||
import Splunk from "./Splunk.vue";
|
||||
import SpugPush from "./SpugPush.vue";
|
||||
import SevenIO from "./SevenIO.vue";
|
||||
import Whapi from "./Whapi.vue";
|
||||
import WAHA from "./WAHA.vue";
|
||||
|
@ -69,6 +73,7 @@ import WPush from "./WPush.vue";
|
|||
import SIGNL4 from "./SIGNL4.vue";
|
||||
import SendGrid from "./SendGrid.vue";
|
||||
import YZJ from "./YZJ.vue";
|
||||
import SMSPlanet from "./SMSPlanet.vue";
|
||||
|
||||
/**
|
||||
* Manage all notification form.
|
||||
|
@ -105,6 +110,7 @@ const NotificationFormList = {
|
|||
"nostr": Nostr,
|
||||
"ntfy": Ntfy,
|
||||
"octopush": Octopush,
|
||||
"OneChat": OneChat,
|
||||
"OneBot": OneBot,
|
||||
"Onesender": Onesender,
|
||||
"Opsgenie": Opsgenie,
|
||||
|
@ -112,10 +118,12 @@ const NotificationFormList = {
|
|||
"FlashDuty": FlashDuty,
|
||||
"PagerTree": PagerTree,
|
||||
"promosms": PromoSMS,
|
||||
"pumble": Pumble,
|
||||
"pushbullet": Pushbullet,
|
||||
"PushByTechulus": TechulusPush,
|
||||
"PushDeer": PushDeer,
|
||||
"pushover": Pushover,
|
||||
"PushPlus": PushPlus,
|
||||
"pushy": Pushy,
|
||||
"rocket.chat": RocketChat,
|
||||
"serwersms": SerwerSMS,
|
||||
|
@ -133,6 +141,7 @@ const NotificationFormList = {
|
|||
"threema": Threema,
|
||||
"twilio": Twilio,
|
||||
"Splunk": Splunk,
|
||||
"SpugPush": SpugPush,
|
||||
"webhook": Webhook,
|
||||
"WeCom": WeCom,
|
||||
"GoAlert": GoAlert,
|
||||
|
@ -146,6 +155,7 @@ const NotificationFormList = {
|
|||
"WPush": WPush,
|
||||
"SendGrid": SendGrid,
|
||||
"YZJ": YZJ,
|
||||
"SMSPlanet": SMSPlanet,
|
||||
};
|
||||
|
||||
export default NotificationFormList;
|
||||
|
|
|
@ -21,6 +21,9 @@
|
|||
<label><input v-model="settings.checkBeta" type="checkbox" :disabled="!settings.checkUpdate" @change="saveSettings()" /> {{ $t("Also check beta release") }}</label>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-5">
|
||||
<p>{{ $t("Font Twemoji by Twitter licensed under") }} <a href="https://creativecommons.org/licenses/by/4.0/">CC-BY 4.0</a></p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
|
|
@ -31,6 +31,7 @@ const languageList = {
|
|||
"sv-SE": "Svenska",
|
||||
"tr-TR": "Türkçe",
|
||||
"ko-KR": "한국어",
|
||||
"lt": "Lietuvių",
|
||||
"ru-RU": "Русский",
|
||||
"zh-CN": "简体中文",
|
||||
"pl": "Polski",
|
||||
|
|
|
@ -1098,5 +1098,25 @@
|
|||
"RabbitMQ Nodes": "Възли за управление на RabbitMQ",
|
||||
"rabbitmqNodesDescription": "Въведете URL адреса на възлите за управление на RabbitMQ, включително протокол и порт. Пример: {0}",
|
||||
"rabbitmqHelpText": "За да използвате монитора, ще трябва да активирате добавката за управление във вашата настройка на RabbitMQ. За повече информация моля, вижте {rabitmq_documentation}.",
|
||||
"aboutSlackUsername": "Променя показваното име на подателя на съобщението. Ако желаете да споменете някого, вместо това го включете в приятелското име."
|
||||
"aboutSlackUsername": "Променя показваното име на подателя на съобщението. Ако желаете да споменете някого, вместо това го включете в приятелското име.",
|
||||
"YZJ Robot Token": "YZJ Robot токен код",
|
||||
"YZJ Webhook URL": "YZJ Уеб кука URL адрес",
|
||||
"templateServiceName": "име на услугата",
|
||||
"templateHostnameOrURL": "име на хоста или URL адрес",
|
||||
"Plain Text": "Обикновен текст",
|
||||
"Message Template": "Шаблон за съобщение",
|
||||
"templateStatus": "статус",
|
||||
"telegramUseTemplate": "Използвай персонализиран шаблон за съобщение",
|
||||
"telegramUseTemplateDescription": "Ако е активирано, съобщението ще бъде изпратено чрез персонализиран шаблон.",
|
||||
"telegramTemplateFormatDescription": "Telegram позволява използването на различни \"markup\" езици за съобщенията. Вижте Telegram {0} за детайли.",
|
||||
"Template Format": "Формат на шаблона",
|
||||
"wayToGetWahaApiUrl": "Вашият WAHA URL адрес.",
|
||||
"wahaSession": "Сесия",
|
||||
"wahaChatId": "Чат ID (телефонен номер / ID на контакт / ID на група)",
|
||||
"wayToGetWahaApiKey": "API ключът, е стойността на променливата WHATSAPP_API_KEY, която сте използвали за стартиране на WAHA.",
|
||||
"wayToWriteWahaChatId": "Телефонният номер с международния префикс, но без знака плюс в началото ({0}), ID на контакта ({1}) или ID на групата ({2}). Известията се изпращат до това чат ID от WAHA сесия.",
|
||||
"wayToGetWahaSession": "От тази сесия WAHA изпраща известия до чат ID. Можете да го намерите в таблото за управление на WAHA.",
|
||||
"telegramServerUrlDescription": "За премахване на API бот ограниченията за Telegram или за получаване на достъп в блокирани зони (Китай, Иран и др.). За повече информация щракнете върху {0}. По подразбиране: {1}",
|
||||
"telegramServerUrl": "(По избор) URL адрес на сървъра",
|
||||
"Font Twemoji by Twitter licensed under": "Шрифт Twemoji от Twitter, лицензиран под"
|
||||
}
|
||||
|
|
349
src/lang/ca.json
349
src/lang/ca.json
|
@ -49,7 +49,7 @@
|
|||
"Delete": "Eliminar",
|
||||
"Current": "Actual",
|
||||
"Uptime": "Temps actiu",
|
||||
"Cert Exp.": "Caducitat del certificat",
|
||||
"Cert Exp.": "Caducitat del certificat.",
|
||||
"Monitor": "Monitor | Monitors",
|
||||
"day": "dia | dies",
|
||||
"-day": "-dia",
|
||||
|
@ -218,7 +218,7 @@
|
|||
"Required": "Obligatori",
|
||||
"Post URL": "Posar URL",
|
||||
"Content Type": "Content Type",
|
||||
"Json Query Expression": "Json Query Expression",
|
||||
"Json Query Expression": "Expressió de consulta Json",
|
||||
"now": "ara",
|
||||
"-year": "-any",
|
||||
"Status Pages": "Pàgines d'estat",
|
||||
|
@ -226,5 +226,348 @@
|
|||
"time ago": "fa {0}",
|
||||
"ignoredTLSError": "Errors TLS/SSL ignorats",
|
||||
"webhookFormDataDesc": "{multipart} es bo per PHP. El JSON haurà d'analitzar-se amb {decodeFunction}",
|
||||
"webhookJsonDesc": "{0} es bo per qualsevol servidor HTTP modern com Express.js"
|
||||
"webhookJsonDesc": "{0} es bo per qualsevol servidor HTTP modern com Express.js",
|
||||
"templateMsg": "missatge de la notificació",
|
||||
"webhookAdditionalHeadersTitle": "Capçaleres addicionals",
|
||||
"Application Token": "Testimoni d'aplicació",
|
||||
"Server URL": "URL del servidor",
|
||||
"Priority": "Prioritat",
|
||||
"Webhook URL": "URL del Webhook",
|
||||
"emojiCheatSheet": "Full de trampa d'emoji: {0}",
|
||||
"Read more": "Llegeix més",
|
||||
"appriseInstalled": "S'ha instal·lat l'apèndix.",
|
||||
"templateHeartbeatJSON": "objecte que descriu el batec del cor",
|
||||
"templateMonitorJSON": "objecte que descriu el monitor",
|
||||
"templateLimitedToUpDownCertNotifications": "només disponible per a notificacions de venciment UP/DOWN/Certificate",
|
||||
"templateLimitedToUpDownNotifications": "només disponible per a notificacions UP/DOWN",
|
||||
"webhookAdditionalHeadersDesc": "Estableix les capçaleres addicionals enviades amb el webhook. Cada capçalera s'ha de definir com una clau/valor JSON.",
|
||||
"webhookBodyPresetOption": "Predefinit - {0}",
|
||||
"webhookBodyCustomOption": "Cos personalitzat",
|
||||
"Headers": "Capçaleres",
|
||||
"Monitor History": "Historial del monitor",
|
||||
"PasswordsDoNotMatch": "Les contrasenyes no coincideixen.",
|
||||
"records": "registres",
|
||||
"One record": "Un registre",
|
||||
"Current User": "Usuari actual",
|
||||
"topic": "Tema",
|
||||
"topicExplanation": "tema MQTT a monitorar",
|
||||
"successKeyword": "Paraula clau d'èxit",
|
||||
"successKeywordExplanation": "Paraula clau MQTT que es considerarà un èxit",
|
||||
"recent": "Recent",
|
||||
"Reset Token": "Restableix el testimoni",
|
||||
"Done": "Fet",
|
||||
"Info": "Info",
|
||||
"Steam API Key": "Clau API de Steam",
|
||||
"Shrink Database": "Redueix la base de dades",
|
||||
"Pick a RR-Type...": "Trieu un tipus RR…",
|
||||
"Default": "Per defecte",
|
||||
"HTTP Options": "Opcions HTTP",
|
||||
"Create Incident": "Crear Incident",
|
||||
"Title": "Títol",
|
||||
"Content": "Contingut",
|
||||
"Style": "Estil",
|
||||
"info": "info",
|
||||
"warning": "avís",
|
||||
"danger": "perill",
|
||||
"primary": "primària",
|
||||
"light": "lleuger",
|
||||
"dark": "fosc",
|
||||
"Post": "Post",
|
||||
"Created": "Creat",
|
||||
"Last Updated": "Darrera actualització",
|
||||
"Switch to Light Theme": "Canvia a tema clar",
|
||||
"Switch to Dark Theme": "Canviar a tema fosc",
|
||||
"Show Tags": "Mostra les etiquetes",
|
||||
"Hide Tags": "Amaga les etiquetes",
|
||||
"Description": "Descripció",
|
||||
"No monitors available.": "No hi ha monitors disponibles.",
|
||||
"Add one": "Afegeix-ne un",
|
||||
"No Monitors": "Sense monitors",
|
||||
"Untitled Group": "Grup sense títol",
|
||||
"Services": "Serveis",
|
||||
"Discard": "Descarta",
|
||||
"Cancel": "Canel·la",
|
||||
"Select": "Selecciona",
|
||||
"Check/Uncheck": "Comprova/desmarca",
|
||||
"Powered by": "Funciona amb",
|
||||
"Customize": "Personalitza",
|
||||
"Custom Footer": "Peu de pàgina personalitzat",
|
||||
"Custom CSS": "CSS personalitzat",
|
||||
"default": "Per defecte",
|
||||
"enabled": "Habilitat",
|
||||
"setAsDefault": "Estableix com a predeterminat",
|
||||
"deleteProxyMsg": "Esteu segur que voleu suprimir aquest servidor intermediari per a tots els monitors?",
|
||||
"setAsDefaultProxyDescription": "Aquest servidor intermediari s'habilitarà de manera predeterminada per als monitors nous. Encara podeu desactivar el servidor intermediari per separat per a cada monitor.",
|
||||
"Certificate Chain": "Cadena de certificats",
|
||||
"Valid": "Vàlid",
|
||||
"Invalid": "Invàlid",
|
||||
"User": "Usuari",
|
||||
"Installed": "Instal·lat",
|
||||
"Not installed": "No instal·lat",
|
||||
"Running": "En execució",
|
||||
"Not running": "No en execució",
|
||||
"Remove Token": "Elimina el testimoni",
|
||||
"Start": "Inicia",
|
||||
"Stop": "Aturar",
|
||||
"Add New Status Page": "Afegeix una pàgina d'estat nova",
|
||||
"Slug": "Àlies",
|
||||
"Accept characters:": "Accepta caràcters:",
|
||||
"startOrEndWithOnly": "Inicia o acaba només amb {0}",
|
||||
"No consecutive dashes": "Sense guions consecutius",
|
||||
"Next": "Següent",
|
||||
"The slug is already taken. Please choose another slug.": "L'àlias ja està agafat. Si us plau, escolliu un altre àlies.",
|
||||
"No Proxy": "Sense servidor intermediari",
|
||||
"Proxies": "Servidors intermediaris",
|
||||
"HTTP Basic Auth": "Autenticació bàsica HTTP",
|
||||
"New Status Page": "Pàgina d'estat nova",
|
||||
"Reverse Proxy": "Servidor intermediari invertit",
|
||||
"Backup": "Còpia de seguretat",
|
||||
"About": "Quant a",
|
||||
"wayToGetCloudflaredURL": "(Descarrega de cloudfared des de {0})",
|
||||
"cloudflareWebsite": "Lloc web de Cloudflare",
|
||||
"Message:": "Missatge:",
|
||||
"HTTP Headers": "Capçaleres HTTP",
|
||||
"Trust Proxy": "Confia en el servidor intermediari",
|
||||
"Other Software": "Un altre programari",
|
||||
"For example: nginx, Apache and Traefik.": "Per exemple: nginx, Apache i Traefik.",
|
||||
"Please read": "Llegiu",
|
||||
"Subject:": "Assumpte:",
|
||||
"Valid To:": "Vàlid per a:",
|
||||
"Days Remaining:": "Dies restants:",
|
||||
"Issuer:": "Emissor:",
|
||||
"Fingerprint:": "Empremta digital:",
|
||||
"No status pages": "Sense pàgines d'estat",
|
||||
"Domain Name Expiry Notification": "Notificació de venciment del nom de domini",
|
||||
"Add a new expiry notification day": "Notificació de venciment del nom de domini",
|
||||
"Remove the expiry notification": "Elimina el dia de notificació de venciment",
|
||||
"Proxy": "Servidor intermediari",
|
||||
"Date Created": "Data de creació",
|
||||
"Footer Text": "Text del peu de pàgina",
|
||||
"Refresh Interval Description": "La pàgina d'estat farà una actualització completa del lloc cada {0} segons",
|
||||
"Show Powered By": "Mostra Impulsat per",
|
||||
"Domain Names": "Noms de domini",
|
||||
"signedInDisp": "Sessió iniciada com a {0}",
|
||||
"RadiusSecret": "Secret de Radius",
|
||||
"RadiusSecretDescription": "Secret compartit entre client i servidor",
|
||||
"RadiusCalledStationId": "Id de l'estació cridada",
|
||||
"RadiusCallingStationId": "Id de l'estació de trucada",
|
||||
"RadiusCallingStationIdDescription": "Identificador del dispositiu de crida",
|
||||
"Certificate Expiry Notification": "Notificació de venciment del certificat",
|
||||
"API Username": "Nom d'usuari API",
|
||||
"API Key": "Clau API",
|
||||
"Show update if available": "Mostra l'actualització si està disponible",
|
||||
"Using a Reverse Proxy?": "Usar un servidor intermediari invers?",
|
||||
"Check how to config it for WebSocket": "Comprova com configurar-lo per a WebSocket",
|
||||
"Steam Game Server": "Servidor de jocs Steam",
|
||||
"Most likely causes:": "Causes més probables:",
|
||||
"There might be a typing error in the address.": "Pot haver-hi un error d'escriptura a l'adreça.",
|
||||
"What you can try:": "Què podeu provar:",
|
||||
"Retype the address.": "Torneu a teclejar l'adreça.",
|
||||
"Go back to the previous page.": "Torna a la pàgina anterior.",
|
||||
"Coming Soon": "Properament",
|
||||
"Connection String": "Cadena de connexió",
|
||||
"Query": "Consulta",
|
||||
"settingsCertificateExpiry": "Caducitat del certificat TLS",
|
||||
"Setup Docker Host": "Configura l'amfitrió Docker",
|
||||
"Connection Type": "Tipus de connexió",
|
||||
"Docker Daemon": "Dimoni Docker",
|
||||
"noDockerHostMsg": "No disponible. Primer configureu un amfitrió Docker.",
|
||||
"DockerHostRequired": "Establiu l'amfitrió Docker per a aquest monitor.",
|
||||
"socket": "Sòcol",
|
||||
"tcp": "TCP / HTTP",
|
||||
"Docker Container": "Contenidor Docker",
|
||||
"Container Name / ID": "Nom del contenidor / ID",
|
||||
"Docker Host": "Amfitrió Docker",
|
||||
"Docker Hosts": "Amfitrions Docker",
|
||||
"Domain": "Domini",
|
||||
"Workstation": "Estació de treball",
|
||||
"Packet Size": "Mida del paquet",
|
||||
"Bot Token": "Testimoni de bot",
|
||||
"wayToGetTelegramToken": "Podeu obtenir un testimoni de {0}.",
|
||||
"Chat ID": "ID de xat",
|
||||
"telegramMessageThreadID": "(Opcional) ID del fil del missatge",
|
||||
"telegramMessageThreadIDDescription": "Identificador únic opcional per al fil del missatge de destinació (tema) del fòrum; només per als supergrups del fòrum",
|
||||
"telegramSendSilently": "Envia silenciosament",
|
||||
"telegramProtectContent": "Protegeix la reenviament/desament",
|
||||
"supportTelegramChatID": "Admet xat directe / grup / ID de xat del canal",
|
||||
"YOUR BOT TOKEN HERE": "EL VOSTRE TESTIMONI DE BOT AQUÍ",
|
||||
"chatIDNotFound": "No s'ha trobat l'ID del xat; primer envieu un missatge a aquest bot",
|
||||
"disableCloudflaredNoAuthMsg": "Esteu en mode No Auth, no cal una contrasenya.",
|
||||
"wayToGetLineNotifyToken": "Podeu obtenir un testimoni d'accés des de {0}",
|
||||
"Examples": "Exemples",
|
||||
"Home Assistant URL": "URL de l'assistent d'inici",
|
||||
"Long-Lived Access Token": "Testimoni d'accés viu",
|
||||
"Notification Service": "Servei de notificacions",
|
||||
"Automations can optionally be triggered in Home Assistant:": "Les automatitzacions es poden activar opcionalment a l'assistent d'inici:",
|
||||
"Trigger type:": "Tipus d'activador:",
|
||||
"Event type:": "Tipus d'esdeveniment:",
|
||||
"Event data:": "Dades de l'esdeveniment:",
|
||||
"Then choose an action, for example switch the scene to where an RGB light is red.": "A continuació, trieu una acció, per exemple, canvieu l'escena a on una llum RGB és vermella.",
|
||||
"Frontend Version": "Versió del frontal",
|
||||
"Frontend Version do not match backend version!": "La versió frontal no coincideix amb la versió del dorsal!",
|
||||
"backupRecommend": "Si us plau, feu una còpia de seguretat del volum o de la carpeta de dades (./data/) directament.",
|
||||
"Optional": "Opcional",
|
||||
"and": "i",
|
||||
"startDateTime": "Data/hora d'inici",
|
||||
"endDateTime": "Data/hora final",
|
||||
"cronExpression": "Expressió Cron",
|
||||
"cronSchedule": "Planificació: ",
|
||||
"invalidCronExpression": "Expressió Cron no vàlida: {0}",
|
||||
"recurringInterval": "Interval",
|
||||
"Recurring": "Recurrència",
|
||||
"strategyManual": "Activa/Inactiva manualment",
|
||||
"warningTimezone": "Està utilitzant la zona horària del servidor",
|
||||
"weekdayShortMon": "Dill",
|
||||
"weekdayShortTue": "Dim",
|
||||
"weekdayShortWed": "Dim",
|
||||
"weekdayShortThu": "Dij",
|
||||
"weekdayShortFri": "Div",
|
||||
"weekdayShortSat": "Diss",
|
||||
"weekdayShortSun": "Dg",
|
||||
"dayOfWeek": "Dia de la setmana",
|
||||
"dayOfMonth": "Dia del mes",
|
||||
"lastDay": "Últim dia",
|
||||
"lastDay2": "2n últim dia del mes",
|
||||
"lastDay3": "3r Darrer Dia del Mes",
|
||||
"lastDay4": "4t Darrer Dia del Mes",
|
||||
"No Maintenance": "Sense manteniment",
|
||||
"maintenanceStatus-under-maintenance": "Sota manteniment",
|
||||
"maintenanceStatus-inactive": "Inactiu",
|
||||
"maintenanceStatus-scheduled": "Programat",
|
||||
"maintenanceStatus-unknown": "Desconegut",
|
||||
"Server Timezone": "Zona horària del servidor",
|
||||
"statusPageMaintenanceEndDate": "Final",
|
||||
"IconUrl": "URL de la icona",
|
||||
"Enable DNS Cache": "(Obsolet) Habilita la memòria cau DNS per als monitors HTTP(s)",
|
||||
"Enable": "Habilita",
|
||||
"Disable": "Desactiva",
|
||||
"chromeExecutable": "Executable Chrome/Chromium",
|
||||
"chromeExecutableAutoDetect": "Detecció automàtica",
|
||||
"dnsCacheDescription": "Pot ser que no funcioni treballant amb entorns IPv6, desactiva'l si detectes qualsevol problema.",
|
||||
"Single Maintenance Window": "Finestra de Manteniment únic",
|
||||
"Maintenance Time Window of a Day": "Finestra de Temps del manteniment d'un Dia",
|
||||
"Effective Date Range": "Rang de data eficaç (Opcional)",
|
||||
"Schedule Maintenance": "Programa de manteniment",
|
||||
"Edit Maintenance": "Edita el manteniment",
|
||||
"Date and Time": "Data i hora",
|
||||
"DateTime Range": "Rang de data i temps",
|
||||
"loadingError": "Impossible obtenir la data, si us plau prova-ho més endavant.",
|
||||
"plugin": "Connector | Connectors",
|
||||
"install": "Instal·la",
|
||||
"installing": "Instal·lant",
|
||||
"uninstall": "Desinstal·la",
|
||||
"confirmUninstallPlugin": "Estàs segur de desinstal·lar aquest connector?",
|
||||
"notificationRegional": "Local",
|
||||
"Clone Monitor": "Clona el monitor",
|
||||
"Clone": "Clona",
|
||||
"cloneOf": "Clon de {0}",
|
||||
"secureOptionNone": "Cap / STARTTLS (25, 587)",
|
||||
"secureOptionTLS": "TLS (465)",
|
||||
"Ignore TLS Error": "Ignora error TLS",
|
||||
"From Email": "Des de Correu",
|
||||
"emailCustomisableContent": "Contingut personalitzable",
|
||||
"emailCustomSubject": "Tema personalitzable",
|
||||
"leave blank for default subject": "deixar en blanc per tema per defecte",
|
||||
"emailCustomBody": "Cos personalitzat",
|
||||
"leave blank for default body": "deixa en blanc per un cos per defecte",
|
||||
"emailTemplateServiceName": "Nom de servei",
|
||||
"emailTemplateHostnameOrURL": "Nom de host o URL",
|
||||
"emailTemplateStatus": "Estat",
|
||||
"emailTemplateMonitorJSON": "objecte que descriu el monitor",
|
||||
"emailTemplateHeartbeatJSON": "objecte que descriu el batec del cor",
|
||||
"To Email": "Destí email",
|
||||
"smtpCC": "CC",
|
||||
"smtpBCC": "BCC",
|
||||
"Discord Webhook URL": "URL del Webhook de Discord",
|
||||
"wayToGetDiscordURL": "Pots rebre aquest per anar a Paràmetres de Servidor -> Integracions -> Vista *Webhooks -> Nou *Webhook",
|
||||
"Bot Display Name": "Nom de pantalla de bot",
|
||||
"Prefix Custom Message": "Prefix de missatge personalitzat",
|
||||
"Hello @everyone is...": "Hola {'@'} a tothom …",
|
||||
"Send to channel": "Envia al canal",
|
||||
"Create new forum post": "Crea una nova publicació",
|
||||
"postToExistingThread": "Publica a un fil existent",
|
||||
"forumPostName": "Nom de publicació de fòrum",
|
||||
"threadForumPostID": "Fil / identificador de fòrum",
|
||||
"e.g. {discordThreadID}": "exemple {discordThreadID}",
|
||||
"wayToGetTeamsURL": "Pot aprendre com crear una URL de webhook {0}.",
|
||||
"wayToGetZohoCliqURL": "Pot aprendre com crear una URL de webhook {0}.",
|
||||
"needSignalAPI": "Necessites tenir una senyal de client amb REST API.",
|
||||
"wayToCheckSignalURL": "Pot comprovar aquesta URL per veure com configurar:",
|
||||
"Number": "Número",
|
||||
"Recipients": "Receptors",
|
||||
"Access Token": "Fitxa d'accés",
|
||||
"Channel access token (Long-lived)": "Fitxa d'accés del canal (de llarga vida)",
|
||||
"Line Developers Console": "Consola de Desenvolupadors de la línia",
|
||||
"appriseNotInstalled": "L'apèndix no està instal·lat. {0}",
|
||||
"Method": "Mètode",
|
||||
"clearDataOlderThan": "Conserva les dades de l'historial del monitor durant {0} dies.",
|
||||
"steamApiKeyDescription": "Per a monitoritzar un servidor de jocs de vapor, necessiteu una clau Steam Web-API. Podeu registrar la vostra clau API aquí: ",
|
||||
"shrinkDatabaseDescriptionSqlite": "Activa la base de dades {vacuum} per a SQLite. {auto.vacuum} ja està activat, però això no desfragmenta la base de dades ni reempaqueta les pàgines individuals de la base de dades de la manera com ho fa l'ordre {vacuum}.",
|
||||
"liquidIntroduction": "S'aconsegueix la flexibilitat mitjançant el llenguatge de templatació líquid. Consulteu el {0} per a les instruccions d'ús. Aquestes són les variables disponibles:",
|
||||
"selectedMonitorCount": "Seleccionat: {0}",
|
||||
"deleteStatusPageMsg": "Esteu segur que voleu suprimir aquesta pàgina d'estat?",
|
||||
"proxyDescription": "Els intermediaris s'han d'assignar a un monitor perquè funcioni.",
|
||||
"enableProxyDescription": "Aquest servidor intermediari no afectarà les sol·licituds del monitor fins que estigui activat. Podeu controlar temporalment desactivar el servidor intermediari de tots els monitors per l'estat d'activació.",
|
||||
"statusPageSpecialSlugDesc": "Àlies especial {0}: aquesta pàgina es mostrarà quan no es proporcioni l'àlies",
|
||||
"Authentication": "Autenticació",
|
||||
"Page Not Found": "Pàgina no trobada",
|
||||
"Don't know how to get the token? Please read the guide:": "No saps com aconseguir el testimoni? Si us plau, llegiu la guia:",
|
||||
"The current connection may be lost if you are currently connecting via Cloudflare Tunnel. Are you sure want to stop it? Type your current password to confirm it.": "La connexió actual es pot perdre si esteu connectant a través del túnel Cloudflare. Segur que voleu aturar-ho? Escriviu la contrasenya actual per confirmar-la.",
|
||||
"Refresh Interval": "Interval de refresc",
|
||||
"signedInDispDisabled": "Autenticació desactivada.",
|
||||
"RadiusCalledStationIdDescription": "Identificador del dispositiu anomenat",
|
||||
"Also check beta release": "Comprova també la versió beta",
|
||||
"The resource is no longer available.": "El recurs ja no està disponible.",
|
||||
"certificationExpiryDescription": "Els monitors HTTPS activen la notificació quan el certificat TLS caduca a:",
|
||||
"deleteDockerHostMsg": "Esteu segur que voleu suprimir aquest amfitrió de l'acoblador per a tots els monitors?",
|
||||
"tailscalePingWarning": "Per utilitzar el monitor de Ping Tailscale, heu d'instal·lar el Kuma Uptime sense Docker i també instal·lar el client Tailscale al vostre servidor.",
|
||||
"telegramSendSilentlyDescription": "Envia el missatge en silenci. Els usuaris rebran una notificació sense so.",
|
||||
"telegramProtectContentDescription": "Si està activat, els missatges del bot del Telegram estaran protegits contra reenviaments i desaments.",
|
||||
"wayToGetTelegramChatID": "Podeu obtenir el vostre ID de xat enviant un missatge al bot i anant a aquest URL per veure el xat id:",
|
||||
"trustProxyDescription": "Confia en les capçaleres «X-Forwarded-*». Si voleu obtenir la IP del client correcta i el vostre Kuma Uptime està darrere d'un servidor intermediari com Nginx o Apache, hauríeu d'activar-ho.",
|
||||
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Es pot crear un testimoni d'accés de llarga durada fent clic al nom del vostre perfil (a baix a l'esquerra) i desplaçant-vos a la part inferior i després feu clic a Crea un testimoni. ",
|
||||
"default: notify all devices": "per defecte: notifica tots els dispositius",
|
||||
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Podeu trobar una llista dels Serveis de Notificació a l'assistent d'inici a «Eines de revelador . Serveis» cerca «notificació» per trobar el nom del vostre dispositiu/telèfon.",
|
||||
"backupOutdatedWarning": "Obsolet: Atès que s'han afegit moltes característiques i aquesta funció de còpia de seguretat és una mica inexistent, no pot generar o restaurar una còpia de seguretat completa.",
|
||||
"lastDay1": "L'últim dia del mes",
|
||||
"pauseMaintenanceMsg": "Segur que voleu fer una pausa?",
|
||||
"maintenanceStatus-ended": "Finalitzat",
|
||||
"Display Timezone": "Mostra la zona horària",
|
||||
"enableNSCD": "Habilita NSCD (Dimoni de memòria cau de Servei del Nom ) per accelerar les sol·licituds de DNS",
|
||||
"chromeExecutableDescription": "Per a usuaris de Docker, si el Chrome no està encara instal·lat, pot dur uns quants minuts per instal·lar i mostrar el resultat de prova. Duu 1*GB d'espai de disc.",
|
||||
"uninstalling": "Desinstal·lant",
|
||||
"smtp": "Correu electrònic (SMTP)",
|
||||
"smtpLiquidIntroduction": "Els següents dos camps són personalitzables via \"Liquid templating Language\". Per favor refereix al {0} per a instruccions d'ús. Aquests són les variables disponibles:",
|
||||
"emailTemplateMsg": "missatge de la notificació",
|
||||
"emailTemplateLimitedToUpDownNotification": "només disponible per estats UP/Down, altrament null",
|
||||
"Select message type": "Selecciona el tipus de missatge",
|
||||
"whatHappensAtForumPost": "Crea una nova publicació de fòrum. Això no publica un missatge a un fòrum existent. Per publicar un fil existent utilitza \"{option}\"",
|
||||
"Channel access token": "Fitxa d'accés del canal",
|
||||
"Body": "Cos",
|
||||
"or": "o",
|
||||
"PushUrl": "URL de captura",
|
||||
"HeadersInvalidFormat": "Les capçaleres de sol·licitud no són JSON vàlides: ",
|
||||
"BodyInvalidFormat": "El cos de petició no és JSON vàlid: ",
|
||||
"Security": "Seguretat",
|
||||
"Pick Accepted Status Codes...": "Trieu els codis d'estat acceptats…",
|
||||
"error": "error",
|
||||
"critical": "crítica",
|
||||
"Please input title and content": "Introduïu el títol i el contingut",
|
||||
"telegramServerUrl": "(Opcional) Url del servidor",
|
||||
"telegramServerUrlDescription": "Per saltar-se les limitacions del bot de Telegram o tenir accés a regions bloquejades (China, Iran, etc). Per a més informació fes click {0}. Per defecte {1}",
|
||||
"templateServiceName": "Nom del servei",
|
||||
"templateHostnameOrURL": "Adreça URL o nom del host",
|
||||
"templateStatus": "Estat",
|
||||
"telegramUseTemplate": "Fes servir una plantilla de missatge personalitzada",
|
||||
"telegramUseTemplateDescription": "Si s'activa, el missatge s'enviarà fent servir una plantilla personalitzada.",
|
||||
"telegramTemplateFormatDescription": "Telegram permet l'ús de diferents tipus de llenguatges de marcat, llegeix Telegram {0} per més detalls.",
|
||||
"wayToGetDiscordThreadId": "Obtenir un identificador de publicació del fil/fòrum és semblant a obtenir un identificador de canal. Més informació sobre com obtenir identificadors {0}",
|
||||
"lineDevConsoleTo": "Consola de desenvolupadors de linia - {0}",
|
||||
"Basic Settings": "Configuracions bàsiques",
|
||||
"User ID": "ID d'usuari",
|
||||
"Your User ID": "El teu identificador d'usuari",
|
||||
"Messaging API": "API de missatges",
|
||||
"wayToGetLineChannelToken": "Primer accediu a {0}, creeu un proveïdor i un canal (API de missatgeria) i, a continuació, podeu obtenir el token d'accés al canal i l'identificador d'usuari dels elements del menú esmentats anteriorment.",
|
||||
"Icon URL": "URL de la icona",
|
||||
"aboutIconURL": "Pots donar un enllaç a la imatge a \"URL de la icona\" per sobreposar-la a la imatge de perfil pere defecte. No s'usarà si hi ha una icona d'emoji establerta."
|
||||
}
|
||||
|
|
|
@ -1095,5 +1095,25 @@
|
|||
"Separate multiple email addresses with commas": "Mehrere E-Mail-Adressen mit Kommas trennen",
|
||||
"rabbitmqNodesInvalid": "Benutze eine vollständig qualifizierte URL (beginnend mit 'http') für RabbitMQ-Knoten.",
|
||||
"rabbitmqHelpText": "Um den Monitor zu benutzen, musst du das Management Plugin in deinem RabbitMQ-Setup aktivieren. Weitere Informationen siehe {rabitmq_documentation}.",
|
||||
"aboutSlackUsername": "Ändert den Anzeigenamen des Absenders. Wenn du jemanden erwähnen möchtest, füge ihn stattdessen in den Namen ein."
|
||||
"aboutSlackUsername": "Ändert den Anzeigenamen des Absenders. Wenn du jemanden erwähnen möchtest, füge ihn stattdessen in den Namen ein.",
|
||||
"templateHostnameOrURL": "Hostname oder URL",
|
||||
"telegramUseTemplate": "Benutzerdefinierte Nachrichtenvorlage verwenden",
|
||||
"telegramUseTemplateDescription": "Wenn diese Option aktiviert ist, wird die Nachricht unter Verwendung einer benutzerdefinierten Vorlage gesendet.",
|
||||
"templateServiceName": "Service-Name",
|
||||
"YZJ Webhook URL": "YZJ Webhook URL",
|
||||
"YZJ Robot Token": "YZJ Robot Token",
|
||||
"templateStatus": "Status",
|
||||
"telegramTemplateFormatDescription": "Telegram ermöglicht die Verwendung verschiedener Markup-Sprachen für Nachrichten, siehe Telegram {0} für spezifische Details.",
|
||||
"Plain Text": "Nur Text",
|
||||
"Message Template": "Nachrichtenvorlage",
|
||||
"Template Format": "Vorlagenformat",
|
||||
"wayToGetWahaApiUrl": "Die URL deiner WAHA-Instanz.",
|
||||
"wayToGetWahaSession": "Von dieser Sitzung aus sendet WAHA Benachrichtigungen an die Chat-ID. Du kannst sie im WAHA Dashboard finden.",
|
||||
"wahaSession": "Sitzung",
|
||||
"wahaChatId": "Chat-ID (Telefonnummer / Kontakt-ID / Gruppen-ID)",
|
||||
"wayToGetWahaApiKey": "API-Schlüssel ist der Wert der WHATSAPP_API_KEY-Umgebungsvariable, den du beim Ausführen von WAHA verwendet hast.",
|
||||
"wayToWriteWahaChatId": "Die Telefonnummer mit internationaler Vorwahl, ohne den anfänglichen Pluszeichen ({0}), die Kontakt-ID ({1}) oder die Gruppen-ID ({2}). Die Benachrichtigungen werden an diese Chat-ID von der WAHA-Sitzung gesendet.",
|
||||
"telegramServerUrl": "(Optional) Server URL",
|
||||
"telegramServerUrlDescription": "Um die Telegram-Bot-API-Beschränkungen aufzuheben oder in gesperrten Gebieten (China, Iran usw.) Zugriff zu erhalten. Weitere Informationen findest du unter {0}. Standard: {1}",
|
||||
"Font Twemoji by Twitter licensed under": "Schriftart Twemoji von Twitter lizenziert unter"
|
||||
}
|
||||
|
|
|
@ -1098,5 +1098,25 @@
|
|||
"rabbitmqNodesDescription": "Gib die URL für die RabbitMQ-Verwaltungsknoten einschließlich Protokoll und Port ein. Beispiel: {0}",
|
||||
"rabbitmqNodesInvalid": "Benutze eine vollständig qualifizierte URL (beginnend mit 'http') für RabbitMQ-Knoten.",
|
||||
"rabbitmqHelpText": "Um den Monitor zu benutzen, musst du das Management Plugin in deinem RabbitMQ-Setup aktivieren. Weitere Informationen siehe {rabitmq_documentation}.",
|
||||
"aboutSlackUsername": "Ändert den Anzeigenamen des Absenders. Wenn du jemanden erwähnen möchtest, füge ihn stattdessen in den Namen ein."
|
||||
"aboutSlackUsername": "Ändert den Anzeigenamen des Absenders. Wenn du jemanden erwähnen möchtest, füge ihn stattdessen in den Namen ein.",
|
||||
"templateHostnameOrURL": "Hostname oder URL",
|
||||
"telegramUseTemplate": "Benutzerdefinierte Nachrichtenvorlage verwenden",
|
||||
"telegramTemplateFormatDescription": "Telegram ermöglicht die Verwendung verschiedener Markup-Sprachen für Nachrichten, siehe Telegram {0} für spezifische Details.",
|
||||
"Plain Text": "Nur Text",
|
||||
"templateServiceName": "Service-Name",
|
||||
"YZJ Webhook URL": "YZJ Webhook URL",
|
||||
"YZJ Robot Token": "YZJ Robot Token",
|
||||
"templateStatus": "Status",
|
||||
"telegramUseTemplateDescription": "Wenn diese Option aktiviert ist, wird die Nachricht unter Verwendung einer benutzerdefinierten Vorlage gesendet.",
|
||||
"Message Template": "Nachrichtenvorlage",
|
||||
"Template Format": "Vorlagenformat",
|
||||
"wayToGetWahaApiUrl": "Die URL deiner WAHA-Instanz.",
|
||||
"wahaSession": "Sitzung",
|
||||
"wahaChatId": "Chat-ID (Telefonnummer / Kontakt-ID / Gruppen-ID)",
|
||||
"wayToGetWahaApiKey": "API-Schlüssel ist der Wert der WHATSAPP_API_KEY-Umgebungsvariable, den du beim Ausführen von WAHA verwendet hast.",
|
||||
"wayToGetWahaSession": "Von dieser Sitzung aus sendet WAHA Benachrichtigungen an die Chat-ID. Du kannst sie im WAHA Dashboard finden.",
|
||||
"wayToWriteWahaChatId": "Die Telefonnummer mit internationaler Vorwahl, ohne den anfänglichen Pluszeichen ({0}), die Kontakt-ID ({1}) oder die Gruppen-ID ({2}). Die Benachrichtigungen werden an diese Chat-ID von der WAHA-Sitzung gesendet.",
|
||||
"telegramServerUrlDescription": "Um die Telegram-Bot-API-Beschränkungen aufzuheben oder in gesperrten Gebieten (China, Iran usw.) Zugriff zu erhalten. Weitere Informationen findest du unter {0}. Standard: {1}",
|
||||
"telegramServerUrl": "(Optional) Server URL",
|
||||
"Font Twemoji by Twitter licensed under": "Schriftart Twemoji von Twitter lizenziert unter"
|
||||
}
|
||||
|
|
|
@ -517,6 +517,7 @@
|
|||
"Clone": "Clone",
|
||||
"cloneOf": "Clone of {0}",
|
||||
"smtp": "Email (SMTP)",
|
||||
"Use HTML for custom E-mail body": "Use HTML for custom E-mail body",
|
||||
"secureOptionNone": "None / STARTTLS (25, 587)",
|
||||
"secureOptionTLS": "TLS (465)",
|
||||
"Ignore TLS Error": "Ignore TLS Error",
|
||||
|
@ -757,12 +758,26 @@
|
|||
"smseagleTo": "Phone number(s)",
|
||||
"smseagleGroup": "Phonebook group name(s)",
|
||||
"smseagleContact": "Phonebook contact name(s)",
|
||||
"smseagleGroupV2": "Phonebook group ID(s)",
|
||||
"smseagleContactV2": "Phonebook contact ID(s)",
|
||||
"smseagleRecipientType": "Recipient type",
|
||||
"smseagleRecipient": "Recipient(s) (multiple must be separated with comma)",
|
||||
"smseagleToken": "API Access token",
|
||||
"smseagleUrl": "Your SMSEagle device URL",
|
||||
"smseagleEncoding": "Send as Unicode",
|
||||
"smseaglePriority": "Message priority (0-9, default = 0)",
|
||||
"smseagleEncoding": "Send as Unicode (default=GSM-7)",
|
||||
"smseaglePriority": "Message priority (0-9, highest priority = 9)",
|
||||
"smseagleMsgType": "Message type",
|
||||
"smseagleMsgSms": "Sms message (default)",
|
||||
"smseagleMsgRing": "Ring call",
|
||||
"smseagleMsgTts": "Text-to-speech call",
|
||||
"smseagleMsgTtsAdvanced": "Text-to-speech Advanced call",
|
||||
"smseagleDuration": "Duration (in seconds)",
|
||||
"smseagleTtsModel": "Text-to-speech model ID",
|
||||
"smseagleApiType": "API version",
|
||||
"smseagleApiv1": "APIv1 (for existing projects and backward compatibility)",
|
||||
"smseagleApiv2": "APIv2 (recommended for new integrations)",
|
||||
"smseagleDocs": "Check documentation or APIv2 availability: {0}",
|
||||
"smseagleComma": "Multiple must be separated with comma",
|
||||
"smspartnerApiurl": "You can find your API key in your dashboard at {0}",
|
||||
"smspartnerPhoneNumber": "Phone number(s)",
|
||||
"smspartnerPhoneNumberHelptext": "The number must be in the international format {0}, {1}. Multiple numbers must be separated by {2}",
|
||||
|
@ -784,6 +799,7 @@
|
|||
"PushDeer Server": "PushDeer Server",
|
||||
"pushDeerServerDescription": "Leave blank to use the official server",
|
||||
"PushDeer Key": "PushDeer Key",
|
||||
"SpugPush Template Code": "Template Code",
|
||||
"wayToGetClickSendSMSToken": "You can get API Username and API Key from {0} .",
|
||||
"Custom Monitor Type": "Custom Monitor Type",
|
||||
"Google Analytics ID": "Google Analytics ID",
|
||||
|
@ -1058,6 +1074,9 @@
|
|||
"SendGrid API Key": "SendGrid API Key",
|
||||
"Separate multiple email addresses with commas": "Separate multiple email addresses with commas",
|
||||
"smtpHelpText": "“SMTPS” tests that SMTP/TLS is working; “Ignore TLS” connects over plaintext; “STARTTLS” connects, issues a STARTTLS command and verifies the server certificate. None of these send an email.",
|
||||
"OneChatAccessToken": "OneChat Access Token",
|
||||
"OneChatUserIdOrGroupId": "OneChat User ID or Group ID",
|
||||
"OneChatBotId": "OneChat Bot ID",
|
||||
"wahaSession": "Session",
|
||||
"wahaChatId": "Chat ID (Phone Number / Contact ID / Group ID)",
|
||||
"wayToGetWahaApiUrl": "Your WAHA Instance URL.",
|
||||
|
@ -1068,5 +1087,12 @@
|
|||
"YZJ Robot Token": "YZJ Robot token",
|
||||
"Plain Text": "Plain Text",
|
||||
"Message Template": "Message Template",
|
||||
"Template Format": "Template Format"
|
||||
"Template Format": "Template Format",
|
||||
"Font Twemoji by Twitter licensed under": "Font Twemoji by Twitter licensed under",
|
||||
"smsplanetApiToken": "Token for the SMSPlanet API",
|
||||
"smsplanetApiDocs": "Detailed information on obtaining API tokens can be found in {the_smsplanet_documentation}.",
|
||||
"the smsplanet documentation": "the smsplanet documentation",
|
||||
"Phone numbers": "Phone numbers",
|
||||
"Sender name": "Sender name",
|
||||
"smsplanetNeedToApproveName": "Needs to be approved in the client panel"
|
||||
}
|
||||
|
|
|
@ -1036,5 +1036,37 @@
|
|||
"Elevator": "آسانسور",
|
||||
"Guitar": "گیتار",
|
||||
"Pop": "پاپ",
|
||||
"From": "از"
|
||||
"From": "از",
|
||||
"telegramServerUrl": "(اختیاری) آدرس سرور",
|
||||
"telegramServerUrlDescription": "برای کاهش محدودیتهای بات تلگرام یا دسترسی در مناطقی که تلگرام فیلتر شده است (مثل ایران یا چین و ...). برای اطلاعات بیشتر {0} را ببینید. مقدار پیشفرض: {1}",
|
||||
"Alphanumerical string and hyphens only": "فقط حروف الفبا، اعداد و -",
|
||||
"Time sensitive notifications will be delivered immediately, even if the device is in do not disturb mode.": "اعلانهای حساس به زمان در لحظه ارسال خواهند شد، حتی اگر دستگاه در حالت بدون مزاحمت قرار داشته باشد.",
|
||||
"rabbitmqNodesRequired": "لطفا گرههای این پایشگر را تنظیم کنید.",
|
||||
"RabbitMQ Password": "گذرواژه RabbitMQ",
|
||||
"RabbitMQ Nodes": "گرههای مدیریت RabbitMQ",
|
||||
"rabbitmqHelpText": "برای پایش، لازم است افزونه مدیریت (Management) در RabbitMQ را فعال کنید. برای اطلاعات بیشتر به {rabitmq_documentation} مراجعه کنید.",
|
||||
"wayToWriteWahaChatId": "شماره موبایل در قالب بینالمللی و بدون علامت مثبت ابتدایی ({0})، شناسه مخاطب ({1}) یا شناسه گروه ({2}). اعلانها از نشست WAHA به این شناسه گفتگو ارسال خواهند شد.",
|
||||
"wahaSession": "نشست",
|
||||
"wahaChatId": "شناسه گفتگو (شماره موبایل / شناسه مخاطب / شناسه گروه)",
|
||||
"wayToGetWahaSession": "با این نشست WAHA اعلانها را به شناسه گفتگو ارسال میکند. قابل مشاهده در پنل کاربری WAHA.",
|
||||
"Message Template": "قالب پیام",
|
||||
"Template Format": "فرمت قالب",
|
||||
"YZJ Webhook URL": "آدرس وبهوک YZJ",
|
||||
"Fail": "شکست",
|
||||
"Custom sound to override default notification sound": "نوای دلخواه به جای نوای پیشفرض اعلان",
|
||||
"Time Sensitive (iOS Only)": "حساس به زمان (فقط iOS)",
|
||||
"Can be found on:": "در {0} یافت میشود",
|
||||
"Either a text sender ID or a phone number in E.164 format if you want to be able to receive replies.": "شناسه ارسال کننده متنی و در صورتی که میخواهید پاسخها را دریافت کنید، شماره موبایل در قالب E.164.",
|
||||
"rabbitmqNodesDescription": "آدرس گرههای مدیریت RabbitMQ را به همراه پروتکل و شماره پورت وارد کنید. مثال: {0}",
|
||||
"RabbitMQ Username": "نام کاربری RabbitMQ",
|
||||
"Separate multiple email addresses with commas": "آدرسهای ایمیل را با استفاده از ویرگول انگلیسی یا کاما جدا کنید",
|
||||
"Plain Text": "متن ساده",
|
||||
"aboutSlackUsername": "نام نمایشی ارسال کننده پیام را تغییر میدهد. اگر میخواهید شخصی را نام ببرید، در قسمت نام دوستانه بنویسید.",
|
||||
"Clear": "پاکسازی",
|
||||
"templateServiceName": "نام خدمت",
|
||||
"templateHostnameOrURL": "آدرس یا نام میزبان",
|
||||
"templateStatus": "وضعیت",
|
||||
"telegramUseTemplate": "استفاده از قالب پیام دلخواه",
|
||||
"telegramUseTemplateDescription": "در صورت فعالسازی، پیام با قالب دلخواه ارسال خواهد شد.",
|
||||
"telegramTemplateFormatDescription": "در تلگرام امکان استفاده از زبانهای نشانهگذاری مختلفی وجود دارد، برای جزئیات بیشتر {0} را ببینید."
|
||||
}
|
||||
|
|
|
@ -341,7 +341,7 @@
|
|||
"Packet Size": "Paketin koko",
|
||||
"telegram": "Telegram",
|
||||
"ZohoCliq": "ZohoCliq",
|
||||
"Bot Token": "Botin token",
|
||||
"Bot Token": "Botin tokeni",
|
||||
"wayToGetTelegramToken": "Voit saada tunnuksen osoitteesta {0}.",
|
||||
"Chat ID": "Chat-tunnus",
|
||||
"wayToGetTelegramChatID": "Saat chat-tunnuksesi lähettämällä viestin botille ja siirtymällä tähän URL-osoitteeseen nähdäksesi chat_id:",
|
||||
|
@ -1096,5 +1096,25 @@
|
|||
"RabbitMQ Nodes": "RabbitMQ-hallintasolmut",
|
||||
"rabbitmqNodesDescription": "Anna URL RabbitMQ-hallintasolmuille sisältäen protokollan ja portin. Esimerkki: {0}",
|
||||
"rabbitmqHelpText": "Jotta voit käyttää seurainta, sinun on otettava hallintalaajennus käyttöön RabbitMQ-asetuksissa. Lisätietoja saat osoitteesta {rabitmq_documentation}.",
|
||||
"aboutSlackUsername": "Muuttaa viestin lähettäjän näyttönimeä. Jos haluat mainita jonkun, lisää se ystävälliseen nimeen."
|
||||
"aboutSlackUsername": "Muuttaa viestin lähettäjän näyttönimeä. Jos haluat mainita jonkun, lisää se ystävälliseen nimeen.",
|
||||
"Font Twemoji by Twitter licensed under": "Twemoji-fontti (Twitter) on lisensoitu seuraavalla lisenssillä",
|
||||
"wayToGetWahaSession": "Tästä istunnosta WAHA lähettää ilmoituksia Chat ID:hen. Löydät sen WAHA kojelaudasta.",
|
||||
"wayToWriteWahaChatId": "Puhelinnumero kansainvälisellä etuliitteellä, mutta ilman plusmerkkiä alussa ({0}), yhteystietotunnusta ({1}) tai ryhmätunnusta ({2}). Ilmoitukset lähetetään tähän chat-tunnukseen WAHA-istunnosta.",
|
||||
"wahaSession": "Istunto",
|
||||
"wahaChatId": "Viesti ID (Puhelinnumero / Yhteystieto ID / Ryhmä ID)",
|
||||
"Template Format": "Malli Muotoilu",
|
||||
"wayToGetWahaApiUrl": "Sinun WAHA instanssin URL.",
|
||||
"YZJ Webhook URL": "YZJ Webhook URL",
|
||||
"telegramServerUrl": "(Valinnainen) Palvelin Url",
|
||||
"telegramServerUrlDescription": "Telegramin bot-api-rajoitusten poistamiseksi tai pääsyn saamiseksi estetyille alueille (Kiina, Iran jne.). Saat lisätietoja napsauttamalla {0}. Oletus: {1}",
|
||||
"Message Template": "Viesti Malli",
|
||||
"YZJ Robot Token": "YZJ Robotti tokeni",
|
||||
"wayToGetWahaApiKey": "API Key on WHATSAPP_API_KEY ympäristömuuttujan arvo, jota käytit WAHA käynnistämiseen.",
|
||||
"Plain Text": "Pelkkää tekstiä",
|
||||
"templateServiceName": "palvelin nimi",
|
||||
"templateHostnameOrURL": "isäntänimi tai URL",
|
||||
"templateStatus": "tila",
|
||||
"telegramUseTemplate": "Käytä mukautettua viesti mallia",
|
||||
"telegramUseTemplateDescription": "Jos aktivoitu, viesti lähetetään käyttämällä mukautettua mallia.",
|
||||
"telegramTemplateFormatDescription": "Telegram sallii erilaisten merkintäkielien käytön viesteissä, katso Telegram {0} tarkempia tietoja."
|
||||
}
|
||||
|
|
|
@ -1098,5 +1098,25 @@
|
|||
"rabbitmqHelpText": "Pour utiliser la sonde, vous devrez activer le plug-in de gestion dans votre configuration RabbitMQ. Pour plus d'informations, veuillez consulter la {rabitmq_documentation}.",
|
||||
"SendGrid API Key": "Clé API SendGrid",
|
||||
"Separate multiple email addresses with commas": "Séparez plusieurs adresses e-mail par des virgules",
|
||||
"aboutSlackUsername": "Modifie le nom d'affichage de l'expéditeur du message. Si vous souhaitez mentionner quelqu’un, incluez-le plutôt dans le nom convivial."
|
||||
"aboutSlackUsername": "Modifie le nom d'affichage de l'expéditeur du message. Si vous souhaitez mentionner quelqu’un, incluez-le plutôt dans le nom convivial.",
|
||||
"templateHostnameOrURL": "Nom d'hôte ou URL",
|
||||
"telegramUseTemplate": "Utiliser un modèle de message personnalisé",
|
||||
"telegramTemplateFormatDescription": "Telegram permet d'utiliser différents langages de balisage pour les messages, voir Telegram {0} pour plus de détails.",
|
||||
"Plain Text": "Texte brut",
|
||||
"YZJ Webhook URL": "URL du webhook YZJ",
|
||||
"YZJ Robot Token": "Jeton robot YZJ",
|
||||
"templateServiceName": "Nom du service",
|
||||
"templateStatus": "Status",
|
||||
"telegramUseTemplateDescription": "Si cette option est activée, le message sera envoyé à l'aide d'un modèle personnalisé.",
|
||||
"Message Template": "Modèle de message",
|
||||
"Template Format": "Format du modèle",
|
||||
"wayToGetWahaApiUrl": "L’URL de votre instance WAHA.",
|
||||
"wayToGetWahaSession": "À partir de cette session, WAHA envoie des notifications à l'ID de discussion. Vous pouvez le trouver dans le tableau de bord WAHA.",
|
||||
"wahaSession": "Session",
|
||||
"wahaChatId": "ID de discussion (numéro de téléphone / ID de contact / ID de groupe)",
|
||||
"wayToGetWahaApiKey": "La clé API est la valeur de la variable d'environnement WHATSAPP_API_KEY que vous avez utilisée pour exécuter WAHA.",
|
||||
"wayToWriteWahaChatId": "Le numéro de téléphone avec le préfixe international, mais sans le signe plus ({0}), l'identifiant de contact ({1}) ni l'identifiant de groupe ({2}). Les notifications sont envoyées à cet identifiant de chat depuis la session WAHA.",
|
||||
"telegramServerUrlDescription": "Pour lever les limitations de l’API des bots Telegram ou accéder aux zones bloquées (Chine, Iran, etc.). Pour plus d’informations, cliquez sur {0}. Par défaut : {1}",
|
||||
"telegramServerUrl": "(Facultatif) URL du serveur",
|
||||
"Font Twemoji by Twitter licensed under": "La police Twemoji de Twitter est sous licence"
|
||||
}
|
||||
|
|
|
@ -194,11 +194,11 @@
|
|||
"telegram": "Telegram",
|
||||
"Bot Token": "Token bota",
|
||||
"wayToGetTelegramToken": "Token možete nabaviti preko {0}.",
|
||||
"Chat ID": "ID razgovora",
|
||||
"supportTelegramChatID": "Podržani su ID-jevi izravnih razgovora, grupa i kanala",
|
||||
"wayToGetTelegramChatID": "ID razgovora možete saznati tako da botu pošaljete poruku te odete na ovaj URL:",
|
||||
"YOUR BOT TOKEN HERE": "OVDJE IDE TOKEN BOTA",
|
||||
"chatIDNotFound": "ID razgovora nije pronađen; prvo morate poslati poruku botu",
|
||||
"Chat ID": "Identifikator razgovora",
|
||||
"supportTelegramChatID": "Podržani su identifikatori izravnih razgovora, grupa i kanala",
|
||||
"wayToGetTelegramChatID": "Identifikator razgovora možete saznati tako da botu pošaljete poruku te odete na ovaj URL:",
|
||||
"YOUR BOT TOKEN HERE": "TOKEN BOTA STAVITI OVDJE",
|
||||
"chatIDNotFound": "Identifikator razgovora nije pronađen; prvo morate poslati poruku botu",
|
||||
"webhook": "Webhook",
|
||||
"Post URL": "URL Post zahtjeva",
|
||||
"Content Type": "Tip sadržaja (Content Type)",
|
||||
|
@ -267,7 +267,7 @@
|
|||
"Check octopush prices": "Provjerite cijene usluge Octopush {0}.",
|
||||
"octopushPhoneNumber": "Telefonski broj (međunarodni format, primjerice: +38512345678) ",
|
||||
"octopushSMSSender": "Naziv SMS pošiljatelja : 3-11 alfanumeričkih znakova i razmak (a-zA-Z0-9)",
|
||||
"LunaSea Device ID": "LunaSea ID Uređaja",
|
||||
"LunaSea Device ID": "LunaSea identifikator uređaja",
|
||||
"Apprise URL": "URL usluge Apprise",
|
||||
"Example:": "Primjerice: {0}",
|
||||
"Read more:": "Pročitajte više: {0}",
|
||||
|
@ -280,9 +280,9 @@
|
|||
"Line Developers Console": "LINE razvojnoj konzoli",
|
||||
"lineDevConsoleTo": "LINE razvojna konzola - {0}",
|
||||
"Basic Settings": "Osnovne Postavke",
|
||||
"User ID": "Korisnički ID",
|
||||
"User ID": "Korisnički identifikator",
|
||||
"Messaging API": "API za razmjenu poruka",
|
||||
"wayToGetLineChannelToken": "Prvo, pristupite {0}, kreirajte pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti token za pristup kanalu te korisnički ID za polja iznad.",
|
||||
"wayToGetLineChannelToken": "Prvo, pristupite {0}, kreirajte pružatelja usluga te kanal (API za razmjenu poruka), zatim možete dobiti token za pristup kanalu te identifikator korisnika za polja iznad.",
|
||||
"Icon URL": "URL slike",
|
||||
"aboutIconURL": "Možete postaviti poveznicu na sliku u polju \"URL slike\" kako biste spriječili korištenje zadane slike. Ovo se polje neće koristiti ako je postavljeno polje \"Emotikon\".",
|
||||
"aboutMattermostChannelName": "Možete promijeniti kanal u kojeg webhook šalje tako da ispunite polje \"Naziv kanala\". Ta opcija mora biti omogućena unutar Mattermost postavki za webhook. Primjerice: #neki-kanal",
|
||||
|
@ -554,7 +554,7 @@
|
|||
"socket": "Docker socket",
|
||||
"tcp": "TCP / HTTP",
|
||||
"Docker Container": "Docker kontejner",
|
||||
"Container Name / ID": "Naziv / ID kontejnera",
|
||||
"Container Name / ID": "Naziv / identifikator kontejnera",
|
||||
"Docker Host": "Docker domaćin",
|
||||
"Docker Hosts": "Docker domaćini",
|
||||
"ntfy Topic": "ntfy tema",
|
||||
|
@ -632,7 +632,7 @@
|
|||
"Authorization Identity": "Identitet autorizacije",
|
||||
"weekdayShortThu": "Čet",
|
||||
"setupDatabaseChooseDatabase": "Koju bazu podataka želite koristiti?",
|
||||
"setupDatabaseEmbeddedMariaDB": "Ne morate ništa dodatno postavljati. Ovaj docker image ima ugrađenu i konfiguriranu MariaDB bazu podataka za Vas. Uptime Kuma će se spojiti na ovu bazu preko UNIX socketa.",
|
||||
"setupDatabaseEmbeddedMariaDB": "Ne morate ništa dodatno postavljati. Ovaj Docker image ima ugrađenu i konfiguriranu MariaDB bazu podataka za Vas. Uptime Kuma će se spojiti na ovu bazu preko UNIX socketa.",
|
||||
"setupDatabaseMariaDB": "Spojite vanjsku MariaDB bazu podataka. Morate unijeti informacije o konekciji prema bazi.",
|
||||
"setupDatabaseSQLite": "Jednostavna datoteka s bazom podataka, preporuča se samo za manje implementacije. Prije inačice v2.0.0, Uptime Kuma je koristila SQLite kao zadanu bazu podataka.",
|
||||
"dbName": "Naziv baze podataka",
|
||||
|
@ -648,7 +648,7 @@
|
|||
"webhookBodyCustomOption": "Prilagođeno tijelo zahtjeva",
|
||||
"selectedMonitorCount": "Odabrano: {0}",
|
||||
"Check/Uncheck": "Označi/odznači",
|
||||
"telegramMessageThreadID": "(Neobavezno) ID dretve poruka",
|
||||
"telegramMessageThreadID": "(Neobvezno) Identivikator dretve poruka",
|
||||
"telegramMessageThreadIDDescription": "Neobavezni jedinstveni identifikator za dretvu poruka (temu) foruma; samo za forumske supergrupe",
|
||||
"telegramSendSilently": "Pošalji nečujno",
|
||||
"telegramSendSilentlyDescription": "Šalje poruku nečujno. Primatelji će dobiti obavijest bez zvuka.",
|
||||
|
@ -689,7 +689,7 @@
|
|||
"confirmDeleteTagMsg": "Jeste li sigurni da želite izbrisati ovu oznaku? Monitori povezani s ovom oznakom neće biti izbrisani.",
|
||||
"enableGRPCTls": "Omogući sigurno slanje gRPC zahtjeva koristeći TLS",
|
||||
"deleteMaintenanceMsg": "Jeste li sigurni da želite izbrisati ovo održavanje?",
|
||||
"Guild ID": "ID za guild",
|
||||
"Guild ID": "Identifikator za guild",
|
||||
"pushoverMessageTtl": "Vrijeme isteka poruke (u sekundama)",
|
||||
"Proto Method": "Metoda poziva",
|
||||
"Proto Content": "Proto sadržaj",
|
||||
|
@ -937,7 +937,7 @@
|
|||
"cellsyntOriginator": "Vidljivo na mobilnom telefonu primatelja kao autor poruke. Dopuštene vrijednosti i funkcija ovise o vrsti izvorišta.",
|
||||
"cellsyntDestination": "Telefonski broj primatelja u međunarodnom formatu s početnim 00 iza kojeg slijedi pozivni broj države (maksimalno 17 znamenki). Primjerice, za broj iz UK-a 07920-110-000 vrijednost mora biti 00447920110000 . Maksimalno 25.000 primatelja odvojenih zarezom po HTTP zahtjevu.",
|
||||
"Channel access token (Long-lived)": "Pristupni token za kanal (dugovječni)",
|
||||
"Your User ID": "Vaš korisnički identifikator",
|
||||
"Your User ID": "Vaš korisnički identifikator (ID)",
|
||||
"wayToGetSevenIOApiKey": "Posjetite nadzornu ploču odlaskom na app.seven.io > Developer > API Key i dodajte novi ključ koristeći zeleni gumb za dodavanje",
|
||||
"Command": "Naredba",
|
||||
"mongodbCommandDescription": "Pokreni MongoDB naredbu na bazi podataka. Za informacije o dostupnim naredbama posjetite {documentation}",
|
||||
|
@ -1092,5 +1092,24 @@
|
|||
"RabbitMQ Nodes": "RabbitMQ upravljački čvorovi",
|
||||
"rabbitmqNodesDescription": "Unesite URL za upravljačke čvorove RabbitMQ uključujući protokol i port. Primjer: {0}",
|
||||
"rabbitmqHelpText": "Za korištenje ovog Monitora morat ćete omogućiti dodatak \"Management Plugin\" u svom RabbitMQ-u. Za više informacija pogledajte {rabitmq_documentation}.",
|
||||
"aboutSlackUsername": "Mijenja ime pošiljatelja vidljivo svima ostalima."
|
||||
"aboutSlackUsername": "Mijenja ime pošiljatelja vidljivo svima ostalima.",
|
||||
"templateServiceName": "naziv servisa",
|
||||
"telegramUseTemplate": "Koristi prilagođeni predložak poruke",
|
||||
"telegramTemplateFormatDescription": "Telegram dozvoljava korištenje različitih markup jezika za formatiranje poruka, pogledajte {0} za više detalja.",
|
||||
"YZJ Robot Token": "YZJ token robota",
|
||||
"YZJ Webhook URL": "YZJ URL webhooka",
|
||||
"templateHostnameOrURL": "domaćin ili URL",
|
||||
"templateStatus": "status",
|
||||
"telegramUseTemplateDescription": "Ako je omogućeno, poruka će biti poslana koristeći prilagođeni predložak.",
|
||||
"Plain Text": "Obični tekst",
|
||||
"Message Template": "Predložak poruke",
|
||||
"Template Format": "Format predloška",
|
||||
"wahaSession": "Sjednica",
|
||||
"wahaChatId": "Identifikator razgovora (telefonski broj / ID kontakta / ID grupe)",
|
||||
"wayToGetWahaApiUrl": "URL instance WAHA.",
|
||||
"wayToGetWahaApiKey": "API ključ je vrijednost varijable okruženja WHATSAPP_API_KEY koju ste koristili za pokretanje servisa WAHA.",
|
||||
"wayToGetWahaSession": "Iz ove sjednice WAHA šalje obavijesti na identifikator razgovora. Može se pronaći na WAHA nadzornoj ploči.",
|
||||
"wayToWriteWahaChatId": "Telefonski broj s međunarodnim prefiksom, ali bez znaka plus na početku ({0}), identifikator kontakta ({1}) ili identifikator grupe ({2}). Obavijesti se šalju na ovaj identifikator chata iz WAHA sesije.",
|
||||
"telegramServerUrl": "(Neobvezno) URL Poslužitelja",
|
||||
"telegramServerUrlDescription": "Za ukidanje ograničenja API-ja za botove Telegrama ili dobivanje pristupa u blokiranim područjima (Kina, Iran, itd.). Za više informacija kliknite {0}. Zadano: {1}"
|
||||
}
|
||||
|
|
|
@ -542,7 +542,7 @@
|
|||
"chromeExecutableAutoDetect": "Automatikus felismerés",
|
||||
"emailTemplateStatus": "Státusz",
|
||||
"deleteMaintenanceMsg": "Biztosan törölni szeretné ezt a karbantartást?",
|
||||
"apiKeyAddedMsg": "Az ön API kulcsa létrejött. Kérjük jegyezze fel, mert nem lesz a felületen elérhető.",
|
||||
"apiKeyAddedMsg": "Az ön API kulcsa létrejött. Kérjük jegyezze fel, mert nem lesz a felületen elérhető a jövőben!",
|
||||
"Expires": "Lejár",
|
||||
"disableAPIKeyMsg": "Biztosan le fel szeretné függeszteni ezt az API kulcsot?",
|
||||
"Key Added": "Kulcs létrehozva",
|
||||
|
@ -735,7 +735,7 @@
|
|||
"RadiusSecretDescription": "Megosztott titok az ügyfél és a szerver között",
|
||||
"RadiusCalledStationId": "Hívott állomás azonosítója",
|
||||
"Date and Time": "Dátum és idő",
|
||||
"enableNSCD": "Az NSCD (Name Service Cache Daemon) engedélyezése az összes DNS-kérés gyorsítótárba helyezéséhez",
|
||||
"enableNSCD": "Az NSCD (Name Service Cache Daemon) engedélyezése az összes DNS-kérés gyorsítótárazásához.",
|
||||
"Edit Maintenance": "Karbantartás szerkesztése",
|
||||
"smseagleGroup": "Telefonkönyv csoport neve(i)",
|
||||
"styleElapsedTime": "Az eltelt idő a heartbeat sáv alatt",
|
||||
|
@ -900,7 +900,7 @@
|
|||
"Press Enter to add broker": "Bróker hozzáadásához nyomja meg az ENTER billentyűt",
|
||||
"Enable Kafka SSL": "Kafka SSL engedélyezése",
|
||||
"Enable Kafka Producer Auto Topic Creation": "Kafka Producer automatikus téma létrehozásának engedélyezése",
|
||||
"Kafka Producer Message": "Kafka producer üzenet",
|
||||
"Kafka Producer Message": "Kafka Producer üzenet",
|
||||
"Kafka SASL Options": "Kafka SASL opciók",
|
||||
"Pick a SASL Mechanism...": "Válassz egy SASL mechanizmus-t…",
|
||||
"AccessKey Id": "Hozzáférési Kulcs ID",
|
||||
|
@ -933,7 +933,7 @@
|
|||
"Command": "Utasítás",
|
||||
"wayToGetSevenIOApiKey": "Látogasson el a műszerfalra az app.seven.io > developer > api key > a zöld hozzáadás gombra",
|
||||
"senderSevenIO": "Szám vagy név küldése",
|
||||
"receiverSevenIO": "Szám fogadása",
|
||||
"receiverSevenIO": "Fogadó telefonszáma",
|
||||
"apiKeySevenIO": "SevenIO API kulcs",
|
||||
"wayToWriteWhapiRecipient": "A telefonszám a nemzetközi előtaggal, de az elején lévő pluszjel nélkül ({0}), a kapcsolattartó azonosítója ({1}) vagy a csoport azonosítója ({2}).",
|
||||
"Separate multiple email addresses with commas": "Több e-mail cím elválasztása vesszővel",
|
||||
|
@ -943,7 +943,7 @@
|
|||
"not equals": "nem egyenlő",
|
||||
"contains": "tartalmaz",
|
||||
"not contains": "nem tartalmaz",
|
||||
"ends with": "végződik",
|
||||
"ends with": "végződik a",
|
||||
"not ends with": "nem végződik a",
|
||||
"greater than": "nagyobb, mint",
|
||||
"less than": "kisebb, mint",
|
||||
|
@ -972,15 +972,15 @@
|
|||
"RabbitMQ Password": "RabbitMQ jelszó",
|
||||
"SendGrid API Key": "SendGrid API kulcs",
|
||||
"pagertreeHigh": "Magas",
|
||||
"noOrBadCertificate": "Hiányzó/Hibás tanúsítvány",
|
||||
"noOrBadCertificate": "Nincs/rossz tanúsítvány",
|
||||
"whatHappensAtForumPost": "Új fórumbejegyzés létrehozása. NEM küldi el a meglévő hozzászólásokhoz. Meglévő hozzászólásokhoz az \"{option}\" használatával lehet hozzászólni",
|
||||
"snmpCommunityStringHelptext": "Ez a karakterlánc jelszóként szolgál az SNMP-kompatibilis eszközök hitelesítésére és a hozzáférés ellenőrzésére. Egyeztesse az SNMP-eszköz konfigurációjával.",
|
||||
"snmpOIDHelptext": "Adja meg a megfigyelni kívánt érzékelő vagy állapot OID azonosítóját. Ha nem biztos az OID-ben, használjon hálózatirányítási eszközöket, például MIB-böngészőket vagy SNMP-szoftvereket.",
|
||||
"privateOnesenderDesc": "Győződjön meg róla, hogy a telefonszám érvényes. Üzenet küldése privát telefonszámra, például: 628123456789",
|
||||
"Authorization Header": "Hitelesítési Fejléc",
|
||||
"wayToGetDiscordThreadId": "Szál / fórum bejegyzés ID lekérése hasonló, a csatorna ID lekéréséhez. Itt olvashatsz tovább az ID-k lekérésől{0}",
|
||||
"Badge Type": "Jelvény Típusa",
|
||||
"Badge Duration (in hours)": "Jelvény Időtartama (órákban)",
|
||||
"Badge Type": "Jelvény típusa",
|
||||
"Badge Duration (in hours)": "Jelvény Időtartam (órákban)",
|
||||
"Badge Label": "Jelvény Címke",
|
||||
"Badge Prefix": "Jelvény Érték Előtag",
|
||||
"Badge Suffix": "Jelvény Érték Utótag",
|
||||
|
@ -1050,7 +1050,7 @@
|
|||
"rabbitmqNodesRequired": "Állítsa be a csomópontokat ehhez a figyelőhöz.",
|
||||
"rabbitmqNodesDescription": "Adja meg a RabbitMQ menedszer csomópontok URL-jét beleértve a protokollt és a port számát is. Példa: {0}",
|
||||
"shrinkDatabaseDescriptionSqlite": "SQLite adatbázis {vacuum} indítása. Az {auto_vacuum} már engedélyezve van, de ez nem defragmentálja az adatbázist, és nem csomagolja újra az egyes adatbázisoldalakat, ahogyan a {vacuum} parancs teszi.",
|
||||
"invertKeywordDescription": "Keresés a kulcsszó hiányára.",
|
||||
"invertKeywordDescription": "Keresse meg, hogy a kulcsszó inkább hiányzik-e, mint jelen van.",
|
||||
"No tags found.": "Nem található címkék.",
|
||||
"twilioToNumber": "Címzett szám",
|
||||
"twilioFromNumber": "Feladó szám",
|
||||
|
@ -1080,5 +1080,24 @@
|
|||
"Fail": "Hiba",
|
||||
"Pop": "Megjelen",
|
||||
"Bitrix24 Webhook URL": "Bitrix24 Webhook URL",
|
||||
"wayToGetHeiiOnCallDetails": "A Trigger ID és az API kulcsok megszerzésének módja a {dokumentáció}"
|
||||
"wayToGetHeiiOnCallDetails": "A Trigger ID és az API kulcsok megszerzésének módja a {dokumentáció}",
|
||||
"telegramServerUrl": "(Választható) Szerver Url",
|
||||
"telegramServerUrlDescription": "A Telegram bot api korlátozásainak feloldása vagy hozzáférés a blokkolt területekhez (Kína, Irán stb.). További információért kattintson a {0} gombra. Alapértelmezett: {1}",
|
||||
"wahaSession": "Munkamenet",
|
||||
"wahaChatId": "Beszélgetés azonosító (Telefonszám / Kontakt azonosító / Csoport azonosító)",
|
||||
"wayToGetWahaApiUrl": "WAHA példányod URL-je.",
|
||||
"wayToGetWahaApiKey": "Az API-kulcs a WHATSAPP_API_KEY környezeti változó értéke, amelyet a WAHA futtatásához használt.",
|
||||
"wayToWriteWahaChatId": "A telefonszám nemzetközi előtaggal, de az elején lévő pluszjel ({0}), a kapcsolattartó azonosítója ({1}) vagy a csoportazonosító ({2}) nélkül. A WAHA Session értesítéseket küld erre a beszélgetési azonosítóra.",
|
||||
"Plain Text": "Sima Szöveg",
|
||||
"Message Template": "Üzenet Sablon",
|
||||
"Template Format": "Sablon Formátum",
|
||||
"wayToGetWahaSession": "A munkamenetből WAHA küld egy értesítést a Beszélgetés azonosítóra. Az értesítést megtalálhatod a WAHA műszerfalon.",
|
||||
"YZJ Webhook URL": "YZJ Webhook URL",
|
||||
"YZJ Robot Token": "YZJ Robot token",
|
||||
"templateServiceName": "szolgáltatás név",
|
||||
"templateHostnameOrURL": "kiszolgáló név vagy URL",
|
||||
"templateStatus": "státusz",
|
||||
"telegramUseTemplate": "Egyéni üzenetsablon használata",
|
||||
"telegramUseTemplateDescription": "Ha engedélyezve van, az üzenet egy egyéni sablon szerint lesz elküldve.",
|
||||
"telegramTemplateFormatDescription": "Telegram különböző jelölőnyelvek használatát engedi, további információkért lásd {0}."
|
||||
}
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
"day": "giorno | giorni",
|
||||
"-day": "-giorni",
|
||||
"hour": "ora",
|
||||
"-hour": "-ore",
|
||||
"-hour": "-ora",
|
||||
"Response": "Risposta",
|
||||
"Ping": "Ping",
|
||||
"Monitor Type": "Modalità di monitoraggio",
|
||||
|
@ -80,7 +80,7 @@
|
|||
"pushOptionalParams": "Parametri aggiuntivi: {0}",
|
||||
"Save": "Salva",
|
||||
"Notifications": "Notifiche",
|
||||
"Not available, please setup.": "Non disponibili, richiesta configurazione manuale.",
|
||||
"Not available, please setup.": "Non disponibile, richiesta configurazione manuale.",
|
||||
"Setup Notification": "Configura le notifiche",
|
||||
"Light": "Chiaro",
|
||||
"Dark": "Scuro",
|
||||
|
@ -114,7 +114,7 @@
|
|||
"Username": "Nome utente",
|
||||
"Password": "Password",
|
||||
"Remember me": "Ricorda credenziali",
|
||||
"Login": "Accesso",
|
||||
"Login": "Accedi",
|
||||
"No Monitors, please": "Nessun monitor presente,",
|
||||
"add one": "aggiungine uno",
|
||||
"Notification Type": "Servizio di notifica",
|
||||
|
@ -559,7 +559,7 @@
|
|||
"dataRetentionTimeError": "Il periodo di conservazione deve essere pari o superiore a 0",
|
||||
"infiniteRetention": "Impostare su 0 per la conservazione infinita.",
|
||||
"enableGRPCTls": "Consenti l'invio di richieste gRPC con connessione TLS",
|
||||
"grpcMethodDescription": "Il nome del metodo viene convertito nel formato cammelCase come sayHello, check, ecc.",
|
||||
"grpcMethodDescription": "Il nome del metodo viene convertito nel formato camelCase come sayHello, check, ecc.",
|
||||
"styleElapsedTimeShowNoLine": "Mostra (nessuna riga)",
|
||||
"Add New Tag": "Aggiungi nuova etichetta",
|
||||
"webhookCustomBodyDesc": "Definire un corpo HTTP personalizzato per la richiesta. Le variabili modello {msg}, {heartbeat}, {monitor} sono accettate.",
|
||||
|
@ -738,5 +738,9 @@
|
|||
"invertKeywordDescription": "Cerca la parola chiave essere assente anziché presente.",
|
||||
"octopushAPIKey": "\"API Key\" dalle credenziali API HTTP nel pannello di controllo",
|
||||
"Enable TLS": "Abilita TLS",
|
||||
"ignoredTLSError": "Ignora errori TLS/SSL"
|
||||
"ignoredTLSError": "Ignora errori TLS/SSL",
|
||||
"templateHostnameOrURL": "nome host o URL",
|
||||
"templateStatus": "stato",
|
||||
"templateServiceName": "nome del servizio",
|
||||
"locally configured mail transfer agent": "agente mail configurato localmente"
|
||||
}
|
||||
|
|
|
@ -1065,5 +1065,25 @@
|
|||
"Key Added": "追加キー",
|
||||
"Bark Sound": "Bark通知音",
|
||||
"Badge URL": "バッジURL",
|
||||
"pushoversounds intermission": "Intermission"
|
||||
"pushoversounds intermission": "Intermission",
|
||||
"telegramServerUrl": "(任意)サーバーUrl",
|
||||
"telegramServerUrlDescription": "Telegramのボットapiの制限を解除したり、ブロックされた地域(中国、イランなど)でアクセスする。詳しくは {0} をクリックしてください。デフォルト: {1}",
|
||||
"wayToWriteWahaChatId": "電話番号の先頭にプラス記号を付けない国際電話番号({0})、コンタクトID ({1})、またはグループID ({2}) 。WAHAセッションからこのチャットIDに通知が送信されます。",
|
||||
"wahaSession": "セッション",
|
||||
"wahaChatId": "チャットID(電話番号/連絡先ID/グループID)",
|
||||
"wayToGetWahaApiUrl": "WAHAインスタンスのURL。",
|
||||
"wayToGetWahaApiKey": "APIキーはWAHAを実行するために使用したWHATSAPP_API_KEY環境変数の値です。",
|
||||
"wayToGetWahaSession": "このセッションから WAHA はチャット ID に通知を送信します。WAHAダッシュボードで確認できます。",
|
||||
"YZJ Webhook URL": "YZJ ウェブフック URL",
|
||||
"YZJ Robot Token": "YZJ ロボットトークン",
|
||||
"Plain Text": "平文",
|
||||
"Message Template": "メッセージテンプレート",
|
||||
"Template Format": "テンプレート形式",
|
||||
"templateServiceName": "サービス名",
|
||||
"templateHostnameOrURL": "ホスト名またはURL",
|
||||
"templateStatus": "ステータス",
|
||||
"telegramUseTemplate": "カスタムメッセージテンプレートを使用",
|
||||
"telegramUseTemplateDescription": "有効にすると、メッセージはカスタムテンプレートを使って送信されます。",
|
||||
"telegramTemplateFormatDescription": "Telegramではメッセージに異なるマークアップ言語を使用することができます。詳細はTelegram {0} を参照してください。",
|
||||
"Font Twemoji by Twitter licensed under": "TwemojiフォントはTwitterライセンス下でライセンスされています"
|
||||
}
|
||||
|
|
|
@ -17,5 +17,6 @@
|
|||
"List": "სია",
|
||||
"Add": "დამატება",
|
||||
"Add New Monitor": "ახალი მონიტორის დამატება",
|
||||
"Down": "დაბლა"
|
||||
"Down": "დაბლა",
|
||||
"setupDatabaseChooseDatabase": "რომელი მონაცემთა ბაზის გამოყენება გსურთ?"
|
||||
}
|
||||
|
|
|
@ -76,7 +76,7 @@
|
|||
"Accepted Status Codes": "응답 성공 상태 코드",
|
||||
"Save": "저장",
|
||||
"Notifications": "알림",
|
||||
"Not available, please setup.": "존재하지 않아요, 새로운 거 하나 만드는 건 어때요?",
|
||||
"Not available, please setup.": "존재하지 않아요. 새로운 거 하나 만드는 건 어때요?",
|
||||
"Setup Notification": "알림 설정",
|
||||
"Light": "화이트",
|
||||
"Dark": "다크",
|
||||
|
@ -797,5 +797,42 @@
|
|||
"successKeywordExplanation": "성공으로 간주되는 MQTT 키워드",
|
||||
"Reset Token": "토큰 초기화",
|
||||
"Check/Uncheck": "체크/체크 해제",
|
||||
"pushViewCode": "푸시 모니터링는 어떻게 사용하나요? (코드 보기)"
|
||||
"pushViewCode": "푸시 모니터링는 어떻게 사용하나요? (코드 보기)",
|
||||
"Search monitored sites": "모니터링중인 사이트 검색",
|
||||
"templateHeartbeatJSON": "heartbeat를 설명하는 오브젝트",
|
||||
"shrinkDatabaseDescriptionSqlite": "SQLite 데이터베이스에서 {vacuum} 명령을 실행해요. {auto_vacuum}이 이미 활성화되어 있지만, {auto_vacuum}은 {vacuum}이 하는 것처럼 데이터베이스를 조각 모음 하거나 페이지를 다시 압축하지는 않아요.",
|
||||
"statusPageSpecialSlugDesc": "특별한 주소 {0}: 아무런 주소도 입력되지 않으면 이 페이지가 보여요",
|
||||
"Add a new expiry notification day": "새 만료 알림 날짜 추가",
|
||||
"Refresh Interval Description": "이 상태 페이지는 {0}초마다 완전 새로고침(F5) 돼요",
|
||||
"telegramServerUrlDescription": "텔레그램 봇 API의 제한을 해제하거나, 차단된 지역(중국, 이란 등)에서 액세스하려면 {0}을 클릭하세요. 기본값: {1}",
|
||||
"chromeExecutableDescription": "Docker 사용자의 경우, Chromium이 아직 설치되지 않았다면 이를 설치하고 테스트 결과를 표시하는 데 몇 분이 걸릴 수 있어요. 1GB의 디스크 공간을 사용해요.",
|
||||
"templateMonitorJSON": "monitor를 설명하는 오브젝트",
|
||||
"webhookBodyCustomOption": "커스텀 Body",
|
||||
"telegramServerUrl": "(선택) 서버 URL",
|
||||
"and": "그리고",
|
||||
"emailCustomisableContent": "사용자 지정 가능한 콘텐츠",
|
||||
"smtpLiquidIntroduction": "다음 두 개 필드는 Liquid 템플릿 언어를 통해 템플릿화할 수 있습니다. 사용 지침은 {0}을 참조하세요. 사용 가능한 변수는 다음과 같습니다:",
|
||||
"leave blank for default subject": "기본값을 사용하려면 비워두세요",
|
||||
"emailCustomBody": "커스텀 Body",
|
||||
"leave blank for default body": "기본값을 사용하려면 비워두세요",
|
||||
"templateServiceName": "서비스 이름",
|
||||
"templateHostnameOrURL": "호스트명 또는 URL",
|
||||
"templateStatus": "상태",
|
||||
"selectedMonitorCount": "선택됨: {0}",
|
||||
"Remove the expiry notification": "만료 알림 날짜 제거",
|
||||
"Refresh Interval": "새로고침 주기",
|
||||
"noDockerHostMsg": "사용할 수 없습니다. 먼저 도커 호스트를 설정하세요.",
|
||||
"DockerHostRequired": "이 모니터링을 위한 도커 호스트를 설정해 주세요.",
|
||||
"tailscalePingWarning": "Tailscale Ping 모니터링을 사용하려면 Docker 없이 Uptime Kuma를 설치하고 서버에 Tailscale 클라이언트도 설치해야 합니다.",
|
||||
"telegramUseTemplate": "커스텀 메시지 템플릿 사용",
|
||||
"telegramUseTemplateDescription": "활성화하면 메시지를 보낼 때 커스텀 템플릿을 사용해요.",
|
||||
"telegramTemplateFormatDescription": "텔레그램은 메시지에 다양한 마크업 언어를 사용할 수 있어요. 자세한 내용은 텔레그램 {0}을 참조하세요.",
|
||||
"RabbitMQ Username": "RabbitMQ 사용자명",
|
||||
"RabbitMQ Password": "RabbitMQ 비밀번호",
|
||||
"wahaSession": "세션",
|
||||
"emailTemplateMsg": "알림 메시지",
|
||||
"Select message type": "메시지 유형 선택",
|
||||
"Send to channel": "채널로 전송",
|
||||
"Create new forum post": "새 포럼 게시물 만들기",
|
||||
"Your User ID": "사용자 ID"
|
||||
}
|
||||
|
|
863
src/lang/lt.json
863
src/lang/lt.json
File diff suppressed because it is too large
Load diff
7
src/lang/lv.json
Normal file
7
src/lang/lv.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"languageName": "Latviešu",
|
||||
"setupDatabaseChooseDatabase": "Kuru datubāzi izmantosiet?",
|
||||
"setupDatabaseEmbeddedMariaDB": "Jums nav nekas jādara. Docker imidžā ir iebūvēta un automātiski konfigurēta MariaDB datubāze. Uptime Kuma pieslēgsies šai datubāzei izmantojot unix soketu.",
|
||||
"setupDatabaseSQLite": "Vienkāršs datu bāzes fails, iesakāms maza izmēra risinājumiem. Pirms versijas v2.0.0 SQLite bija noklusējuma datubāze.",
|
||||
"setupDatabaseMariaDB": "Pieslēgties ārējai MariaDB datubāzei. Jums būs jākonfigurē datubāzes pieslēgšanās informācija."
|
||||
}
|
|
@ -7,24 +7,24 @@
|
|||
"Game": "Permainan",
|
||||
"Primary Base URL": "URL Pangkalan Utama",
|
||||
"Version": "Versi",
|
||||
"Add": "Menambah",
|
||||
"Quick Stats": "Statistik ringkas",
|
||||
"Up": "Dalam talian",
|
||||
"Down": "Luar talian",
|
||||
"Pending": "Belum selesai",
|
||||
"statusMaintenance": "Membaiki",
|
||||
"Maintenance": "Membaiki",
|
||||
"Unknown": "Tidak ketahui",
|
||||
"General Monitor Type": "Jenis monitor umum",
|
||||
"Check Update On GitHub": "Semak kemas kini dalam GitHub",
|
||||
"Add": "Tambah",
|
||||
"Quick Stats": "Statistik Pantas",
|
||||
"Up": "Atas",
|
||||
"Down": "Bawah",
|
||||
"Pending": "Dalam Proses",
|
||||
"statusMaintenance": "Penyelenggaraan",
|
||||
"Maintenance": "Penyelenggaraan",
|
||||
"Unknown": "Tidak Diketahui",
|
||||
"General Monitor Type": "Jenis Monitor Umum",
|
||||
"Check Update On GitHub": "Semak kemas kini di GitHub",
|
||||
"List": "Senarai",
|
||||
"Specific Monitor Type": "Jenis monitor spesifik",
|
||||
"Specific Monitor Type": "Jenis Monitor Spesifik",
|
||||
"markdownSupported": "Sintaks markdown disokong",
|
||||
"languageName": "Bahasa inggeris",
|
||||
"Dashboard": "Papan pemuka",
|
||||
"Language": "Bahasa",
|
||||
"Add New Monitor": "Tambah monitor baharu",
|
||||
"Passive Monitor Type": "Jenis monitor pasif",
|
||||
"Add New Monitor": "Tambah Monitor Baharu",
|
||||
"Passive Monitor Type": "Jenis Monitor Pasif",
|
||||
"No Services": "Tiada Servis",
|
||||
"Add a monitor": "Tambah Monitor",
|
||||
"High": "Tinggi",
|
||||
|
@ -49,5 +49,41 @@
|
|||
"Content Type": "Jenis Content",
|
||||
"Home": "Laman Utama",
|
||||
"Settings": "Tetapan",
|
||||
"Save": "Simpan"
|
||||
"Save": "Simpan",
|
||||
"Cannot connect to the socket server": "Tidak dapat disambungkan kepada pelayan soket",
|
||||
"Resume": "Sambung",
|
||||
"Current": "Terkini",
|
||||
"Uptime": "Uptime",
|
||||
"Cert Exp.": "Tamat Sijil",
|
||||
"now": "sekarang",
|
||||
"setupDatabaseMariaDB": "Sambungan kepada pangkalan data MariaDB secara luaran. Anda perlu tetapkan maklumat sambungan pangkalan data.",
|
||||
"hour": "jam",
|
||||
"Ping": "Ping",
|
||||
"settingUpDatabaseMSG": "Pangkalan data sedang ditetapkan. Sila tunggu sebentar.",
|
||||
"Reconnecting...": "Penyambungan...",
|
||||
"Message": "Mesej",
|
||||
"No important events": "Tiada info penting",
|
||||
"Edit": "Sunting",
|
||||
"Delete": "Padam",
|
||||
"Monitor": "Monitor | Monitors",
|
||||
"time ago": "{0} yang lepas",
|
||||
"day": "hari | hari",
|
||||
"-day": "-hari",
|
||||
"-year": "-tahun",
|
||||
"Pause": "Rehat",
|
||||
"Status": "Status",
|
||||
"DateTime": "TarikhMasa",
|
||||
"dbName": "Nama Pangkalan Data",
|
||||
"-hour": "-jam",
|
||||
"Response": "Tindakbalas",
|
||||
"Monitor Type": "Jenis Monitor",
|
||||
"Keyword": "Katakunci",
|
||||
"pauseDashboardHome": "Rehat",
|
||||
"Name": "Nama",
|
||||
"setupDatabaseChooseDatabase": "Pangkalan Data yang mana hendak digunakan ?",
|
||||
"Host URL": "URL Host",
|
||||
"URL": "URL",
|
||||
"Expected Value": "Nilai Sepatutnya",
|
||||
"Friendly Name": "Nama Mudah",
|
||||
"Hostname": "Nama Host"
|
||||
}
|
||||
|
|
|
@ -127,7 +127,7 @@
|
|||
"Create": "Aanmaken",
|
||||
"Clear Data": "Data wissen",
|
||||
"Events": "Gebeurtenissen",
|
||||
"Heartbeats": "Heartbeats",
|
||||
"Heartbeats": "Hartslagen",
|
||||
"Auto Get": "Auto Get",
|
||||
"backupDescription": "U kunt een back-up maken van alle monitoren en alle meldingen in een JSON-bestand.",
|
||||
"backupDescription2": "PS: Geschiedenis- en gebeurtenisgegevens zijn niet inbegrepen.",
|
||||
|
@ -464,24 +464,24 @@
|
|||
"Show Powered By": "Laat \"Mogeljik gemaakt door\" zien",
|
||||
"Domain Names": "Domein Namen",
|
||||
"pushoversounds pushover": "Pushover (standaard)",
|
||||
"pushoversounds bike": "Bike",
|
||||
"pushoversounds bugle": "Bugle",
|
||||
"pushoversounds cashregister": "Cash Register",
|
||||
"pushoversounds bike": "Fiets",
|
||||
"pushoversounds bugle": "Trompet",
|
||||
"pushoversounds cashregister": "Kassa",
|
||||
"pushoversounds classical": "Classical",
|
||||
"pushoversounds cosmic": "Cosmic",
|
||||
"pushoversounds falling": "Falling",
|
||||
"pushoversounds cosmic": "Buitenaards",
|
||||
"pushoversounds falling": "Vallend",
|
||||
"pushoversounds gamelan": "Gamelan",
|
||||
"pushoversounds incoming": "Incoming",
|
||||
"pushoversounds intermission": "Intermission",
|
||||
"pushoversounds magic": "Magic",
|
||||
"pushoversounds mechanical": "Mechanical",
|
||||
"pushoversounds incoming": "Inkomend",
|
||||
"pushoversounds intermission": "Pauze",
|
||||
"pushoversounds magic": "Magie",
|
||||
"pushoversounds mechanical": "Mechanisch",
|
||||
"pushoversounds pianobar": "Piano Bar",
|
||||
"pushoversounds siren": "Siren",
|
||||
"pushoversounds spacealarm": "Space Alarm",
|
||||
"pushoversounds siren": "Sirene",
|
||||
"pushoversounds spacealarm": "Ruimte Alarm",
|
||||
"pushoversounds tugboat": "Tug Boat",
|
||||
"pushoversounds alien": "Alien Alarm (long)",
|
||||
"pushoversounds climb": "Climb (long)",
|
||||
"pushoversounds persistent": "Persistent (long)",
|
||||
"pushoversounds persistent": "Aanhoudend (lang)",
|
||||
"pushoversounds echo": "Pushover Echo (long)",
|
||||
"pushoversounds updown": "Up Down (long)",
|
||||
"pushoversounds vibrate": "Alleen trillen",
|
||||
|
@ -649,8 +649,8 @@
|
|||
"smseagleTo": "Telefoonnummer(s)",
|
||||
"Custom Monitor Type": "Custom Monitor Type",
|
||||
"trustProxyDescription": "'X-Forwarded-*' headers vertrouwen. Als je de correcte client IP wilt krijgen en de Uptime Kuma installatie is achter een proxy zoals Nginx of Apache, schakel dan dit in.",
|
||||
"RadiusCalledStationId": "Called Station Id",
|
||||
"RadiusCalledStationIdDescription": "Identifier of the called device",
|
||||
"RadiusCalledStationId": "Genoemde stations ID",
|
||||
"RadiusCalledStationIdDescription": "Identificatie van het genoemde apparaat",
|
||||
"RadiusCallingStationId": "Calling Station Id",
|
||||
"ZohoCliq": "ZohoCliq",
|
||||
"Long-Lived Access Token": "Long-Lived Access Token",
|
||||
|
@ -789,7 +789,7 @@
|
|||
"Badge Warn Days": "Badge Waarschuwing dagen",
|
||||
"Badge Down Days": "Badge Offline dagen",
|
||||
"Badge Style": "Badge stijl",
|
||||
"chromeExecutable": "Chrome/Chromium Executable",
|
||||
"chromeExecutable": "Chrome/Chromium Uitvoerbaar bestand",
|
||||
"chromeExecutableAutoDetect": "Automatisch detecteren",
|
||||
"Edit Maintenance": "Onderhoud bewerken",
|
||||
"Badge Label": "Badge Label",
|
||||
|
@ -1039,7 +1039,74 @@
|
|||
"ends with": "eindigt met",
|
||||
"not ends with": "eindigt niet met",
|
||||
"less than": "minder dan",
|
||||
"greater than": "meer dan",
|
||||
"greater than": "groter dan",
|
||||
"record": "dossier",
|
||||
"jsonQueryDescription": "Parseer en haal specifieke gegevens uit de JSON-respons van de server met behulp van JSON-query of gebruik \"$\" voor de onbewerkte respons, als u geen JSON verwacht. Het resultaat wordt vervolgens vergeleken met de verwachte waarde, als strings. Zie {0} voor documentatie en gebruik {1} om te experimenteren met query's."
|
||||
"jsonQueryDescription": "Parseer en haal specifieke gegevens uit de JSON-respons van de server met behulp van JSON-query of gebruik \"$\" voor de onbewerkte respons, als u geen JSON verwacht. Het resultaat wordt vervolgens vergeleken met de verwachte waarde, als strings. Zie {0} voor documentatie en gebruik {1} om te experimenteren met query's.",
|
||||
"rabbitmqNodesDescription": "Voer het URL voor de RabbitMQ beheer nodes inclusief protocol en poort in. Bijvoorbeeld: {0}",
|
||||
"rabbitmqNodesRequired": "Aub stel de knooppunten voor deze monitor in.",
|
||||
"rabbitmqNodesInvalid": "Gebruik een volledig gekwalificeerde (beginnend met 'http') URL voor de RabbitMQ nodes.",
|
||||
"RabbitMQ Username": "RabbitMQ gebruikersnaam",
|
||||
"RabbitMQ Password": "RabbitMQ wachtwoord",
|
||||
"rabbitmqHelpText": "Om gebruik te maken van de monitor moet je de Management Plugin in de RabbitMQ setup aanzetten. Voor meer informatie zie de {rabitmq_documentatie}.",
|
||||
"SendGrid API Key": "SendGrid API sleutel",
|
||||
"Separate multiple email addresses with commas": "Splits meerdere emailadressen met kommas",
|
||||
"RabbitMQ Nodes": "RabbitMQ beheer Nodes",
|
||||
"shrinkDatabaseDescriptionSqlite": "Trigger database {vacuum} voor SQLite. {auto_vacuum} is al ingeschakeld, maar hiermee wordt de database niet gedefragmenteerd en worden ook databasepagina's niet afzonderlijke opnieuw ingepakt zoals de opdracht {vacuum} dat doet.",
|
||||
"aboutSlackUsername": "Verandert de weergavenaam van de afzender. Als je iemand wil vermelden, voeg dit dan aan de vriendelijke naam toe.",
|
||||
"cacheBusterParam": "Voeg de {0} parameter",
|
||||
"Form Data Body": "Formulier Gegevens Body",
|
||||
"Optional: Space separated list of scopes": "Optioneel: door spaties gescheiden lijst met scopes",
|
||||
"Alphanumerical string and hyphens only": "Alleen alfanumerieke tekens en streepjes",
|
||||
"Time sensitive notifications will be delivered immediately, even if the device is in do not disturb mode.": "Tijdsgevoelige meldingen worden meteen afgeleverd, zelfs als het apparaat in niet storen modus staat.",
|
||||
"Message format": "Bericht opmaak",
|
||||
"Send rich messages": "Verstuur berichten met opmaak",
|
||||
"OAuth Scope": "OAuth bereik",
|
||||
"equals": "hetzelfde als",
|
||||
"not equals": "niet gelijk aan",
|
||||
"less than or equal to": "minder dan of gelijk aan",
|
||||
"greater than or equal to": "meer dan of gelijk aan",
|
||||
"Notification Channel": "Notificatie kanaal",
|
||||
"Sound": "Geluid",
|
||||
"Arcade": "Speelhal",
|
||||
"Correct": "Goed",
|
||||
"Fail": "Mislukt",
|
||||
"Harp": "Harp",
|
||||
"Reveal": "Laat zien",
|
||||
"Bubble": "Bubbel",
|
||||
"Doorbell": "Deurbel",
|
||||
"Flute": "Fluit",
|
||||
"Money": "Geld",
|
||||
"Scifi": "Science fiction",
|
||||
"Guitar": "Gitaar",
|
||||
"Custom sound to override default notification sound": "Aangepast geluid om het standaard geluid te vervangen",
|
||||
"Time Sensitive (iOS Only)": "Tijdsgevoelig (alleen voor iOs)",
|
||||
"From": "Van",
|
||||
"Can be found on:": "Kan gevonden worden op: {0}",
|
||||
"The phone number of the recipient in E.164 format.": "Het telefoonnummer van de ontvanger in E.164 formaat.",
|
||||
"Either a text sender ID or a phone number in E.164 format if you want to be able to receive replies.": "Ofwel een sms zender ID of een telefoonnummer in E.164 formaat als je reacties wil ontvangen.",
|
||||
"Clear": "Helder",
|
||||
"Elevator": "Lift",
|
||||
"Pop": "Pop",
|
||||
"Community String": "Gemeenschapsreeks",
|
||||
"Json Query Expression": "JSON Query Expressie",
|
||||
"ignoredTLSError": "TLS/SSL-fouten zijn genegeerd",
|
||||
"telegramServerUrl": "(Optioneel) Server Url",
|
||||
"telegramServerUrlDescription": "Om de beperkingen van Telegram's bot api op te heffen of toegang te krijgen in geblokkeerde gebieden (China, Iran, enz.). Klik voor meer informatie op {0}. Standaard: {1}",
|
||||
"wahaSession": "Sessie",
|
||||
"wahaChatId": "Chat-ID (telefoonnummer / contact-ID / groeps-ID)",
|
||||
"wayToGetWahaApiUrl": "Je WAHA Instance URL.",
|
||||
"wayToGetWahaApiKey": "API Key is de WHATSAPP_API_KEY omgevingsvariabele die je hebt gebruikt om WAHA uit te voeren.",
|
||||
"wayToGetWahaSession": "Vanaf deze sessie stuurt WAHA meldingen naar Chat ID. Je kunt deze vinden in WAHA Dashboard.",
|
||||
"wayToWriteWahaChatId": "Het telefoonnummer met het internationale voorvoegsel, maar zonder het plusteken aan het begin ({0}), de contact-ID ({1}) of de groeps-ID ({2}). Vanuit WAHA Sessie worden meldingen naar deze Chat-ID verzonden.",
|
||||
"YZJ Robot Token": "YZJ Robot token",
|
||||
"Plain Text": "Platte tekst",
|
||||
"Message Template": "Bericht Sjabloon",
|
||||
"YZJ Webhook URL": "YZJ Webhook URL",
|
||||
"Template Format": "Sjabloonformaat",
|
||||
"templateServiceName": "service naam",
|
||||
"templateHostnameOrURL": "hostnaam of url",
|
||||
"templateStatus": "status",
|
||||
"telegramUseTemplate": "Gebruik aangepaste bericht sjabloon",
|
||||
"telegramTemplateFormatDescription": "Telegram staat het gebruik van verschillende opmaaktalen voor berichten toe, zie Telegram {0} voor specifieke details.",
|
||||
"telegramUseTemplateDescription": "Indien ingeschakeld, wordt het bericht verzonden met een aangepaste sjabloon."
|
||||
}
|
||||
|
|
|
@ -1098,5 +1098,24 @@
|
|||
"RabbitMQ Username": "Nazwa użytkownika RabbitMQ",
|
||||
"RabbitMQ Password": "Hasło RabbitMQ",
|
||||
"SendGrid API Key": "Klucz API SendGrid",
|
||||
"Separate multiple email addresses with commas": "Oddziel wiele adresów e-mail przecinkami"
|
||||
"Separate multiple email addresses with commas": "Oddziel wiele adresów e-mail przecinkami",
|
||||
"templateServiceName": "service name",
|
||||
"telegramServerUrlDescription": "Aby znieść ograniczenia api bota Telegrama lub uzyskać dostęp w zablokowanych obszarach (Chiny, Iran itp.). Aby uzyskać więcej informacji, kliknij {0}. Domyślnie: {1}",
|
||||
"wayToGetWahaSession": "Z tej sesji WAHA wysyła powiadomienia do Chat ID. Można go znaleźć w WAHA Dashboard.",
|
||||
"wayToWriteWahaChatId": "Numer telefonu z prefiksem międzynarodowym, ale bez znaku plus na początku ({0}), identyfikator kontaktu ({1}) lub identyfikator grupy ({2}). Powiadomienia są wysyłane do tego identyfikatora czatu z sesji WAHA.",
|
||||
"wahaSession": "Sesja",
|
||||
"wahaChatId": "Identyfikator czatu (numer telefonu / identyfikator kontaktu / identyfikator grupy)",
|
||||
"wayToGetWahaApiUrl": "Adres URL instancji WAHA.",
|
||||
"wayToGetWahaApiKey": "Klucz API to wartość zmiennej środowiskowej WHATSAPP_API_KEY użytej do uruchomienia WAHA.",
|
||||
"YZJ Robot Token": "Token robota YZJ",
|
||||
"YZJ Webhook URL": "Adres URL usługi YZJ Webhook",
|
||||
"telegramServerUrl": "(Opcjonalnie) Adres URL serwera",
|
||||
"Plain Text": "Zwykły tekst",
|
||||
"Message Template": "Szablon wiadomości",
|
||||
"Template Format": "Format szablonu",
|
||||
"templateHostnameOrURL": "nazwa hosta lub adres URL",
|
||||
"templateStatus": "status",
|
||||
"telegramUseTemplate": "Użyj niestandardowego szablonu wiadomości",
|
||||
"telegramUseTemplateDescription": "Jeśli opcja ta jest włączona, wiadomość zostanie wysłana przy użyciu niestandardowego szablonu.",
|
||||
"telegramTemplateFormatDescription": "Telegram pozwala na używanie różnych języków znaczników dla wiadomości, zobacz Telegram {0}, aby uzyskać szczegółowe informacje."
|
||||
}
|
||||
|
|
|
@ -1062,5 +1062,25 @@
|
|||
"RabbitMQ Username": "Nome de usuário do RabbitMQ",
|
||||
"RabbitMQ Password": "Senha do RabbitMQ",
|
||||
"SendGrid API Key": "Chave API do SendGrid",
|
||||
"Separate multiple email addresses with commas": "Separe vários endereços de e-mail com vírgulas"
|
||||
"Separate multiple email addresses with commas": "Separe vários endereços de e-mail com vírgulas",
|
||||
"templateServiceName": "nome do serviço",
|
||||
"telegramUseTemplate": "Use um template personalizado de mensagem",
|
||||
"telegramTemplateFormatDescription": "O Telegram permite o uso de diferentes linguagens de marcação para mensagens. Veja o Telegram {0} para detalhes específicos.",
|
||||
"templateHostnameOrURL": "hostname ou URL",
|
||||
"templateStatus": "status",
|
||||
"telegramUseTemplateDescription": "Se habilitado, a mensagem será enviada usando um template personalizado.",
|
||||
"telegramServerUrlDescription": "Para suspender as limitações da API de bots do Telegram ou obter acesso em áreas bloqueadas (China, Irã, etc). Para mais informações, clique em {0}. Padrão: {1}",
|
||||
"wahaSession": "Sessão",
|
||||
"wayToGetWahaApiUrl": "URL da sua instância WAHA.",
|
||||
"wayToGetWahaApiKey": "API Key é o valor da variável de ambiente WHATSAPP_API_KEY que você usou para executar o WAHA.",
|
||||
"wayToGetWahaSession": "A partir desta sessão, o WAHA envia notificações para o Chat ID. Você pode encontrá-lo no WAHA Dashboard.",
|
||||
"wayToWriteWahaChatId": "O número de telefone com o prefixo internacional, mas sem o sinal de mais no início ({0}), o Contact ID ({1}) ou o Group ID ({2}). As notificações são enviadas para este Chat ID da sessão WAHA.",
|
||||
"Plain Text": "Texto Simples",
|
||||
"wahaChatId": "Chat ID (Número de Telefone / Contact ID / Group ID)",
|
||||
"YZJ Webhook URL": "YZJ Webhook URL",
|
||||
"YZJ Robot Token": "YZJ Robot token",
|
||||
"telegramServerUrl": "(Opcional) URL do Servidor",
|
||||
"Message Template": "Modelo de Mensagem",
|
||||
"Template Format": "Formato do Modelo",
|
||||
"Font Twemoji by Twitter licensed under": "Fonte Twemoji do Twitter licenciada sob"
|
||||
}
|
||||
|
|
|
@ -1039,5 +1039,43 @@
|
|||
"less than": "mai puțin decât",
|
||||
"less than or equal to": "mai mic sau egal cu",
|
||||
"greater than or equal to": "mai mare sau egal cu",
|
||||
"record": "înregistrare"
|
||||
"record": "înregistrare",
|
||||
"aboutSlackUsername": "Modifică numele afișat al expeditorului mesajului. Dacă doriți să menționați pe cineva, includeți-l în numele prietenos.",
|
||||
"Custom sound to override default notification sound": "Sunet personalizat pentru a înlocui sunetul de notificare implicit",
|
||||
"ignoredTLSError": "Erorile TLS/SSL au fost ignorate",
|
||||
"Message format": "Formatul mesajului",
|
||||
"Send rich messages": "Trimiteți mesaje complexe",
|
||||
"Notification Channel": "Canal de notificare",
|
||||
"Sound": "Sunet",
|
||||
"Alphanumerical string and hyphens only": "Doar șir de caractere alfanumerice și liniuțe",
|
||||
"Arcade": "Galerie",
|
||||
"RabbitMQ Username": "Utilizator RabbitMQ",
|
||||
"Time sensitive notifications will be delivered immediately, even if the device is in do not disturb mode.": "Notificările \"time sensitive\" vor fi livrate imediat, chiar dacă dispozitivul este în modul „nu deranjați”.",
|
||||
"rabbitmqNodesDescription": "Introduceți adresa URL pentru nodurile de gestionare RabbitMQ, inclusiv protocolul și portul. Exemplu: {0}",
|
||||
"rabbitmqHelpText": "Pentru a utiliza monitorul, va trebui să activați plugin-ul de gestionare în configurația RabbitMQ. Pentru mai multe informații, vă rugăm să consultați {rabitmq_documentation}.",
|
||||
"Time Sensitive (iOS Only)": "Time Sensitive (numai iOS)",
|
||||
"From": "De la",
|
||||
"Can be found on:": "Poate fi găsit la: {0}",
|
||||
"The phone number of the recipient in E.164 format.": "Numărul de telefon al destinatarului în format E.164.",
|
||||
"Either a text sender ID or a phone number in E.164 format if you want to be able to receive replies.": "Fie un ID expeditor text, fie un număr de telefon în format E.164, dacă doriți să puteți primi răspunsuri.",
|
||||
"RabbitMQ Nodes": "Noduri de gestionare RabbitMQ",
|
||||
"Money": "Bani",
|
||||
"Scifi": "SF",
|
||||
"Elevator": "Lift",
|
||||
"Guitar": "Chitară",
|
||||
"Pop": "Pop",
|
||||
"Harp": "Harpă",
|
||||
"Reveal": "Dezvăluire",
|
||||
"Bubble": "Bule",
|
||||
"Doorbell": "Sonerie",
|
||||
"Flute": "Flaut",
|
||||
"Clear": "Clar",
|
||||
"rabbitmqNodesRequired": "Vă rugăm să setați nodurile pentru acest monitor.",
|
||||
"rabbitmqNodesInvalid": "Vă rugăm să utilizați o adresă URL complet calificată (începând cu „http”) pentru nodurile RabbitMQ.",
|
||||
"RabbitMQ Password": "Parolă RabbitMQ",
|
||||
"SendGrid API Key": "Cheia API SendGrid",
|
||||
"Separate multiple email addresses with commas": "Separați adresele de e-mail multiple cu virgule",
|
||||
"Correct": "Corect",
|
||||
"Fail": "Eșec",
|
||||
"shrinkDatabaseDescriptionSqlite": "Declanșează comanda {vacuum} pentru baza de date SQLite. {auto_vacuum} este deja activat, dar acest lucru nu defragmentează baza de date și nici nu reîmpachetează paginile individuale ale bazei de date așa cum o face comanda {vacuum}."
|
||||
}
|
||||
|
|
|
@ -1106,5 +1106,24 @@
|
|||
"SendGrid API Key": "API-ключ SendGrid",
|
||||
"Separate multiple email addresses with commas": "Разделяйте несколько адресов электронной почты запятыми",
|
||||
"-year": "-год",
|
||||
"Json Query Expression": "Выражение запроса Json"
|
||||
"Json Query Expression": "Выражение запроса Json",
|
||||
"templateServiceName": "имя сервиса",
|
||||
"templateHostnameOrURL": "hostname или URL",
|
||||
"templateStatus": "статус",
|
||||
"telegramServerUrlDescription": "Чтобы поднять ограничения API API Telegram или получить доступ к заблокированным районам (Китай, Иран и т.д.). Для получения дополнительной информации нажмите {0}. По умолчанию: {1}",
|
||||
"wayToGetWahaApiKey": "Ключ API - это значение переменной среды WHATSAPP_API_KEY, которое вы использовали для запуска WAHA.",
|
||||
"wayToGetWahaSession": "Из этой сессии WAHA отправляет уведомления на удостоверение личности чата. Вы можете найти его на приборной панели Waha.",
|
||||
"wayToWriteWahaChatId": "Номер телефона с международным префиксом, но без знака плюс в начале ({0}), идентификатор контакта ({1}) или идентификатора группы ({2}). Уведомления отправляются на этот идентификатор чата от сеанса Waha.",
|
||||
"wahaSession": "Сессия",
|
||||
"wahaChatId": "Идентификатор чата (номер телефона / идентификатор контакта / идентификатор группы)",
|
||||
"wayToGetWahaApiUrl": "Ваш экземпляр WAHA URL.",
|
||||
"YZJ Webhook URL": "YZJ Вебхук URL",
|
||||
"YZJ Robot Token": "YZJ Токен Робота",
|
||||
"telegramServerUrl": "(Необязательно) URL Сервера",
|
||||
"telegramUseTemplate": "Используйте пользовательский шаблон сообщения",
|
||||
"telegramUseTemplateDescription": "Если включено, сообщение будет отправлено с помощью пользовательского шаблона.",
|
||||
"telegramTemplateFormatDescription": "Telegram позволяет использовать различные языки разметки для сообщений, см. Telegram {0} для конкретных деталей.",
|
||||
"Plain Text": "Простой текст",
|
||||
"Message Template": "Шаблон сообщения",
|
||||
"Template Format": "Формат шаблона"
|
||||
}
|
||||
|
|
|
@ -558,5 +558,29 @@
|
|||
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Zoznam notifikačných služieb nájdete v aplikácii Home Assistant v časti „Nástroje pre vývojárov > Služby“, kde vyhľadajte položku „ notifikácia“ a nájdite názov svojho zariadenia/telefónu.",
|
||||
"tailscalePingWarning": "Ak chcete používať sledovanie Tailscale Ping, musíte nainštalovať aplikáciu Uptime Kuma bez nástroja Docker a tiež nainštalovať klienta Tailscale na server.",
|
||||
"Enable": "Povoliť",
|
||||
"Enable DNS Cache": "(Zastarané) Povoliť vyrovnávaciu pamäť DNS pre HTTP(s) sledovania"
|
||||
"Enable DNS Cache": "(Zastarané) Povoliť vyrovnávaciu pamäť DNS pre HTTP(s) sledovania",
|
||||
"Post": "Publikovať",
|
||||
"Not running": "Nebeží",
|
||||
"RadiusSecret": "Radius Secret",
|
||||
"cronExpression": "CRON výraz",
|
||||
"Maintenance Time Window of a Day": "Časové okno pre údržbu v daný deň",
|
||||
"Hello @everyone is...": "Dobrý deň, {'@'}všetci sú…",
|
||||
"clearHeartbeatsMsg": "Naozaj chcete odstrániť všetky heartbeaty pre tento monitoring?",
|
||||
"Trust Proxy": "Dôveryhodná proxy",
|
||||
"RadiusCalledStationId": "ID volaného zariadenia",
|
||||
"Connection String": "Connection String",
|
||||
"socket": "Socket",
|
||||
"Line Developers Console": "Konzola Line Developers",
|
||||
"confirmClearStatisticsMsg": "Naozaj chcete odstrániť VŠETKY štatistiky?",
|
||||
"-year": "-rok",
|
||||
"and": "a",
|
||||
"shrinkDatabaseDescriptionSqlite": "Podmienka spustenia príkazu pre SQLite databázu. Príkaz {auto_vacuum} je už zapnutý, ale nedochádza k defragmentácii databázy ani k prebaleniu jednotlivých stránok databázy ako to robí príkaz {vacuum}.",
|
||||
"lineDevConsoleTo": "Konzola Line Developers - {0}",
|
||||
"clearEventsMsg": "Naozaj chcete odstrániť všetky udalosti pre tento monitoring?",
|
||||
"now": "teraz",
|
||||
"time ago": "pred {0}",
|
||||
"Json Query Expression": "Výraz dotazu JSON",
|
||||
"ignoredTLSError": "Chyby TLS/SSL boli ignorované",
|
||||
"Add a new expiry notification day": "Pridať nové oznámenie o vypršaní platnosti",
|
||||
"chromeExecutable": "Spustitelný súbor Chrome/Chromium"
|
||||
}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{
|
||||
"languageName": "Türkçe",
|
||||
"languageName": "İngilizce",
|
||||
"checkEverySecond": "{0} saniyede bir kontrol et",
|
||||
"retryCheckEverySecond": "{0} saniyede bir dene",
|
||||
"resendEveryXTimes": "Her {0} bir yeniden gönder",
|
||||
|
@ -183,7 +183,7 @@
|
|||
"Entry Page": "Giriş Sayfası",
|
||||
"statusPageNothing": "Burada hiçbir şey yok, lütfen bir grup veya servis ekleyin.",
|
||||
"No Services": "Hizmet Yok",
|
||||
"All Systems Operational": "Tüm Sistemler Operasyonel",
|
||||
"All Systems Operational": "Tüm Sistemler Sorunsuz",
|
||||
"Partially Degraded Service": "Kısmen Bozulmuş Hizmet",
|
||||
"Degraded Service": "Bozulmuş Hizmet",
|
||||
"Add Group": "Grup Ekle",
|
||||
|
@ -201,7 +201,7 @@
|
|||
"Chat ID": "Chat ID",
|
||||
"supportTelegramChatID": "Doğrudan Sohbet / Grup / Kanalın Sohbet Kimliğini Destekleyin",
|
||||
"wayToGetTelegramChatID": "Bot'a bir mesaj göndererek ve chat_id'yi görüntülemek için bu URL'ye giderek sohbet kimliğinizi alabilirsiniz:",
|
||||
"YOUR BOT TOKEN HERE": "BOT TOKENİNİZ BURADA",
|
||||
"YOUR BOT TOKEN HERE": "BOT TOKENİNİZ BURAYA",
|
||||
"chatIDNotFound": "Chat ID bulunamadı; lütfen önce bu bota bir mesaj gönderin",
|
||||
"webhook": "Webhook",
|
||||
"Post URL": "Post URL",
|
||||
|
@ -224,7 +224,7 @@
|
|||
"Prefix Custom Message": "Özel Önek Mesajı",
|
||||
"Hello @everyone is...": "Merhaba {'@'}everyone…",
|
||||
"teams": "Microsoft Teams",
|
||||
"Webhook URL": "Webhook URL",
|
||||
"Webhook URL": "Webhook URL'si",
|
||||
"wayToGetTeamsURL": "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
|
||||
"signal": "Sinyal",
|
||||
"Number": "Numara",
|
||||
|
@ -378,8 +378,8 @@
|
|||
"auto resolve": "otomatik çözümleme",
|
||||
"gorush": "Gorush",
|
||||
"alerta": "Alerta",
|
||||
"alertaApiEndpoint": "API Endpoint",
|
||||
"alertaEnvironment": "Environment",
|
||||
"alertaApiEndpoint": "API Uç Noktası",
|
||||
"alertaEnvironment": "Ortam",
|
||||
"alertaApiKey": "API Anahtarı",
|
||||
"alertaAlertState": "Uyarı Durumu",
|
||||
"alertaRecoverState": "Kurtarma Durumu",
|
||||
|
@ -403,7 +403,7 @@
|
|||
"Sms template must contain parameters: ": "Sms şablonu parametreleri içermelidir: ",
|
||||
"Bark Endpoint": "Bark Endpoint",
|
||||
"Bark Group": "Bark Group",
|
||||
"Bark Sound": "Bark Sound",
|
||||
"Bark Sound": "Havlama Sesi",
|
||||
"WebHookUrl": "WebHookUrl",
|
||||
"SecretKey": "SecretKey",
|
||||
"For safety, must use secret key": "Güvenlik için gizli anahtar kullanılmalıdır",
|
||||
|
@ -593,7 +593,7 @@
|
|||
"Kook": "Kook",
|
||||
"wayToGetKookBotToken": "Uygulama oluşturun ve {0} adresinde bot tokenı alın",
|
||||
"wayToGetKookGuildID": "Kook ayarında \"Geliştirici Modu\"nu açın ve kimliğini almak için guild'e sağ tıklayın",
|
||||
"Guild ID": "Guild ID",
|
||||
"Guild ID": "Sunucu ID'si",
|
||||
"smseagle": "SMSEagle",
|
||||
"smseagleTo": "Telefon numara(ları)",
|
||||
"smseagleGroup": "Telefon defteri grubu ad(lar)ı",
|
||||
|
@ -840,11 +840,11 @@
|
|||
"styleElapsedTime": "Kalp atışı çubuğunun altında geçen süre",
|
||||
"styleElapsedTimeShowWithLine": "Göster (Satır ile birlikte)",
|
||||
"enableNSCD": "Tüm DNS isteklerini önbelleğe almak için NSCD'yi (Ad Hizmeti Önbellek Programı) etkinleştirin",
|
||||
"setupDatabaseEmbeddedMariaDB": "Hiçbir şey ayarlamanıza gerek yok. Bu docker imajı, MariaDB'yi sizin için otomatik olarak yerleştirdi ve yapılandırdı. Çalışma Süresi Kuma bu veritabanına unix soketi aracılığıyla bağlanacaktır.",
|
||||
"setupDatabaseEmbeddedMariaDB": "Hiçbir şey ayarlamanıza gerek yok. Bu docker imajı, MariaDB'yi sizin için otomatik olarak yerleştirdi ve yapılandırdı. Çalışma Süresi Kuma bu veri tabanına unix soketi aracılığıyla bağlanacaktır.",
|
||||
"setupDatabaseSQLite": "Küçük ölçekli dağıtımlar için önerilen basit bir veritabanı dosyası. v2.0.0'dan önce Uptime Kuma, varsayılan veritabanı olarak SQLite'ı kullanıyordu.",
|
||||
"setupDatabaseChooseDatabase": "Hangi veritabanını kullanmak istersiniz?",
|
||||
"setupDatabaseMariaDB": "Harici bir MariaDB veritabanına bağlanın. Veritabanı bağlantı bilgilerini ayarlamanız gerekir.",
|
||||
"dbName": "Veritabanı ismi",
|
||||
"setupDatabaseChooseDatabase": "Hangi veri tabanını kullanmak istersiniz?",
|
||||
"setupDatabaseMariaDB": "Harici bir MariaDB veri tabanına bağlanın. Veri tabanı bağlantı bilgilerini ayarlamanız gerekir.",
|
||||
"dbName": "Veri tabanı ismi",
|
||||
"Saved.": "Kaydedildi.",
|
||||
"toastErrorTimeout": "Hata Bildirimleri için Zaman Aşımı",
|
||||
"toastSuccessTimeout": "Başarı Bildirimleri için Zaman Aşımı",
|
||||
|
@ -958,7 +958,7 @@
|
|||
"whatHappensAtForumPost": "Yeni bir forum gönderisi oluşturun. Bu, mevcut gönderiye mesaj YAYINLAMAZ. Mevcut gönderide yayınlamak için \"{option}\" seçeneğini kullanın",
|
||||
"Command": "Komut",
|
||||
"mongodbCommandDescription": "Veritabanına karşı bir MongoDB komutu çalıştırın. Mevcut komutlar hakkında bilgi için {dokümantasyona} bakın",
|
||||
"Bitrix24 Webhook URL": "Bitrix24 Webhook URL",
|
||||
"Bitrix24 Webhook URL": "Bitrix24 Webhook URL'si",
|
||||
"wayToGetBitrix24Webhook": "{0} adresindeki adımları izleyerek bir web kancası oluşturabilirsiniz",
|
||||
"bitrix24SupportUserID": "Bitrix24'e kullanıcı kimliğinizi girin. Kullanıcının profiline giderek bağlantıdan kimliğini öğrenebilirsiniz.",
|
||||
"Select message type": "Mesaj türünü seçin",
|
||||
|
@ -1098,5 +1098,24 @@
|
|||
"RabbitMQ Nodes": "RabbitMQ Yönetim Sunucuları",
|
||||
"rabbitmqNodesDescription": "Protokol ve port dahil olmak üzere RabbitMQ yönetim düğümleri için URL'yi girin. Örnek: {0}",
|
||||
"rabbitmqHelpText": "Monitörü kullanmak için, RabbitMQ kurulumunuzda Yönetim Eklentisini etkinleştirmeniz gerekecektir. Daha fazla bilgi için lütfen {rabitmq_documentation}'a bakın.",
|
||||
"aboutSlackUsername": "Mesaj göndericinin görünen adını değiştir. Eğer birilerini etiketlemek isterseniz, onu ismini dostça ekleyebilirsiniz."
|
||||
"aboutSlackUsername": "Mesaj göndericinin görünen adını değiştir. Eğer birilerini etiketlemek isterseniz, onu ismini dostça ekleyebilirsiniz.",
|
||||
"templateHostnameOrURL": "ana bilgisayar adı veya URL",
|
||||
"templateStatus": "durum",
|
||||
"telegramUseTemplate": "Özel mesaj şablonu kullan",
|
||||
"telegramUseTemplateDescription": "Etkinleştirilirse mesaj özel bir şablon kullanılarak gönderilecektir.",
|
||||
"telegramTemplateFormatDescription": "Telegram, mesajlar için farklı işaretleme dillerinin kullanılmasına izin verir, ayrıntılar için Telegram {0} bölümüne bakın.",
|
||||
"templateServiceName": "servis adı",
|
||||
"telegramServerUrlDescription": "Telegram'ın bot API sınırlamalarını kaldırmak veya engellenen alanlarda (Çin, İran vb.) erişim sağlamak için. Daha fazla bilgi için tıklayın {0}. Varsayılan: {1}",
|
||||
"wahaSession": "Oturum",
|
||||
"wahaChatId": "Sohbet Kimliği (Telefon Numarası / Kişi Kimliği / Grup Kimliği)",
|
||||
"wayToGetWahaApiUrl": "WAHA Örnek URL'niz.",
|
||||
"wayToGetWahaApiKey": "API Anahtarı, WAHA'yı çalıştırmak için kullandığınız WHATSAPP_API_KEY ortam değişkeni değeridir.",
|
||||
"wayToGetWahaSession": "Bu oturumdan itibaren WAHA, Chat ID'ye bildirimler gönderir. Bunu WAHA Dashboard'da bulabilirsiniz.",
|
||||
"wayToWriteWahaChatId": "Uluslararası ön eke sahip, ancak başında artı işareti olmayan telefon numarası ({0}), Kişi Kimliği ({1}) veya Grup Kimliği ({2}). Bildirimler WAHA Session'dan bu Sohbet Kimliğine gönderilir.",
|
||||
"Plain Text": "Düz Metin",
|
||||
"Message Template": "Mesaj Şablonu",
|
||||
"Template Format": "Şablon Biçimi",
|
||||
"YZJ Webhook URL": "YZJ Webhook URL'si",
|
||||
"YZJ Robot Token": "YZJ Robot tokeni",
|
||||
"telegramServerUrl": "(İsteğe bağlı) Sunucu URL'si"
|
||||
}
|
||||
|
|
|
@ -54,7 +54,7 @@
|
|||
"Keyword": "Ключове слово",
|
||||
"Friendly Name": "Ім'я",
|
||||
"URL": "URL",
|
||||
"Hostname": "Адреса хоста",
|
||||
"Hostname": "Адреса хосту",
|
||||
"Port": "Порт",
|
||||
"Heartbeat Interval": "Частота опитування",
|
||||
"Retries": "Спроб",
|
||||
|
@ -951,7 +951,7 @@
|
|||
"cellsyntDestination": "Номер телефону одержувача в міжнародному форматі з 00 на початку, за яким слідує код країни, наприклад, 00447920110000 для британського номера 07920 110 000 (максимум 17 цифр). Максимум 25000 одержувачів, розділених комами, на один HTTP-запит.",
|
||||
"max 11 alphanumeric characters": "максимум 11 буквено-цифрових символів",
|
||||
"locally configured mail transfer agent": "локально налаштований агент пересилання пошти",
|
||||
"Either enter the hostname of the server you want to connect to or localhost if you intend to use a locally configured mail transfer agent": "Або введіть ім'я хоста сервера, до якого ви хочете підключитися, або {localhost}, якщо ви маєте намір використовувати {local_mta}",
|
||||
"Either enter the hostname of the server you want to connect to or localhost if you intend to use a locally configured mail transfer agent": "Або введіть ім'я хосту сервера, до якого ви хочете підключитися, або {localhost}, якщо ви маєте намір використовувати {local_mta}",
|
||||
"Don't mention people": "Не згадувати людей",
|
||||
"Mentioning": "Згадування",
|
||||
"Mention group": "Згадати {group}",
|
||||
|
@ -1104,5 +1104,25 @@
|
|||
"rabbitmqNodesDescription": "Введіть URL-адресу для вузлів керування RabbitMQ, включаючи протокол і порт. Приклад: {0}",
|
||||
"rabbitmqNodesInvalid": "Будь ласка, використовуйте повну URL-адресу (починаючи з 'http') для вузлів RabbitMQ.",
|
||||
"rabbitmqHelpText": "Щоб використовувати монітор, вам потрібно увімкнути плагін керування у налаштуваннях RabbitMQ. Для отримання додаткової інформації, будь ласка, зверніться до {rabitmq_documentation}.",
|
||||
"aboutSlackUsername": "Змінює відображуване ім'я відправника повідомлення. Якщо ви хочете згадати когось, додайте його до дружнього імені."
|
||||
"aboutSlackUsername": "Змінює відображуване ім'я відправника повідомлення. Якщо ви хочете згадати когось, додайте його до дружнього імені.",
|
||||
"templateServiceName": "назва сервісу",
|
||||
"templateHostnameOrURL": "ім'я хосту або URL",
|
||||
"telegramUseTemplate": "Використовувати власний шаблон повідомлення",
|
||||
"telegramUseTemplateDescription": "Якщо увімкнено, повідомлення буде надіслано з використанням спеціального шаблону.",
|
||||
"telegramTemplateFormatDescription": "Telegram дозволяє використовувати різні мови розмітки для повідомлень, див. Telegram {0} для більш детальної інформації.",
|
||||
"Plain Text": "Звичайний текст",
|
||||
"templateStatus": "статус",
|
||||
"Message Template": "Шаблон повідомлення",
|
||||
"Template Format": "Формат шаблону",
|
||||
"YZJ Webhook URL": "URL вебхука YZJ",
|
||||
"YZJ Robot Token": "Токен YZJ Robot",
|
||||
"wayToGetWahaApiUrl": "URL вашого екземпляра WAHA.",
|
||||
"wayToGetWahaApiKey": "Ключ API - це значення змінної оточення WHATSAPP_API_KEY, яку ви використовували для запуску WAHA.",
|
||||
"wahaSession": "Сесія",
|
||||
"wahaChatId": "ID чату (номер телефону / ID контакту / ID групи)",
|
||||
"wayToGetWahaSession": "З цієї сесії WAHA надсилає сповіщення на ID чату. Ви можете знайти його в інформаційній панелі WAHA.",
|
||||
"wayToWriteWahaChatId": "Номер телефону з міжнародним префіксом, але без знака плюс на початку ({0}), ID контакту ({1}) або ID групи ({2}). На цей ID чату надсилаються сповіщення з сеансу WAHA.",
|
||||
"telegramServerUrl": "(Необов'язково) URL сервера",
|
||||
"telegramServerUrlDescription": "Щоб зняти обмеження з Telegram bot api або отримати доступ у заблокованих регіонах (Китай, Іран тощо). Для отримання додаткової інформації натисніть {0}. За замовчуванням: {1}",
|
||||
"Font Twemoji by Twitter licensed under": "Шрифт Twemoji від Twitter ліцензований під"
|
||||
}
|
||||
|
|
|
@ -1100,5 +1100,25 @@
|
|||
"RabbitMQ Nodes": "RabbitMQ 管理节点",
|
||||
"Separate multiple email addresses with commas": "用逗号分隔多个电子邮件地址",
|
||||
"rabbitmqHelpText": "要使用此监控项,您需要在 RabbitMQ 设置中启用管理插件。有关更多信息,请参阅 {rabitmq_documentation}。",
|
||||
"aboutSlackUsername": "更改消息发件人的显示名称。如果您想提及某人,请另行将其包含在友好名称中。"
|
||||
"aboutSlackUsername": "更改消息发件人的显示名称。如果您想提及某人,请另行将其包含在友好名称中。",
|
||||
"templateStatus": "状态",
|
||||
"templateHostnameOrURL": "主机名或 URL",
|
||||
"templateServiceName": "服务名",
|
||||
"telegramUseTemplateDescription": "如果启用,该消息将使用自定义模板发送。",
|
||||
"telegramUseTemplate": "使用自定义消息模板",
|
||||
"wayToGetWahaSession": "在此会话中,WAHA 会向聊天 ID 发送通知。您可以在 WAHA 仪表板中找到它。",
|
||||
"wayToGetWahaApiUrl": "你的 WAHA 实例 URL。",
|
||||
"wahaChatId": "聊天 ID(电话号码 / 联系人 ID / 群组 ID)",
|
||||
"wahaSession": "会话",
|
||||
"Template Format": "模板格式",
|
||||
"Message Template": "消息模板",
|
||||
"Plain Text": "纯文本",
|
||||
"wayToWriteWahaChatId": "包含国际区号但不含开头加号({0})的电话号码、联系人 ID({1})、组 ID({2})。通知将从 WAHA 会话发送到此聊天 ID。",
|
||||
"wayToGetWahaApiKey": "API 密钥是你用于运行 WAHA 的 WHATSAPP_API_KEY 环境变量值。",
|
||||
"telegramTemplateFormatDescription": "Telegram 允许在消息中使用不同的标记语言,具体细节请参见 Telegram {0}。",
|
||||
"YZJ Webhook URL": "YZJ Webhook 地址",
|
||||
"YZJ Robot Token": "YZJ 机器人令牌",
|
||||
"telegramServerUrl": "(可选) 服务器 Url",
|
||||
"telegramServerUrlDescription": "用以解除 Telegram 的机器人 API 限制或在封锁区域(中国、伊朗等)获得访问权限。获取更多信息,请点击 {0}。默认值:{1}",
|
||||
"Font Twemoji by Twitter licensed under": "由 Twitter 制作的 Twemoji 字体根据此许可证授权"
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue