diff --git a/CHANGELOG.md b/CHANGELOG.md
index 201fb81..a67fdc1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
# PrivateBin version history
* **1.4 (not yet released)**
+ * ADDED: Translation for Estonian
* **1.3.5 (2021-04-05)**
* ADDED: Translation for Hebrew, Lithuanian, Indonesian and Catalan
* ADDED: Make the project info configurable (#681)
diff --git a/CREDITS.md b/CREDITS.md
index 8b24f16..1aabf6f 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -50,3 +50,4 @@ Sébastien Sauvage - original idea and main developer
* Moo - Lithuanian
* whenwesober - Indonesian
* retiolus - Catalan
+* sarnane - Estonian
diff --git a/i18n/et.json b/i18n/et.json
new file mode 100644
index 0000000..877c732
--- /dev/null
+++ b/i18n/et.json
@@ -0,0 +1,188 @@
+{
+ "PrivateBin": "PrivateBin",
+ "%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s on minimalistlik, avatud lähtekoodiga online pastebin, kus serveril pole kleebitud andmete kohta teadmist. Andmed krüpteeritakse/dekrüpteeritakse %sbrauseris%s kasutades 256-bitist AES-i.",
+ "More information on the project page.": "Lisateave projekti lehel.",
+ "Because ignorance is bliss": "Kuna teadmatus on õndsus",
+ "en": "et",
+ "Paste does not exist, has expired or has been deleted.": "Kleebet ei eksisteeri, on aegunud või on kustutatud.",
+ "%s requires php %s or above to work. Sorry.": "%s vajab, et oleks php %s või kõrgem, et töötada. Vabandame.",
+ "%s requires configuration section [%s] to be present in configuration file.": "%s vajab, et [%s] seadistamise jaotis oleks olemas konfiguratsioonifailis.",
+ "Please wait %d seconds between each post.": [
+ "Palun oota %d sekund iga postituse vahel.",
+ "Palun oota %d sekundit iga postituse vahel.",
+ "Palun oota %d sekundit iga postituse vahel.",
+ "Palun oota %d sekundit iga postituse vahel."
+ ],
+ "Paste is limited to %s of encrypted data.": "Kleepe limiit on %s krüpteeritud andmeid.",
+ "Invalid data.": "Valed andmed.",
+ "You are unlucky. Try again.": "Sul ei vea. Proovi uuesti.",
+ "Error saving comment. Sorry.": "Viga kommentaari salvestamisel. Vabandame.",
+ "Error saving paste. Sorry.": "Viga kleepe salvestamisel. Vabandame.",
+ "Invalid paste ID.": "Vale kleepe ID.",
+ "Paste is not of burn-after-reading type.": "Kleebe ei ole põleta-pärast-lugemist tüüpi.",
+ "Wrong deletion token. Paste was not deleted.": "Vale kustutamiskood. Kleebet ei kustutatud.",
+ "Paste was properly deleted.": "Kleebe kustutati korralikult.",
+ "JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript on vajalik %s'i töötamiseks. Vabandame ebamugavuste pärast.",
+ "%s requires a modern browser to work.": "%s vajab töötamiseks kaasaegset brauserit.",
+ "New": "Uus",
+ "Send": "Saada",
+ "Clone": "Klooni",
+ "Raw text": "Lähtetekst",
+ "Expires": "Aegub",
+ "Burn after reading": "Põleta pärast lugemist",
+ "Open discussion": "Avatud arutelu",
+ "Password (recommended)": "Parool (soovitatav)",
+ "Discussion": "Arutelu",
+ "Toggle navigation": "Näita menüüd",
+ "%d seconds": [
+ "%d sekund",
+ "%d sekundit",
+ "%d sekundit",
+ "%d sekundit"
+ ],
+ "%d minutes": [
+ "%d minut",
+ "%d minutit",
+ "%d minutit",
+ "%d minutit"
+ ],
+ "%d hours": [
+ "%d tund",
+ "%d tundi",
+ "%d tundi",
+ "%d tundi"
+ ],
+ "%d days": [
+ "%d päev",
+ "%d päeva",
+ "%d päeva",
+ "%d päeva"
+ ],
+ "%d weeks": [
+ "%d nädal",
+ "%d nädalat",
+ "%d nädalat",
+ "%d nädalat"
+ ],
+ "%d months": [
+ "%d kuu",
+ "%d kuud",
+ "%d kuud",
+ "%d kuud"
+ ],
+ "%d years": [
+ "%d aasta",
+ "%d aastat",
+ "%d aastat",
+ "%d aastat"
+ ],
+ "Never": "Mitte kunagi",
+ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Märge: See on testimisteenus: Andmeid võidakse igal ajal kustutada. Kiisupojad hukuvad, kui seda teenust kuritarvitad.",
+ "This document will expire in %d seconds.": [
+ "See dokument aegub %d sekundi pärast.",
+ "See dokument aegub %d sekundi pärast.",
+ "See dokument aegub %d sekundi pärast.",
+ "See dokument aegub %d sekundi pärast."
+ ],
+ "This document will expire in %d minutes.": [
+ "See dokument aegub %d minuti pärast.",
+ "See dokument aegub %d minuti pärast.",
+ "See dokument aegub %d minuti pärast.",
+ "See dokument aegub %d minuti pärast."
+ ],
+ "This document will expire in %d hours.": [
+ "See dokument aegub %d tunni pärast.",
+ "See dokument aegub %d tunni pärast.",
+ "See dokument aegub %d tunni pärast.",
+ "See dokument aegub %d tunni pärast."
+ ],
+ "This document will expire in %d days.": [
+ "See dokument aegub %d päeva pärast.",
+ "See dokument aegub %d päeva pärast.",
+ "See dokument aegub %d päeva pärast.",
+ "See dokument aegub %d päeva pärast."
+ ],
+ "This document will expire in %d months.": [
+ "See dokument aegub %d kuu pärast.",
+ "See dokument aegub %d kuu pärast.",
+ "See dokument aegub %d kuu pärast.",
+ "See dokument aegub %d kuu pärast."
+ ],
+ "Please enter the password for this paste:": "Palun sisesta selle kleepe parool:",
+ "Could not decrypt data (Wrong key?)": "Ei suutnud andmeid dekrüpteerida (Vale võti?)",
+ "Could not delete the paste, it was not stored in burn after reading mode.": "Ei suutnud kleebet kustutada, seda ei salvestatud põleta pärast lugemist režiimis.",
+ "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "AINULT SINU SILMADELE. Ära sulge seda akent, seda sõnumit ei saa enam kuvada.",
+ "Could not decrypt comment; Wrong key?": "Ei suutnud kommentaari dekrüpteerida; Vale võti?",
+ "Reply": "Vasta",
+ "Anonymous": "Anonüümne",
+ "Avatar generated from IP address": "Avatar genereeritud IP aadressi põhjal",
+ "Add comment": "Lisa kommentaar",
+ "Optional nickname…": "Valikuline hüüdnimi…",
+ "Post comment": "Postita kommentaar",
+ "Sending comment…": "Kommentaari saatmine…",
+ "Comment posted.": "Kommentaar postitatud.",
+ "Could not refresh display: %s": "Ei suutnud kuva värskendada: %s",
+ "unknown status": "tundmatu staatus",
+ "server error or not responding": "serveri viga või ei vasta",
+ "Could not post comment: %s": "Ei suutnud kommentaari postitada: %s",
+ "Sending paste…": "Kleepe saatmine…",
+ "Your paste is %s(Hit [Ctrl]+[c] to copy)": "Sinu kleebe on %s(Kopeerimiseks vajuta [Ctrl]+[c])",
+ "Delete data": "Kustuta andmed",
+ "Could not create paste: %s": "Ei suutnud kleebet luua: %s",
+ "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Ei suutnud kleebet dekrüpteerida: Dekrüpteerimisvõti on URL-ist puudu (Kas kasutasid ümbersuunajat või URL-i lühendajat, mis eemaldab osa URL-ist?)",
+ "B": "B",
+ "KiB": "KiB",
+ "MiB": "MiB",
+ "GiB": "GiB",
+ "TiB": "TiB",
+ "PiB": "PiB",
+ "EiB": "EiB",
+ "ZiB": "ZiB",
+ "YiB": "YiB",
+ "Format": "Formaat",
+ "Plain Text": "Lihttekst",
+ "Source Code": "Lähtekood",
+ "Markdown": "Markdown",
+ "Download attachment": "Laadi manus alla",
+ "Cloned: '%s'": "Kloonitud: '%s'",
+ "The cloned file '%s' was attached to this paste.": "Kloonitud fail '%s' manustati sellele kleepele.",
+ "Attach a file": "Manusta fail",
+ "alternatively drag & drop a file or paste an image from the clipboard": "teise võimalusena lohista fail või kleebi pilt lõikelaualt",
+ "File too large, to display a preview. Please download the attachment.": "Fail on eelvaate kuvamiseks liiga suur. Palun laadi manus alla.",
+ "Remove attachment": "Eemalda manus",
+ "Your browser does not support uploading encrypted files. Please use a newer browser.": "Sinu brauser ei toeta krüpteeritud failide üleslaadimist. Palun kasuta uuemat brauserit.",
+ "Invalid attachment.": "Sobimatu manus.",
+ "Options": "Valikud",
+ "Shorten URL": "Lühenda URL",
+ "Editor": "Toimetaja",
+ "Preview": "Eelvaade",
+ "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s vajab, et PATH lõppeks järgmisega: \"%s\". Palun uuenda PATH-i oma index.php failis.",
+ "Decrypt": "Dekrüpteeri",
+ "Enter password": "Sisesta parool",
+ "Loading…": "Laadimine…",
+ "Decrypting paste…": "Kleepe dekrüpteerimine…",
+ "Preparing new paste…": "Uue kleepe ettevalmistamine…",
+ "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": "Kui see sõnum ei kao, palun vaata seda KKK-d, et saada tõrkeotsinguks teavet..",
+ "+++ no paste text +++": "+++ kleepe tekst puudub +++",
+ "Could not get paste data: %s": "Ei suutnud saada kleepe andmeid: %s",
+ "QR code": "QR kood",
+ "This website is using an insecure HTTP connection! Please use it only for testing.": "See veebisait kasutab ebaturvalist HTTP ühendust! Palun kasuta seda ainult katsetamiseks.",
+ "For more information see this FAQ entry.": "Lisateabe saamiseks vaata seda KKK sissekannet.",
+ "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": "Sinu brauser võib vajada HTTPS ühendust, et toetada WebCrypto API-d. Proovi üle minna HTTPS-ile.",
+ "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Sinu brauser ei toeta WebAssembly't, mida kasutatakse zlib tihendamiseks. Sa saad luua tihendamata dokumente, kuid ei saa lugeda tihendatuid.",
+ "waiting on user to provide a password": "ootan parooli sisestamist kasutajalt",
+ "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Ei suutnud andmeid dekrüpteerida. Kas sisestasid vale parooli? Proovi uuesti üleval asuva nupuga.",
+ "Retry": "Proovi uuesti",
+ "Showing raw text…": "Lähteteksti näitamine…",
+ "Notice:": "Teade:",
+ "This link will expire after %s.": "See link aegub: %s.",
+ "This link can only be accessed once, do not use back or refresh button in your browser.": "Sellele lingile saab vaid üks kord ligi pääseda, ära kasuta tagasi või värskenda nuppe sinu brauseris.",
+ "Link:": "Link:",
+ "Recipient may become aware of your timezone, convert time to UTC?": "Saaja võib saada teada sinu ajavööndi, kas teisendada aeg UTC-ks?",
+ "Use Current Timezone": "Kasuta praegust ajavööndit",
+ "Convert To UTC": "Teisenda UTC-ks",
+ "Close": "Sulge",
+ "Encrypted note on PrivateBin": "Krüpteeritud kiri PrivateBin-is",
+ "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Kirja nägemiseks külasta seda linki. Teistele URL-i andmine lubab ka neil ligi pääseda kirjale.",
+ "URL shortener may expose your decrypt key in URL.": "URL-i lühendaja võib paljastada sinu dekrüpteerimisvõtme URL-is."
+}
diff --git a/i18n/lt.json b/i18n/lt.json
index f973f4f..7ef45bf 100644
--- a/i18n/lt.json
+++ b/i18n/lt.json
@@ -1,7 +1,7 @@
{
"PrivateBin": "PrivateBin",
"%s is a minimalist, open source online pastebin where the server has zero knowledge of pasted data. Data is encrypted/decrypted %sin the browser%s using 256 bits AES.": "%s yra minimalistinis, atvirojo kodo internetinis įdėjimų dėklas, kurį naudojant, serveris nieko nenutuokia apie įdėtus duomenis. Duomenys yra šifruojami/iššifruojami %snaršyklėje%s naudojant 256 bitų AES.",
- "More information on the project page.": "Daugiau informacijos rasite projeketo puslapyje.",
+ "More information on the project page.": "Daugiau informacijos rasite projekto puslapyje.",
"Because ignorance is bliss": "Nes nežinojimas yra palaima",
"en": "lt",
"Paste does not exist, has expired or has been deleted.": "Įdėjimo nėra, jis nebegalioja arba buvo ištrintas.",
@@ -184,5 +184,5 @@
"Close": "Užverti",
"Encrypted note on PrivateBin": "Šifruoti užrašai ties PrivateBin",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Norėdami matyti užrašus, aplankykite šį tinklalapį. Pasidalinus šiuo URL adresu su kitais žmonėmis, jiems taip pat bus leidžiama prieiga prie šių užrašų.",
- "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL."
+ "URL shortener may expose your decrypt key in URL.": "URL trumpinimo įrankis gali atskleisti URL adrese jūsų iššifravimo raktą."
}
diff --git a/i18n/zh.json b/i18n/zh.json
index 67a456f..2e1dc12 100644
--- a/i18n/zh.json
+++ b/i18n/zh.json
@@ -111,7 +111,7 @@
"Please enter the password for this paste:": "请输入这份粘贴内容的密码:",
"Could not decrypt data (Wrong key?)": "无法解密数据(密钥错误?)",
"Could not delete the paste, it was not stored in burn after reading mode.": "无法删除此粘贴内容,它没有以阅后即焚模式保存。",
- "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "注意啦!!!不要关闭窗口,否则你再也见不到这条消息了。",
+ "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "看!仔!细!了!不要关闭窗口,否则你再也见不到这条消息了。",
"Could not decrypt comment; Wrong key?": "无法解密评论; 密钥错误?",
"Reply": "回复",
"Anonymous": "匿名",
@@ -162,7 +162,7 @@
"Loading…": "载入中…",
"Decrypting paste…": "正在解密",
"Preparing new paste…": "正在准备新的粘贴内容",
- "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": "如果这个消息一直存在,请参考 这里的 参考文档(英文版)进行故障排除。",
+ "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": "如果这个消息一直存在,请参考 这里的 FAQ (英文版)进行故障排除。",
"+++ no paste text +++": "+++ 没有粘贴内容 +++",
"Could not get paste data: %s": "无法获取粘贴数据:%s",
"QR code": "二维码",
@@ -184,5 +184,5 @@
"Close": "关闭",
"Encrypted note on PrivateBin": "PrivateBin上的加密笔记",
"Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "访问这个链接来查看该笔记。 将这个URL发送给任何人即可允许其访问该笔记。",
- "URL shortener may expose your decrypt key in URL.": "URL shortener may expose your decrypt key in URL."
+ "URL shortener may expose your decrypt key in URL.": "URL 缩短可能会暴露您在 URL 中的解密密钥。"
}
diff --git a/js/privatebin.js b/js/privatebin.js
index 42cdd96..e549dd6 100644
--- a/js/privatebin.js
+++ b/js/privatebin.js
@@ -601,7 +601,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
* @prop {string[]}
* @readonly
*/
- const supportedLanguages = ['bg', 'cs', 'de', 'es', 'fr', 'he', 'hu', 'it', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sl', 'uk', 'zh'];
+ const supportedLanguages = ['bg', 'ca', 'cs', 'de', 'es', 'et', 'fr', 'he', 'hu', 'id', 'it', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sl', 'uk', 'zh'];
/**
* built in language
@@ -767,7 +767,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
/**
* per language functions to use to determine the plural form
*
- * @see {@link http://localization-guide.readthedocs.org/en/latest/l10n/pluralforms.html}
+ * @see {@link https://localization-guide.readthedocs.org/en/latest/l10n/pluralforms.html}
* @name I18n.getPluralForm
* @function
* @param {int} n
@@ -795,7 +795,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
return n % 10 === 1 && n % 100 !== 11 ? 0 : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
case 'sl':
return n % 100 === 1 ? 1 : (n % 100 === 2 ? 2 : (n % 100 === 3 || n % 100 === 4 ? 3 : 0));
- // bg, ca, de, en, es, hu, it, nl, no, pt
+ // bg, ca, de, en, es, et, hu, it, nl, no, pt
default:
return n !== 1 ? 1 : 0;
}
diff --git a/lib/I18n.php b/lib/I18n.php
index ea7d07f..50bf0cc 100644
--- a/lib/I18n.php
+++ b/lib/I18n.php
@@ -305,7 +305,7 @@ class I18n
/**
* determines the plural form to use based on current language and given number
*
- * From: http://localization-guide.readthedocs.org/en/latest/l10n/pluralforms.html
+ * From: https://localization-guide.readthedocs.org/en/latest/l10n/pluralforms.html
*
* @access protected
* @static
@@ -334,7 +334,7 @@ class I18n
return $n % 10 == 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
case 'sl':
return $n % 100 == 1 ? 1 : ($n % 100 == 2 ? 2 : ($n % 100 == 3 || $n % 100 == 4 ? 3 : 0));
- // bg, ca, de, en, es, hu, it, nl, no, pt
+ // bg, ca, de, en, es, et, hu, it, nl, no, pt
default:
return $n != 1 ? 1 : 0;
}
diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php
index a86faf3..ffea872 100644
--- a/tpl/bootstrap.php
+++ b/tpl/bootstrap.php
@@ -72,7 +72,7 @@ endif;
?>
-
+
diff --git a/tpl/page.php b/tpl/page.php
index 6dd4331..e58617d 100644
--- a/tpl/page.php
+++ b/tpl/page.php
@@ -50,7 +50,7 @@ endif;
?>
-
+