diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3d39cd30..9a817590 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,7 @@
# PrivateBin version history
## 1.6.3 (not yet released)
+* ADDED: Translations for Romanian
* ADDED: Detect and report on damaged pastes (#1218)
* CHANGED: Upgrading libraries to: zlib 1.3
* FIXED: Support more types of valid URLs for shorteners, incl. IDN ones (#1224)
diff --git a/CREDITS.md b/CREDITS.md
index 59e7892f..e77348d4 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -65,3 +65,4 @@
* jaideejung007 - Thai
* Nicolas Le Gall - Japanese
* lazerns - Arabic
+* Edward205 - Romanian
diff --git a/i18n/ro.json b/i18n/ro.json
new file mode 100644
index 00000000..169e57b3
--- /dev/null
+++ b/i18n/ro.json
@@ -0,0 +1,218 @@
+{
+ "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 este un pastebin online, minimalist și cu sursă deschisă unde serverul are zero acces la datele introduse. Datele sunt criptate/decriptate %sîn browser%s folosind AES cu 256 de biți.",
+ "More information on the project page.": "Mai multe informații pe pagina proiectului.",
+ "Because ignorance is bliss": "Ignoranța este o binecuvântare",
+ "Paste does not exist, has expired or has been deleted.": "Paste-ul nu există, a expirat sau a fost șters.",
+ "%s requires php %s or above to work. Sorry.": "%s necesită php %s sau mai nou pentru a funcționa. Scuze.",
+ "%s requires configuration section [%s] to be present in configuration file.": "%s necesită ca secțiunea de configurare [%s] să fie prezentă în fișierul de configurare.",
+ "Please wait %d seconds between each post.": [
+ "Vă rugăm să așteptați %d secundă între fiecare postare",
+ "Vă rugăm să așteptați %d secunde între fiecare postare",
+ "Vă rugăm să așteptați %d de secunde între fiecare postare",
+ "Please wait %d seconds between each post. (3rd plural)",
+ "Please wait %d seconds between each post. (4th plural)",
+ "Please wait %d seconds between each post. (5th plural)"
+ ],
+ "Paste is limited to %s of encrypted data.": "Paste-ul este limitat la %s de date criptate.",
+ "Invalid data.": "Date invalide.",
+ "You are unlucky. Try again.": "Ați avut ghinion. Încercați din nou.",
+ "Error saving comment. Sorry.": "Eroare la salvarea comentariului. Ne pare rău.",
+ "Error saving paste. Sorry.": "Eroare la salvarea paste-ului. Ne pare rău.",
+ "Invalid paste ID.": "ID paste invalid.",
+ "Paste is not of burn-after-reading type.": "Paste-ul nu se șterge după citire.",
+ "Wrong deletion token. Paste was not deleted.": "Token de ștergere incorect. Paste-ul nu a fost șters.",
+ "Paste was properly deleted.": "Paste-ul a fost șters cu succes.",
+ "JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript este necesar pentru ca %s să funcționeze. Ne cerem scuze pentru neplăceri.",
+ "%s requires a modern browser to work.": "%s necesită un browser modern pentru a funcționa.",
+ "New": "Nou",
+ "Send": "Trimiteți",
+ "Clone": "Clonați",
+ "Raw text": "Text brut",
+ "Expires": "Expiră",
+ "Burn after reading": "Ștergere după citire",
+ "Open discussion": "Deschideți discuția",
+ "Password (recommended)": "Parolă (recomandată)",
+ "Discussion": "Discuție",
+ "Toggle navigation": "Comutați navigarea",
+ "%d seconds": [
+ "%d secundă",
+ "%d secunde",
+ "%d de secunde",
+ "%d seconds (3rd plural)",
+ "%d seconds (4th plural)",
+ "%d seconds (5th plural)"
+ ],
+ "%d minutes": [
+ "%d minut",
+ "%d minute",
+ "%d de minute",
+ "%d minutes (3rd plural)",
+ "%d minutes (4th plural)",
+ "%d minutes (5th plural)"
+ ],
+ "%d hours": [
+ "%d oră",
+ "%d ore",
+ "%d de ore",
+ "%d hours (3rd plural)",
+ "%d hours (4th plural)",
+ "%d hours (5th plural)"
+ ],
+ "%d days": [
+ "%d zi",
+ "%d zile",
+ "%d de zile",
+ "%d days (3rd plural)",
+ "%d days (4th plural)",
+ "%d days (5th plural)"
+ ],
+ "%d weeks": [
+ "%d week (singular)",
+ "%d săptămână",
+ "%d săptămâni",
+ "%d de săptămâni",
+ "%d weeks (4th plural)",
+ "%d weeks (5th plural)"
+ ],
+ "%d months": [
+ "%d lună",
+ "%d luni",
+ "%d de luni",
+ "%d months (3rd plural)",
+ "%d months (4th plural)",
+ "%d months (5th plural)"
+ ],
+ "%d years": [
+ "%d an",
+ "%d ani",
+ "%d de ani",
+ "%d years (3rd plural)",
+ "%d years (4th plural)",
+ "%d years (5th plural)"
+ ],
+ "Never": "Niciodată",
+ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Notă: Acesta este un serviciu de test: Datele ar putea fi șterse oricând. Vor muri niște pisicuțe dacă abuzați acest serviciu.",
+ "This document will expire in %d seconds.": [
+ "Acest document va expira în %d secundă.",
+ "Acest document va expira în %d secunde.",
+ "Acest document va expira în %d de secunde.",
+ "This document will expire in %d seconds. (3rd plural)",
+ "This document will expire in %d seconds. (4th plural)",
+ "This document will expire in %d seconds. (5th plural)"
+ ],
+ "This document will expire in %d minutes.": [
+ "This document will expire in %d minute. (singular)",
+ "This document will expire in %d minutes. (1st plural)",
+ "This document will expire in %d minutes. (2nd plural)",
+ "This document will expire in %d minutes. (3rd plural)",
+ "This document will expire in %d minutes. (4th plural)",
+ "This document will expire in %d minutes. (5th plural)"
+ ],
+ "This document will expire in %d hours.": [
+ "Acest document va expira în %d oră.",
+ "Acest document va expira în %d ore.",
+ "Acest document va expira în %d de ore.",
+ "This document will expire in %d hours. (3rd plural)",
+ "This document will expire in %d hours. (4th plural)",
+ "This document will expire in %d hours. (5th plural)"
+ ],
+ "This document will expire in %d days.": [
+ "Acest document va expira în %d zi.",
+ "Acest document va expira în %d zile.",
+ "Acest document va expira în %d de zile.",
+ "This document will expire in %d days. (3rd plural)",
+ "This document will expire in %d days. (4th plural)",
+ "This document will expire in %d days. (5th plural)"
+ ],
+ "This document will expire in %d months.": [
+ "Acest document va expira în %d lună.",
+ "Acest document va expira în %d luni.",
+ "Acest document va expira în %d de luni.",
+ "This document will expire in %d months. (3rd plural)",
+ "This document will expire in %d months. (4th plural)",
+ "This document will expire in %d months. (5th plural)"
+ ],
+ "Please enter the password for this paste:": "Va rugăm să introduceți parola pentru acest paste:",
+ "Could not decrypt data (Wrong key?)": "Nu s-au putut decripta datele (Cheie gresită?)",
+ "Could not delete the paste, it was not stored in burn after reading mode.": "Nu s-a putut șterge paste-ul, nu a fost stocat în modul de ștergere după citire.",
+ "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "NUMAI PENTRU OCHII DVS. Nu închideți această fereastră, acest mesaj nu poate fi afișat din nou.",
+ "Could not decrypt comment; Wrong key?": "Nu s-a putut decripta comentariul; Cheie greșită?",
+ "Reply": "Răspundeți",
+ "Anonymous": "Anonim",
+ "Avatar generated from IP address": "Avatar generat din adresa IP",
+ "Add comment": "Adăugați un comentariu",
+ "Optional nickname…": "Poreclă opțională…",
+ "Post comment": "Postați comentariul",
+ "Sending comment…": "Se trimite comentariul…",
+ "Comment posted.": "Comentariul a fost postat.",
+ "Could not refresh display: %s": "Nu s-a putut actualiza afișarea: %s",
+ "unknown status": "stare necunoscută",
+ "server error or not responding": "eroare de server sau nu răspunde",
+ "Could not post comment: %s": "Nu s-a putut posta comentariul: %s",
+ "Sending paste…": "Se trimite paste-ul…",
+ "Your paste is %s(Hit [Ctrl]+[c] to copy)": "Paste-ul dvs. este %s(Apăsați [Ctrl]+[c] pentru a copia)",
+ "Delete data": "Ștergeți datele",
+ "Could not create paste: %s": "Nu s-a putut crea paste-ul: %s",
+ "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Nu s-a putut decripta paste-ul: Cheia de decriptare lipsește din URL (Ați folosit un redirector sau un scurtător de URL care a tăiat o parte din URL?)",
+ "B": "B",
+ "KiB": "KiB",
+ "MiB": "MiB",
+ "GiB": "GiB",
+ "TiB": "TiB",
+ "PiB": "PiB",
+ "EiB": "EiB",
+ "ZiB": "ZiB",
+ "YiB": "YiB",
+ "Format": "Formatare",
+ "Plain Text": "Text neformatat",
+ "Source Code": "Cod sursă",
+ "Markdown": "Markdown",
+ "Download attachment": "Descărcați fișierul atașat",
+ "Cloned: '%s'": "S-a clonat: '%s'",
+ "The cloned file '%s' was attached to this paste.": "Fișierul clonat '%s' a fost atașat la acest paste.",
+ "Attach a file": "Atașați un fișier",
+ "alternatively drag & drop a file or paste an image from the clipboard": "alternativ, trageți și plasați un fișier sau lipiți o imagine din clipboard",
+ "File too large, to display a preview. Please download the attachment.": "Fișierul este prea mare pentru a afișa o previzualizare. Vă rugăm să descărcaţi fișierul.",
+ "Remove attachment": "Eliminați fișierul atașat",
+ "Your browser does not support uploading encrypted files. Please use a newer browser.": "Browserul dvs. nu acceptă încărcarea fișierelor criptate. Vă rugăm să folosiți un browser mai nou.",
+ "Invalid attachment.": "Fișier invalid.",
+ "Options": "Opţiuni",
+ "Shorten URL": "Scurtați URL-ul",
+ "Editor": "Editor",
+ "Preview": "Previzualizare",
+ "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s necesită ca PATH să se termine cu \"%s\". Vă rugăm să actualizați PATH în index.php.",
+ "Decrypt": "Decriptare",
+ "Enter password": "Introduceţi parola",
+ "Loading…": "Se încarcă…",
+ "Decrypting paste…": "Se decriptează paste-ul…",
+ "Preparing new paste…": "Se pregătește un paste nou…",
+ "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": "În cazul în care acest mesaj nu dispare niciodată, vă rugăm să aruncaţi o privire la acest FAQ pentru informații de depanare.",
+ "+++ no paste text +++": "+++ fără text +++",
+ "Could not get paste data: %s": "Nu s-a putut obține datele paste-ului: %s",
+ "QR code": "Cod QR",
+ "This website is using an insecure HTTP connection! Please use it only for testing.": "Acest website folosește o conexiune HTTP nesigură! Vă rugăm să îl folosiți doar pentru teste.",
+ "For more information see this FAQ entry.": "Pentru mai multe informații a se vedea secțiunea FAQ.",
+ "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": "Este posibil ca browserul dvs. să necesite o conexiune HTTPS pentru a suporta API-ul WebCrypto. Încercați să comutați la HTTPS.",
+ "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "Browserul dvs. nu acceptă WebAssembly folosit pentru compresia zlib. Puteți crea documente necompresate, dar nu le puteți citi pe cele compresate.",
+ "waiting on user to provide a password": "se așteaptă ca utilizatorul să furnizeze o parolă",
+ "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Nu s-au putut decripta datele. Ați introdus parola greșită? Reîncercați folosind butonul de sus.",
+ "Retry": "Reîncercați",
+ "Showing raw text…": "Se afișează textul brut…",
+ "Notice:": "Observaţie:",
+ "This link will expire after %s.": "Acest link va expira după %s.",
+ "This link can only be accessed once, do not use back or refresh button in your browser.": "Acest link poate fi accesat o singură dată, nu folosiți butonul înapoi sau reîmprospătare din browserul dvs.",
+ "Link:": "Link:",
+ "Recipient may become aware of your timezone, convert time to UTC?": "Destinatarul vă poate afla fusul dvs. orar, convertiți timpul în UTC?",
+ "Use Current Timezone": "Se folosește fusul orar actual",
+ "Convert To UTC": "Convertire la UTC",
+ "Close": "Închideți",
+ "Encrypted note on %s": "Notă criptată pe %s",
+ "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Accesați acest link pentru a vedea nota. Nota poate fi accesată de către oricine care are acest URL.",
+ "URL shortener may expose your decrypt key in URL.": "Scurtătorul de URL ar putea să vă expună cheia de decriptare din URL.",
+ "Save paste": "Salvați paste-ul",
+ "Your IP is not authorized to create pastes.": "Adresa dvs. IP nu este autorizată să creeze paste-uri.",
+ "Trying to shorten a URL that isn't pointing at our instance.": "Încercarea de a scurta un URL care nu direcționează spre instanța noastră.",
+ "Error calling YOURLS. Probably a configuration issue, like wrong or missing \"apiurl\" or \"signature\".": "Eroare la apelarea YOURLS. Probabil o problemă de configurare, cum ar fi \"apiurl\" sau \"signature\" greșite sau lipsă.",
+ "Error parsing YOURLS response.": "Eroare la analizarea răspunsului YOURLS."
+}
diff --git a/js/privatebin.js b/js/privatebin.js
index 9196ca5f..518cf32a 100644
--- a/js/privatebin.js
+++ b/js/privatebin.js
@@ -627,7 +627,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
* @prop {string[]}
* @readonly
*/
- const supportedLanguages = ['ar', 'bg', 'ca', 'co', 'cs', 'de', 'el', 'es', 'et', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'jbo', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sk', 'sl', 'th', 'tr', 'uk', 'zh'];
+ const supportedLanguages = ['ar', 'bg', 'ca', 'co', 'cs', 'de', 'el', 'es', 'et', 'fi', 'fr', 'he', 'hu', 'id', 'it', 'ja', 'jbo', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ro', 'ru', 'sk', 'sl', 'th', 'tr', 'uk', 'zh'];
/**
* built in language
@@ -836,6 +836,8 @@ jQuery.PrivateBin = (function($, RawDeflate) {
return n % 10 === 1 && n % 100 !== 11 ? 0 : ((n % 10 >= 2 && n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
case 'pl':
return n === 1 ? 0 : (n % 10 >= 2 && n %10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
+ case 'ro':
+ return n === 1 ? 0 : ((n === 0 || (n % 100 > 0 && n % 100 < 20)) ? 1 : 2);
case 'ru':
case 'uk':
return n % 10 === 1 && n % 100 !== 11 ? 0 : (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2);
diff --git a/lib/I18n.php b/lib/I18n.php
index 22142c00..77500aff 100644
--- a/lib/I18n.php
+++ b/lib/I18n.php
@@ -356,6 +356,8 @@ class I18n
return $n % 10 === 1 && $n % 100 !== 11 ? 0 : (($n % 10 >= 2 && $n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
case 'pl':
return $n === 1 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
+ case 'ro':
+ return $n === 1 ? 0 : (($n === 0 || ($n % 100 > 0 && $n % 100 < 20)) ? 1 : 2);
case 'ru':
case 'uk':
return $n % 10 === 1 && $n % 100 != 11 ? 0 : ($n % 10 >= 2 && $n % 10 <= 4 && ($n % 100 < 10 || $n % 100 >= 20) ? 1 : 2);
diff --git a/tpl/bootstrap.php b/tpl/bootstrap.php
index 0cf27f5f..6b6efa05 100644
--- a/tpl/bootstrap.php
+++ b/tpl/bootstrap.php
@@ -73,7 +73,7 @@ endif;
?>
-
+
diff --git a/tpl/page.php b/tpl/page.php
index 7e62f37e..7acf2bb5 100644
--- a/tpl/page.php
+++ b/tpl/page.php
@@ -51,7 +51,7 @@ endif;
?>
-
+