Browse Source

feat: indonesian translation

Sv443 1 month ago
parent
commit
eaa6ae5672
4 changed files with 659 additions and 200 deletions
  1. 168 124
      data/errorMessages.js
  2. 334 0
      data/jokes/jokes-id.json
  3. 148 76
      data/translations.json
  4. 9 0
      package.json

+ 168 - 124
data/errorMessages.js

@@ -6,297 +6,341 @@ module.exports = {
         "errorInternal": true,
         "errorMessage": {
             "en": "Internal Error in HTTP Server",
+            "cs": "Interní chyba v HTTP serveru",
             "de": "Interner Error im HTTP Server",
+            "it": "Errore interno al server HTTP",
             "ru": "Внутренняя ошибка в HTTP-сервере",
-            "cs": "Interní chyba v HTTP serveru",
-			"it": "Errore Interno al Server HTTP"
+            "id": "Kesalahan internal di server HTTP",
         },
         "causedBy": {
             "en": [
-                `An error in the code - please contact me through one of the options on my website (${settings.info.author.website}) with the additional info.`
+                `An error in the code - please contact me through one of the options on my website (${settings.info.author.website}) with the additional info.`,
+            ],
+            "cs": [
+                `Chyba v kódu - kontaktujte mě přes jedné z možností na mé webové stránce (${settings.info.author.website}) s dalšími informacemi.`,
             ],
             "de": [
-                `Ein Error im Quellcode - bitte kontaktiere mich durch eine der Möglichkeiten auf meiner Website (${settings.info.author.website}) mit den zusätzlichen Informationen.`
+                `Ein Error im Quellcode - bitte kontaktiere mich durch eine der Möglichkeiten auf meiner Website (${settings.info.author.website}) mit den zusätzlichen Informationen.`,
+            ],
+            "it": [
+                `Un errore nel codice - per favore contattami tramite una delle opzioni sul mio sito (${settings.info.author.website}) fornendo maggiori informazioni.`,
             ],
             "ru": [
-                `Ошибка в коде - пожалуйста, свяжитесь со мной через одну из опций на моем сайте (${settings.info.author.website}) с дополнительной информацией.`
+                `Ошибка в коде - пожалуйста, свяжитесь со мной через одну из опций на моем сайте (${settings.info.author.website}) с дополнительной информацией.`,
             ],
-            "cs": [
-                `Chyba v kódu - kontaktujte mě přes jedné z možností na mé webové stránce (${settings.info.author.website}) s dalšími informacemi.`
+            "id": [
+                `Kesalahan pada kode - silakan hubungi saya melalui salah satu opsi di situs web saya (${settings.info.author.website}) untuk informasi lebih lanjut.`,
             ],
-			"it": [
-                `Un errore nel codice - per favore contattami tramite una delle opzioni sul mio sito (${settings.info.author.website}) fornendo maggiori informazioni.`
-            ]
-        }
+        },
     },
     "101": {
         "errorInternal": false,
         "errorMessage": {
             "en": "Request blocked by Rate Limiting",
+            "cs": "Požadavek byl blokován omezením míry",
             "de": "Anfrage blockiert durch Ratenbegrenzung",
+            "it": "Richiesta bloccata per il superamento del limite di frequenza",
             "ru": "Запрос заблокирован ограничением скорости",
-            "cs": "Požadavek byl blokován omezením míry",
-			"it": "Richiesta bloccata per il superamento del limite di frequenza"
+            "id": "Permintaan diblokir oleh Pembatasan Nilai",
         },
         "causedBy": {
             "en": [
-                `You have sent too many requests too quickly. The limit is ${settings.httpServer.rateLimiting} requests within ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "second" : "seconds"}.\nIf you need more requests per minute, please contact me and we can try to figure things out: ${settings.info.author.website}`
+                `You have sent too many requests too quickly. The limit is ${settings.httpServer.rateLimiting} requests within ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "second" : "seconds"}.\nIf you need more requests per minute, please contact me and we can try to figure things out: ${settings.info.author.website}`,
+            ],
+            "cs": [
+                `Příliš rychle jste odeslali příliš mnoho žádostí. Limit je ${settings.httpServer.rateLimiting} požadavků v rámci ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "sekunda" : "sekund"}.\n Pokud potřebujete více požadavků za minutu, kontaktujte mě a můžeme se domluvit: ${settings.info.author.website}`,
             ],
             "de": [
-                `Du hast zu viele Anfragen zu schnell gesendet. Das Limit ist ${settings.httpServer.rateLimiting} Anfragen innerhalb von ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "Sekunde" : "Sekunden"}.\nWenn du mehr Anfragen pro Minute brauchst, kontaktiere mich bitte, damit wir es klären können: ${settings.info.author.website}`
+                `Du hast zu viele Anfragen zu schnell gesendet. Das Limit ist ${settings.httpServer.rateLimiting} Anfragen innerhalb von ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "Sekunde" : "Sekunden"}.\nWenn du mehr Anfragen pro Minute brauchst, kontaktiere mich bitte, damit wir es klären können: ${settings.info.author.website}`,
+            ],
+            "it": [
+                `Hai inoltrato troppe richieste in poco tempo. Il limite è di ${settings.httpServer.rateLimiting} richieste in ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "secondo" : "secondi"}.\nSe hai bisogno di più richieste al minuto, per favore contattami per trovare una risoluzione: ${settings.info.author.website}`,
             ],
             "ru": [
-                `Вы отправили слишком много запросов слишком быстро. Лимит составляет ${settings.httpServer.rateLimiting} запросов в пределах ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "секунда" : "секунды"}.\nЕсли Вам нужно больше запросов в минуту, пожалуйста, свяжитесь со мной, и мы попробуем разобраться в этом: ${settings.info.author.website}`
+                `Вы отправили слишком много запросов слишком быстро. Лимит составляет ${settings.httpServer.rateLimiting} запросов в пределах ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "секунда" : "секунды"}.\nЕсли Вам нужно больше запросов в минуту, пожалуйста, свяжитесь со мной, и мы попробуем разобраться в этом: ${settings.info.author.website}`,
             ],
-            "cs": [
-                `Příliš rychle jste odeslali příliš mnoho žádostí. Limit je ${settings.httpServer.rateLimiting} požadavků v rámci ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "sekunda" : "sekund"}.\n Pokud potřebujete více požadavků za minutu, kontaktujte mě a můžeme se domluvit: ${settings.info.author.website}`
+            "id": [
+                `Anda telah mengirim terlalu banyak permintaan terlalu cepat. Batasnya adalah ${settings.httpServer.rateLimiting} permintaan dalam ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "detik" : "detik"}.\nJika Anda membutuhkan lebih banyak permintaan per menit, silakan hubungi saya dan kami dapat mencoba mencari jalan keluarnya: ${settings.info.author.website}`,
             ],
-			"it": [
-                `Hai inoltrato troppe richieste in poco tempo. Il limite è di ${settings.httpServer.rateLimiting} richieste in ${settings.httpServer.timeFrame} ${settings.httpServer.timeFrame == 1 ? "secondo" : "secondi"}.\nSe hai bisogno di più richieste al minuto, per favore contattami per trovare una risoluzione: ${settings.info.author.website}`
-            ]
-        }
+        },
     },
     "102": {
         "errorInternal": false,
         "errorMessage": {
             "en": "Requested Endpoint not found",
+            "cs": "Koncový bod nebyl nalezen",
             "de": "Angefragten Endpunkt nicht gefunden",
+            "it": "Endpoint richiesto non trovato",
             "ru": "Запрашиваемая конечная точка не найдена",
-            "cs": "Koncový bod nebyl nalezen",
-            "it": "Endpoint richiesto non trovato"
+            "id": "Endpoint yang diminta tidak ditemukan",
         },
         "causedBy": {
             "en": [
-                "You sent a request to the wrong URL."
+                "You sent a request to the wrong URL.",
+            ],
+            "cs": [
+                "Odeslali jste požadavek na špatnou URL adresu.",
             ],
             "de": [
-                "Du hast eine Anfrage an die falsche URL gesendet."
+                "Du hast eine Anfrage an die falsche URL gesendet.",
+            ],
+            "it": [
+                "Hai inoltrato una richiesta all'URL sbagliato.",
             ],
             "ru": [
-                "Вы отправили запрос на неправильный URL-адрес."
+                "Вы отправили запрос на неправильный URL-адрес.",
             ],
-            "cs": [
-                "Odeslali jste požadavek na špatnou URL adresu."
+            "id": [
+                "Anda mengirim permintaan ke URL yang salah.",
             ],
-            "it": [
-                "Hai inoltrato una rischiesta all'URL sbagliato"
-            ]
-        }
+        },
     },
     "103": {
         "errorInternal": false,
         "errorMessage": {
             "en": "Disreputable IP Address",
+            "cs": "Pochybná IP adresa",
             "de": "In schlechtem Ruf stehende IP Addresse",
+            "it": "Indirizzo IP illegittimo",
             "ru": "Дискредитирующий IP-адрес",
-            "cs": "Pochybná IP adresa",
-            "it": "Indirizzo IP screditato"
+            "id": "Alamat IP Tidak Terpercaya",
         },
         "causedBy": {
             "en": [
                 `${settings.info.name} has found your IP address to be disreputable and added it to the blacklist.\nThis is probably because you have shown malicious behavior like an attempted interruption of ${settings.info.name}'s service.\n\nIf you believe this was done in error, please contact me (${settings.info.author.website}) so we can sort things out.`,
             ],
+            "cs": [
+                `${settings.info.name} zjistil, že vaše IP adresa má špatnou pověst a přidal ji na černou listinu.\nJe to pravděpodobně proto, že jste projevili škodlivé chování jako pokus o přerušení služby ${settings.info.name}.\n\nPokud si myslíte, že se to stalo omylem, kontaktujte mě (${settings.info.author.website}) abychom mohli věci vyřešit.`,
+            ],
             "de": [
-                `${settings.info.name} ist aufgefallen, dass deine IP Addresse einen schlechten Ruf hat und hat sie in die Ignorierungsliste eingetragen.\nDas ist wahrscheinlich passiert, weil du böswilliges Verhalten gezeigt hast, wie beispielsweise eine Unterbrechung von ${settings.info.name}'s Betrieb.\n\nWenn du meinst, das wurde fälschlicherweise gemacht, bitte kontaktiere mich hier: (${settings.info.author.website}).`
+                `${settings.info.name} ist aufgefallen, dass deine IP Addresse einen schlechten Ruf hat und hat sie in die Ignorierungsliste eingetragen.\nDas ist wahrscheinlich passiert, weil du böswilliges Verhalten gezeigt hast, wie beispielsweise eine Unterbrechung von ${settings.info.name}'s Betrieb.\n\nWenn du meinst, das wurde fälschlicherweise gemacht, bitte kontaktiere mich hier: (${settings.info.author.website}).`,
+            ],
+            "it": [
+                `${settings.info.name} ha trovato illegittimo il tuo indirizzo IP e lo ha aggiunto alla blacklist.\nQuesto è successo probabilmente perché hai dimostrato intenzioni malevoli come la tentata interruzione del servizio ${settings.info.name}.\n\nSe credi che sia stato non intenzionale, per favore contattami su (${settings.info.author.website}) così possiamo risolvere il problema.`,
             ],
             "ru": [
-                `${settings.info.name} нашел ваш IP-адрес неблаговидным и добавил его в черный список.\nВероятно, это потому, что вы показали вредоносное поведение, например, попытку прерывания сервиса ${settings.info.name}.\n\nЕсли вы считаете, что это было сделано по ошибке, пожалуйста, свяжитесь со мной (${settings.info.author.website}), чтобы мы могли разобраться в этом.`
+                `${settings.info.name} нашел ваш IP-адрес неблаговидным и добавил его в черный список.\nВероятно, это потому, что вы показали вредоносное поведение, например, попытку прерывания сервиса ${settings.info.name}.\n\nЕсли вы считаете, что это было сделано по ошибке, пожалуйста, свяжитесь со мной (${settings.info.author.website}), чтобы мы могли разобраться в этом.`,
             ],
-            "cs": [
-                `${settings.info.name} zjistil, že vaše IP adresa má špatnou pověst a přidal ji na černou listinu.\nJe to pravděpodobně proto, že jste projevili škodlivé chování jako pokus o přerušení služby ${settings.info.name}.\n\nPokud si myslíte, že se to stalo omylem, kontaktujte mě (${settings.info.author.website}) abychom mohli věci vyřešit.`
+            "id": [
+                `${settings.info.name} menemukan alamat IP Anda tidak dapat dipercaya dan menambahkannya ke blacklist.\nHal ini mungkin karena Anda telah menunjukkan perilaku jahat seperti upaya gangguan ${settings.info.name}'layanan.\n\nJika Anda yakin bahwa hal ini dilakukan karena kesalahan, silakan hubungi saya (${settings.info.author.website}) sehingga kami dapat menyelesaikan masalah ini.`,
             ],
-            "it": [
-                `${settings.info.name} trova il tuo indirizzo IP illegittimo e lo ha aggiunto alla blacklist.\nQuesto probabilmente perché hai dimostrato intenzioni malevoli come la tentata interruzione del servizio ${settings.info.name}.\n\nSe credi che sia stato non intenzionale, per favore contattami su (${settings.info.author.website}) così possiamo risolvere il problema.`
-            ]
-        }
+        },
     },
     "104": {
         "errorInternal": true,
         "errorMessage": {
             "en": "Internal Error while calling Endpoint",
+            "cs": "Interní chyba při volání koncového bodu",
             "de": "Interner Error während des Aufrufs eines Endpunktes",
+            "it": "Errore interno nel tentativo di chiamata Endpoint",
             "ru": "Внутренняя ошибка при вызове конечной точки",
-            "cs": "Interní chyba při volání koncového bodu",
-            "it": "Errore interno nel tentativo di chiamata Endpoint"
+            "id": "Kesalahan Internal saat memanggil Endpoint",
         },
         "causedBy": {
             "en": [
-                `An error in the code - please contact me through one of the options on my website (${settings.info.author.website}) with the additional info.`
+                `An error in the code - please contact me through one of the options on my website (${settings.info.author.website}) with the additional info.`,
+            ],
+            "cs": [
+                `Chyba v kódu - kontaktujte mě přes jedné z možností na mé webové stránce (${settings.info.author.website}) s dalšími informacemi.`,
             ],
             "de": [
-                `Ein Error im Quellcode - bitte kontaktiere mich durch eine der Möglichkeiten auf meiner Website (${settings.info.author.website}) mit den zusätzlichen Informationen.`
+                `Ein Error im Quellcode - bitte kontaktiere mich durch eine der Möglichkeiten auf meiner Website (${settings.info.author.website}) mit den zusätzlichen Informationen.`,
+            ],
+            "it": [
+                `Un errore nel codice - per favore contattami tramite una delle opzioni sul mio sito (${settings.info.author.website}) fornendo maggiori informazioni.`,
             ],
             "ru": [
-                `Ошибка в коде - пожалуйста, свяжитесь со мной через одну из опций на моем сайте (${settings.info.author.website}) с дополнительной информацией.`
+                `Ошибка в коде - пожалуйста, свяжитесь со мной через одну из опций на моем сайте (${settings.info.author.website}) с дополнительной информацией.`,
             ],
-            "cs": [
-                `Chyba v kódu - kontaktujte mě přes jedné z možností na mé webové stránce (${settings.info.author.website}) s dalšími informacemi.`
+            "id": [
+                `Kesalahan pada kode - silakan hubungi saya melalui salah satu opsi di situs web saya (${settings.info.author.website}) dengan informasi tambahan.`,
             ],
-            "it": [
-                `Un errore nel codice - per favore contattami tramite una delle opzioni sul mio sito (${settings.info.author.website}) fornendo maggiori informazioni.`
-            ]
-        }
+        },
     },
     "105": {
         "errorInternal": false,
         "errorMessage": {
             "en": "Malformed Joke",
+            "cs": "Malformovaný vtip",
             "de": "Falsch formatierter Witz",
+            "it": "Scherzo mal formattato",
             "ru": "Малоформальная шутка",
-            "cs": "Malformovaný vtip",
-            "it": "Scherzo mal formattato"
+            "id": "Lelucon yang tidak sempurna",
         },
         "causedBy": {
             "en": [
-                "This joke was formatted incorrectly."
+                "This joke was formatted incorrectly.",
+            ],
+            "cs": [
+                "Tento vtip byl špatně formátován.",
             ],
             "de": [
-                "Dieser Witz wurde nicht korrekt formatiert."
+                "Dieser Witz wurde nicht korrekt formatiert.",
+            ],
+            "it": [
+                "Questa barzelletta non è stata formattata correttamente.",
             ],
             "ru": [
-                "Эта шутка была отформатирована неправильно."
+                "Эта шутка была отформатирована неправильно.",
             ],
-            "cs": [
-                "Tento vtip byl špatně formátován."
+            "id": [
+                "Lelucon ini diformat dengan cara yang salah.",
             ],
-            "it": [
-                "Questa barzelletta non è stata formattata correttamente."
-            ]
-        }
+        },
     },
     "106": {
         "errorInternal": false,
         "errorMessage": {
             "en": "No matching joke found",
+            "cs": "Nebyl nalezen žádný odpovídající vtip",
             "de": "Kein übereinstimmender Witz gefunden",
+            "it": "Nessuna barzelletta trovata",
             "ru": "Шутка не найдена",
-            "cs": "Nebyl nalezen žádný odpovídající vtip",
-            "it": "Nessuna barzelletta trovata"
+            "id": "Tidak ditemukan lelucon yang cocok",
         },
         "causedBy": {
             "en": [
-                "No jokes were found that match your provided filter(s)."
+                "No jokes were found that match your provided filter(s).",
+            ],
+            "cs": [
+                "Nebyly nalezeny žádné vtipy, které by odpovídaly zadaným filtrům.",
             ],
             "de": [
-                "Keine Witze wurden gefunden, die den Filtern entsprechen."
+                "Keine Witze wurden gefunden, die den Filtern entsprechen.",
+            ],
+            "it": [
+                "Nessuna barzelletta corrisponde ai filtri da te specificati.",
             ],
             "ru": [
-                "Не было найдено ни одной шутки, которая бы соответствовала вашему фильтру(ам)."
+                "Не было найдено ни одной шутки, которая бы соответствовала вашему фильтру(ам).",
             ],
-            "cs": [
-                "Nebyly nalezeny žádné vtipy, které by odpovídaly zadaným filtrům."
+            "id": [
+                "Tidak ada lelucon yang ditemukan yang cocok dengan filter yang Anda berikan.",
             ],
-            "it": [
-                "Nessuna barzelletta corrisponde ai filtri da te specificati."
-            ]
-        }
+        },
     },
     "107": {
         "errorInternal": false,
         "errorMessage": {
             "en": "Payload too large",
+            "cs": "Datový obsah je příliš velký.",
             "de": "Anfrageinhalt zu groß",
+            "it": "Payload troppo grande",
             "ru": "Слишком большое содержание запроса",
-            "cs": "Datový obsah je příliš velký.",
-            "it": "Payload troppo grande"
+            "id": "Muatan terlalu besar",
         },
         "causedBy": {
             "en": [
-                `The provided payload exceeds the limit of ${settings.httpServer.maxPayloadSize} bytes (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`
+                `The provided payload exceeds the limit of ${settings.httpServer.maxPayloadSize} bytes (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`,
+            ],
+            "cs": [
+                `Poskytovaný datový obsah překračuje limit ${settings.httpServer.maxPayloadSize} bytes (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`,
             ],
             "de": [
-                `Der Anfrageinhalt ist größer als das Maximum von ${settings.httpServer.maxPayloadSize} bytes (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`
+                `Der Anfrageinhalt ist größer als das Maximum von ${settings.httpServer.maxPayloadSize} bytes (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`,
+            ],
+            "it": [
+                `Il payload fornito eccede il limite di ${settings.httpServer.maxPayloadSize} bytes (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`,
             ],
             "ru": [
-                `Содержимое запроса больше максимального значения ${settings.httpServer.maxPayloadSize} байт (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`
+                `Содержимое запроса больше максимального значения ${settings.httpServer.maxPayloadSize} байт (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`,
             ],
-            "cs": [
-                `Poskytovaný datový obsah překračuje limit ${settings.httpServer.maxPayloadSize} bytes (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`
+            "id": [
+                `Muatan yang disediakan melebihi batas ${settings.httpServer.maxPayloadSize} bytes (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`,
             ],
-            "it": [
-                `Il payload fornito eccede il limite di ${settings.httpServer.maxPayloadSize} bytes (${(settings.httpServer.maxPayloadSize / 1024).toFixed(1)} kB).`
-            ]
-        }
+        },
     },
     "108": {
         "errorInternal": false,
         "errorMessage": {
             "en": "URL too long",
+            "cs": "URL je moc dlouhá",
             "de": "URL zu lang",
+            "it": "URL troppo lungo",
             "ru": "URL-адрес слишком длинный",
-            "cs": "URL je moc dlouhá",
-            "it": "URL troppo lungo"
+            "id": "URL terlalu panjang",
         },
         "causedBy": {
             "en": [
-                `The URL (%1 characters) exceeds the maximum length of ${settings.httpServer.maxUrlLength} characters.`
+                `The URL (%1 characters) exceeds the maximum length of ${settings.httpServer.maxUrlLength} characters.`,
+            ],
+            "cs": [
+                `URL (%1 znaků) překračuje maximální délku znaků ${settings.httpServer.maxUrlLength}.`,
             ],
             "de": [
-                `Die angefragte URL (%1 Zeichen) überschreitet die Maximallänge von ${settings.httpServer.maxUrlLength} Zeichen.`
+                `Die angefragte URL (%1 Zeichen) überschreitet die Maximallänge von ${settings.httpServer.maxUrlLength} Zeichen.`,
+            ],
+            "it": [
+                `L'URL (%1 caratteri) eccede la lunghezza massima di ${settings.httpServer.maxUrlLength} caratteri.`,
             ],
             "ru": [
-                `Длина URL-адрес (%1 символов) превышает максимально допустимую длину в ${settings.httpServer.maxUrlLength} символа.`
+                `Длина URL-адрес (%1 символов) превышает максимально допустимую длину в ${settings.httpServer.maxUrlLength} символа.`,
             ],
-            "cs": [
-                `URL (% 1 znaků) překračuje maximální délku znaků ${settings.httpServer.maxUrlLength}.`
+            "id": [
+                `URL (%1 karakter) melebihi panjang maksimum ${settings.httpServer.maxUrlLength} karakter.`,
             ],
-            "it": [
-                `L'URL (% 1 caratteri) eccede la lunghezza massima di ${settings.httpServer.maxUrlLength} caratteri.`
-            ]
-        }
+        },
     },
     "109": {
         "errorInternal": false,
         "errorMessage": {
             "en": "Contains invalid characters",
+            "cs": "Obsahuje neplatné znaky",
             "de": "Enthält unerlaubte Zeichen",
+            "it": "Caratteri non validi trovati",
             "ru": "Содержит недопустимые символы",
-            "cs": "Obsahuje neplatné znaky",
-            "it": "Contiene caratteri non validi"
+            "id": "Berisi karakter yang tidak valid",
         },
         "causedBy": {
             "en": [
-                `The joke submission contains invalid characters outside the Unicode range of 0x0000 to 0x0fff`
+                "The joke submission contains invalid characters outside the Unicode range of 0x0000 to 0x0fff",
+            ],
+            "cs": [
+                "Podání vtipu obsahuje neplatné znaky mimo rozsah Unicode od 0x0000 do 0x0fff.",
             ],
             "de": [
-                `Der eingereichte Witz enthält unerlaubte Zeichen außerhalb des Unicode-Bereichs 0x0000 bis 0x0fff`
+                "Der eingereichte Witz enthält unerlaubte Zeichen außerhalb des Unicode-Bereichs 0x0000 bis 0x0fff",
             ],
-            "ru": [
-                `Представленный анекдот содержит недопустимые символы вне диапазона Юникода от 0x0000 до 0x0fff`
-            ],            
-            "cs": [
-                `Podání vtipu obsahuje neplatné znaky mimo rozsah Unicode od 0x0000 do 0x0fff.`
-            ],            
             "it": [
-                `La barzelletta inoltarta contiene caratteri Unicode non compresi tra 0x0000 e 0x0fff.`
-            ]
-        }
+                "La barzelletta inoltrata contiene caratteri Unicode non compresi tra 0x0000 e 0x0fff.",
+            ],
+            "ru": [
+                "Представленный анекдот содержит недопустимые символы вне диапазона Юникода от 0x0000 до 0x0fff",
+            ],
+            "id": [
+                "Kiriman lelucon berisi karakter yang tidak valid di luar rentang Unicode 0x0000 hingga 0x0fff",
+            ],
+        },
     },
     "110": {
         "errorInternal": false,
         "errorMessage": {
             "en": "Submission blocked by Rate Limiting",
+            "cs": "Podání bylo blokováno omezením míry",
             "de": "Einreichung blockiert durch Ratenbegrenzung",
+            "it": "Invio bloccato dal limite di frequenza",
             "ru": "Представление заблокировано ограничением по тарифу",
-            "cs": "Podání bylo blokováno omezením míry",
-            "it": "Invio bloccato dal limite di frequenza"
+            "id": "Pengiriman diblokir oleh Pembatasan Nilai",
         },
         "causedBy": {
             "en": [
-                `You have sent too many requests too quickly. The limit is ${settings.jokes.submissions.rateLimiting} submissions within ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "second" : "seconds"}.\nIf you need to send more requests, please either wait for a bit or contact me and we can try to figure things out: ${settings.info.author.website}`
+                `You have sent too many requests too quickly. The limit is ${settings.jokes.submissions.rateLimiting} submissions within ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "second" : "seconds"}.\nIf you need to send more requests, please either wait for a bit or contact me and we can try to figure things out: ${settings.info.author.website}`,
+            ],
+            "cs": [
+                `Příliš rychle jste odeslali příliš mnoho žádostí. Limit je ${settings.jokes.submissions.rateLimiting} podání v rámci ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "sekunda" : "sekund"}.\nPokud potřebujete poslat více požadavků, počkejte prosím chvilku nebo kontaktujte mě a můžeme se domluvit: ${settings.info.author.website}`,
             ],
             "de": [
-                `Du hast zu viele Anfragen zu schnell gesendet. Das Limit ist ${settings.jokes.submissions.rateLimiting} Einreichungen innerhalb von ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "Sekunde" : "Sekunden"}.\nWenn du mehr Anfragen pro Minute brauchst, kontaktiere mich bitte, damit wir es klären können: ${settings.info.author.website}`
+                `Du hast zu viele Anfragen zu schnell gesendet. Das Limit ist ${settings.jokes.submissions.rateLimiting} Einreichungen innerhalb von ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "Sekunde" : "Sekunden"}.\nWenn du mehr Anfragen pro Minute brauchst, kontaktiere mich bitte, damit wir es klären können: ${settings.info.author.website}`,
+            ],
+            "it": [
+                `Hai inoltrato troppe richieste in poco tempo. Il limite è di ${settings.jokes.submissions.rateLimiting} richieste in ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "secondo" : "secondi"}.\nSe hai bisogno di più richieste al minuto, per favore contattami per trovare una risoluzione: ${settings.info.author.website}`,
             ],
             "ru": [
-                `Вы отправили слишком много запросов слишком быстро. Лимит - ${settings.jokes.submissions.rateLimiting} представления в пределах ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "секунда" : "секунды" }.\nЕсли Вам нужно отправить больше запросов, пожалуйста, либо подождите немного, либо свяжитесь со мной, и мы попробуем разобраться в этом: ${settings.info.author.website}`
+                `Вы отправили слишком много запросов слишком быстро. Лимит - ${settings.jokes.submissions.rateLimiting} представления в пределах ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "секунда" : "секунды" }.\nЕсли Вам нужно отправить больше запросов, пожалуйста, либо подождите немного, либо свяжитесь со мной, и мы попробуем разобраться в этом: ${settings.info.author.website}`,
             ],
-            "cs": [
-                `Příliš rychle jste odeslali příliš mnoho žádostí. Limit je ${settings.jokes.submissions.rateLimiting} podání v rámci ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "sekunda" : "sekund"}.\nPokud potřebujete poslat více požadavků, počkejte prosím chvilku nebo kontaktujte mě a můžeme se domluvit: ${settings.info.author.website}`
+            "id": [
+                `Anda telah mengirim terlalu banyak permintaan terlalu cepat. Batasnya adalah ${settings.jokes.submissions.rateLimiting} pengiriman dalam ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "detik" : "detik"}.\nJika Anda perlu mengirim lebih banyak permintaan, silakan tunggu sebentar atau hubungi saya dan kami akan mencoba mencari jalan keluarnya: ${settings.info.author.website}`,
             ],
-            "it": [
-                `Hai inoltrato troppe richieste in poco tempo. Il limite è di ${settings.jokes.submissions.rateLimiting} richieste in ${settings.jokes.submissions.timeFrame} ${settings.jokes.submissions.timeFrame == 1 ? "secondo" : "secondi"}.\nSe hai bisogno di più richieste al minuto, per favore contattami per trovare una risoluzione: ${settings.info.author.website}`
-            ]
-        }
-    }
-}
+        },
+    },
+};

