diff --git a/CHANGELOG.md b/CHANGELOG.md
index fcda590a..e14337fc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,7 +1,7 @@
# PrivateBin version history
* **1.4 (not yet released)**
- * ADDED: Translations for Estonian and Lojban
+ * ADDED: Translations for Corsican, Estonian and Lojban
* ADDED: new HTTP headers improving security (#765)
* ADDED: Download button for paste text (#774)
* ADDED: Opt-out of federated learning of cohorts (FLoC) (#776)
diff --git a/CREDITS.md b/CREDITS.md
index de0ebe81..536042b1 100644
--- a/CREDITS.md
+++ b/CREDITS.md
@@ -55,3 +55,4 @@ Sébastien Sauvage - original idea and main developer
* retiolus - Catalan
* sarnane - Estonian
* foxsouns - Lojban
+* Patriccollu di Santa Maria è Sichè - Corsican
diff --git a/i18n/co.json b/i18n/co.json
new file mode 100644
index 00000000..652d0d75
--- /dev/null
+++ b/i18n/co.json
@@ -0,0 +1,189 @@
+{
+ "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 hè un serviziu in linea di tipu « pastebin » (ghjestiunariu d’appiccicu di pezzi di testu è di codice di fonte) minimalistu è à fonte aperta induve u servitore ùn hà micca cunnuscenza di i dati mandati. I dati sò cifrati è dicifrati %sin u navigatore%s cù una cifratura AES di 256 bit.",
+ "More information on the project page.": "Più d’infurmazione annant’à a pagina di u prughjettu<\/a>.",
+ "Because ignorance is bliss": "Perchè l’ignurenza hè una campa",
+ "en": "co",
+ "Paste does not exist, has expired or has been deleted.": "L’appiccicu ùn esiste micca, hè scadutu o hè statu squassatu.",
+ "%s requires php %s or above to work. Sorry.": "Per disgrazzia, %s richiede php %s o più recente per funziunà. ",
+ "%s requires configuration section [%s] to be present in configuration file.": "%s richiede a presenza di a sezzione di cunfigurazione [%s] in a schedariu di cunfigurazione.",
+ "Please wait %d seconds between each post.": [
+ "Aspettate %d seconda trà dui publicazioni.",
+ "Aspettate %d seconde trà dui publicazioni.",
+ "Please wait %d seconds between each post. (2nd plural)",
+ "Please wait %d seconds between each post. (3rd plural)"
+ ],
+ "Paste is limited to %s of encrypted data.": "L’appiccicu hè limitatu à %s di dati cifrati.",
+ "Invalid data.": "Dati inaccetevule.",
+ "You are unlucky. Try again.": "Pruvate torna, Serete più furtunati.",
+ "Error saving comment. Sorry.": "Sbagliu à l’arregistramentu di u cummentu. ",
+ "Error saving paste. Sorry.": "Sbagliu à l’arregistramentu di l’appiccicu. ",
+ "Invalid paste ID.": "N° di l’appiccicu inaccettevule.",
+ "Paste is not of burn-after-reading type.": "L’appiccicu ùn hè micca di tipu « Squassà dopu a lettura ».",
+ "Wrong deletion token. Paste was not deleted.": "Gettone di squassatura incurrettu. L’appiccicu ùn hè micca statu squassatu.",
+ "Paste was properly deleted.": "L’appiccicu hè statu squassatu currettamente.",
+ "JavaScript is required for %s to work. Sorry for the inconvenience.": "JavaScript hè richiestu per fà funziunà %s. Scusate per stu penseru.",
+ "%s requires a modern browser to work.": "%s richiede un navigatore mudernu per funziunà.",
+ "New": "Novu",
+ "Send": "Mandà",
+ "Clone": "Duppione",
+ "Raw text": "Testu grossu",
+ "Expires": "Scadenza",
+ "Burn after reading": "Squassà dopu a lettura",
+ "Open discussion": "Apre una chjachjarata",
+ "Password (recommended)": "Parolla d’intesa (ricumandata)",
+ "Discussion": "Chjachjarata",
+ "Toggle navigation": "Invertisce a navigazione",
+ "%d seconds": [
+ "%d seconda",
+ "%d seconde",
+ "%d seconds (2nd plural)",
+ "%d seconds (3rd plural)"
+ ],
+ "%d minutes": [
+ "%d minutu",
+ "%d minuti",
+ "%d minutes (2nd plural)",
+ "%d minutes (3rd plural)"
+ ],
+ "%d hours": [
+ "%d ora",
+ "%d ore",
+ "%d hours (2nd plural)",
+ "%d hours (3rd plural)"
+ ],
+ "%d days": [
+ "%d ghjornu",
+ "%d ghjorni",
+ "%d days (2nd plural)",
+ "%d days (3rd plural)"
+ ],
+ "%d weeks": [
+ "%d settimana",
+ "%d settimane",
+ "%d weeks (2nd plural)",
+ "%d weeks (3rd plural)"
+ ],
+ "%d months": [
+ "%d mese",
+ "%d mesi",
+ "%d months (2nd plural)",
+ "%d months (3rd plural)"
+ ],
+ "%d years": [
+ "%d annu",
+ "%d anni",
+ "%d years (2nd plural)",
+ "%d years (3rd plural)"
+ ],
+ "Never": "Mai",
+ "Note: This is a test service: Data may be deleted anytime. Kittens will die if you abuse this service.": "Nota : Què hè un serviziu di prova ; i dati ponu esse squassati à ogni mumentu. Parechji catorni anu da esse tombi s’è vò impiegate troppu stu serviziu.",
+ "This document will expire in %d seconds.": [
+ "Stu ducumentu serà scadutu in %d seconda.",
+ "Stu ducumentu serà scadutu in %d seconde.",
+ "This document will expire in %d seconds. (2nd plural)",
+ "This document will expire in %d seconds. (3rd plural)"
+ ],
+ "This document will expire in %d minutes.": [
+ "Stu ducumentu serà scadutu in %d minutu.",
+ "Stu ducumentu serà scadutu in %d minuti.",
+ "This document will expire in %d minutes. (2nd plural)",
+ "This document will expire in %d minutes. (3rd plural)"
+ ],
+ "This document will expire in %d hours.": [
+ "Stu ducumentu serà scadutu in %d ora.",
+ "Stu ducumentu serà scadutu in %d ore.",
+ "This document will expire in %d hours. (2nd plural)",
+ "This document will expire in %d hours. (3rd plural)"
+ ],
+ "This document will expire in %d days.": [
+ "Stu ducumentu serà scadutu in %d ghjornu.",
+ "Stu ducumentu serà scadutu in %d ghjorni.",
+ "This document will expire in %d days. (2nd plural)",
+ "This document will expire in %d days. (3rd plural)"
+ ],
+ "This document will expire in %d months.": [
+ "Stu ducumentu serà scadutu in %d mese.",
+ "Stu ducumentu serà scadutu in %d mesi.",
+ "This document will expire in %d months. (2nd plural)",
+ "This document will expire in %d months. (3rd plural)"
+ ],
+ "Please enter the password for this paste:": "Stampittate a parolla d’intesa per st’appiccicu :",
+ "Could not decrypt data (Wrong key?)": "Ùn si pò micca dicifrà i dati ; seria incurretta a chjave ?",
+ "Could not delete the paste, it was not stored in burn after reading mode.": "Ùn si pò micca squassà l’appiccicu, ùn hè micca statu in u modu « Squassà dopu a lettura ».",
+ "FOR YOUR EYES ONLY. Don't close this window, this message can't be displayed again.": "SOLU CÙ L’OCHJI. Ùn chjudite micca sta finestra, stu messaghju un puderà più esse affissatu torna.",
+ "Could not decrypt comment; Wrong key?": "Ùn si pò micca dicifrà u cummentu. Seria incurretta a chjave ?",
+ "Reply": "Risponde",
+ "Anonymous": "Anonimu",
+ "Avatar generated from IP address": "Avatar ingeneratu da l’indirizzu IP",
+ "Add comment": "Aghjunghje un cummentu",
+ "Optional nickname…": "Cugnome ozzionale…",
+ "Post comment": "Impustà u cummentu",
+ "Sending comment…": "Inviu di u cummentu…",
+ "Comment posted.": "Cummentu inviatu.",
+ "Could not refresh display: %s": "Ùn si pò micca attualizà l’affissera : %s",
+ "unknown status": "statu scunnisciutu",
+ "server error or not responding": "sbagliu di u servitore o u servitore ùn risponde micca",
+ "Could not post comment: %s": "Ùn si pò micca impustà u cummentu : %s",
+ "Sending paste…": "Inviu di l’appiccicu…",
+ "Your paste is %s (Hit [Ctrl]+[c] to copy)": "U vostru appiccicu si trova à l’indirizzu%s<\/a> (Appughjate [Ctrl]+[c] per cupià u liame)<\/span>",
+ "Delete data": "Squassà i dati",
+ "Could not create paste: %s": "Ùn si pò micca creà l’appiccicu : %s",
+ "Cannot decrypt paste: Decryption key missing in URL (Did you use a redirector or an URL shortener which strips part of the URL?)": "Ùn si pò micca dicifrà l’appiccicu : A chjave di dicifratura hè assente in l’indirizzu. Averiate impiegatu un orientadore d’indirizzu o un riduttore chì ammuzzeghja una parte di l’indirizzu ?",
+ "B": "o",
+ "KiB": "Ko",
+ "MiB": "Mo",
+ "GiB": "Go",
+ "TiB": "To",
+ "PiB": "Po",
+ "EiB": "Eo",
+ "ZiB": "Zo",
+ "YiB": "Yo",
+ "Format": "Furmatu",
+ "Plain Text": "Testu in chjaru",
+ "Source Code": "Codice di fonte",
+ "Markdown": "Markdown",
+ "Download attachment": "Scaricà a pezza aghjunta",
+ "Cloned: '%s'": "Duppiatu : « %s »",
+ "The cloned file '%s' was attached to this paste.": "U schedariu duppiatu « %s » hè statu aghjuntu à st’appiccicu.",
+ "Attach a file": "Aghjunghje un schedariu",
+ "alternatively drag & drop a file or paste an image from the clipboard": "in alternanza, sguillà è depone un schedariu o incullà una fiura da u preme’papei",
+ "File too large, to display a preview. Please download the attachment.": "Schedariu troppu maiò per affissà una fighjulata. Scaricate a pezza aghjunta.",
+ "Remove attachment": "Caccià a pezza aghjunta.",
+ "Your browser does not support uploading encrypted files. Please use a newer browser.": "U vostru navigatore ùn accetta micca l’inviu di i schedarii cifrati. Impiegate un navigatore più recente.",
+ "Invalid attachment.": "A pezza aghjunta hè inaccettevule.",
+ "Options": "Ozzioni",
+ "Shorten URL": "Ammuzzà l’indirizzu",
+ "Editor": "Editore",
+ "Preview": "Fighjulata",
+ "%s requires the PATH to end in a \"%s\". Please update the PATH in your index.php.": "%s richiede chì a variabile PATH si compii cù « %s ». Mudificate a variabile PATH in u vostru index.php.",
+ "Decrypt": "Dicifrà",
+ "Enter password": "Stampittate a parolla d’intesa",
+ "Loading…": "Caricamentu…",
+ "Decrypting paste…": "Dicifratura di l’appiccicu…",
+ "Preparing new paste…": "Approntu di u novu appiccicu…",
+ "In case this message never disappears please have a look at this FAQ for information to troubleshoot.": "S’è stu messaghju ùn smarisce micca, lighjite sta FAQ per ottene infurmazioni annant’à a risuluzione di i prublemi<\/a>.",
+ "+++ no paste text +++": "+++ nisunu testu incullatu +++",
+ "Could not get paste data: %s": "Ùn si pò micca ottene i dati di l’appiccicu : %s",
+ "QR code": "Codice QR",
+ "This website is using an insecure HTTP connection! Please use it only for testing.": "Stu situ web impiegheghja una cunnessione HTTP non sicura ! impiegatelu solu per una prova.",
+ "For more information see this FAQ entry.": "Per sapene di più, lighjite sta rubrica di a FAQ<\/a>.",
+ "Your browser may require an HTTPS connection to support the WebCrypto API. Try switching to HTTPS.": "U vostru navigatore pò richiede una cunnessione HTTPS per permette l’usu di l’API WebCrypto. Pruvate di passà à HTTPS<\/a>.",
+ "Your browser doesn't support WebAssembly, used for zlib compression. You can create uncompressed documents, but can't read compressed ones.": "U vostru navigatore ùn accetta micca WebAssembly, impiegatu per a cumpressione zlib. Pudete creà ducumenti micca cumpressi, ma ùn pudete micca leghje quelli chì sò cumpressi.",
+ "waiting on user to provide a password": "in attesa di l’utilizatore per furnisce una parolla d’intesa",
+ "Could not decrypt data. Did you enter a wrong password? Retry with the button at the top.": "Ùn si pò micca dicifrà i dati. Avete stampittatu una parolla d’intesa incurretta ? Pruvate torna cù u buttone insù.",
+ "Retry": "Pruvà torna",
+ "Showing raw text…": "Affissera di u testu grossu…",
+ "Notice:": "Avertimentu :",
+ "This link will expire after %s.": "Stu liame hà da scade dopu à %s.",
+ "This link can only be accessed once, do not use back or refresh button in your browser.": "Stu liame pò esse accessu solu una volta, ùn impiegate micca i buttoni Precedente o Attualizà di u vostru navigatore.",
+ "Link:": "Liame :",
+ "Recipient may become aware of your timezone, convert time to UTC?": "U destinatariu pò cunnnosce u vostru fusu orariu. Vulete cunvertisce l’ora in u furmatu UTC ?",
+ "Use Current Timezone": "Impiegà u fusu orariu attuale",
+ "Convert To UTC": "Cunvertisce in UTC",
+ "Close": "Chjode",
+ "Encrypted note on PrivateBin": "Nota cifrata nant’à PrivateBin",
+ "Visit this link to see the note. Giving the URL to anyone allows them to access the note, too.": "Visitate stu liame per vede a nota. Date l’indirizzu à qualunque li permette d’accede à a nota dinù.",
+ "URL shortener may expose your decrypt key in URL.": "Un ammuzzatore d’indirizzu pò palisà a vostra chjave di dicifratura in l’indirizzu.",
+ "Save paste": "Arregistrà l’appiccicu"
+}
diff --git a/js/privatebin.js b/js/privatebin.js
index ef030fb3..b6a3226e 100644
--- a/js/privatebin.js
+++ b/js/privatebin.js
@@ -601,7 +601,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
* @prop {string[]}
* @readonly
*/
- const supportedLanguages = ['bg', 'ca', 'cs', 'de', 'es', 'et', 'fr', 'he', 'hu', 'id', 'it', 'jbo', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sl', 'uk', 'zh'];
+ const supportedLanguages = ['bg', 'ca', 'co', 'cs', 'de', 'es', 'et', 'fr', 'he', 'hu', 'id', 'it', 'jbo', 'lt', 'no', 'nl', 'pl', 'pt', 'oc', 'ru', 'sl', 'uk', 'zh'];
/**
* built in language
@@ -778,6 +778,7 @@ jQuery.PrivateBin = (function($, RawDeflate) {
{
case 'cs':
return n === 1 ? 0 : (n >= 2 && n <=4 ? 1 : 2);
+ case 'co':
case 'fr':
case 'oc':
case 'zh':
diff --git a/lib/I18n.php b/lib/I18n.php
index bc8b765c..1321c4a2 100644
--- a/lib/I18n.php
+++ b/lib/I18n.php
@@ -317,6 +317,7 @@ class I18n
switch (self::$_language) {
case 'cs':
return $n == 1 ? 0 : ($n >= 2 && $n <= 4 ? 1 : 2);
+ case 'co':
case 'fr':
case 'oc':
case 'zh':