diff --git a/README.md b/README.md index 20f7ca0..6323e18 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,7 @@ A big thanks to all our sponsors! Without them, it wouldn't be possible to creat |🇵🇹 Portuguese |quiradon |🟢 Up To Date | |🇨🇿 Czech |spyeye_ |🟢 Up To Date | |🇩🇪 German |benzorich |🟢 Up To Date | +|❓ Catalan |guillee3 |🟢 Up To Date | |🇫🇷 French |sankedev & tostam |🟠 Temporary Outdated (beta) | |🇷🇴 Romanian |sankedev |🟠 Temporary Outdated (beta) | |🇪🇸 Spanish |redactado & josuens |🟠 Temporary Outdated (beta) | diff --git a/languages/catalan.json b/languages/catalan.json new file mode 100644 index 0000000..c24557a --- /dev/null +++ b/languages/catalan.json @@ -0,0 +1,477 @@ +{ + "_TRANSLATION":{ + "otversion":"v4.0.0", + "translator":"guillee3", + "lastedited":"21/08/2024", + "language":"Catalan" + }, + "checker":{ + "system":{ + "typeError":"[ERROR]", + "headerOpenTicket":"OPEN TICKET", + "typeWarning":"[AVÍS]", + "typeInfo":"[INFO]", + "headerConfigChecker":"VERIFICADOR DE CONFIGURACIÓ", + "headerDescription":"comprova si existeixen errors als teus fitxers de configuració!", + "footerError":"el bot no s'iniciarà fins que tots els {0} es solucionin!", + "footerWarning":"es recomana solucionar tots els {0} abans de començar!", + "footerSupport":"SUPORT: {0} - DOCUMENTACIÓ: {1}", + "compactInformation":"utilitza {0} per obtenir més informació!", + "dataPath":"ruta", + "dataDocs":"documents", + "dataMessages":"missatge" + }, + "messages":{ + "stringTooShort":"Aquesta cadena no pot tenir menys de {0} caràcters!", + "stringTooLong":"Aquesta cadena no pot tenir més de {0} caràcters!", + "stringLengthInvalid":"Aquesta cadena ha de tenir {0} caràcters!", + "stringStartsWith":"Aquesta cadena ha de començar amb {0}!", + "stringEndsWith":"Aquesta cadena ha d'acabar amb {0}!", + "stringContains":"Aquesta cadena ha de contenir {0}!", + "stringChoices":"Aquesta cadena només pot ser un dels valors següents: {0}!", + "stringRegex":"Aquesta cadena és invàlida!", + + "numberTooShort":"Aquest nombre no pot tenir menys de {0} caràcters!", + "numberTooLong":"Aquest nombre no pot tenir més de {0} caràcters!", + "numberLengthInvalid":"Aquest nombre ha de tenir {0} caràcters!", + "numberTooSmall":"Aquest nombre ha de ser almenys {0}!", + "numberTooLarge":"Aquest nombre ha de ser com a màxim {0}!", + "numberNotEqual":"Aquest nombre ha de ser {0}!", + "numberStep":"Aquest nombre ha de ser un múltiple de {0}!", + "numberStepOffset":"Aquest nombre ha de ser un múltiple de {0} començant amb {1}!", + "numberStartsWith":"Aquest nombre ha de començar amb {0}!", + "numberEndsWith":"Aquest nombre ha d'acabar amb {0}!", + "numberContains":"Aquest nombre ha de contenir {0}!", + "numberChoices":"Aquest nombre només pot ser un dels valors següents: {0}!", + "numberFloat":"Aquest nombre no pot ser un decimal!", + "numberNegative":"Aquest nombre no pot ser negatiu!", + "numberPositive":"Aquest nombre no pot ser positiu!", + "numberZero":"Aquest nombre no pot ser zero!", + + "booleanTrue":"Aquest booleà no pot ser veritable!", + "booleanFalse":"Aquest booleà no pot ser fals!", + + "arrayEmptyDisabled":"Aquest array no pot estar buit!", + "arrayEmptyRequired":"Aquest array ha d'estar buit!", + "arrayTooShort":"Aquest array ha de tenir una longitud d'almenys {0}!", + "arrayTooLong":"Aquest array ha de tenir una longitud màxima de {0}!", + "arrayLengthInvalid":"Aquest array ha de tenir una longitud de {0}!", + "arrayInvalidTypes":"Aquest array només pot contenir els tipus següents: {0}!", + "arrayDouble":"Aquest array no permet el mateix valor dues vegades!", + + "discordInvalidId":"Aquest és un id de {0} de discord invàlid!", + "discordInvalidIdOptions":"Aquest és un id de {0} de discord invàlid! També en pots utilitzar un d'aquests: {1}!", + "discordInvalidToken":"Aquest és un token de discord invàlid (sintàcticament)!", + "colorInvalid":"Aquest és un color hex invàlid!", + "emojiTooShort":"Aquesta cadena ha de tenir almenys {0} emojis!", + "emojiTooLong":"Aquesta cadena ha de tenir com a màxim {0} emojis!", + "emojiCustom":"Aquest emoji no pot ser un emoji personalitzat de discord!", + "emojiInvalid":"Aquest és un emoji invàlid!", + "urlInvalid":"Aquesta url és invàlida!", + "urlInvalidHttp":"Aquesta url només pot utilitzar el protocol https://!", + "urlInvalidProtocol":"Aquesta url només pot utilitzar els protocols http:// i https://!", + "urlInvalidHostname":"Aquesta url té un nom de domini no permès!", + "urlInvalidExtension":"Aquesta url té una extensió invàlida! Tria entre: {0}!", + "urlInvalidPath":"Aquesta url té un camí invàlid!", + "idNotUnique":"Aquest id no és únic, utilitza un altre id!", + "idNonExistent":"L'id {0} no existeix!", + + "invalidType":"Aquesta propietat ha de ser del tipus: {0}!", + "propertyMissing":"La propietat {0} falta en aquest objecte!", + "propertyOptional":"La propietat {0} és opcional en aquest objecte!", + "objectDisabled":"Aquest objecte està desactivat, activa'l utilitzant {0}!", + "nullInvalid":"Aquesta propietat no pot ser nul·la!", + "switchInvalidType":"Això ha de ser d'un dels tipus següents: {0}!", + "objectSwitchInvalid":"Aquest objecte ha de ser d'un dels tipus següents: {0}!", + + "invalidLanguage":"Aquest és un idioma invàlid!", + "invalidButton":"Aquest botó ha de tenir almenys un {0} o {1}!", + "unusedOption":"L'opció {0} no s'utilitza enlloc!", + "unusedQuestion":"La pregunta {0} no s'utilitza enlloc!", + "dropdownOption":"Un panell amb desplegable activat només pot contenir opcions del tipus 'ticket'!" + } + }, + "actions":{ + "buttons":{ + "create":"Visitar Ticket", + "close":"Tancar Ticket", + "delete":"Eliminar Ticket", + "reopen":"Reobrir Ticket", + "claim":"Reclamar Ticket", + "unclaim":"Alliberar Ticket", + "pin":"Fixar Ticket", + "unpin":"Desfixar Ticket", + "clear":"Eliminar Tickets", + "helpSwitchSlash":"Veure Comandes Slash", + "helpSwitchText":"Veure Comandes de Text", + "helpPage":"Pàgina {0}", + "withReason":"Amb Motiu", + "withoutTranscript":"Sense Transcripció" + }, + "titles":{ + "created":"Ticket Creat", + "close":"Ticket Tancat", + "delete":"Ticket Eliminat", + "reopen":"Ticket Reobert", + "claim":"Ticket Reclamat", + "unclaim":"Ticket Alliberat", + "pin":"Ticket Fixat", + "unpin":"Ticket Desfixat", + "rename":"Ticket Renomenat", + "move":"Ticket Mogut", + "add":"Usuari Afegit al Ticket", + "remove":"Usuari Eliminat del Ticket", + + "help":"Comandes Disponibles", + "statsReset":"Restablir Estadístiques", + "blacklistAdd":"Usuari a la Llista Negra", + "blacklistRemove":"Usuari Alliberat", + "blacklistGet":"Usuari a la Llista Negra", + "blacklistView":"Llista Negra Actual", + "blacklistAddDm":"Afegit a la Llista Negra", + "blacklistRemoveDm":"Eliminat de la Llista Negra", + "clear":"Tickets Netejats", + "roles":"Rols Actualitzats", + + "autoclose":"Ticket Tancat Automàticament", + "autocloseEnabled":"Tancament Automàtic Activat", + "autocloseDisabled":"Tancament Automàtic Desactivat", + "autodelete":"Ticket Eliminat Automàticament", + "autodeleteEnabled":"Eliminació Automàtica Activada", + "autodeleteDisabled":"Eliminació Automàtica Desactivada" + }, + "descriptions":{ + "create":"El teu ticket ha estat creat. Fes clic al botó a continuació per accedir-hi!", + "close":"El ticket ha estat tancat amb èxit!", + "delete":"El ticket ha estat eliminat amb èxit!", + "reopen":"El ticket ha estat reobert amb èxit!", + "claim":"El ticket ha estat reclamat amb èxit!", + "unclaim":"El ticket ha estat alliberat amb èxit!", + "pin":"El ticket ha estat fixat amb èxit!", + "unpin":"El ticket ha estat desfixat amb èxit!", + "rename":"El ticket ha estat renomenat a {0} amb èxit!", + "move":"El ticket ha estat mogut a {0} amb èxit!", + "add":"{0} ha estat afegit al ticket amb èxit!", + "remove":"{0} ha estat eliminat del ticket amb èxit!", + + "helpExplanation":"`` => paràmetre requerit\n`[nom]` => paràmetre opcional", + "statsReset":"Les estadístiques del bot s'han restablert correctament!", + "statsError":"No es poden veure les estadístiques del ticket!\n{0} no és un ticket!", + "blacklistAdd":"{0} ha estat afegit a la llista negra amb èxit!", + "blacklistRemove":"{0} ha estat alliberat amb èxit!", + "blacklistGetSuccess":"{0} està actualment a la llista negra!", + "blacklistGetEmpty":"{0} actualment no està a la llista negra!", + "blacklistViewEmpty":"Encara no hi ha ningú a la llista negra!", + "blacklistViewTip":"Utilitza \"/blacklist add\" per afegir un usuari a la llista negra!", + "clearVerify":"Estàs segur que vols eliminar múltiples tickets?\nAquesta acció no es pot desfer!", + "clearReady":"{0} tickets han estat eliminats amb èxit!", + "rolesEmpty":"No s'han actualitzat rols!", + + "autocloseLeave":"Aquest ticket ha estat tancat automàticament perquè el creador ha abandonat el servidor!", + "autocloseTimeout":"Aquest ticket ha estat tancat automàticament perquè ha estat inactiu durant més de `{0}h`!", + "autodeleteLeave":"Aquest ticket ha estat eliminat automàticament perquè el creador ha abandonat el servidor!", + "autodeleteTimeout":"Aquest ticket ha estat eliminat automàticament perquè ha estat inactiu durant més de `{0} dies`!", + "autocloseEnabled":"El tancament automàtic ha estat activat en aquest ticket!\nEs tancarà quan estigui inactiu durant més de `{0}h`!", + "autocloseDisabled":"El tancament automàtic ha estat desactivat en aquest ticket!\nJa no es tancarà automàticament!", + "autodeleteEnabled":"L'eliminació automàtica ha estat activada en aquest ticket!\nS'eliminarà quan estigui inactiu durant més de `{0} dies`!", + "autodeleteDisabled":"L'eliminació automàtica ha estat desactivada en aquest ticket!\nJa no s'eliminarà automàticament!", + + "ticketMessageLimit":"Només pots crear {0} ticket(s) al mateix temps!", + "ticketMessageAutoclose":"Aquest ticket es tancarà automàticament quan estigui inactiu durant {0}h!", + "ticketMessageAutodelete":"Aquest ticket es eliminarà automàticament quan estigui inactiu durant {0} dies!", + "panelReady":"Pots trobar el panell a continuació!\nAquest missatge ara es pot eliminar!" + }, + "modal":{ + "closePlaceholder":"Per què has tancat aquest ticket?", + "deletePlaceholder":"Per què has eliminat aquest ticket?", + "reopenPlaceholder":"Per què has reobert aquest ticket?", + "claimPlaceholder":"Per què has reclamat aquest ticket?", + "unclaimPlaceholder":"Per què has alliberat aquest ticket?", + "pinPlaceholder":"Per què has fixat aquest ticket?", + "unpinPlaceholder":"Per què has desfixat aquest ticket?" + }, + "logs":{ + "createLog":"Un nou ticket ha estat creat per {0}!", + "closeLog":"Aquest ticket ha estat tancat per {0}!", + "closeDm":"El teu ticket ha estat tancat al nostre servidor!", + "deleteLog":"Aquest ticket ha estat eliminat per {0}!", + "deleteDm":"El teu ticket ha estat eliminat al nostre servidor!", + "reopenLog":"Aquest ticket ha estat reobert per {0}!", + "reopenDm":"El teu ticket ha estat reobert al nostre servidor!", + "claimLog":"Aquest ticket ha estat reclamat per {0}!", + "claimDm":"El teu ticket ha estat reclamat al nostre servidor!", + "unclaimLog":"Aquest ticket ha estat alliberat per {0}!", + "unclaimDm":"El teu ticket ha estat alliberat al nostre servidor!", + "pinLog":"Aquest ticket ha estat fixat per {0}!", + "pinDm":"El teu ticket ha estat fixat al nostre servidor!", + "unpinLog":"Aquest ticket ha estat desfixat per {0}!", + "unpinDm":"El teu ticket ha estat desfixat al nostre servidor!", + "renameLog":"Aquest ticket ha estat renomenat a {0} per {1}!", + "renameDm":"El teu ticket ha estat renomenat a {0} al nostre servidor!", + "moveLog":"Aquest ticket ha estat mogut a {0} per {1}!", + "moveDm":"El teu ticket ha estat mogut a {0} al nostre servidor!", + "addLog":"{0} ha estat afegit a aquest ticket per {1}!", + "addDm":"{0} ha estat afegit al teu ticket al nostre servidor!", + "removeLog":"{0} ha estat eliminat d'aquest ticket per {1}!", + "removeDm":"{0} ha estat eliminat del teu ticket al nostre servidor!", + + "blacklistAddLog":"{0} ha estat afegit a la llista negra per {1}!", + "blacklistRemoveLog":"{0} ha estat eliminat de la llista negra per {1}!", + "blacklistAddDm":"Has estat afegit a la llista negra al nostre servidor!\nA partir d'ara, no pots crear cap ticket!", + "blacklistRemoveDm":"Has estat eliminat de la llista negra al nostre servidor!\nAra pots crear tickets de nou!", + "clearLog":"{0} tickets han estat eliminats per {1}!" + } + }, + "transcripts":{ + "success":{ + "visit":"Visitar Transcripció", + "ready":"Transcripció Creada", + "textFileDescription":"Aquesta és la transcripció de text d'un ticket eliminat!", + "htmlProgress":"Si us plau, espera mentre aquesta transcripció html es processa...", + + "createdChannel":"S'ha creat una nova transcripció tipus {0} al servidor!", + "createdCreator":"S'ha creat una nova transcripció tipus {0} per un dels teus tickets!", + "createdParticipant":"S'ha creat una nova transcripció tipus {0} en un dels tickets on has participat!", + "createdActiveAdmin":"S'ha creat una nova transcripció tipus {0} en un dels tickets on has participat com a administrador!", + "createdEveryAdmin":"S'ha creat una nova transcripció tipus {0} en un dels tickets on eres administrador!", + "createdOther":"S'ha creat una nova transcripció tipus {0}!" + }, + "errors":{ + "retry":"Torna-ho a intentar", + "continue":"Elimina Sense Transcripció", + "backup":"Crea Transcripció de Backup", + "error":"Alguna cosa ha anat malament mentre intentàvem crear la transcripció.\nQuè t'agradaria fer?\n\nAquest ticket no s'eliminarà fins que facis clic en un d'aquests botons." + } + }, + "errors":{ + "titles":{ + "internalError":"Error Intern", + "optionMissing":"Opció de Comanda Absent", + "optionInvalid":"Opció de Comanda Invàlida", + "unknownCommand":"Comanda Desconeguda", + "noPermissions":"No Tens Permisos", + "unknownTicket":"Ticket Desconegut", + "deprecatedTicket":"Ticket Obsolet", + "unknownOption":"Opció Desconeguda", + "unknownPanel":"Panell Desconegut", + "notInGuild":"No Ets Al Servidor", + "channelRename":"No Es Pot Canviar El Nom Del Canal", + "busy":"El Ticket Està Ocupat" + }, + "descriptions":{ + "askForInfo":"Contacta amb el propietari d'aquest bot per obtenir més informació!", + "askForInfoResolve":"Contacta amb el propietari del bot si aquest problema no es resol després de diversos intents.", + "internalError":"No s'ha pogut respondre a aquest {0} a causa d'un error intern!", + "optionMissing":"Falta un paràmetre requerit en aquesta comanda!", + "optionInvalid":"Un paràmetre d'aquesta comanda és invàlid!", + "optionInvalidChoose":"Tria entre", + "unknownCommand":"Prova de visitar el menú d'ajuda per obtenir més informació!", + "noPermissions":"No tens permís per utilitzar aquest {0}!", + "noPermissionsList":"Permisos Requerits: (un d'ells)", + "noPermissionsCooldown":"No tens permís per utilitzar aquest {0} perquè tens un temps de refredament!", + "noPermissionsBlacklist":"No tens permís per utilitzar aquest {0} perquè estàs a la llista negra!", + "noPermissionsLimitGlobal":"No tens permís per crear un ticket perquè el servidor ha arribat al límit màxim de tickets!", + "noPermissionsLimitGlobalUser":"No tens permís per crear un ticket perquè has arribat al límit màxim de tickets!", + "noPermissionsLimitOption":"No tens permís per crear un ticket perquè el servidor ha arribat al límit màxim de tickets per aquesta opció!", + "noPermissionsLimitOptionUser":"No tens permís per crear un ticket perquè has arribat al límit màxim de tickets per aquesta opció!", + "unknownTicket":"Torna a intentar aquesta comanda en un ticket vàlid!", + "deprecatedTicket":"El canal actual no és un ticket vàlid! Pot ser que fos un ticket d'una versió antiga de Open Ticket!", + "notInGuild":"Aquest {0} no funciona en DM! Si us plau, torna a intentar-ho en un servidor!", + "channelRename":"Degut a les limitacions de discord, actualment és impossible per al bot canviar el nom del canal. El canal es canviarà automàticament en 10 minuts si el bot no es reinicia.", + "channelRenameSource":"La font d'aquest error és: {0}", + "busy":"No es pot utilitzar aquest {0}!\nEl ticket està sent processat pel bot.\n\nSi us plau, torna a intentar-ho en uns segons!" + }, + "optionInvalidReasons":{ + "stringRegex":"El valor no coincideix amb el patró!", + "stringMinLength":"El valor ha de tenir almenys {0} caràcters!", + "stringMaxLength":"El valor ha de tenir com a màxim {0} caràcters!", + "numberInvalid":"Nombre invàlid!", + "numberMin":"El nombre ha de ser almenys {0}!", + "numberMax":"El nombre ha de ser com a màxim {0}!", + "numberDecimal":"El nombre no pot ser decimal!", + "numberNegative":"El nombre no pot ser negatiu!", + "numberPositive":"El nombre no pot ser positiu!", + "numberZero":"El nombre no pot ser zero!", + "channelNotFound":"No es pot trobar el canal!", + "userNotFound":"No es pot trobar l'usuari!", + "roleNotFound":"No es pot trobar el rol!", + "memberNotFound":"No es pot trobar l'usuari!", + "mentionableNotFound":"No es pot trobar l'usuari o el rol!", + "channelType":"Tipus de canal invàlid!", + "notInGuild":"Aquesta opció requereix que siguis en un servidor!" + }, + "permissions":{ + "developer":"Has de ser el desenvolupador del bot.", + "owner":"Has de ser el propietari del servidor.", + "admin":"Has de ser un administrador del servidor.", + "moderator":"Has de ser un moderador.", + "support":"Has de formar part de l'equip de suport.", + "member":"Has de ser un membre.", + "discord-administrator":"Has de tenir el permís `ADMINISTRADOR`." + }, + "actionInvalid":{ + "close":"El ticket ja està tancat!", + "reopen":"El ticket encara no està tancat!", + "claim":"El ticket ja està reclamat!", + "unclaim":"El ticket encara no està reclamat!", + "pin":"El ticket ja està fixat!", + "unpin":"El ticket encara no està fixat!", + "add":"Aquest usuari ja té accés al ticket!", + "remove":"No es pot eliminar aquest usuari del ticket!" + } + }, + "params":{ + "uppercase":{ + "ticket":"Ticket", + "tickets":"Tickets", + "reason":"Motiu", + "creator":"Creador", + "remaining":"Temps Restant", + "added":"Afegit", + "removed":"Eliminat", + "filter":"Filtre", + "claimedBy":"Reclamat Per {0}", + "method":"Mètode", + "type":"Tipus", + "blacklisted":"Llista Negra", + "panel":"Panell", + "command":"Comanda", + "system":"Sistema", + "true":"Cert", + "false":"Fals", + "syntax":"Sintaxi", + "originalName":"Nom Original", + "newName":"Nom Nou", + "until":"Fins a", + "validOptions":"Opcions Vàlides", + "validPanels":"Panells Vàlids", + "autoclose":"Tancament Automàtic", + "autodelete":"Eliminació Automàtica", + "startupDate":"Data d'Inici", + "version":"Versió", + "name":"Nom", + "role":"Rol", + "status":"Estat", + "claimed":"Reclamat", + "pinned":"Fixat", + "creationDate":"Data de Creació" + }, + "lowercase":{ + "text":"text", + "html":"html", + "command":"comanda", + "modal":"modal", + "button":"botó", + "dropdown":"desplegable", + "method":"mètode" + } + }, + "commands":{ + "reason":"Especifica una raó opcional que serà visible als registres.", + "help":"Obtingues una llista de totes les comandes disponibles.", + "panel":"Genera un missatge amb un desplegable o botons (per a la creació de tickets).", + "panelId":"L'identificador del panell que vols generar.", + "panelAutoUpdate":"Vols que aquest panell s'actualitzi automàticament quan s'edita?", + "ticket":"Crea instantàniament un ticket.", + "ticketId":"L'identificador del ticket que vols crear.", + "close":"Tanca un ticket.", + "delete":"Elimina un ticket.", + "deleteNoTranscript":"Elimina aquest ticket sense crear una transcripció.", + "reopen":"Reobre un ticket.", + "claim":"Reclama un ticket.", + "claimUser":"Reclama aquest ticket per a una altra persona en lloc de tu mateix.", + "unclaim":"Allibera un ticket.", + "pin":"Fixa un ticket.", + "unpin":"Desfixa un ticket.", + "move":"Mou un ticket.", + "moveId":"L'identificador de l'opció a la qual vols moure't.", + "rename":"Renomena un ticket.", + "renameName":"El nou nom per aquest ticket.", + "add":"Afegeix un usuari a un ticket.", + "addUser":"L'usuari a afegir.", + "remove":"Elimina un usuari d'un ticket.", + "removeUser":"L'usuari a eliminar.", + "blacklist":"Gestiona la llista negra de tickets.", + "blacklistView":"Veure una llista de l'actual llista negra.", + "blacklistAdd":"Afegeix un usuari a la llista negra.", + "blacklistRemove":"Elimina un usuari de la llista negra.", + "blacklistGet":"Obtingues els detalls d'un usuari a la llista negra.", + "blacklistGetUser":"L'usuari dels qual vols obtenir detalls.", + "stats":"Veure estadístiques del bot, d'un membre o d'un ticket.", + "statsReset":"Restablir totes les estadístiques del bot (i començar a comptar des de zero).", + "statsGlobal":"Veure les estadístiques globals.", + "statsUser":"Veure les estadístiques d'un usuari al servidor.", + "statsUserUser":"L'usuari del qual vols veure les estadístiques.", + "statsTicket":"Veure les estadístiques d'un ticket al servidor.", + "statsTicketTicket":"El ticket que vols veure.", + "clear":"Elimina múltiples tickets al mateix temps.", + "clearFilter":"El filtre per a la neteja de tickets.", + "clearFilters":{ + "all":"Tots", + "open":"Oberts", + "close":"Tancats", + "claim":"Reclamats", + "unclaim":"Alliberats", + "pin":"Fixats", + "unpin":"Desfixats", + "autoclose":"Tancat Automàticaments" + }, + "autoclose":"Gestiona el tancament automàtic en un ticket.", + "autocloseDisable":"Desactiva el tancament automàtic en aquest ticket.", + "autocloseEnable":"Activa el tancament automàtic en aquest ticket.", + "autocloseEnableTime":"La quantitat d'hores que aquest ticket ha d'estar inactiu per tancar-lo.", + "autodelete":"Gestiona l'eliminació automàtica en un ticket.", + "autodeleteDisable":"Desactiva l'eliminació automàtica en aquest ticket.", + "autodeleteEnable":"Activa l'eliminació automàtica en aquest ticket.", + "autodeleteEnableTime":"La quantitat de dies que aquest ticket ha d'estar inactiu per eliminar-lo." + }, + "helpMenu":{ + "help":"Obtingues una llista de totes les comandes disponibles.", + "ticket":"Crea instantàniament un ticket.", + "close":"Tanca un ticket, això desactiva l'escriptura en aquest canal.", + "delete":"Elimina un ticket, això crea una transcripció quan està activat.", + "reopen":"Reobre un ticket, això permet escriure de nou en aquest canal.", + "pin":"Fixar un ticket. Això mou el ticket a la part superior i afegeix un emoji '📌' al nom.", + "unpin":"Desfixar un ticket. El ticket romandrà a la seva posició però perdrà l'emoji '📌'.", + "move":"Mou un ticket. Això canvia el tipus d'aquest ticket.", + "rename":"Renomena un ticket. Això canvia el nom del canal d'aquest ticket.", + "claim":"Reclama un ticket. Amb això, pots fer saber al teu equip que estàs gestionant aquest ticket.", + "unclaim":"Allibera un ticket. Amb això, pots fer saber al teu equip que aquest ticket està lliure de nou.", + "add":"Afegeix un usuari a un ticket. Això permetrà a l'usuari llegir i escriure en aquest ticket.", + "remove":"Elimina un usuari d'un ticket. Això eliminarà la capacitat de llegir i escriure per a un usuari en aquest ticket.", + "panel":"Genera un missatge amb un desplegable o botons (per a la creació de tickets).", + "blacklistView":"Veure una la llista negra actual.", + "blacklistAdd":"Afegeix un usuari a la llista negra.", + "blacklistRemove":"Elimina un usuari de la llista negra.", + "blacklistGet":"Obtingues els detalls d'un usuari de la llista negra.", + "statsGlobal":"Veure les estadístiques globals.", + "statsTicket":"Veure les estadístiques d'un ticket al servidor.", + "statsUser":"Veure les estadístiques d'un usuari al servidor.", + "statsReset":"Restablir totes les estadístiques del bot (i començar a comptar des de zero).", + "autocloseDisable":"Desactiva el tancament automàtic en aquest ticket.", + "autocloseEnable":"Activa el tancament automàtic en aquest ticket.", + "autodeleteDisable":"Desactiva l'eliminació automàtica en aquest ticket.", + "autodeleteEnable":"Activa l'eliminació automàtica en aquest ticket." + }, + "stats":{ + "scopes":{ + "global":"Estadístiques Globals", + "system":"Estadístiques del Sistema", + "user":"Estadístiques d'Usuari", + "ticket":"Estadístiques de Ticket", + "participants":"Participants" + }, + "properties":{ + "ticketsCreated":"Tickets Creats", + "ticketsClosed":"Tickets Tancats", + "ticketsDeleted":"Tickets Eliminats", + "ticketsReopened":"Tickets Reoberts", + "ticketsAutoclosed":"Tickets Tancats Automàticament", + "ticketsClaimed":"Tickets Reclamats", + "ticketsPinned":"Tickets Fixats", + "ticketsMoved":"Tickets Moguts", + "usersBlacklisted":"Usuaris a la Llista Negra", + "transcriptsCreated":"Transcripcions Creades" + } + } +} \ No newline at end of file diff --git a/src/builders/embeds.ts b/src/builders/embeds.ts index 4eb4d0e..6923c63 100644 --- a/src/builders/embeds.ts +++ b/src/builders/embeds.ts @@ -203,7 +203,7 @@ const errorEmbeds = () => { instance.setColor(generalConfig.data.system.useRedErrorEmbeds ? "Red" : generalConfig.data.mainColor) instance.setTitle(utilities.emojiTitle("❌",lang.getTranslation("errors.titles.noPermissions"))) instance.setAuthor(user.displayName,user.displayAvatarURL()) - instance.setDescription(lang.getTranslation("errors.descriptions.noPermissionsBlacklist")) + instance.setDescription(lang.getTranslationWithParams("errors.descriptions.noPermissionsBlacklist",[method])) }) ) @@ -834,7 +834,7 @@ const ticketEmbeds = () => { //TODO TRANSLATION!!! {name:"Option"+":",value:"```"+(ticket.option.get("openticket:name").value)+"```",inline:false}, ) - if (reason) instance.addFields({name:"Reason:",value:"```"+reason+"```",inline:false}) + if (reason) instance.addFields({name:lang.getTranslation("params.uppercase.reason")+":",value:"```"+reason+"```",inline:false}) if (mode == "close"){ instance.setTitle(utilities.emojiTitle("🔒",lang.getTranslation("actions.titles.close"))) diff --git a/src/builders/messages.ts b/src/builders/messages.ts index 25dd7a3..dfb0f1a 100644 --- a/src/builders/messages.ts +++ b/src/builders/messages.ts @@ -94,7 +94,7 @@ const verifyBarMessages = () => { instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar})) instance.addComponent(await buttons.getSafe("openticket:verifybar-failure").build("verifybar",{guild,channel,user,verifybar})) if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"})) - if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:"Without Transcript",customColor:"red"})) + if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:lang.getTranslation("actions.buttons.withoutTranscript"),customColor:"red"})) } }) ) @@ -130,7 +130,7 @@ const verifyBarMessages = () => { instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar})) instance.addComponent(await buttons.getSafe("openticket:verifybar-failure").build("verifybar",{guild,channel,user,verifybar})) if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"})) - if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:"Without Transcript",customColor:"red"})) + if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:lang.getTranslation("actions.buttons.withoutTranscript"),customColor:"red"})) } }) ) @@ -166,7 +166,7 @@ const verifyBarMessages = () => { instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar})) instance.addComponent(await buttons.getSafe("openticket:verifybar-failure").build("verifybar",{guild,channel,user,verifybar})) if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"})) - if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:"Without Transcript",customColor:"red"})) + if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:lang.getTranslation("actions.buttons.withoutTranscript"),customColor:"red"})) } }) ) @@ -319,7 +319,7 @@ const verifyBarMessages = () => { instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar})) instance.addComponent(await buttons.getSafe("openticket:verifybar-failure").build("verifybar",{guild,channel,user,verifybar})) if (generalConfig.data.system.enableTicketActionWithReason) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"reason",customEmoji:"✏️",customLabel:lang.getTranslation("actions.buttons.withReason"),customColor:"blue"})) - if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:"Without Transcript",customColor:"red"})) + if (generalConfig.data.system.enableDeleteWithoutTranscript) instance.addComponent(await buttons.getSafe("openticket:verifybar-success").build("verifybar",{guild,channel,user,verifybar,customData:"no-transcript",customEmoji:"📄",customLabel:lang.getTranslation("actions.buttons.withoutTranscript"),customColor:"red"})) } }) ) diff --git a/src/commands/add.ts b/src/commands/add.ts index 4ad48b9..5186c9e 100644 --- a/src/commands/add.ts +++ b/src/commands/add.ts @@ -66,7 +66,7 @@ export const registerCommandResponders = async () => { //return when user already added to ticket const participants = await openticket.tickets.getAllTicketParticipants(ticket) if (!participants || participants.find((p) => p.user.id == data.id)){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"This user is already able to access the ticket!",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.add"),layout:"simple"})) return cancel() } diff --git a/src/commands/autoclose.ts b/src/commands/autoclose.ts index e731e96..7bfc575 100644 --- a/src/commands/autoclose.ts +++ b/src/commands/autoclose.ts @@ -57,7 +57,7 @@ export const registerCommandResponders = async () => { } //return when already closed if (ticket.get("openticket:closed").value){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is already closed!",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"})) return cancel() } //return when busy diff --git a/src/commands/claim.ts b/src/commands/claim.ts index 84316f7..c6ad44c 100644 --- a/src/commands/claim.ts +++ b/src/commands/claim.ts @@ -56,7 +56,7 @@ export const registerCommandResponders = async () => { } //return when already claimed if (ticket.get("openticket:claimed").value){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is already claimed!",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.claim"),layout:"simple"})) return cancel() } //return when busy diff --git a/src/commands/close.ts b/src/commands/close.ts index dc39dc6..fdb107c 100644 --- a/src/commands/close.ts +++ b/src/commands/close.ts @@ -56,7 +56,7 @@ export const registerCommandResponders = async () => { } //return when already closed if (ticket.get("openticket:closed").value){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is already closed!",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.close"),layout:"simple"})) return cancel() } //return when busy diff --git a/src/commands/move.ts b/src/commands/move.ts index a33cb55..f3d1b23 100644 --- a/src/commands/move.ts +++ b/src/commands/move.ts @@ -66,7 +66,7 @@ export const registerCommandResponders = async () => { const option = openticket.options.get(id) //return if unknown option if (!option || !(option instanceof api.ODTicketOption)){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Unknown Option",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.titles.unknownOption"),layout:"simple"})) return cancel() } //return if option is the same diff --git a/src/commands/pin.ts b/src/commands/pin.ts index 64d5c2b..a29f5ad 100644 --- a/src/commands/pin.ts +++ b/src/commands/pin.ts @@ -56,7 +56,7 @@ export const registerCommandResponders = async () => { } //return when already pinned if (ticket.get("openticket:pinned").value){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is already pinned!",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.pin"),layout:"simple"})) return cancel() } //return when busy diff --git a/src/commands/remove.ts b/src/commands/remove.ts index f984372..e38a265 100644 --- a/src/commands/remove.ts +++ b/src/commands/remove.ts @@ -66,7 +66,7 @@ export const registerCommandResponders = async () => { //return when user is not a participant of the ticket (admins & creator can't be removed) const participants = await openticket.tickets.getAllTicketParticipants(ticket) if (!participants || !participants.find((p) => p.user.id == data.id && p.role == "participant")){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Unable to remove this user from the ticket!",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.remove"),layout:"simple"})) return cancel() } diff --git a/src/commands/reopen.ts b/src/commands/reopen.ts index 82ccb36..415ba5d 100644 --- a/src/commands/reopen.ts +++ b/src/commands/reopen.ts @@ -56,7 +56,7 @@ export const registerCommandResponders = async () => { } //return when not closed if (!ticket.get("openticket:closed").value){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is not closed yet!",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.reopen"),layout:"simple"})) return cancel() } //return when busy diff --git a/src/commands/unclaim.ts b/src/commands/unclaim.ts index 784fa8a..e4ff53c 100644 --- a/src/commands/unclaim.ts +++ b/src/commands/unclaim.ts @@ -56,7 +56,7 @@ export const registerCommandResponders = async () => { } //return when not claimed if (!ticket.get("openticket:claimed").value){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is not claimed yet!",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unclaim"),layout:"simple"})) return cancel() } //return when busy diff --git a/src/commands/unpin.ts b/src/commands/unpin.ts index c39daf2..b69b579 100644 --- a/src/commands/unpin.ts +++ b/src/commands/unpin.ts @@ -56,7 +56,7 @@ export const registerCommandResponders = async () => { } //return when not pinned yet if (!ticket.get("openticket:pinned").value){ - instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:"Ticket is not pinned yet!",layout:"simple"})) + instance.reply(await openticket.builders.messages.getSafe("openticket:error").build("button",{guild,channel,user,error:openticket.languages.getTranslation("errors.actionInvalid.unpin"),layout:"simple"})) return cancel() } //return when busy diff --git a/src/core/api/defaults/language.ts b/src/core/api/defaults/language.ts index 6f58120..b81a9dc 100644 --- a/src/core/api/defaults/language.ts +++ b/src/core/api/defaults/language.ts @@ -450,6 +450,7 @@ export interface ODLanguageManagerIds_Default { "openticket:portuguese":ODLanguage, "openticket:czech":ODLanguage, "openticket:german":ODLanguage, + "openticket:catalan":ODLanguage, //ADD NEW LANGUAGES HERE!!! } diff --git a/src/core/api/modules/defaults.ts b/src/core/api/modules/defaults.ts index 17e0e41..cefc0c5 100644 --- a/src/core/api/modules/defaults.ts +++ b/src/core/api/modules/defaults.ts @@ -234,7 +234,7 @@ export class ODDefaultsManager { languageLoading:true, languageSelection:true, backupLanguage:"openticket:english", - languageList:["custom","english","dutch","portuguese","czech","german"], + languageList:["custom","english","dutch","portuguese","czech","german","catalan"], checkerLoading:true, checkerFunctionLoading:true, diff --git a/src/data/framework/checkerLoader.ts b/src/data/framework/checkerLoader.ts index 1e02728..667fa1b 100644 --- a/src/data/framework/checkerLoader.ts +++ b/src/data/framework/checkerLoader.ts @@ -488,7 +488,7 @@ export const defaultTranscriptsStructure = new api.ODCheckerObjectStructure("ope {key:"includeFiles",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("openticket:transcripts-text-include-files",{})}, {key:"includeBotMessages",optional:false,priority:0,checker:new api.ODCheckerBooleanStructure("openticket:transcripts-text-include-bots",{})}, - {key:"fileMode",optional:false,priority:0,checker:new api.ODCheckerStringStructure("openticket:transcripts-text-file-mode",{choices:["custom","name","id"]})}, + {key:"fileMode",optional:false,priority:0,checker:new api.ODCheckerStringStructure("openticket:transcripts-text-file-mode",{choices:["custom","channel-name","channel-id","user-name","user-id"]})}, {key:"customFileName",optional:false,priority:0,checker:new api.ODCheckerStringStructure("openticket:transcripts-file-name",{maxLength:512,regex:/^[^\.#%&{}\\<>*?/!'":@`|=]*$/})}, ]})}, diff --git a/src/data/framework/languageLoader.ts b/src/data/framework/languageLoader.ts index 770d701..70a9ca4 100644 --- a/src/data/framework/languageLoader.ts +++ b/src/data/framework/languageLoader.ts @@ -7,6 +7,7 @@ export const loadAllLanguages = async () => { openticket.languages.add(new api.ODLanguage("openticket:portuguese","portuguese.json")) openticket.languages.add(new api.ODLanguage("openticket:czech","czech.json")) openticket.languages.add(new api.ODLanguage("openticket:german","german.json")) + openticket.languages.add(new api.ODLanguage("openticket:catalan","catalan.json")) /** How to add more languages? * - Add the language to the list above diff --git a/src/data/openticket/panelLoader.ts b/src/data/openticket/panelLoader.ts index 5737c53..3d3682d 100644 --- a/src/data/openticket/panelLoader.ts +++ b/src/data/openticket/panelLoader.ts @@ -63,6 +63,7 @@ export function describePanelOptions(mode:"fields"|"text", panel:api.ODPanel): { } }) + //TODO TRANSLATION!!! const autotitle = (hasTicket && ticketOnly) ? "Select your ticket:" : ((hasRole && roleOnly) ? "Select your role:" : "Select your option:") const title = (panel.get("openticket:describe-options-custom-title").value.length < 1) ? "__"+autotitle+"__\n" : "__"+panel.get("openticket:describe-options-custom-title").value+"__\n" @@ -74,10 +75,13 @@ export function describePanelOptions(mode:"fields"|"text", panel:api.ODPanel): { let description = opt.exists("openticket:description") ? opt.get("openticket:description").value : "``" if (layout == "normal" || layout == "detailed"){ + //TODO TRANSLATION!!! if (opt.exists("openticket:cooldown-enabled") && opt.get("openticket:cooldown-enabled").value) description = description + "\nCooldown: `"+opt.get("openticket:cooldown-minutes").value+" min`" + //TODO TRANSLATION!!! if (opt.exists("openticket:limits-enabled") && opt.get("openticket:limits-enabled").value) description = description + "\nMax Tickets: `"+opt.get("openticket:limits-maximum-user").value+"`" } if (layout == "detailed"){ + //TODO TRANSLATION!!! if (opt.exists("openticket:admins")) description = description + "\nAdmins: "+opt.get("openticket:admins").value.map((admin) => discord.roleMention(admin)).join(", ") } @@ -98,6 +102,7 @@ export function describePanelOptions(mode:"fields"|"text", panel:api.ODPanel): { let description = opt.exists("openticket:description") ? opt.get("openticket:description").value : "``" if (layout == "normal" || layout == "detailed"){ + //TODO TRANSLATION!!! if (opt.exists("openticket:roles")) description = description + "\nRoles: "+opt.get("openticket:roles").value.map((admin) => discord.roleMention(admin)).join(", ") } @@ -119,10 +124,13 @@ export function describePanelOptions(mode:"fields"|"text", panel:api.ODPanel): { let description = opt.exists("openticket:description") ? opt.get("openticket:description").value : "``" if (layout == "normal" || layout == "detailed"){ + //TODO TRANSLATION!!! if (opt.exists("openticket:cooldown-enabled") && opt.get("openticket:cooldown-enabled").value) description = description + "\nCooldown: `"+opt.get("openticket:cooldown-minutes").value+" min`" + //TODO TRANSLATION!!! if (opt.exists("openticket:limits-enabled") && opt.get("openticket:limits-enabled").value) description = description + "\nMax Tickets: `"+opt.get("openticket:limits-maximum-user").value+"`" } if (layout == "detailed"){ + //TODO TRANSLATION!!! if (opt.exists("openticket:admins")) description = description + "\nAdmins: "+opt.get("openticket:admins").value.map((admin) => discord.roleMention(admin)).join(", ") } @@ -145,6 +153,7 @@ export function describePanelOptions(mode:"fields"|"text", panel:api.ODPanel): { let description = opt.exists("openticket:description") ? opt.get("openticket:description").value : "``" if (layout == "normal" || layout == "detailed"){ + //TODO TRANSLATION!!! if (opt.exists("openticket:roles")) description = description + "\nRoles: "+opt.get("openticket:roles").value.map((admin) => discord.roleMention(admin)).join(", ") }