+ 334 - 0
data/jokes/jokes-id.json

@@ -0,0 +1,334 @@
+{
+    "info": {
+        "formatVersion": 3
+    },
+    "jokes": [
+        {
+            "category": "Misc",
+            "type": "single",
+            "joke": "Aku bukan pemalas. Aku sedang menjalankan mode hemat energi.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 0,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "single",
+            "joke": "Aku ingat, dulu sekali aku ingin segera menjadi dewasa. Ternyata aku salah.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 1,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "single",
+            "joke": "Aku sudah siap kalau Senin harus bangun pagi, apalagi bangun rumah tangga sama kamu.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 2,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "single",
+            "joke": "Anak kecil gak punya temen aja nangis, gimana hati kecil ini yang gak punya pasangan.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 3,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "twopart",
+            "setup": "Apa bahasa Inggris-nya ikan sapu-sapu?",
+            "delivery": "Cleaning Share Fish.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 4,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "single",
+            "joke": "Barusan saya ke apotek beli obat tidur. Pas Pulang saya bawanya pelan-pelan, takut obatnya bangun.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 5,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "twopart",
+            "setup": "Apakah namamu WiFi?",
+            "delivery": "Soalnya aku bisa merasakan konektivitas.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 6,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "twopart",
+            "setup": "Buah, buah apa yang paling receh?",
+            "delivery": "Buah ha ha ha ha ha",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 7,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "twopart",
+            "setup": "Gajah apa yang paling baik hati?",
+            "delivery": "Gajahat",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 8,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "twopart",
+            "setup": "Gula apa yang bukan gula?",
+            "delivery": "Gula aren't.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 9,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "single",
+            "joke": "Hati-hati di jalan. Hatinya jangan jalan-jalan. Ingat, ada hati yang lagi dijalani.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 10,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "single",
+            "joke": "Hidup adalah seni menggambar tanpa penghapus.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 11,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "single",
+            "joke": "Hidup ini singkat. Tersenyumlah selagi kamu masih memiliki gigi.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 12,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "single",
+            "joke": "Ingat, hari ini adalah hari esok yang kamu khawatirkan kemarin.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 13,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "twopart",
+            "setup": "Huruf apa yang sering kedinginan?",
+            "delivery": "Huruf B karena berada di antara AC.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 14,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "twopart",
+            "setup": "Hewan apa yang kalau diinjek nggak marah?",
+            "delivery": "Kera mik",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 15,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "twopart",
+            "setup": "Kuliah lo ambil apa?",
+            "delivery": "Gue sih ambil hikmahnya aja.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 16,
+            "safe": true
+        },
+        {
+            "category": "Misc",
+            "type": "twopart",
+            "setup": "Pasien yang terkena gejala rindu dilarikan kemana?",
+            "delivery": "Ke ruang I see you.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 17,
+            "safe": true
+        },
+        {
+            "category": "Pun",
+            "type": "twopart",
+            "setup": "Apa persamaan antara uang dan rahasia?",
+            "delivery": "sama-sama susah dipegang.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 18,
+            "safe": true
+        },
+        {
+            "category": "Pun",
+            "type": "twopart",
+            "setup": "Uang 100 ribu jika dilempar maka akan menjadi?",
+            "delivery": "Jadi rebutan.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 19,
+            "safe": true
+        },
+        {
+            "category": "Pun",
+            "type": "twopart",
+            "setup": "Selain uang benda apa yang sering dicari-cari orang?",
+            "delivery": "Benda hilang.",
+            "flags": {
+                "nsfw": false,
+                "religious": false,
+                "political": false,
+                "racist": false,
+                "sexist": false,
+                "explicit": false
+            },
+            "id": 20,
+            "safe": true
+        }
+    ]
+}

