Merge remote-tracking branch 'origin/master' into squadcast-notification-support

# Conflicts:
#	src/languages/en.js
This commit is contained in:
Louis Lam 2022-10-03 16:16:50 +08:00
commit 3e85893bdd
10 changed files with 92 additions and 36 deletions

View file

@ -27,7 +27,7 @@ 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?
Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create empty draft pull request or open an issue, so we can discuss first**. Especially for a large pull request or you don't know it will be merged or not. Yes or no, it depends on what you will try to do. Since I don't want to waste your time, be sure to **create an empty draft pull request or open an issue, so we can discuss first**. Especially for a large pull request or you don't know it will be merged or not.
Here are some references: Here are some references:
@ -48,7 +48,7 @@ Here are some references:
- UI/UX is not close to Uptime Kuma - UI/UX is not close to Uptime Kuma
- Existing logic is completely modified or deleted for no reason - Existing logic is completely modified or deleted for no reason
- A function that is completely out of scope - A function that is completely out of scope
- Unnesscary large code changes (Hard to review, casuse code conflicts to other pull requests) - Unnecessary large code changes (Hard to review, causes code conflicts to other 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. 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.
@ -183,7 +183,7 @@ By default, the Chromium window will be shown up during the test. Specifying `HE
## Dependencies ## Dependencies
Both frontend and backend share the same package.json. However, the frontend dependencies are eventually not be used in 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" - Frontend dependencies = "devDependencies"
- Examples: vue, chart.js - Examples: vue, chart.js

View file

@ -8,12 +8,19 @@ class Ntfy extends NotificationProvider {
async send(notification, msg, monitorJSON = null, heartbeatJSON = null) { async send(notification, msg, monitorJSON = null, heartbeatJSON = null) {
let okMsg = "Sent Successfully."; let okMsg = "Sent Successfully.";
try { try {
await axios.post(`${notification.ntfyserverurl}`, { let headers = {};
if (notification.ntfyusername.length > 0) {
headers = {
"Authorization": "Basic " + Buffer.from(notification.ntfyusername + ":" + notification.ntfypassword).toString("base64"),
};
}
let data = {
"topic": notification.ntfytopic, "topic": notification.ntfytopic,
"message": msg, "message": msg,
"priority": notification.ntfyPriority || 4, "priority": notification.ntfyPriority || 4,
"title": "Uptime-Kuma", "title": "Uptime-Kuma",
}); };
await axios.post(`${notification.ntfyserverurl}`, data, { headers: headers });
return okMsg; return okMsg;

View file

@ -10,7 +10,7 @@ class Octopush extends NotificationProvider {
try { try {
// Default - V2 // Default - V2
if (notification.octopushVersion === 2 || !notification.octopushVersion) { if (notification.octopushVersion === "2" || !notification.octopushVersion) {
let config = { let config = {
headers: { headers: {
"api-key": notification.octopushAPIKey, "api-key": notification.octopushAPIKey,
@ -31,7 +31,7 @@ class Octopush extends NotificationProvider {
"sender": notification.octopushSenderName "sender": notification.octopushSenderName
}; };
await axios.post("https://api.octopush.com/v1/public/sms-campaign/send", data, config); await axios.post("https://api.octopush.com/v1/public/sms-campaign/send", data, config);
} else if (notification.octopushVersion === 1) { } else if (notification.octopushVersion === "1") {
let data = { let data = {
"user_login": notification.octopushDMLogin, "user_login": notification.octopushDMLogin,
"api_key": notification.octopushDMAPIKey, "api_key": notification.octopushDMAPIKey,
@ -49,7 +49,15 @@ class Octopush extends NotificationProvider {
}, },
params: data params: data
}; };
await axios.post("https://www.octopush-dm.com/api/sms/json", {}, config);
// V1 API returns 200 even on error so we must check
// response data
let response = await axios.post("https://www.octopush-dm.com/api/sms/json", {}, config);
if ("error_code" in response.data) {
if (response.data.error_code !== "000") {
this.throwGeneralAxiosError(`Octopush error ${JSON.stringify(response.data)}`);
}
}
} else { } else {
throw new Error("Unknown Octopush version!"); throw new Error("Unknown Octopush version!");
} }

View file

@ -63,7 +63,7 @@ class Teams extends NotificationProvider {
}); });
} }
if (monitorUrl) { if (monitorUrl && monitorUrl !== "https://") {
facts.push({ facts.push({
name: "URL", name: "URL",
value: monitorUrl, value: monitorUrl,
@ -127,13 +127,17 @@ class Teams extends NotificationProvider {
let url; let url;
if (monitorJSON["type"] === "port") { switch (monitorJSON["type"]) {
url = monitorJSON["hostname"]; case "http":
if (monitorJSON["port"]) { case "keywork":
url += ":" + monitorJSON["port"]; url = monitorJSON["url"];
} break;
} else { case "docker":
url = monitorJSON["url"]; url = monitorJSON["docker_host"];
break;
default:
url = monitorJSON["hostname"];
break;
} }
const payload = this._notificationPayloadFactory({ const payload = this._notificationPayloadFactory({

View file

@ -11,15 +11,31 @@
<input id="ntfy-server-url" v-model="$parent.notification.ntfyserverurl" type="text" class="form-control" required> <input id="ntfy-server-url" v-model="$parent.notification.ntfyserverurl" type="text" class="form-control" required>
</div> </div>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="ntfy-priority" class="form-label">{{ $t("Priority") }}</label> <label for="ntfy-priority" class="form-label">{{ $t("Priority") }}</label>
<input id="ntfy-priority" v-model="$parent.notification.ntfyPriority" type="number" class="form-control" required min="1" max="5" step="1"> <input id="ntfy-priority" v-model="$parent.notification.ntfyPriority" type="number" class="form-control" required min="1" max="5" step="1">
</div> </div>
<div class="mb-3">
<label for="ntfy-username" class="form-label">{{ $t("Username") }} ({{ $t("Optional") }})</label>
<div class="input-group mb-3">
<input id="ntfy-username" v-model="$parent.notification.ntfyusername" type="text" class="form-control" required>
</div>
</div>
<div class="mb-3">
<label for="ntfy-password" class="form-label">{{ $t("Password") }} ({{ $t("Optional") }})</label>
<div class="input-group mb-3">
<HiddenInput id="ntfy-password" v-model="$parent.notification.ntfypassword" autocomplete="new-password"></HiddenInput>
</div>
</div>
</template> </template>
<script> <script>
import HiddenInput from "../HiddenInput.vue";
export default { export default {
components: {
HiddenInput,
},
mounted() { mounted() {
if (typeof this.$parent.notification.ntfyPriority === "undefined") { if (typeof this.$parent.notification.ntfyPriority === "undefined") {
this.$parent.notification.ntfyserverurl = "https://ntfy.sh"; this.$parent.notification.ntfyserverurl = "https://ntfy.sh";

View file

@ -562,4 +562,24 @@ export default {
"Docker Host": "Docker хост", "Docker Host": "Docker хост",
"Docker Hosts": "Docker хостове", "Docker Hosts": "Docker хостове",
trustProxyDescription: "Trust 'X-Forwarded-*' headers. Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.", trustProxyDescription: "Trust 'X-Forwarded-*' headers. Ако искате да получавате правилния IP адрес на клиента, а Uptime Kuma е зад системи като Nginx или Apache, трябва да разрешите тази опция.",
Examples: "Примери",
"Home Assistant URL": "Home Assistant URL адрес",
"Long-Lived Access Token": "Long-Lived Access Token",
"Long-Lived Access Token can be created by clicking on your profile name (bottom left) and scrolling to the bottom then click Create Token. ": "Long-Lived Access Token можете да създадете, като кликнете върху името на профила си (долу ляво) и превъртите до най-долу, след това кликнете върху Създаване на токен. ",
"Notification Service": "Услуга за известяване",
"default: notify all devices": "по подразбиране: извести всички устройства",
"A list of Notification Services can be found in Home Assistant under \"Developer Tools > Services\" search for \"notification\" to find your device/phone name.": "Списък с услугите за известяване може да бъде намерен в Home Assistant под \"Developer Tools > Services\", там потърсете \"notification\", за да намерите името на вашето устройство/телефон.",
"Automations can optionally be triggered in Home Assistant:": "Автоматизациите могат да се задействат при нужда в Home Assistant:",
"Trigger type:": "Задействане тип:",
"Event type:": "Събитие тип:",
"Event data:": "Събитие данни:",
"Then choose an action, for example switch the scene to where an RGB light is red.": "След което изберете действие, например да превключите сцената, където RGB светлината е червена.",
"Frontend Version": "Фронтенд версия",
"Frontend Version do not match backend version!": "Фронтенд версията не съвпада с Бекенд версията!",
"Base URL": "Базов URL адрес",
goAlertInfo: "GoAlert е приложение с отворен код за планиране на повиквания, автоматизирани ескалации и известия (като SMS или гласови повиквания). Автоматично ангажирайте точния човек, по точния начин и в точното време! {0}",
goAlertIntegrationKeyInfo: "Вземете общ API интеграционен ключ за услугата във формат \"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\" обикновено стойността на параметъра token на копирания URL адрес.",
goAlert: "GoAlert",
backupOutdatedWarning: "Отпаднало: Тъй като са добавени много функции, тази опция за архивиране не е достатъчно поддържана и не може да генерира или възстанови пълен архив.",
backupRecommend: "Моля, архивирайте дяла или папката (./data/) директно вместо това.",
}; };

View file

@ -68,7 +68,7 @@ export default {
Timezone: "Zeitzone", Timezone: "Zeitzone",
"Search Engine Visibility": "Sichtbarkeit für Suchmaschinen", "Search Engine Visibility": "Sichtbarkeit für Suchmaschinen",
"Allow indexing": "Indizierung zulassen", "Allow indexing": "Indizierung zulassen",
"Discourage search engines from indexing site": "Halte Suchmaschinen von der Indexierung der Seite ab", "Discourage search engines from indexing site": "Suchmaschinen darum bitten, die Seite nicht zu indizieren",
"Change Password": "Passwort ändern", "Change Password": "Passwort ändern",
"Current Password": "Aktuelles Passwort", "Current Password": "Aktuelles Passwort",
"New Password": "Neues Passwort", "New Password": "Neues Passwort",
@ -78,7 +78,7 @@ export default {
"Disable Auth": "Authentifizierung deaktivieren", "Disable Auth": "Authentifizierung deaktivieren",
"Enable Auth": "Authentifizierung aktivieren", "Enable Auth": "Authentifizierung aktivieren",
"disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?", "disableauth.message1": "Bist du sicher das du die <strong>Authentifizierung deaktivieren</strong> möchtest?",
"disableauth.message2": "Es ist für <strong>jemanden der eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access.", "disableauth.message2": "Dies ist für Szenarien gedacht, <strong>in denen man eine externe Authentifizierung</strong> vor Uptime Kuma geschaltet hat, wie z.B. Cloudflare Access, Authelia oder andere Authentifizierungsmechanismen.",
"Please use this option carefully!": "Bitte mit Vorsicht nutzen.", "Please use this option carefully!": "Bitte mit Vorsicht nutzen.",
Logout: "Ausloggen", Logout: "Ausloggen",
notificationDescription: "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.", notificationDescription: "Benachrichtigungen müssen einem Monitor zugewiesen werden, damit diese funktionieren.",
@ -559,7 +559,7 @@ export default {
"ntfy Topic": "ntfy Thema", "ntfy Topic": "ntfy Thema",
Domain: "Domain", Domain: "Domain",
Workstation: "Workstation", Workstation: "Workstation",
disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren modus, ein Passwort wird nicht benötigt.", disableCloudflaredNoAuthMsg: "Du bist im nicht-authentifizieren Modus, ein Passwort wird nicht benötigt.",
trustProxyDescription: "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.", trustProxyDescription: "Vertraue 'X-Forwarded-*' headern. Wenn man die richtige client IP haben möchte und Uptime Kuma hinter einem Proxy wie Nginx or Apache läuft, wollte dies aktiviert werden.",
wayToGetLineNotifyToken: "Du kannst hier ein Token erhalten: {0}", wayToGetLineNotifyToken: "Du kannst hier ein Token erhalten: {0}",
Examples: "Beispiele", Examples: "Beispiele",

View file

@ -582,5 +582,6 @@ export default {
goAlert: "GoAlert", goAlert: "GoAlert",
backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.", backupOutdatedWarning: "Deprecated: Since a lot of features added and this backup feature is a bit unmaintained, it cannot generate or restore a complete backup.",
backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.", backupRecommend: "Please backup the volume or the data folder (./data/) directly instead.",
"Optional": "Optional",
squadcast: "Squadcast", squadcast: "Squadcast",
}; };

View file

@ -130,7 +130,7 @@ export default {
"Repeat Password": "Ulangi Sandi", "Repeat Password": "Ulangi Sandi",
"Import Backup": "Impor Cadangan", "Import Backup": "Impor Cadangan",
"Export Backup": "Expor Cadangan", "Export Backup": "Expor Cadangan",
Export: "Expor", Export: "Ekspor",
Import: "Impor", Import: "Impor",
respTime: "Tanggapan. Waktu (milidetik)", respTime: "Tanggapan. Waktu (milidetik)",
notAvailableShort: "N/A", notAvailableShort: "N/A",
@ -192,7 +192,7 @@ export default {
"Status Pages": "Halaman Status", "Status Pages": "Halaman Status",
defaultNotificationName: "{notification} saya Peringatan ({number})", defaultNotificationName: "{notification} saya Peringatan ({number})",
here: "di sini", here: "di sini",
Required: "Dibutuhkan", Required: "Wajib",
telegram: "Telegram", telegram: "Telegram",
"Bot Token": "Bot Token", "Bot Token": "Bot Token",
wayToGetTelegramToken: "Anda dapat mendapatkan token dari {0}.", wayToGetTelegramToken: "Anda dapat mendapatkan token dari {0}.",
@ -210,9 +210,9 @@ export default {
secureOptionNone: "None / STARTTLS (25, 587)", secureOptionNone: "None / STARTTLS (25, 587)",
secureOptionTLS: "TLS (465)", secureOptionTLS: "TLS (465)",
"Ignore TLS Error": "Abaikan Kesalahan TLS", "Ignore TLS Error": "Abaikan Kesalahan TLS",
"From Email": "Dari Surel", "From Email": "Dari Email",
emailCustomSubject: "Subjek", emailCustomSubject: "Subjek",
"To Email": "Ke Surel", "To Email": "Ke Email",
smtpCC: "CC", smtpCC: "CC",
smtpBCC: "BCC", smtpBCC: "BCC",
discord: "Discord", discord: "Discord",
@ -232,7 +232,7 @@ export default {
signalImportant: "PENTING: Anda tidak dapat mencampur grup dan nomor di penerima!", signalImportant: "PENTING: Anda tidak dapat mencampur grup dan nomor di penerima!",
gotify: "Gotify", gotify: "Gotify",
"Application Token": "Token Aplikasi", "Application Token": "Token Aplikasi",
"Server URL": "URL Peladen", "Server URL": "URL Server",
Priority: "Prioritas", Priority: "Prioritas",
slack: "Slack", slack: "Slack",
"Icon Emoji": "Ikon Emoji", "Icon Emoji": "Ikon Emoji",
@ -274,9 +274,9 @@ export default {
"LunaSea Device ID": "LunaSea Device ID", "LunaSea Device ID": "LunaSea Device ID",
"Apprise URL": "Apprise URL", "Apprise URL": "Apprise URL",
"Example:": "Contoh: {0}", "Example:": "Contoh: {0}",
"Read more:": "Baca lebih lajut: {0}", "Read more:": "Baca lebih lanjut: {0}",
"Status:": "Status: {0}", "Status:": "Status: {0}",
"Read more": "Baca lebih lajut", "Read more": "Baca lebih lanjut",
appriseInstalled: "Apprise diinstall.", appriseInstalled: "Apprise diinstall.",
appriseNotInstalled: "Apprise tidak diinstall. {0}", appriseNotInstalled: "Apprise tidak diinstall. {0}",
"Access Token": "Token Akses", "Access Token": "Token Akses",
@ -310,7 +310,7 @@ export default {
BodyInvalidFormat: "Request Body memiliki format JSON yang tidak sesuai: ", BodyInvalidFormat: "Request Body memiliki format JSON yang tidak sesuai: ",
"Monitor History": "Riyawat Monitor", "Monitor History": "Riyawat Monitor",
clearDataOlderThan: "Simpan data riwayat monitoring selama {0} hari.", clearDataOlderThan: "Simpan data riwayat monitoring selama {0} hari.",
PasswordsDoNotMatch: "Passwords tidak sama.", PasswordsDoNotMatch: "Password tidak sama.",
records: "catatan", records: "catatan",
"One record": "Satu catatan", "One record": "Satu catatan",
steamApiKeyDescription: "Untuk monitoring Steam Game Server Anda membutuhkan kunci Steam Web-API. Anda dapat mendaftarkan Kunci API Anda melalui: ", steamApiKeyDescription: "Untuk monitoring Steam Game Server Anda membutuhkan kunci Steam Web-API. Anda dapat mendaftarkan Kunci API Anda melalui: ",
@ -322,7 +322,7 @@ export default {
recent: "Baru saja", recent: "Baru saja",
Done: "Selesai", Done: "Selesai",
Info: "Info", Info: "Info",
Security: "Keamaan", Security: "Keamanan",
"Steam API Key": "Steam API Key", "Steam API Key": "Steam API Key",
"Shrink Database": "Shrink Database", "Shrink Database": "Shrink Database",
"Pick a RR-Type...": "Pilih RR-Type...", "Pick a RR-Type...": "Pilih RR-Type...",
@ -393,7 +393,7 @@ export default {
alertaAlertState: "Status Siaga", alertaAlertState: "Status Siaga",
alertaRecoverState: "Status Pemulihan", alertaRecoverState: "Status Pemulihan",
deleteStatusPageMsg: "Apakah Anda yakin untuk menghapus halaman status berikut?", deleteStatusPageMsg: "Apakah Anda yakin untuk menghapus halaman status berikut?",
Proxies: "Proxies", Proxies: "Proxy",
default: "Bawaan", default: "Bawaan",
enabled: "Diaktifkan", enabled: "Diaktifkan",
setAsDefault: "Tetapkan sebagai bawaan", setAsDefault: "Tetapkan sebagai bawaan",
@ -403,7 +403,7 @@ export default {
setAsDefaultProxyDescription: "Proxy berikut akan diaktifkan sebagai bawaan untuk monitor baru. Anda masih dapat menonaktifkan proxy secara terpisah untuk setiap monitor.", setAsDefaultProxyDescription: "Proxy berikut akan diaktifkan sebagai bawaan untuk monitor baru. Anda masih dapat menonaktifkan proxy secara terpisah untuk setiap monitor.",
"Certificate Chain": "Certificate Chain", "Certificate Chain": "Certificate Chain",
Valid: "Sahih", Valid: "Sahih",
Invalid: "Tidak Sahih", Invalid: "Tidak Valid",
AccessKeyId: "AccessKey ID", AccessKeyId: "AccessKey ID",
SecretAccessKey: "AccessKey Secret", SecretAccessKey: "AccessKey Secret",
PhoneNumbers: "Nomor Telepon", PhoneNumbers: "Nomor Telepon",
@ -433,7 +433,7 @@ export default {
Installed: "Terpasang", Installed: "Terpasang",
"Not installed": "Tidak terpasang", "Not installed": "Tidak terpasang",
Running: "Berlari", Running: "Berlari",
"Not running": "Tidak berlari", "Not running": "Tidak berjalan",
"Remove Token": "Hapus Token", "Remove Token": "Hapus Token",
Start: "Mulai", Start: "Mulai",
Stop: "Berhenti", Stop: "Berhenti",
@ -444,7 +444,7 @@ export default {
startOrEndWithOnly: "Mulai atau akhiri hanya dengan {0}", startOrEndWithOnly: "Mulai atau akhiri hanya dengan {0}",
"No consecutive dashes": "Tanda hubung tidak berurutan", "No consecutive dashes": "Tanda hubung tidak berurutan",
Next: "Selanjutnya", Next: "Selanjutnya",
"The slug is already taken. Please choose another slug.": "Slug is telah digunakan. Silakan pilih slug lain.", "The slug is already taken. Please choose another slug.": "Slug telah digunakan. Silakan pilih slug lain.",
"No Proxy": "TIdak ada Proxy", "No Proxy": "TIdak ada Proxy",
Authentication: "Autentikasi", Authentication: "Autentikasi",
"HTTP Basic Auth": "HTTP Basic Auth", "HTTP Basic Auth": "HTTP Basic Auth",

View file

@ -224,7 +224,7 @@ export default {
teams: "Microsoft Teams", teams: "Microsoft Teams",
"Webhook URL": "Webhook URL", "Webhook URL": "Webhook URL",
wayToGetTeamsURL: "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.", wayToGetTeamsURL: "Bir webhook URL'sinin nasıl oluşturulacağını öğrenebilirsiniz {0}.",
signal: "Signal", signal: "Sinyal",
Number: "Numara", Number: "Numara",
Recipients: "Alıcılar", Recipients: "Alıcılar",
needSignalAPI: "REST API ile bir signal istemciniz olması gerekiyor.", needSignalAPI: "REST API ile bir signal istemciniz olması gerekiyor.",
@ -552,14 +552,14 @@ export default {
deleteDockerHostMsg: "Bu docker ana bilgisayarını tüm monitörler için silmek istediğinizden emin misiniz?", deleteDockerHostMsg: "Bu docker ana bilgisayarını tüm monitörler için silmek istediğinizden emin misiniz?",
socket: "Soket", socket: "Soket",
tcp: "TCP / HTTP", tcp: "TCP / HTTP",
"Docker Container": "Docker Konteyneri", "Docker Container": "Docker Konteyner",
"Container Name / ID": "Konteyner Adı / Kimliği", "Container Name / ID": "Konteyner Adı / Kimliği",
"Docker Host": "Docker Ana Bilgisayarı", "Docker Host": "Docker Ana Bilgisayarı",
"Docker Hosts": "Docker Ana Bilgisayarları", "Docker Hosts": "Docker Ana Bilgisayarları",
"ntfy Topic": "ntfy Konu", "ntfy Topic": "ntfy Konu",
Domain: "Domain", Domain: "Domain",
Workstation: "İş İstasyonu", Workstation: "İş İstasyonu",
disableCloudflaredNoAuthMsg: "Yetki Yok modundasınız, şifre gerekli değil.", disableCloudflaredNoAuthMsg: "Yetki yok modundasınız, şifre gerekli değil.",
trustProxyDescription: "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.", trustProxyDescription: "'X-Forwarded-*' başlıklarına güvenin. Doğru istemci IP'sini almak istiyorsanız ve Uptime Kuma'nız Nginx veya Apache'nin arkasındaysa, bunu etkinleştirmelisiniz.",
wayToGetLineNotifyToken: "{0} adresinden bir erişim jetonu alabilirsiniz.", wayToGetLineNotifyToken: "{0} adresinden bir erişim jetonu alabilirsiniz.",
Examples: "Örnekler", Examples: "Örnekler",