👉 Delete this line if you have read and agree our pull request rules and guidelines: https://github.com/louislam/uptime-kuma/blob/master/CONTRIBUTING.md#can-i-create-a-pull-request-for-uptime-kuma
@ -27,17 +27,30 @@ The frontend code build into "dist" directory. The server (express.js) exposes t
## Can I create a pull request for Uptime Kuma?
## Can I create a pull request for Uptime Kuma?
(Updated 2022-04-24) Since I don't want to waste your time, be sure to create empty draft pull request, so we can discuss first.
Yes, you can. However, since I don't want to waste your time, be sure to **create empty draft pull request, so we can discuss first** if it is a large pull request or you don't know it will be merged or not.
Also, please don't rush or ask for ETA, because I have to understand the pull request, make sure it is no breaking changes and stick to my vision of this project, especially for large pull requests.
I will mark your pull request in the [milestones](https://github.com/louislam/uptime-kuma/milestones), if I am plan to review and merge it.
✅ Accept:
✅ Accept:
- Bug/Security fix
- Bug/Security fix
- Translations
- Translations
- Adding notification providers
- Adding notification providers
⚠️ Discuss First
⚠️ Discussion First
- Large pull requests
- Large pull requests
- New features
- New features
❌ Won't Merge
- Do not pass auto test
- Any breaking changes
- Duplicated pull request
- Buggy
- Existing logic is completely modified or deleted for no reason
- A function that is completely out of scope
### Recommended Pull Request Guideline
### Recommended Pull Request Guideline
Before deep into coding, discussion first is preferred. Creating an empty pull request for discussion would be recommended.
Before deep into coding, discussion first is preferred. Creating an empty pull request for discussion would be recommended.
@ -53,22 +66,15 @@ Before deep into coding, discussion first is preferred. Creating an empty pull r
1. Click "Change to draft"
1. Click "Change to draft"
1. Discussion
1. Discussion
#### ❌ Won't Merge
- Any breaking changes
- Duplicated pull request
- Buggy
- Existing logic is completely modified or deleted
- A function that is completely out of scope
## Project Styles
## Project Styles
I personally do not like something need to learn so much and need to config so much before you can finally start the app.
I personally do not like something need to learn so much and need to config so much before you can finally start the app.
- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort to get it run
- Easy to install for non-Docker users, no native build dependency is needed (at least for x86_64), no extra config, no extra effort to get it run
- Single container for Docker users, no very complex docker-compose file. Just map the volume and expose the port, then good to go
- Single container for Docker users, no very complex docker-compose file. Just map the volume and expose the port, then good to go
- Settings should be configurable in the frontend. Env var is not encouraged.
- Settings should be configurable in the frontend. Environment variable is not encouraged, unless it is related to startup such as `DATA_DIR`.
- Easy to use
- Easy to use
- The web UI styling should be consistent and nice.
"Go back to the previous page.":"Да се върнете към предишната страница.",
"Go back to the previous page.":"Да се върнете към предишната страница.",
"Coming Soon":"Очаквайте скоро",
"Coming Soon":"Очаквайте скоро",
wayToGetClickSendSMSToken:"Може да получите API потребителско име и API ключ от {0} .",
wayToGetClickSendSMSToken:"Може да получите API потребителско име и API ключ от {0} .",
dnsPortDescription:"DNS порт на сървъра. По подразбиране е 53, но може да бъде променен по всяко време.",
error:"грешка",
critical:"критична",
wayToGetPagerDutyKey:"Може да го получите като посетите Service -> Service Directory -> (Select a service) -> Integrations -> Add integration. Тук може да потърсите \"Events API V2\". Повече информация {0}",
"Integration Key":"Ключ за интегриране",
"Integration URL":"URL адрес за интеграция",
"Auto resolve or acknowledged":"Автоматично разрешаване или потвърждаване",
"do nothing":"не прави нищо",
"auto acknowledged":"автоматично потвърждаване",
"auto resolve":"автоматично потвърждаване",
"Connection String":"Стринг за връзка",
Query:"Заявка",
settingsCertificateExpiry:"Изтичане валидността на TLS сертификата",
certificationExpiryDescription:"HTTPS мониторите задействат известие при изтичане на TLS сертификата в:",
supportTelegramChatID:"Direct Chat / Group / Channel's Chat ID를 지원해요.",
supportTelegramChatID:"개인 채팅 / 그룹 / 채널의 ID를 지원해요.",
wayToGetTelegramChatID:"봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
wayToGetTelegramChatID:"봇에 메시지를 보내 채팅 ID를 얻고 밑에 URL로 이동해 chat_id를 볼 수 있어요.",
"YOUR BOT TOKEN HERE":"여기에 BOT 토큰을 적어주세요.",
"YOUR BOT TOKEN HERE":"봇 토큰",
chatIDNotFound:"채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
chatIDNotFound:"채팅 ID를 찾을 수 없어요. 먼저 봇에게 메시지를 보내주세요.",
webhook:"Webhook",
webhook:"Webhook",
"Post URL":"Post URL",
"Post URL":"Post URL",
@ -305,13 +304,13 @@ export default {
PasswordsDoNotMatch:"비밀번호가 일치하지 않아요.",
PasswordsDoNotMatch:"비밀번호가 일치하지 않아요.",
records:"records",
records:"records",
"One record":"One record",
"One record":"One record",
steamApiKeyDescription:"스팀 게임 서버를 모니터링하려면 Steam Web API 키가 필요해요. API 키는 하단 사이트에서 등록할 수 있어요: ",
steamApiKeyDescription:"스팀 게임 서버를 모니터링하려면 Steam Web API 키가 필요해요. API 키는 하단 웹사이트에서 등록할 수 있어요: ",
"Current User":"현재 사용자",
"Current User":"현재 사용자",
recent:"최근",
recent:"최근",
Done:"완료",
Done:"완료",
Info:"정보",
Info:"정보",
Security:"보안",
Security:"보안",
"Steam API Key":"Steam API Key",
"Steam API Key":"스팀 API 키",
"Shrink Database":"데이터베이스 축소",
"Shrink Database":"데이터베이스 축소",
"Pick a RR-Type...":"RR-Type을 골라주세요...",
"Pick a RR-Type...":"RR-Type을 골라주세요...",
"Pick Accepted Status Codes...":"상태 코드를 골라주세요...",
"Pick Accepted Status Codes...":"상태 코드를 골라주세요...",
@ -352,4 +351,177 @@ export default {
serwersmsPhoneNumber:"휴대전화 번호",
serwersmsPhoneNumber:"휴대전화 번호",
serwersmsSenderName:"보내는 사람 이름 (customer portal를 통해 가입된 정보)",
serwersmsSenderName:"보내는 사람 이름 (customer portal를 통해 가입된 정보)",
stackfield:"Stackfield",
stackfield:"Stackfield",
dnsPortDescription:"DNS 서버 포트, 기본값은 53 이에요. 포트는 언제나 변경할 수 있어요.",
PushByTechulus:"Push by Techulus",
GoogleChat:"Google Chat (Google Workspace only)",
topic:"Topic",
topicExplanation:"모니터링할 MQTT Topic",
successMessage:"성공 메시지",
successMessageExplanation:"성공으로 간주되는 MQTT 메시지",
error:"error",
critical:"critical",
Customize:"커스터마이즈",
"Custom Footer":"커스텀 Footer",
"Custom CSS":"커스텀 CSS",
smtpDkimSettings:"DKIM 설정",
smtpDkimDesc:"사용 방법은 DKIM {0}를 참조하세요.",
documentation:"문서",
smtpDkimDomain:"도메인 이름",
smtpDkimKeySelector:"Key Selector",
smtpDkimPrivateKey:"Private Key",
smtpDkimHashAlgo:"해시 알고리즘 (선택)",
smtpDkimheaderFieldNames:"서명할 헤더 키 (선택)",
smtpDkimskipFields:"서명하지 않을 헤더 키 (선택)",
wayToGetPagerDutyKey:"Service -> Service Directory -> (서비스 선택) -> Integrations -> Add integration. 에서 찾을 수 있어요. 자세히 알아보려면 {0}에서 \"Events API V2\"를 검색해봐요.",
"Integration Key":"Integration 키",
"Integration URL":"Integration URL",
"Auto resolve or acknowledged":"자동 해결 혹은 승인",
"do nothing":"아무것도 하지 않기",
"auto acknowledged":"자동 승인 (acknowledged)",
"auto resolve":"자동 해결 (resolve)",
gorush:"Gorush",
alerta:"Alerta",
alertaApiEndpoint:"API Endpoint",
alertaEnvironment:"환경변수",
alertaApiKey:"API 키",
alertaAlertState:"경고 상태",
alertaRecoverState:"해결된 상태",
deleteStatusPageMsg:"정말 이 상태 페이지를 삭제할까요?",
Proxies:"프록시",
default:"Default",
enabled:"활성화",
setAsDefault:"기본 프록시로 설정",
deleteProxyMsg:"정말 이 프록시를 모든 모니터링에서 삭제할까요?",
proxyDescription:"프록시가 작동하려면 모니터에 할당되어야 해요.",
enableProxyDescription:"이 프록시는 활성화될 때까지 영향을 미치지 않아요. 활성화 상태에 따라 모든 모니터에서 프록시를 일시정지할 수 있어요.",
setAsDefaultProxyDescription:"새로 추가하는 모든 모니터링에 이 프록시를 기본적으로 활성화해요. 각 모니터에 대해 별도로 프록시를 비활성화할 수 있어요.",
"Certificate Chain":"인증서 체인",
Valid:"유효",
Invalid:"유효하지 않음",
AccessKeyId:"AccessKey ID",
SecretAccessKey:"AccessKey Secret",
PhoneNumbers:"휴대전화 번호",
TemplateCode:"템플릿 코드",
SignName:"SignName",
"Sms template must contain parameters: ":"Sms 템플릿은 다음과 같은 파라미터가 포함되어야 해요:",
"Bark Endpoint":"Bark Endpoint",
WebHookUrl:"웹훅 URL",
SecretKey:"Secret Key",
"For safety, must use secret key":"안전을 위해 꼭 Secret Key를 사용하세요.",
"Device Token":"기기 Token",
Platform:"플랫폼",
iOS:"iOS",
Android:"Android",
Huawei:"Huawei",
High:"High",
Retry:"재시도",
Topic:"Topic",
"WeCom Bot Key":"WeCom Bot Key",
"Setup Proxy":"프록시 설정",
"Proxy Protocol":"프록시 프로토콜",
"Proxy Server":"프록시 서버",
"Proxy server has authentication":"프록시 서버에 인증 절차가 있음",
User:"사용자",
Installed:"설치됨",
"Not installed":"설치되어 있지 않음",
Running:"작동 중",
"Not running":"작동하고 있지 않음",
"Remove Token":"토큰 삭제",
Start:"시작",
Stop:"정지",
"Uptime Kuma":"Uptime Kuma",
"Add New Status Page":"새로운 상태 페이지 만들기",
Slug:"주소",
"Accept characters:":"허용되는 문자열:",
startOrEndWithOnly:"{0}로 시작하거나 끝나야 해요.",
"No consecutive dashes":"연속되는 대시는 허용되지 않아요",
Next:"다음",
"The slug is already taken. Please choose another slug.":"이미 존재하는 주소에요. 다른 주소를 사용해 주세요.",
"No Proxy":"프록시 없음",
"HTTP Basic Auth":"HTTP 인증",
"New Status Page":"새로운 상태 페이지",
"Page Not Found":"페이지를 찾을 수 없어요",
"Reverse Proxy":"리버스 프록시",
Backup:"백업",
About:"정보",
wayToGetCloudflaredURL:"({0}에서 Cloudflare 다운로드 하기)",
cloudflareWebsite:"Cloudflare 웹사이트",
"Message:":"메시지:",
"Don't know how to get the token? Please read the guide:":"토큰을 얻는 방법은 이 가이드를 확인해주세요:",
"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.":"Cloudflare Tunnel를 연결하면 현재 연결이 끊길 수 있어요. 정말 중지할까요? 비밀번호를 입력해 확인하세요.",
"Other Software":"다른 소프트웨어",
"For example: nginx, Apache and Traefik.":"nginx, Apache, Traefik 등을 사용할 수 있어요.",
"Please read":"이 문서를 참조하세요:",
"Subject:":"Subject:",
"Valid To:":"Valid To:",
"Days Remaining:":"남은 일수:",
"Issuer:":"Issuer:",
"Fingerprint:":"Fingerprint:",
"No status pages":"상태 페이지 없음",
"Domain Name Expiry Notification":"도메인 이름 만료 알림",
Proxy:"프록시",
"Date Created":"생성된 날짜",
onebotHttpAddress:"OneBot HTTP 주소",
onebotMessageType:"OneBot 메시지 종류",
onebotGroupMessage:"그룹 메시지",
onebotPrivateMessage:"개인 메시지",
onebotUserOrGroupId:"그룹/사용자 ID",
onebotSafetyTips:"안전을 위해 Access 토큰을 설정하세요.",
"PushDeer Key":"PushDeer 키",
"Footer Text":"Footer 문구",
"Show Powered By":"Powered By 문구 표시하기",
"Domain Names":"도메인 이름",
signedInDisp:"{0} 로그인됨",
signedInDispDisabled:"인증 비활성화됨.",
"Certificate Expiry Notification":"인증서 만료 알림",
"API Username":"API 사용자 이름",
"API Key":"API 키",
"Recipient Number":"받는 사람 번호",
"From Name/Number":"발신자 이름/번호",
"Leave blank to use a shared sender number.":"공유 발신자 번호를 사용하려면 공백으로 두세요.",
"Octopush API Version":"Octopush API 버전",
"Legacy Octopush-DM":"레거시 Octopush-DM",
endpoint:"endpoint",
octopushAPIKey:"제어판 HTTP API credentials 에서 \"API key\"",
octopushLogin:"제어판 HTTP API credentials 에서 \"Login\"",
promosmsLogin:"API 로그인 이름",
promosmsPassword:"API 비밀번호",
"pushoversounds pushover":"Pushover (기본)",
"pushoversounds bike":"Bike",
"pushoversounds bugle":"Bugle",
"pushoversounds cashregister":"Cash Register",
"pushoversounds classical":"Classical",
"pushoversounds cosmic":"Cosmic",
"pushoversounds falling":"Falling",
"pushoversounds gamelan":"Gamelan",
"pushoversounds incoming":"Incoming",
"pushoversounds intermission":"Intermission",
"pushoversounds magic":"Magic",
"pushoversounds mechanical":"Mechanical",
"pushoversounds pianobar":"Piano Bar",
"pushoversounds siren":"Siren",
"pushoversounds spacealarm":"Space Alarm",
"pushoversounds tugboat":"Tug Boat",
"pushoversounds alien":"Alien Alarm (long)",
"pushoversounds climb":"Climb (long)",
"pushoversounds persistent":"Persistent (long)",
"pushoversounds echo":"Pushover Echo (long)",
"pushoversounds updown":"Up Down (long)",
"pushoversounds vibrate":"진동만",
"pushoversounds none":"없음 (무음)",
pushyAPIKey:"비밀 API 키",
pushyToken:"기기 토큰",
"Show update if available":"사용 가능한 경우에 업데이트 표시",
"Also check beta release":"베타 릴리즈 확인",
"Using a Reverse Proxy?":"리버스 프록시를 사용하시나요?",
"Check how to config it for WebSocket":"웹소켓에 대한 설정 방법 확인",
"Steam Game Server":"스팀 게임 서버",
"Most likely causes:":"원인:",
"The resource is no longer available.":"더이상 사용할 수 없어요.",
"There might be a typing error in the address.":"주소에 오탈자가 있을 수 있어요.",
"What you can try:":"해결 방법:",
"Retype the address.":"주소 다시 입력하기",
"Go back to the previous page.":"이전 페이지로 돌아가기",
"Coming Soon":"Coming Soon",
wayToGetClickSendSMSToken:"{0}에서 API 사용자 이름과 키를 얻을 수 있어요.",
"Go back to the previous page.":"Bir önceki sayfaya geri git.",
"Go back to the previous page.":"Bir önceki sayfaya geri git.",
"Coming Soon":"Yakında gelecek",
"Coming Soon":"Yakında gelecek",
wayToGetClickSendSMSToken:"API Kullanıcı Adı ve API Anahtarını {0} adresinden alabilirsiniz.",
wayToGetClickSendSMSToken:"API Kullanıcı Adı ve API Anahtarını {0} adresinden alabilirsiniz.",
error:"hata",
critical:"kritik",
wayToGetPagerDutyKey:"Bunu şuraya giderek alabilirsiniz: Servis -> Servis Dizini -> (Bir servis seçin) -> Entegrasyonlar -> Entegrasyon ekle. Burada \"Events API V2\" için arama yapabilirsiniz. Daha fazla bilgi {0}",
"Integration Key":"Entegrasyon Anahtarı",
"Integration URL":"Entegrasyon URL",
"Auto resolve or acknowledged":"Otomatik çözümleme veya onaylama",