+ 148 - 76
data/translations.json

@@ -6,7 +6,8 @@
         "de",
         "ru",
         "cs",
-        "it"
+        "it",
+        "id"
     ],
     "tr": {
         "test": {
@@ -14,488 +15,559 @@
             "de": "Test. Hallo, Welt!",
             "ru": "Тест. Привет, мир!",
             "cs": "Test. Ahoj, světe.",
-            "it": "Test. Ciao mondo!"
+            "it": "Test. Ciao mondo!",
+            "id": "Tes. Halo, dunia!"
         },
         "messageOfTheDay": {
             "en": "If you want to stay up to date on the status and future updates of %1 or need some help, consider joining my Discord server: https://dc.sv443.net/",
             "de": "Wenn du über den Status und die zukünftigen Updates von %1 auf dem Laufenden bleiben willst oder Hilfe benötigst, kannst du auf meinen Discord-Server kommen: https://dc.sv443.net/",
             "ru": "Если вы хотите быть в курсе состояния и будущих обновлений %1 или вам нужна помощь, вы можете прийти на мой Discord-сервер: https://dc.sv443.net/",
             "cs": "Pokud chcete zůstat informováni o stavu a budoucích aktualizací %1 nebo potřebujete pomoc, zvažte připojení ke mému Discord serveru: https://dc.sv443.net/",
-            "it": "Se vuoi aggiornamenti sullo stato e migliorie future del %1 oppure hai bisogno di aiuto, considera di unirti al mio server Discord: https://dc.sv443.net/"
+            "it": "Se vuoi aggiornamenti sullo stato e migliorie future del %1 oppure hai bisogno di aiuto, considera di unirti al mio server Discord: https://dc.sv443.net/",
+            "id": "Jika Anda ingin mengetahui status dan pembaruan %1 di masa mendatang atau membutuhkan bantuan, pertimbangkan untuk bergabung dengan server Discord saya: https://dc.sv443.net/"
         },
         "generalInternalError": {
             "en": "There was an internal error: %1",
             "de": "Es gab einen internen Fehler: %1",
             "ru": "Произошла внутренняя ошибка: %1",
             "cs": "Došlo k interní chybě: %1",
-            "it": "C'è stato un errore interno: %1"
+            "it": "C'è stato un errore interno: %1",
+            "id": "C'è stato un errore interno: %1"
         },
         "invalidLangCode": {
             "en": "The specified language code \"%1\" is invalid. Please see https://jokeapi.dev/#langcodes-endpoint for more info.",
             "de": "Der angegebene Sprach-code \"%1\" ist nicht korrekt. Bitte besuche https://jokeapi.dev/#langcodes-endpoint für mehr Info.",
             "ru": "Указанный код языка \"%1\" является недействительным. Дополнительную информацию можно получить на сайте https://jokeapi.dev/#langcodes-endpoint",
             "cs": "Zadaný kód jazyka \"%1\" je neplatný. Další informace naleznete na adrese https://jokeapi.dev/#langcodes-endpoint",
-            "it": "Il codice di linguaggio specificato \"%1\" non è valido. Per favore visita https://jokeapi.dev/#langcodes-endpoint per maggiori informazioni"
+            "it": "Il codice di linguaggio specificato \"%1\" non è valido. Per favore visita https://jokeapi.dev/#langcodes-endpoint per maggiori informazioni",
+            "id": "Kode bahasa yang ditentukan \"%1\" tidak valid. Silakan lihat https://jokeapi.dev/#langcodes-endpoint untuk info lebih lanjut."
         },
         "invalidLangCodeNoArg": {
             "en": "The specified language code is invalid. Please see https://jokeapi.dev/#langcodes-endpoint for more info.",
             "de": "Der angegebene Sprach-code ist nicht korrekt. Bitte besuche https://jokeapi.dev/#langcodes-endpoint für mehr Info.",
             "ru": "Указанный код языка является недействительным. Дополнительную информацию можно получить на сайте https://jokeapi.dev/#langcodes-endpoint",
             "cs": "Zadaný kód jazyka je neplatný. Další informace naleznete na adrese https://jokeapi.dev/#langcodes-endpoint",
-            "it": "Il codice di linguaggio specificato non è valido. Per favore visita https://jokeapi.dev/#langcodes-endpoint per maggiori informazioni"
+            "it": "Il codice di linguaggio specificato non è valido. Per favore visita https://jokeapi.dev/#langcodes-endpoint per maggiori informazioni",
+            "id": "Kode bahasa yang ditentukan tidak valid. Silakan lihat https://jokeapi.dev/#langcodes-endpoint untuk info lebih lanjut."
         },
         "uriTooLong": {
             "en": "The provided URI (%1 characters) exceeds the maximum allowed length of %2 characters.",
             "de": "Der angegebene URI (%1 Zeichen) überschreitet die Maximallänge von %2 Zeichen.",
             "ru": "Поставляемый URI (%1 символ) превышает максимально допустимую длину %2 символов.",
             "cs": "Zadaná URI (%1 znaků) překračuje maximální povolenou délku %2 znaků.",
-            "it": "L'URI immesso (%1 znaků) eccede la lunghezza massima di %2 caratteri."
+            "it": "L'URI immesso (%1 znaků) eccede la lunghezza massima di %2 caratteri.",
+            "id": "URI yang diberikan (%1 karakter) melebihi panjang maksimum yang diizinkan yaitu %2 karakter."
         },
         "ipBlacklisted": {
             "en": "You were blacklisted by the API and cannot send any requests anymore. If you believe this was done in error, please contact me: %1",
             "de": "Du wurdest von der API auf eine Blockierliste gesetzt und kannst keine Anfragen mehr senden. Wenn du glaubst, dass dies irrtümlicherweise geschehen ist, kontaktiere mich bitte: %1",
             "ru": "Вы были помещены в список блоков API и больше не можете отправлять запросы. Если вы думаете, что это произошло по ошибке, пожалуйста, свяжитесь со мной: %1",
             "cs": "Rozhraní API vám bylo zakázáno a už nemůžete odesílat žádné žádosti. Pokud se domníváte, že se to stalo omylem, kontaktujte mě: %1",
-            "it": "L'API ti ha aggiunto alla blacklist e non puoi più ricevere richieste. Se credi che sia stato un errore, per favore contattami: %1"
+            "it": "L'API ti ha aggiunto alla blacklist e non puoi più ricevere richieste. Se credi che sia stato un errore, per favore contattami: %1",
+            "id": "Anda telah diblokir oleh API dan tidak dapat mengirim permintaan lagi. Jika Anda yakin ini adalah kesalahan, silakan hubungi saya: %1"
         },
         "errSetupHttpResponse": {
             "en": "There was an internal error while setting up the HTTP response: %1",
             "de": "Es gab einen internen Fehler während die HTTP-Antwort aufgebaut wurde: %1",
             "ru": "При настройке ответа HTTP произошла внутренняя ошибка: %1",
             "cs": "Při nastavování odpovědi HTTP došlo k interní chybě: %1",
-            "it": "C'è stato un errore interno nel settaggio della risposta HTTP: %1"
+            "it": "C'è stato un errore interno nel settaggio della risposta HTTP: %1",
+            "id": "Terjadi kesalahan internal saat menyiapkan respons HTTP: %1"
         },
         "rateLimited": {
             "en": "You are being rate limited because you have sent too many requests. The maximum is %1 requests every %2 seconds.",
             "de": "Deine Anfrage wurde blockiert, weil du zu viele Anfragen gesendet hast. Das Maximum sind %1 Anfragen innerhalb von %2 Sekunden.",
             "ru": "Вы ограничены в тарифах, потому что отправили слишком много запросов. Максимальное значение составляет %1 запрос каждые %2 секунды.",
             "cs": "Jste rate limited, protože jste odeslali příliš mnoho žádostí. Maximální počet žádostí: %1 každé %2 sekundy.",
-            "it": "Hai ricevuto una limitazione di frequenza per aver inoltrato troppe richieste. Il massimo è %1 richiesta ogni %2 secondi."
+            "it": "Hai ricevuto una limitazione di frequenza per aver inoltrato troppe richieste. Il massimo è %1 richiesta ogni %2 secondi.",
+            "id": "Anda dibatasi karena telah mengirim terlalu banyak permintaan. Maksimal adalah %1 permintaan setiap %2 detik."
         },
         "rateLimitedShort": {
             "en": "Blocked by rate limiting.",
             "de": "Blockiert durch Ratenbegrenzung.",
             "ru": "Блокировано ограничением скорости.",
             "cs": "Blokováno omezením míry.",
-            "it": "Bloccata per limite di frequenza."
+            "it": "Bloccata per limite di frequenza.",
+            "id": "Diblokir karena pembatasan kecepatan."
         },
         "endpointInternalError": {
             "en": "Internal Error while calling Endpoint: %1",
             "de": "Interner Error während des Aufrufs eines Endpunktes: %1",
             "ru": "Внутренняя ошибка при вызове конечной точки: %1",
             "cs": "Interní chyba při volání koncového bodu: %1",
-            "it": "Errore interno nel tentativo di chiamata Endpoint: %1"
+            "it": "Errore interno nel tentativo di chiamata Endpoint: %1",
+            "id": "Kesalahan internal saat memanggil Endpoint: %1"
         },
         "endpointNotFound": {
             "en": "Endpoint \"%1\" not found - Please read the documentation at https://jokeapi.dev/#endpoints to see all available endpoints.",
             "de": "Endpunkt \"%1\" nicht gefunden - Bitte lies die Dokumentation (https://jokeapi.dev/#endpoints) um alle verfügbaren Endpunkte zu sehen.",
             "ru": "Конечная точка \"%1\" не найдена - с документацией на https://jokeapi.dev/#endpoints можно ознакомиться во всех доступных конечные точки.",
             "cs": "Koncový bod \"%1\" nebyl nalezen - přečtěte si prosím dokumentaci https://jokeapi.dev/#endpoints a podívejte se na všechny dostupné koncové body.",
-            "it": "Endpoint \"%1\" non trovato - Per favore leggi la documentazione su https://jokeapi.dev/#endpoints per vedere tutti gli endpoint disponibili."
+            "it": "Endpoint \"%1\" non trovato - Per favore leggi la documentazione su https://jokeapi.dev/#endpoints per vedere tutti gli endpoint disponibili.",
+            "id": "Endpoint \"%1\" tidak ditemukan - Silakan baca dokumentasi di https://jokeapi.dev/#endpoints untuk melihat semua endpoint yang tersedia."
         },
         "payloadTooLarge": {
             "en": "Payload too large (%1 Bytes - maximum is %2 Bytes).",
             "de": "Anfrageinhalt zu groß (%1 Bytes - maximal erlaubt sind %2 Bytes).",
             "ru": "Слишком большая грузоподъемность (%1 байт - максимум %2 байта).",
             "cs": "Datový obsah je příliš velký (%1 Bytes - maximum je %2 Bytes).",
-            "it": "Payload troppo grande (%1 Bytes - massimo %2 Bytes)."
+            "it": "Payload troppo grande (%1 Bytes - massimo %2 Bytes).",
+            "id": "Payload terlalu besar (%1 Byte - maksimum adalah %2 Byte)."
         },
         "requestEmptyOrTimedOut": {
             "en": "Request body is empty or request timed out.",
             "de": "Anfrageinhalt ist leer oder es gab eine Zeitüberschreitung.",
             "ru": "Тело запроса пустое или запрос таймаут.",
             "cs": "Tělo požadavku je prázdné nebo vypršel časový limit požadavku.",
-            "it": "La richiesta è vuota oppure è scaduta."
+            "it": "La richiesta è vuota oppure è scaduta.",
+            "id": "Isi permintaan kosong atau waktu permintaan habis."
         },
         "invalidSubmissionOrWrongEndpoint": {
             "en": "Request body is invalid or was sent to the wrong endpoint \"%1\", please refer to the documentation at https://jokeapi.dev/#submit-joke to see how to correctly structure a joke submission.",
             "de": "Anfrageinhalt ist ungültig oder wurde an den falschen Endpunkt \"%1\" gesendet, lies bitte in der Dokumentation unter https://jokeapi.dev/#submit-joke nach, wie eine Witzeinreichung korrekt strukturiert wird.",
             "ru": "Тело запроса является недействительным или было отправлено не на ту конечную точку \"%1\", смотрите документацию на https://jokeapi.dev/#submit-joke, чтобы узнать, как правильно структурировать шутку.",
             "cs": "Tělo požadavku je neplatné nebo bylo odesláno na špatný koncový bod \"%1\", viz dokumentace na stránce https://jokeapi.dev/#submit-joke, kde najdete informace o tom, jak správně uspořádat podání vtipu.",
-            "it": "La richiesta non è valida o è stata inviata all'endpoint sbagliato \"%1\", per favore consulta la documentazione su https://jokeapi.dev/#submit-joke per vedere come strutturare correttamente la sottomissione di una barzelletta."
+            "it": "La richiesta non è valida o è stata inviata all'endpoint sbagliato \"%1\", per favore consulta la documentazione su https://jokeapi.dev/#submit-joke per vedere come strutturare correttamente la sottomissione di una barzelletta.",
+            "id": "Isi permintaan tidak valid atau dikirim ke endpoint yang salah \"%1\", silakan lihat dokumentasi di https://jokeapi.dev/#submit-joke untuk mengetahui cara menyusun pengajuan lelucon dengan benar."
         },
         "requestBodyIsInvalid": {
             "en": "Request body is empty.",
             "de": "Anfrageinhalt ist leer.",
             "ru": "Тело запроса пусто.",
             "cs": "Tělo požadavku je prázdné.",
-            "it": "La richiesta è vuota."
+            "it": "La richiesta è vuota.",
+            "id": "Isi permintaan kosong."
         },
         "invalidCategory": {
             "en": "The specified category/ies is/are invalid. Got: \"%1\" but possible categories are: \"%2\" (case insensitive).",
             "de": "Die angegebene Kategorie/n ist/sind inkorrekt. Angefragt wurde \"%1\", möglich sind jedoch nur \"%2\" (Groß- und Kleinschreibung wird ignoriert).",
             "ru": "Указанная категория/единицы являются/являются недействительными. Запрос был \"%1\", но возможен только \"%2\". (Верхний и нижний регистр игнорируются).",
             "cs": "Zadaná/é kategorie je/jsou neplatná/é. Dostal: \"%1\", ale možné kategorie jsou: \"%2\" (nerozlišují velká a malá písmena).",
-            "it": "La categoria o le categorie specificate non sono valide. Ho ricevuto: \"%1\", ma le categorie possibili sono: \"%2\" (non tiene conto delle maiuscole o minuscole)."
+            "it": "La categoria o le categorie specificate non sono valide. Ho ricevuto: \"%1\", ma le categorie possibili sono: \"%2\" (non tiene conto delle maiuscole o minuscole).",
+            "id": "Kategori yang ditentukan tidak valid. Diterima: \"%1\" tetapi kategori yang mungkin adalah: \"%2\" (tidak peka huruf besar/kecil)."
         },
         "invalidType": {
             "en": "The specified type is invalid. Got: \"%1\" but possible types are: \"%2\".",
             "de": "Der angegebene Dateityp ist inkorrekt. Angefragt wurde \"%1\", möglich sind jedoch nur \"%2\".",
             "ru": "Указанный тип файла неверен. Запрос был \"%1\", но возможен только \"%2\".",
             "cs": "Zadaný typ je neplatný. Dostal: \"%1\" ale možné typy jsou: \"%2\".",
-            "it": "Il carattere specificato non è valido. Ho ricevuto: \"%1\" ma i caratteri possibili sono: \"%2\"."
+            "it": "Il carattere specificato non è valido. Ho ricevuto: \"%1\" ma i caratteri possibili sono: \"%2\".",
+            "id": "Jenis yang ditentukan tidak valid. Diterima: \"%1\" tetapi jenis yang mungkin adalah: \"%2\"."
         },
         "idRangeInvalid": {
             "en": "The specified ID range is invalid. Got: \"%1 to %2\" but max possible ID range is: \"0-%3\".",
             "de": "Der angegebene ID-Bereich ist inkorrekt. Angefragt wurde: \"%1 bis %2\" aber der maximal mögliche Bereich ist: \"0-%3\".",
             "ru": "Указанный диапазон ID неверен. Запрос был сделан: \"%1 - %2\", но это максимально возможный диапазон: \"0-%3\".",
             "cs": "Zadaný rozsah ID je neplatný. Dostal: \"%1 až %2\" ale maximální možný rozsah ID je: \"0-%3\".",
-            "it": "Il range ID specificato non è valido. Ho ricevuto: \"%1 - %2\" ma il massimo del range ID è: \"0-%3\"."
+            "it": "Il range ID specificato non è valido. Ho ricevuto: \"%1 - %2\" ma il massimo del range ID è: \"0-%3\".",
+            "id": "Rentang ID yang ditentukan tidak valid. Diterima: \"%1 hingga %2\" tetapi rentang ID maksimum yang mungkin adalah: \"0-%3\"."
         },
         "idRangeInvalidSingle": {
             "en": "The specified ID range is invalid. Got: \"%1\" but max possible ID range is: \"0-%2\".",
             "de": "Der angegebene ID-Bereich ist inkorrekt. Angefragt wurde: \"%1\" aber der maximal mögliche Bereich ist: \"0-%2\".",
             "ru": "Указанный диапазон ID неверен. Запрос был сделан: \"%1\", но это максимально возможный диапазон: \"0-%2\".",
             "cs": "Zadaný rozsah ID je neplatný. Dostal: \"%1\" ale maximální možný rozsah ID je: \"0-%2\".",
-            "it": "L'ID specificato è in un range non valido. Ho ricevuto: \"%1\" ma il range massimo dell'ID è: \"0-%2\"."
+            "it": "L'ID specificato è in un range non valido. Ho ricevuto: \"%1\" ma il range massimo dell'ID è: \"0-%2\".",
+            "id": "Rentang ID yang ditentukan tidak valid. Diterima: \"%1\" tetapi rentang ID maksimum yang mungkin adalah: \"0-%2\"."
         },
         "idRangeInvalidGeneric": {
             "en": "The values in the \"idRange\" parameter are invalid or are not numbers. Error: %1",
             "de": "Der angegebene ID-Bereich im URL-parameter \"idRange\" ist inkorrekt oder enthält keine Zahl/en. Error: %1",
             "ru": "Значения в параметре \"idRange\" недействительны или не являются номерами. Ошибка: %1",
             "cs": "Hodnoty v parametru \"idRange\" jsou neplatné nebo se nejedná o čísla. Chyba: %1",
-            "it": "I valori nel parametro \"idRange\" sono invalidi oppure non sono numeri. Errore: %1"
+            "it": "I valori nel parametro \"idRange\" sono invalidi oppure non sono numeri. Errore: %1",
+            "id": "Nilai dalam parameter \"idRange\" tidak valid atau bukan angka. Kesalahan: %1"
         },
         "invalidFlags": {
             "en": "The specified flags are invalid. Got: \"%1\" - Possible flags are: \"%2\".",
             "de": "Die angegebene/n Markierung/en ist/sind inkorrekt. Angefragt wurde: \"%1\" - Possible flags are: \"%2\".",
             "ru": "Указанные флаги недействительны. Понял: \"%1\" - Возможные флаги: \"%2\".",
             "cs": "Zadané flags jsou neplatné. Dostal: \"%1\" Možné flags jsou: \"%2\".",
-            "it": "I contrassegni specificati sono invalidi. Ho ricevuto: \"%1\" I contrassegni possibili sono: \"%2\"."
+            "it": "I contrassegni specificati sono invalidi. Ho ricevuto: \"%1\" I contrassegni possibili sono: \"%2\".",
+            "id": "Bendera yang ditentukan tidak valid. Diterima: \"%1\" - Bendera yang mungkin adalah: \"%2\"."
         },
         "amountInternalError": {
             "en": "Internal error while setting joke amount: %1",
             "de": "Interner Fehler bei der Einstellung der Witzanzahl: %1",
             "ru": "Внутренняя ошибка при установке суммы шуток: %1",
             "cs": "Interní chyba při nastavení množství vtipů : %1",
-            "it": "Errore interno nel settaggio del totale delle barzellette: %1"
+            "it": "Errore interno nel settaggio del totale delle barzellette: %1",
+            "id": "Kesalahan internal saat menetapkan jumlah lelucon: %1"
         },
         "errorWhileFinalizing": {
             "en": "Error while finalizing joke filtering: %1",
             "de": "Fehler beim Abschließen der Witz-Filterung: %1",
             "ru": "Ошибка при завершении фильтрации шуток: %1",
             "cs": "Chyba při dokončení filtrování vtipů: %1",
-            "it": "Errore nella finalizzazione del filtro barzelletta: %1"
+            "it": "Errore nella finalizzazione del filtro barzelletta: %1",
+            "id": "Kesalahan saat menyelesaikan penyaringan lelucon: %1"
         },
         "invalidChars": {
             "en": "These are the invalid characters: %1",
             "de": "Dies sind die ungültigen Zeichen: %1",
             "ru": "Это недопустимые символы: %1",
             "cs": "Toto jsou neplatné znaky: %1",
-            "it": "Questi sono i caratteri non validi: %1"
+            "it": "Questi sono i caratteri non validi: %1",
+            "id": "Karakter-karakter berikut tidak valid: %1"
         },
         "submittedJokeFormatInvalid": {
             "en": "Submitted joke format is incorrect. Encountered error/s: %1",
             "de": "Eingesandtes Witzformat ist falsch. Aufgetretene/r Fehler: %1",
             "ru": "Отправленный формат шутки неверен. Ошибка/Ошибки при встрече: %1",
             "cs": "Odeslaný vtip je špatně formátovaný. Došlo k chybě/chybám: %1",
-            "it": "Il formato della barzelletta inoltrata non è valido. Errore/i riscontrati: %1"
+            "it": "Il formato della barzelletta inoltrata non è valido. Errore/i riscontrati: %1",
+            "id": "Format lelucon yang dikirim tidak benar. Kesalahan yang ditemukan: %1"
         },
         "errWhileSavingSubmission": {
             "en": "Internal error while saving joke: %1",
             "de": "Interner Fehler beim Speichern des Witzes: %1",
             "ru": "Внутренняя ошибка при сохранении шутки: %1",
             "cs": "Interní chyba při ukládání vtipu: %1",
-            "it": "Errore interno nel salvataggio della barzelletta: %1"
+            "it": "Errore interno nel salvataggio della barzelletta: %1",
+            "id": "Kesalahan internal saat menyimpan lelucon: %1"
         },
         "wrongFormatVersion": {
             "en": "Joke format version is incorrect. expected \"%1\" but got \"%2\".",
             "de": "Die Format-Version des Witzes ist falsch. Erwartet wurde \"%1\", bekam stattdessen \"%2\".",
             "ru": "Версия формата шуток некорректна. Ожидаемый \"%1\", получил \"%2\".",
             "cs": "Verze formátu vtipu je nesprávná. Očekávaval \"%1\", ale dostal \"%2\".",
-            "it": "La formattazione della barzelletta è invalida. Mi aspettavo \"%1\" ma ho \"%2\"."
+            "it": "La formattazione della barzelletta è invalida. Mi aspettavo \"%1\" ma ho \"%2\".",
+            "id": "Versi format lelucon tidak benar. Diharapkan \"%1\" tetapi diterima \"%2\"."
         },
         "invalidJSON": {
             "en": "Request body contains invalid JSON: %1",
             "de": "Anfrage enthält ungültiges JSON: %1",
             "ru": "Тело запроса содержит недействительный JSON: %1",
             "cs": "Tělo požadavku obsahuje neplatný JSON: %1",
-            "it": "Il corpo della richiesta contiene un formato JSON non valido: %1"
+            "it": "Il corpo della richiesta contiene un formato JSON non valido: %1",
+            "id": "Badan permintaan mengandung JSON yang tidak valid: %1"
         },
         "noConversionMapping": {
             "en": "Internal Error - no conversion mapping for data with keys \"%1\" - %2",
             "de": "Interner Fehler - keine Konvertierungszuordnung für Daten mit Schlüsseln \"%1\" - %2",
             "ru": "Внутренняя ошибка - нет отображения преобразования данных с помощью ключей \"%1\". - %2",
             "cs": "Interní chyba - žádné mapování konverzí pro data s klíči \"%1\" - %2",
-            "it": "Errore interno - nessuna mappa di conversione per i dati con chiavi \"%1\" - %2"
+            "it": "Errore interno - nessuna mappa di conversione per i dati con chiavi \"%1\" - %2",
+            "id": "Kesalahan internal - tidak ada pemetaan konversi untuk data dengan kunci \"%1\" - %2"
         },
         "cantConvertToPlainText": {
             "en": "Internal Error - could not convert data to plain text - %1",
             "de": "Interner Fehler - konnte Daten nicht zu Text konvertieren - %1",
             "ru": "Внутренняя ошибка - не удалось преобразовать данные в обычный текст - %1",
             "cs": "Interní chyba - nelze převést data na prostý text - %1",
-            "it": "Errore interno - fallimento della conversione dei dati in testo - %1"
+            "it": "Errore interno - fallimento della conversione dei dati in testo - %1",
+            "id": "Kesalahan internal - tidak dapat mengonversi data menjadi teks biasa - %1"
         },
         "conversionGeneralError": {
             "en": "Error %1 - %2\nThis error is caused by:\n- %3\n\nAdditional info: %4",
             "de": "Fehler %1 - %2\nDieser Fehler kann verursacht werden durch:\n- %3\n\nZusätzliche Informationen: %4",
             "ru": "Ошибка %1 - %2\nЭта ошибка может быть вызвана:\n- %3\n\nДополнительная информация: %4",
             "cs": "Chyba %1 -%2\nTato chyba je způsobena:\n- %3\n\nDalší informace: %4",
-            "it": "Errore %1 -%2\nQuesto errore è causato da:\n- %3\n\nUlteriori informazioni: %4"
+            "it": "Errore %1 -%2\nQuesto errore è causato da:\n- %3\n\nUlteriori informazioni: %4",
+            "id": "Kesalahan %1 - %2\nKesalahan ini disebabkan oleh:\n- %3\n\nInfo tambahan: %4"
         },
         "conversionInternalError": {
             "en": "Internal Error %1 - %2\nThis error is caused by:\n- %3\n\nAdditional info: %4",
             "de": "Interner Fehler %1 - %2\nDieser Fehler kann verursacht werden durch:\n- %3\n\nZusätzliche Informationen: %4",
             "ru": "Внутренняя ошибка %1 - %2\nЭта ошибка может быть вызвана:\n- %3\n\nДополнительная информация: %4",
             "cs": "Interní chyba %1 - %2\nTato chyba je způsobena:\n- %3\n\nDalší informace: %4",
-            "it": "Errore interno %1 - %2\nQuesto errore è causato da:\n- %3\n\nUlteriori informaizoni: %4"
+            "it": "Errore interno %1 - %2\nQuesto errore è causato da:\n- %3\n\nUlteriori informaizoni: %4",
+            "id": "Kesalahan internal %1 - %2\nKesalahan ini disebabkan oleh:\n- %3\n\nInfo tambahan: %4"
         },
         "availableCategories": {
             "en": "Available categories are:\n%1\n\nThese are the available category aliases:\n%2",
             "de": "Verfügbare Kategorien sind:\n%1\n\nDas sind die verfügbaren Kategorie-Aliase:\n%2",
             "ru": "Доступны следующие категории:\n%1\n\nЭто доступные псевдонимы категории:\n%2",
             "cs": "Dostupné kategorie jsou:\n%1\n\nToto jsou dostupné zkratky kategorií:\n%2",
-            "it": "Le categorie disponibili sono:\n%1\n\nQuesti sono gli alias delle categorie disponibili:\n%2"
+            "it": "Le categorie disponibili sono:\n%1\n\nQuesti sono gli alias delle categorie disponibili:\n%2",
+            "id": "Kategori yang tersedia:\n%1\n\nIni adalah alias kategori yang tersedia:\n%2"
         },
         "availableFlags": {
             "en": "Available flags are: \"%1\"",
             "de": "Verfügbare Markierungen sind: \"%1\"",
             "ru": "Доступны флаги: \"%1\"",
             "cs": "Dostupné flags jsou: \"%1\".",
-            "it": "Le contrassegnazioni disponibili sono: \"%1\"."
+            "it": "Le contrassegnazioni disponibili sono: \"%1\".",
+            "id": "Bendera yang tersedia adalah: \"%1\"."
         },
         "timestamp": {
             "en": "Timestamp: %1",
             "de": "Zeitstempel: %1",
             "ru": "Таймштамп: %1",
             "cs": "Časové razítko: %1",
-            "it": "Timestamp: %1"
+            "it": "Timestamp: %1",
+            "id": "Cap waktu: %1"
         },
         "genericError": {
             "en": "Error: %1",
             "de": "Fehler: %1",
             "ru": "Ошибка: %1",
             "cs": "Chyba: %1",
-            "it": "Errore: %1"
+            "it": "Errore: %1",
+            "id": "Kesalahan: %1"
         },
         "languageCode": {
             "en": "Language Code: %1",
             "de": "Sprach-Code: %1",
             "ru": "Код языка: %1",
             "cs": "Kód jazyka: %1",
-            "it": "Codice Lingua: %1"
+            "it": "Codice Lingua: %1",
+            "id": "Kode Bahasa: %1"
         },
         "languagesEndpoint": {
             "en": "Default Language: %1 [%2]\nJoke Languages (%3): %4\nSystem Languages (%5): %6\n\nPossible Language Values:\n%7",
             "de": "Standardsprache: %1 [%2]\nWitz-Sprachen (%3): %4\nSystemsprachen (%5): %6\n\nMögliche Sprachwerte:\n%7",
             "ru": "Язык по умолчанию: %1 [%2]\nЯзыки шуток (%3): %4\nСистемные языки (%5): %6\n\nВозможные значения языка:\n%7",
             "cs": "Výchozí jazyk:  %1 [%2]\nJazyk pro vtipy (%3): %4\nSystémové jazyky (%5): %6\n\nMožné jazykové hodnoty:\n%7",
-            "it": "Lingua predefinita:  %1 [%2]\nLingue delle barzellette (%3): %4\nLingua di sistema (%5): %6\n\nPossibili valori di lingua:\n%7"
+            "it": "Lingua predefinita:  %1 [%2]\nLingue delle barzellette (%3): %4\nLingua di sistema (%5): %6\n\nPossibili valori di lingua:\n%7",
+            "id": "Bahasa Default: %1 [%2]\nBahasa Humor (%3): %4\nBahasa Sistem (%5): %6\n\nNilai Bahasa yang Mungkin:\n%7"
         },
-        "infoEndpoint": {
+       "infoEndpoint": {
             "en": "%1 v%2 - Info:\n\nJoke count: %3\nCategories: \"%4\"\nFlags: \"%5\"\nResponse Formats: \"%6\"\nJoke Types: \"%7\"\nSubmission URL: %8\n\nID Ranges:\n%9\n\nJoke Languages (%10): %11\nSystem Languages (%12): %13\n\nAmount of safe jokes:\n%14\n\nMessage of the Day: %15",
             "de": "%1 v%2 - Info:\n\nAnzahl der Witze: %3\nKategorien: \"%4\"\nMerkmale (Flags): \"%5\"\nAntwort-Dateiformate: \"%6\"\nWitz-Typen: \"%7\"\nEinreichungs-URL: %8\n\nID-Begrenzungen:\n%9\n\nWitz-Sprachen (%10): %11\nSystemsprachen (%12): %13\n\nAnzahl der sicheren Witze:\n%14\n\nNachricht des Tages: %15",
             "ru": "%1 v%2 - Информация:\n\nКоличество шуток: %3\nКатегории: \"%4\"\nФлаги: \"%5\"\nФорматы ответов: \"%6\"\nТипы шуток: \"%7\"\nАдрес отправки: %8\n\nID Диапазоны:\n%9\n\nЯзыки шуток (%10): %11\nСистемные языки (%12): %13\n\nКоличество безопасных шуток:\n%14\n\nПослание дня: %15",
             "cs": "%1 v%2 - Informace:\n\nPočet vtipů: %3\nKategorie: \"%4\"\nVlajky: \"%5\"\nFormáty odpovědi: \"%6\"\nDruhy vtipů: \"%7\"\nURL pro odeslání vtipu: \"%8\"\n\nRozsahy ID:\n%9\n\nJazyky pro vtipy (%10): %11\nSystémové jazyky (%12): %13\n\nMnožství bezpečných vtipů:\n%14\n\nZpráva dne: %15",
-            "it": "%1 v%2 - Info:\n\nConteggio barzellette: %3\nCategorie: \"%4\"\nContrassegni: \"%5\"\nFormato risposte: \"%6\"\nTipi di barzellette: \"%7\"\nURL di sottomissione: \"%8\"\n\nRange ID:\n%9\n\nLingue barzellette (%10): %11\nLingue di sistema (%12): %13\n\nTotale barzellette pulite:\n%14\n\nMessaggio del giorno: %15"
+            "it": "%1 v%2 - Info:\n\nConteggio barzellette: %3\nCategorie: \"%4\"\nContrassegni: \"%5\"\nFormato risposte: \"%6\"\nTipi di barzellette: \"%7\"\nURL di sottomissione: \"%8\"\n\nRange ID:\n%9\n\nLingue barzellette (%10): %11\nLingue di sistema (%12): %13\n\nTotale barzellette pulite:\n%14\n\nMessaggio del giorno: %15",
+            "id": "%1 v%2 - Info:\n\nJumlah lelucon: %3\nKategori: \"%4\"\nBendera: \"%5\"\nFormat Respons: \"%6\"\nJenis Lelucon: \"%7\"\nURL Pengajuan: %8\n\nRentang ID:\n%9\n\nBahasa Lelucon (%10): %11\nBahasa Sistem (%12): %13\n\nJumlah lelucon aman:\n%14\n\nPesan Hari Ini: %15"
         },
         "availableFormats": {
             "en": "Available formats are: %1",
             "de": "Verfügbare Dateiformate sind: %1",
             "ru": "Доступные форматы: %1",
             "cs": "Dostupné formáty jsou: %1",
-            "it": "Formati disponibili: %1"
+            "it": "Formati disponibili: %1",
+            "id": "Format yang tersedia adalah: %1"
         },
         "endpointsWord": {
             "en": "Endpoints",
             "de": "Endpunkte",
             "ru": "Конечные точки",
             "cs": "Koncové body",
-            "it": "Endpoints"
+            "it": "Endpoints",
+            "id": "Titik Akhir"
         },
         "endpointDetails": {
             "en": "%1 - %2\n    Usage: %3 %4\n    Supported parameters: %5",
             "de": "%1 - %2\n    Benutzung: %3 %4\n    Unterstützte URL-Parameter: %5",
             "ru": "%1 - %2\n    Использование: %3 %4\n    Поддерживаемые параметры URL: %5",
             "cs": "%1 - %2\n    Zátěž: %3 %4\n    Podporované parametry: %5",
-            "it": "%1 - %2\n    Utilizzo: %3 %4\n    Parametri supportati: %5"
+            "it": "%1 - %2\n    Utilizzo: %3 %4\n    Parametri supportati: %5",
+            "id": "%1 - %2\n    Penggunaan: %3 %4\n    Parameter yang didukung: %5"
         },
         "foundNoMatchingJokes": {
             "en": "No jokes were found that match your provided filter(s).",
             "de": "Es wurden keine Witze gefunden, die mit dem/den bereitgestellten Filter(n) übereinstimmen.",
             "ru": "Не было найдено ни одной шутки, которая бы соответствовала вашему фильтру(ам).",
             "cs": "Nebyly nalezeny žádné vtipy, které by odpovídaly zadaným filtrům.",
-            "it": "Nessuna barzelletta corrisponde ai filtri da te specificati."
+            "it": "Nessuna barzelletta corrisponde ai filtri da te specificati.",
+            "id": "Tidak ada lelucon yang cocok dengan filter yang Anda berikan."
         },
         "noLangCodeSpecified": {
             "en": "You need to specify a language in the URL. Example: /langcode/english",
             "de": "Du musst eine Sprache in der URL angeben. Beispiel: /langcode/german",
             "ru": "Вам необходимо указать язык в URL-адресе. Пример: /langcode/russian",
-            "cs": "V adrese URL musíte zadat jazyk. Příklad: /langcode/czech"
+            "cs": "V adrese URL musíte zadat jazyk. Příklad: /langcode/czech",
+            "id": "Anda harus menentukan bahasa dalam URL. Contoh: /langcode/indonesian"
         },
         "pingPong": {
             "en": "Pong!",
             "de": "Pong!",
             "ru": "Понг!",
             "cs": "Pong!",
-            "it": "Pong!"
+            "it": "Pong!",
+            "id": "Pong!"
         },
         "submissionSaved": {
             "en": "Joke submission was successfully saved. It will soon be checked out by the author.",
             "de": "Die Witz-Einreichung wurde erfolgreich gespeichert. Sie wird demnächst vom Autor überprüft.",
             "ru": "Представление шутки было успешно сохранено. Вскоре он будет проверен автором.",
             "cs": "Podání vtipu bylo úspěšně uloženo. Autor ho brzy zkontroluje.",
-            "it": "La sottomissione della barzelletta è stata salvata con successo. Sarà presto controllata dall'autore."
+            "it": "La sottomissione della barzelletta è stata salvata con successo. Sarà presto controllata dall'autore.",
+            "id": "Pengajuan lelucon berhasil disimpan. Akan segera diperiksa oleh penulis."
         },
-        "dryRunSuccessful":
-        {
+        "dryRunSuccessful": {
             "en": "Dry Run complete! No errors were found.",
             "de": "Probelauf abgeschlossen! Keine Fehler gefunden.",
             "ru": "Тестовый запуск завершен! Ошибок не найдено.",
             "cs": "Suchý běh dokončen! Nebyly nalezeny žádné chyby.",
-            "it": "Prova completata! Non è stato trovato alcun errore."
+            "it": "Prova completata! Non è stato trovato alcun errore.",
+            "id": "Pengujian selesai! Tidak ditemukan kesalahan."
         },
         "parseJokesInvalidLanguageCode": {
             "en": "Invalid language code provided.",
             "de": "Der angegebene Sprachcode ist ungültig.",
             "ru": "Предоставлен недействительный код языка.",
             "cs": "Byl poskytnut neplatný kód jazyka.",
-            "it": "Il codice di lingua inserito non è valido."
+            "it": "Il codice di lingua inserito non è valido.",
+            "id": "Kode bahasa yang diberikan tidak valid."
         },
         "parseJokesFormatVersionMismatch": {
             "en": "Joke format version \"%1\" doesn't match up with required version \"%2\"",
             "de": "Witz-Format-Version \"%1\" stimmt nicht mit der erforderten Version \"%2\" überein.",
             "ru": "Версия шуточного формата \"%1\" не соответствует требуемой версии \"%2\"",
             "cs": "Verze formátu vtipu \"%1\" neodpovídá požadované verzi \"%2\"",
-            "it": "La formattazione della barzelletta \"%1\" non corrisponde a quella richiesta \"%2\""
+            "it": "La formattazione della barzelletta \"%1\" non corrisponde a quella richiesta \"%2\"",
+            "id": "Versi format lelucon \"%1\" tidak sesuai dengan versi yang diperlukan \"%2\""
         },
         "parseJokesNoFormatVersionOrInvalid": {
             "en": "Joke doesn't have a \"formatVersion\" property or it is empty or invalid.",
             "de": "Witz hat keine Eigenschaft \"formatVersion\" oder sie ist leer oder ungültig.",
             "ru": "У шутки нет свойства \"formatVersion\" или она пуста или недействительна.",
             "cs": "Vtip nemá vlastnost \"formatVersion\" nebo je prázdný nebo neplatný.",
-            "it": "La barzelletta non ha proprietà \"formatVersion\" oppure è vuota o invalida."
+            "it": "La barzelletta non ha proprietà \"formatVersion\" oppure è vuota o invalida.",
+            "id": "Lelucon tidak memiliki properti \"formatVersion\" atau kosong atau tidak valid."
         },
         "parseJokesSingleNoJokeProperty": {
             "en": "Joke is of type \"single\" but doesn't have a \"joke\" property or it is empty.",
             "de": "Witz ist vom Typ \"single\", hat aber keine Eigenschaft \"joke\" oder sie ist leer.",
             "ru": "Шутка имеет тип \"single\", но не имеет свойства \"joke\" или она пуста.",
             "cs": "Vtip je typu \"single\", ale nemá vlastnost \"joke\" nebo je prázdná.",
-            "it": "La barzelletta è del tipo \"single\", ma non ha proprietà \"joke\" oppure è vuota."
+            "it": "La barzelletta è del tipo \"single\", ma non ha proprietà \"joke\" oppure è vuota.",
+            "id": "Lelucon bertipe \"single\" tetapi tidak memiliki properti \"joke\" atau kosong."
         },
         "parseJokesTwopartNoSetupProperty": {
             "en": "Joke is of type \"twopart\" but doesn't have a \"setup\" property or it is empty.",
             "de": "Witz ist vom Typ \"twopart\", hat aber keine Eigenschaft \"setup\" oder sie ist leer.",
             "ru": "Шутка имеет тип \"twopart\", но не имеет свойства \"setup\" или она пуста.",
             "cs": "Vtip je typu \"twopart\", ale nemá vlastnost \"setup\" nebo je prázdná.",
-            "it": "La barzelletta è del tipo \"twopart\", ma non ha proprietà \"setup\" oppure è vuota."
+            "it": "La barzelletta è del tipo \"twopart\", ma non ha proprietà \"setup\" oppure è vuota.",
+            "id": "Lelucon bertipe \"twopart\" tetapi tidak memiliki properti \"setup\" atau kosong."
         },
         "parseJokesTwopartNoDeliveryProperty": {
             "en": "Joke is of type \"twopart\" but doesn't have a \"delivery\" property or it is empty.",
             "de": "Witz ist vom Typ \"twopart\", hat aber keine Eigenschaft \"Lieferung\" oder sie ist leer.",
             "ru": "Шутка имеет тип \"twopart\", но не имеет свойства \"delivery\" или она пуста.",
             "cs": "Vtip je typu \"twopart\", ale nemá vlastnost \"delivery\" nebo je prázdná.",
-            "it": "La barzelletta è del tipo \"twopart\", ma non ha proprietà \"delivery\" oppure è vuota."
+            "it": "La barzelletta è del tipo \"twopart\", ma non ha proprietà \"delivery\" oppure è vuota.",
+            "id": "Lelucon bertipe \"twopart\" tetapi tidak memiliki properti \"delivery\" atau kosong."
         },
         "parseJokesNoTypeProperty": {
             "en": "Joke doesn't have a \"type\" property or it is invalid - it has to be either \"single\" or \"twopart\".",
             "de": "Witz hat keine Eigenschaft \"type\" oder sie ist ungültig - es muss entweder \"single\" oder \"twopart\" sein.",
             "ru": "У шутки нет свойства \"type\" или она недействительна - она должна быть либо \"single\", либо \"twopart\".",
             "cs": "Vtip nemá vlastnost \"type\" nebo je neplatná - musí to být buď \"single\" nebo \"twopart\".",
-            "it": "La barzelletta non ha proprietà \"type\" oppure è invalida - deve essere \"single\" o \"twopart\"."
+            "it": "La barzelletta non ha proprietà \"type\" oppure è invalida - deve essere \"single\" o \"twopart\".",
+            "id": "Lelucon tidak memiliki properti \"type\" atau itu tidak valid - harusnya \"single\" atau \"twopart\"."
         },
         "parseJokesNoCategoryProperty": {
             "en": "Joke doesn't have a \"category\" property or it is empty.",
             "de": "Witz hat keine Eigenschaft \"category\" oder sie ist leer.",
             "ru": "У шутки нет свойства \"category\" или она пуста.",
             "cs": "Vtip nemá vlastnost \"category\" nebo je prázdná.",
-            "it": "La barzelletta non ha proprietà \"category\" o è vuota."
+            "it": "La barzelletta non ha proprietà \"category\" o è vuota.",
+            "id": "Lelucon tidak memiliki properti \"category\" atau kosong."
         },
         "parseJokesInvalidCategory": {
             "en": "Joke category is invalid.",
             "de": "Die Witz-Kategorie ist ungültig.",
             "ru": "Категория шуток недействительна.",
             "cs": "Kategorie vtipu je neplatná.",
-            "it": "La categoria della barzelletta non è valida."
+            "it": "La categoria della barzelletta non è valida.",
+            "id": "Kategori lelucon tidak valid."
         },
         "parseJokesNoFlagNsfw": {
             "en": "Joke doesn't have the \"nsfw\" flag or it is invalid.",
             "de": "Witz hat nicht das Merkmal \"nsfw\" oder es ist ungültig.",
             "ru": "В шутке нет флага \"nsfw\" или она недействительна.",
             "cs": "Vtip nemá vlajku \"nsfw\" nebo je neplatná.",
-            "it": "La barzelletta non è contrassegnata come \"nsfw\" oppure non è valida."
+            "it": "La barzelletta non è contrassegnata come \"nsfw\" oppure non è valida.",
+            "id": "Lelucon tidak memiliki flag \"nsfw\" atau itu tidak valid."
         },
         "parseJokesNoFlagRacist": {
             "en": "Joke doesn't have the \"racist\" flag or it is invalid.",
             "de": "Witz hat nicht das Merkmal \"racist\" oder es ist ungültig.",
             "ru": "В шутке нет флага \"racist\" или она недействительна.",
             "cs": "Vtip nemá vlajku \"racist\" nebo je neplatná.",
-            "it": "La barzelletta non è contrassegnata come \"racist\" oppure non è valida."
+            "it": "La barzelletta non è contrassegnata come \"racist\" oppure non è valida.",
+            "id": "Lelucon tidak memiliki flag \"racist\" atau itu tidak valid."
         },
         "parseJokesNoFlagSexist": {
             "en": "Joke doesn't have the \"sexist\" flag or it is invalid.",
             "de": "Witz hat nicht das Merkmal \"sexist\" oder es ist ungültig.",
             "ru": "В шутке нет флага \"sexist\" или она недействительна.",
             "cs": "Vtip nemá vlajku \"sexist\" nebo je neplatná.",
-            "it": "La barzelletta non è contrassegnata come \"sexist\" oppure non è valida."
+            "it": "La barzelletta non è contrassegnata come \"sexist\" oppure non è valida.",
+            "id": "Lelucon tidak memiliki flag \"sexist\" atau itu tidak valid."
         },
         "parseJokesNoFlagPolitical": {
             "en": "Joke doesn't have the \"political\" flag or it is invalid.",
             "de": "Witz hat nicht das Merkmal \"political\" oder es ist ungültig.",
             "ru": "В шутке нет флага \"political\" или она недействительна.",
             "cs": "Vtip nemá vlajku \"political\" nebo je neplatná.",
-            "it": "La barzelletta non è contrassegnata come \"political\" oppure non è valida."
+            "it": "La barzelletta non è contrassegnata come \"political\" oppure non è valida.",
+            "id": "Lelucon tidak memiliki flag \"political\" atau itu tidak valid."
         },
         "parseJokesNoFlagReligious": {
             "en": "Joke doesn't have the \"religious\" flag or it is invalid.",
             "de": "Witz hat nicht das Merkmal \"religious\" oder es ist ungültig.",
             "ru": "В шутке нет флага \"religious\" или она недействительна.",
             "cs": "Vtip nemá vlajku \"religious\" nebo je neplatná.",
-            "it": "La barzelletta non è contrassegnata come \"religious\" oppure non è valida."
+            "it": "La barzelletta non è contrassegnata come \"religious\" oppure non è valida.",
+            "id": "Lelucon tidak memiliki flag \"religious\" atau itu tidak valid."
         },
         "parseJokesNoFlagExplicit": {
             "en": "Joke doesn't have the \"explicit\" flag or it is invalid.",
             "de": "Witz hat nicht das Merkmal \"explicit\" oder es ist ungültig.",
             "ru": "В шутке нет флага \"explicit\" или она недействительна.",
-            "cs": "Vtip nemá vlajku \"explicit\" nebo je neplatná",
-            "it": "La barzelletta non è contrassegnata come \"explicit\" oppure non è valida."
+            "cs": "Vtip nemá vlajku \"explicit\" nebo je neplatná.",
+            "it": "La barzelletta non è contrassegnata come \"explicit\" oppure non è valida.",
+            "id": "Lelucon tidak memiliki flag \"explicit\" atau itu tidak valid."
         },
         "parseJokesNoFlagsObject": {
             "en": "Joke doesn't have a \"flags\" object or it is invalid.",
             "de": "Witz hat kein Objekt \"flags\" oder es ist ungültig.",
             "ru": "В шутке нет объекта \"flags\" или она недействительна.",
             "cs": "Vtip nemá objekt \"flags\" nebo je neplatný.",
-            "it": "La barzelletta non ha oggetto \"flags\" oppure l'oggetto non è valido."
+            "it": "La barzelletta non ha oggetto \"flags\" oppure l'oggetto non è valido.",
+            "id": "Lelucon tidak memiliki objek \"flags\" atau objek tersebut tidak valid."
         },
         "parseJokesNoLangProperty": {
             "en": "Joke doesn't have a \"lang\" property or it is empty or of the wrong type.",
             "de": "Witz hat keine Eigenschaft \"lang\" oder sie ist leer oder vom falschen Typ.",
             "ru": "У шутки нет свойства \"lang\", или она пуста, или имеет неправильный тип.",
             "cs": "Vtip nemá vlastnost \"lang\" nebo je prázdná nebo nesprávného typu.",
-            "it": "La barzelletta non ha proprietà \"lang\" opppure è vuota o della tipologia errata."
+            "it": "La barzelletta non ha proprietà \"lang\" opppure è vuota o della tipologia errata.",
+            "id": "Lelucon tidak memiliki properti \"lang\" atau itu kosong atau bertipe salah."
         },
         "parseJokesLangPropertyInvalid": {
             "en": "Property \"lang\" is invalid: %1",
             "de": "Eigenschaft \"lang\" ist ungültig: %1",
-            "ru": "Собственность \"lang\" недействительна: %1",
+            "ru": "Свойство \"lang\" недействительно: %1",
             "cs": "Vlastnost \"lang\" je neplatná: %1",
-            "it": "La proprietà \"lang\" non è valida: %1"
+            "it": "La proprietà \"lang\" non è valida: %1",
+            "id": "Properti \"lang\" tidak valid: %1"
         },
         "parseJokesCantParse": {
             "en": "Joke couldn't be parsed: %1",
             "de": "Joke konnte nicht geparst werden: %1",
-            "ru": "Шутка не может быть разбита: %1"
+            "ru": "Шутка не может быть разбита: %1",
+            "cs": "Vtip nemohl být rozparsován: %1",
+            "it": "La barzelletta non può essere parsata: %1",
+            "id": "Lelucon tidak dapat diparse: %1"
         },
         "langModuleInitError": {
             "en": "Internal error: language module was not correctly initialized.",
             "de": "Interner Fehler: Sprach-Modul wurde nicht korrekt initialisiert.",
             "ru": "Внутренняя ошибка: языковой модуль был неправильно инициализирован.",
             "cs": "Interní chyba: jazykový modul nebyl správně inicializován.",
-            "it": "Errore interno: il modulo di linguaggio non è stato inizializzato correttamente."
+            "it": "Errore interno: il modulo di linguaggio non è stato inizializzato correttamente.",
+            "id": "Kesalahan internal: modul bahasa tidak diinisialisasi dengan benar."
         },
         "langCodeInvalidValue": {
             "en": "Language code is not a string or not two characters in length.",
             "de": "Der Sprachcode ist kein String oder nicht zwei Zeichen lang.",
             "ru": "Языковой код не является строкой или не состоит из двух символов.",
             "cs": "Kód jazyka není textový řetězec nebo není dva znaky dlouhý",
-            "it": "Il codice di linguaggio non è uno string oppure non è lungo due caratteri"
+            "it": "Il codice di linguaggio non è uno string oppure non è lungo due caratteri",
+            "id": "Kode bahasa bukan string atau tidak sepanjang dua karakter."
         },
         "langCodeDoesntExist": {
             "en": "Language code doesn't exist.",
             "de": "Der Sprachcode existiert nicht.",
             "ru": "Языкового кода не существует.",
             "cs": "Kód jazyka neexistuje.",
-            "it": "Il codice di linguaggio non esiste."
+            "it": "Il codice di linguaggio non esiste.",
+            "id": "Kode bahasa tidak ada."
         }
     }
 }

+ 9 - 0
package.json

@@ -83,6 +83,15 @@
       "contributions": [
         "Added Spanish jokes"
       ]
+    },
+    {
+      "name": "Ari Sohandri Putra",
+      "url": "https://github.com/arisohandriputra",
+      "contributions": [
+        "Added Indonesian translation",
+        "Fixed translations",
+        "Added Indonesian jokes"
+      ]
     }
   ],
   "license": "MIT",