Add additional validations for placeholders in message properties

Closes #38540

Signed-off-by: Alexander Schwartz <alexander.schwartz@gmx.net>
This commit is contained in:
Alexander Schwartz 2025-04-03 16:51:27 +02:00 committed by GitHub
parent 29d3dcb49a
commit 04b8f690c4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 205 additions and 84 deletions

View File

@ -89,12 +89,12 @@ signedInDevices=Dispositius identificats
missingPasswordMessage=«{{0}}»: Indiqueu la contrasenya.
otp-help-text=Introduïu el codi de verificació de l'aplicació d'autenticació.
error-invalid-uri-scheme=«{{0}}» té un esquema dURL invàlid.
error-user-attribute-read-only=El camp {0} és només de lectura.
error-invalid-date=La data «{0}» no és vàlida.
missingEmailMessage=«{0}»: Indiqueu una adreça electrònica.
error-user-attribute-read-only=El camp {{0}} és només de lectura.
error-invalid-date=La data «{{0}}» no és vàlida.
missingEmailMessage=«{{0}}»: Indiqueu una adreça electrònica.
applicationsIntroMessage=Feu seguiment i gestioneu els permisos de les aplicacions per a accedir al vostre compte
error-invalid-length=«{{0}}» ha de tindre una llargària dentre {{1}} i {{2}}.
missingLastNameMessage=«{0}»: Indiqueu els vostres cognoms.
missingLastNameMessage=«{{0}}»: Indiqueu els vostres cognoms.
linkedLoginProviders=Proveïdors d'entrada enllaçats
inUse=En ús
client=Client
@ -113,13 +113,13 @@ termsOfService=Condicions del servei
requestor=Sol·licitant
shareWith=Comparteix amb
updateCredAriaLabel=Actualitza la credencial
error-pattern-no-match=«{0}» no té el format requerit.
error-pattern-no-match=«{{0}}» no té el format requerit.
application=Aplicació
unlinkedLoginProviders=Proveïdors d'entrada no enllaçats
applicationDetails=Detalls de l'aplicació
successRemovedMessage={{userLabel}} s'ha eliminat.
deleteAccountWarning=Això és irreversible. Totes les vostres dades es destruiran permanentment i no seran accessibles.
error-person-name-invalid-character=«{0}» conté un caràcter no vàlid.
error-person-name-invalid-character=«{{0}}» conté un caràcter no vàlid.
user=Usuari
applications=Aplicacions
username=Nom d'usuari

View File

@ -17,20 +17,20 @@ edit=Επεξεργασία
otp-display-name=εφαρμογή ταυτοποίησης
linkedEmpty=Κανένας συνδεδεμένος πάροχος
directMembership=Άμεση συμμετοχή
error-invalid-length-too-short=Το χαρακτηριστικό {0} πρέπει να έχει ελάχιστο μήκος {1}.
error-number-out-of-range-too-big=Το χαρακτηριστικό {0} πρέπει να έχει μέγιστη τιμή {2}.
error-invalid-length-too-short=Το χαρακτηριστικό {{0}} πρέπει να έχει ελάχιστο μήκος {{1}}.
error-number-out-of-range-too-big=Το χαρακτηριστικό {{0}} πρέπει να έχει μέγιστη τιμή {{2}}.
updateEmail=Ενημέρωση email
two-factor=Έλεγχος ταυτότητας δύο-παραγόντων
signedInDevicesExplanation=Αποσύνδεση από όποια άγνωστη συσκευή.
status=Κατάσταση
error-number-out-of-range-too-small=Το χαρακτηριστικό {0} πρέπει να έχει ελάχιστη τιμή {1}.
error-number-out-of-range-too-small=Το χαρακτηριστικό {{0}} πρέπει να έχει ελάχιστη τιμή {{1}}.
removeModalMessage=Αυτό θα αφαιρέσει την τρέχουσα άδεια πρόσβαση που δόθηκε για το {{name}}. Θα πρέπει να δώσετε ξανά πρόσβαση αν θέλετε να χρησιμοποιήσετε αυτή την εφαρμογή.
lastName=Επώνυμο
invalidEmailMessage=Μη έγκυρη διεύθυνση email.
clients=Πελάτες
filterByName=Φιλτράρισμα Ανά Όνομα ...
refreshPage=Ανανέωση σελίδας
error-user-attribute-required=Παρακαλώ ορίστε το χαρακτηριστικό {0}.
error-user-attribute-required=Παρακαλώ ορίστε το χαρακτηριστικό {{0}}.
currentSession=Τρέχουσα συνεδρία
error-empty=Παρακαλώ ορίστε τιμή.
error-invalid-uri-fragment=Μη έγκυρο κομμάτι URL.
@ -45,7 +45,7 @@ signOutAllDevicesWarning=Αυτή η ενέργεια θα αποσυνδέσε
unShareSuccess=Επιτυχής διακοπή διαμοιρασμού πόρου.
signingIn=Σε είσοδο
stopUsingCred=Διακοπή χρήσης του {{name}};
error-number-out-of-range=Το χαρακτηριστικό {0} πρέπει να είναι ένας αριθμός μεταξύ {1} και {2}.
error-number-out-of-range=Το χαρακτηριστικό {{0}} πρέπει να είναι ένας αριθμός μεταξύ {{1}} και {{2}}.
thirdPartyApp=Τρίτου-μέρους
started=Ξεκίνησε
updateSuccess=Ο πόρος ενημερώθηκε επιτυχώς.
@ -58,7 +58,7 @@ myResources=Οι Πόροι Μου
linkedAccountsIntroMessage=Διαχείριση των εισόδων μέσω λογαριασμών σε τρίτους.
groupDescriptionLabel=Εμφάνιση ομάδων με τις οποίες έχετε συσχετισθεί
resourceAlreadyShared=Ο πόρος ήδη μοιράζεται με αυτό το χρήστη.
error-invalid-length-too-long=Το χαρακτηριστικό {0} πρέπει να έχει μέγιστο μήκος {2}.
error-invalid-length-too-long=Το χαρακτηριστικό {{0}} πρέπει να έχει μέγιστο μήκος {{2}}.
accountUpdatedMessage=Ο λογαριασμός σας έχει ενημερωθεί.
logo=Λογότυπο
password-help-text=Συνδεθείτε βάζοντας το κωδικό πρόσβασής σας.
@ -89,11 +89,11 @@ signedInDevices=Συνδεδεμένες συσκευές
missingPasswordMessage=Παρακαλώ ορίστε κωδικό πρόσβασης.
otp-help-text=Εισάγετε ένα κωδικό επιβεβαίωσης από την εφαρμογή ταυτοποίησης.
error-invalid-uri-scheme=Μη έγκυρο σχήμα URL.
error-user-attribute-read-only=Το πεδίο {0} είναι μόνο για ανάγνωση.
error-user-attribute-read-only=Το πεδίο {{0}} είναι μόνο για ανάγνωση.
error-invalid-date=Μη έγκυρη ημερομηνία.
missingEmailMessage=Παρακαλώ ορίστε email.
applicationsIntroMessage=Διαχειριστείτε το δικαίωμα της εφαρμογής σας να έχει πρόσβαση στο λογαριασμό σας
error-invalid-length=Το χαρακτηριστικό {0} πρέπει να έχει μήκος μεταξύ {1} και {2}.
error-invalid-length=Το χαρακτηριστικό {[0}} πρέπει να έχει μήκος μεταξύ {{1}} και {{2}}.
missingLastNameMessage=Παρακαλώ ορίστε επώνυμο.
linkedLoginProviders=Συνδεδεμένοι πάροχοι εισόδου
inUse=Σε χρήση

View File

@ -5,16 +5,16 @@ backTo=Takaisin {{app}}
error-invalid-email=Väärä sähköpostiosoite.
myResources=Minun resurssini
password=Salasana
error-invalid-length-too-long=Ominaisuudella {0} täytyy olla maksimipituus {2}.
error-invalid-length-too-long=Ominaisuudella {{0}} täytyy olla maksimipituus {{2}}.
accountUpdatedMessage=Käyttäjätiedot päivitetty.
error-username-invalid-character=Käyttäjänimi sisältää vääriä merkkejä.
error-invalid-value=Väärä arvo.
socialLogin=Kirjaudu sosiaalisen median tunnuksilla
error-invalid-length-too-short=Ominaisuudella {0} täytyy olla minimipituus {1}.
error-invalid-length-too-short=Ominaisuudella {{0}} täytyy olla minimipituus {{1}}.
firstName=Etunimi
error-number-out-of-range-too-big=Ominaisuudella {0} täytyy olla maksimiarvona {2}.
error-number-out-of-range-too-big=Ominaisuudella {{0}} täytyy olla maksimiarvona {{2}}.
name=Nimi
error-number-out-of-range-too-small=Ominaisuudella {0} täytyy olla minimiarvona {1}.
error-number-out-of-range-too-small=Ominaisuudella {{0}} täytyy olla minimiarvona {{1}}.
invalidEmailMessage=Virheellinen sähköpostiosoite.
lastName=Sukunimi
expires=Vanhenee
@ -23,13 +23,13 @@ filterByName=Suodata nimen mukaan ...
error-invalid-number=Väärä numero.
description=Kuvaus
missingPasswordMessage=Anna salasana.
error-user-attribute-required=Ole hyvä ja määritä ominaisuus {0}.
error-user-attribute-required=Ole hyvä ja määritä ominaisuus {{0}}.
error-invalid-uri-scheme=Väärä URL\:n malli.
error-user-attribute-read-only=Kenttä {0} on "vain luku"-tilassa.
error-user-attribute-read-only=Kenttä {{0}} on "vain luku"-tilassa.
error-invalid-date=Väärä päivämäärä.
missingEmailMessage=Anna sähköpostiosoite.
applicationsIntroMessage=Seuraa ja hallitse sovelluksiasi, joilla on pääsy tilille
error-invalid-length=Ominaisuudella {0} täytyy olla pituus väliltä {1} ja {2}.
error-invalid-length=Ominaisuudella {{0}} täytyy olla pituus väliltä {{1}} ja {{2}}.
error-empty=Ole hyvä ja määritä arvo.
missingLastNameMessage=Anna sukunimi.
error-invalid-uri-fragment=Väärä URL\:n osa.
@ -40,7 +40,7 @@ share=Jaa
error-invalid-uri=Väärä URL.
email=Sähköposti
permissionRequests=Lupapyynnöt
error-number-out-of-range=Ominaisuuden {0} täytyy olla numero väliltä {1} ja {2}.
error-number-out-of-range=Ominaisuuden {{0}} täytyy olla numero väliltä {{1}} ja {{2}}.
missingUsernameMessage=Anna käyttäjätunnus.
fullName={{givenName}} {{familyName}}
resources=Resurssit

View File

@ -18,20 +18,20 @@ otp-display-name=hitelesítő alkalmazás
selectALocale=Nyelv kiválasztása
linkedEmpty=Nincsenek összekapcsolt szolgáltatások
directMembership=Közvetlen tagság
error-invalid-length-too-short={0} minimális hossza {1} karakter.
error-number-out-of-range-too-big={0} maximum értéke\: {2}.
error-invalid-length-too-short={{0}} minimális hossza {{1}} karakter.
error-number-out-of-range-too-big={{0}} maximum értéke\: {{2}}.
updateEmail=E-mail cím módosítása
two-factor=Kétlépcsős azonosítás
signedInDevicesExplanation=Jelentkezzen ki minden ismeretlen eszközből.
status=Státusz
error-number-out-of-range-too-small={0} minimum értéke\: {1}.
error-number-out-of-range-too-small={{0}} minimum értéke\: {{1}}.
removeModalMessage=Ezzel törli a(z) {{name}} alkalmazás jelenlegi hozzáféréseit. A hozzáféréseket újra meg kell adni, ha hasznáni szeretné az alkalmazást.
lastName=Vezetéknév
invalidEmailMessage=Érvénytelen e-mail cím.
clients=Kliensek
filterByName=Név alapú keresés
refreshPage=Oldal újratöltése
error-user-attribute-required=Kérem, adja meg a(z) {0} értékét.
error-user-attribute-required=Kérem, adja meg a(z) {{0}} értékét.
currentSession=Ez a munkamenet
error-empty=Kérem, adja meg a mező értékét.
error-invalid-uri-fragment=Érvénytelen URL fragmens.
@ -46,7 +46,7 @@ signOutAllDevicesWarning=Ezzel a művelettel kijelentkezik az összes bejelentke
unShareSuccess=Az erőforrás megosztása megszüntetve
signingIn=Bejelentkezés
stopUsingCred=Eltávolítja\: {{name}}?
error-number-out-of-range={0} értéke {1} és {2} közötti szám kell legyen.
error-number-out-of-range={{0}} értéke {{1}} és {{2}} közötti szám kell legyen.
thirdPartyApp=Harmadik fél
started=Kezdete
updateSuccess=Az erőforrás módosítva
@ -59,7 +59,7 @@ myResources=Erőforrásaim
linkedAccountsIntroMessage=Bejelentkezés kezelése harmadik féltől származó fiókokkal.
groupDescriptionLabel=Az Önhöz tartozó csoportok megtekintése
resourceAlreadyShared=Az erőforrás már meg van osztva ezzel a felhasználóval.
error-invalid-length-too-long={0} maximális hossza {2} karakter.
error-invalid-length-too-long={{0}} maximális hossza {{2}} karakter.
accountUpdatedMessage=Felhasználói fiókját módosítottuk.
logo=Logó
password-help-text=Bejelentkezés jelszó segítségével.
@ -90,11 +90,11 @@ signedInDevices=Bejelentkezett eszközök
missingPasswordMessage=Kérem, adja meg a jelszót.
otp-help-text=Hitelesítő kód használata alkalmazás segítségével.
error-invalid-uri-scheme=Érvénytelen URL séma.
error-user-attribute-read-only=A(z) {0} mező csak olvasható.
error-user-attribute-read-only=A(z) {{0}} mező csak olvasható.
error-invalid-date=Érvénytelen dátum.
missingEmailMessage=Kérem, adja meg az e-mail címet.
applicationsIntroMessage=Kezelje alkalmazás jogosultságait, hogy hozzáférjen a fiókjához
error-invalid-length={0} hossza {1} és {2} karakter között kell legyen.
error-invalid-length={{0}} hossza {{1}} és {{2}} karakter között kell legyen.
missingLastNameMessage=Kérem, adja meg a vezetéknevet.
linkedLoginProviders=Összekapcsolt hitelesítő szolgáltatások
inUse=Használatban

View File

@ -10,7 +10,7 @@ setUpNew=Impostazione {{name}}
lastAccessedOn=Ultimo accesso
permissions=Permessi
credentialCreatedAt=<0>Creato</0> {{date}}.
error-username-invalid-character='{0}' contiene caratteri non validi.
error-username-invalid-character='{{0}}' contiene caratteri non validi.
infoMessage=Cliccando su 'Rimuovi accesso', rimuoverai le autorizzazioni concesse a questa applicazione. Questa applicazione non utilizzerà più le tue informazioni.
unknownOperatingSystem=Sistema operativo sconosciuto
edit=Modifica
@ -20,26 +20,26 @@ signOut=Esci
linkedEmpty=Nessun provider collegato
directMembership=Appartenenza diretta
accept=Accetta
error-invalid-length-too-short='{0}' deve avere una lunghezza minima di {1}.
error-number-out-of-range-too-big='{0}' deve avere un valore massimo di {2}.
error-invalid-length-too-short='{{0}}' deve avere una lunghezza minima di {{1}}.
error-number-out-of-range-too-big='{{0}}' deve avere un valore massimo di {{2}}.
updateEmail=Aggiorna email
two-factor=Autenticazione a due fattori
signedInDevicesExplanation=Uscire da tutti i dispositivi sconosciuti.
status=Stato
error-number-out-of-range-too-small='{0}' deve avere un valore minimo di {1}.
error-number-out-of-range-too-small='{{0}}' deve avere un valore minimo di {{1}}.
removeModalMessage=Questo rimuoverà lautorizzazione di accesso attualmente concessa per {{name}}. Dovrai concedere nuovamente laccesso se vuoi utilizzare questa applicazione.
lastName=Cognome
invalidEmailMessage='{{0}}': indirizzo email non valido.
clients=Client
filterByName=Filtra per nome ...
refreshPage=Aggiornare la pagina
error-user-attribute-required=Specificare '{0}'.
error-user-attribute-required=Specificare '{{0}}'.
currentSession=Sessione in corso
error-empty=Specificare il valore di '{0}'.
error-invalid-uri-fragment='{0}' è un frammento URL non valido.
error-empty=Specificare il valore di '{{0}}'.
error-invalid-uri-fragment='{{0}}' è un frammento URL non valido.
signedOutSession=Disconnesso {{browser}}/{{os}}
missingFirstNameMessage='{{0}}': inserisci il nome.
error-invalid-blank=Specificare il valore di '{0}'.
error-invalid-blank=Specificare il valore di '{{0}}'.
share=Condiviso
close=Chiudi
email=Email
@ -48,7 +48,7 @@ signOutAllDevicesWarning=Quest'azione disconnetterà tutti i dispositivi che han
unShareSuccess=La condivisione della risorsa è stata rimossa.
signingIn=Impostazioni di accesso
stopUsingCred=Smettere di usare {{name}}?
error-number-out-of-range='{0}' deve essere un numero compreso tra {1} e {2}.
error-number-out-of-range='{{0}}' deve essere un numero compreso tra {{1}} e {{2}}.
thirdPartyApp=Applicazioni di terze parti
started=Iniziato
updateSuccess=Risorsa aggiornata con successo.
@ -61,13 +61,13 @@ myResources=Le mie risorse
linkedAccountsIntroMessage=Gestire gli accessi tramite utenze di terzi.
groupDescriptionLabel=Visualizza i gruppi con cui sei associato/a
resourceAlreadyShared=La risorsa è già condivisa con questo utente.
error-invalid-length-too-long='{0}' deve avere una lunghezza massima di {2}.
error-invalid-length-too-long='{{0}}' deve avere una lunghezza massima di {{2}}.
accountUpdatedMessage=Il tuo utente è stato aggiornato.
logo=Logo
password-help-text=Accedere inserendo la password.
deleteAccount=Elimina utente
add=Aggiungi
error-invalid-value='{0}' ha un valore non valido.
error-invalid-value='{{0}}' ha un valore non valido.
ipAddress=Indirizzo IP
resourceName=Nome della risorsa
unlinkedEmpty=Nessun provider scollegato
@ -84,23 +84,23 @@ password-display-name=Password
expires=Scade
noGroups=Nessun gruppo
notSetUp={{name}} non è impostato.
error-invalid-number='{0}' non è un numero valido.
error-invalid-number='{{0}}' non è un numero valido.
link=Utente collegato
description=Descrizione
update=Aggiorna
signedInDevices=Dispositivi registrati
missingPasswordMessage='{{0}}': inserisci la password.
otp-help-text=Immettere un codice di verifica dallapplicazione Authenticator.
error-invalid-uri-scheme='{0}' ha uno schema URL non valido.
error-invalid-date='{0}' è una data non valida.
error-invalid-uri-scheme='{{0}}' ha uno schema URL non valido.
error-invalid-date='{{0}}' è una data non valida.
missingEmailMessage='{{0}}': inserisci lindirizzo email.
applicationsIntroMessage=Traccia e gestisci i permessi delle applicazioni nellaccesso al tuo utente
error-invalid-length='{0}' deve avere una lunghezza compresa tra {1} e {2}.
error-invalid-length='{{0}}' deve avere una lunghezza compresa tra {{1}} e {{2}}.
missingLastNameMessage='{{0}}': inserisci il cognome.
linkedLoginProviders=Provider di accesso collegati
inUse=In uso
client=Client
error-invalid-uri='{0}' è un URL non valido.
error-invalid-uri='{{0}}' è un URL non valido.
systemDefined=Sistema definito
internalApp=Interna
accessGrantedOn=Accesso concesso il:
@ -115,13 +115,13 @@ termsOfService=Termini di servizio
requestor=Richiedente
shareWith=Condividi con
updateCredAriaLabel=Aggiorna credenziali
error-pattern-no-match='{0}' non corrisponde al formato richiesto.
error-pattern-no-match='{{0}}' non corrisponde al formato richiesto.
application=Applicazione
unlinkedLoginProviders=Provider di accesso scollegati
applicationDetails=Dettagli dellapplicazione
successRemovedMessage={{userLabel}} è stato rimosso.
deleteAccountWarning=Questa operazione è irreversibile. Tutti i tuoi dati saranno distrutti in modo permanente e non potranno essere recuperati.
error-person-name-invalid-character='{0}' contiene caratteri non validi.
error-person-name-invalid-character='{{0}}' contiene caratteri non validi.
user=Utente
applications=Applicazioni
username=Nome utente
@ -159,7 +159,7 @@ webauthn-help-text=Usa la tua Passkey per accedere.
webauthn-passwordless-display-name=Passkey
webauthn-passwordless-help-text=Usa la tua Passkey per l'accesso senza password.
passwordless=Senza password
error-invalid-multivalued-size=Il campo {0} deve avere almeno {1} e al più {2} valore/i.
error-invalid-multivalued-size=Il campo {{0}} deve avere almeno {{1}} e al più {{2}} valore/i.
recovery-codes-number-used={{0}} codici di recupero usati
recovery-codes-number-remaining={{0}} codici di recupero rimanenti
recovery-codes-generate-new-codes=Genera nuovi codici per assicurarti l'accesso di emergenza al tuo utente

View File

@ -60,7 +60,7 @@ unShareAllConfirm=დარწმუნებული ბრძანდებ
clientTypeHelp=ამ რესურსის ტიპი. შეიძლება გამოიყენოთ სხვადასხვა იგივე ტიპის რესურსების დასაჯგუფებლად.
missingPasswordMessage='{{0}}': მიუთითეთ პაროლი.
error-invalid-uri-scheme='{{0}}'-ის URL-ის სქემა არასწორია.
error-user-attribute-read-only=ველი ({0}) მხოლოდ-წაკითხვადია.
error-user-attribute-read-only=ველი ({{0}}) მხოლოდ-წაკითხვადია.
otp-help-text=შეიყვანეთ გადამოწმების კოდი ავთენტიკატორი აპლიკაციიდან.
missingLastNameMessage='{{0}}': მიუთითეთ გვარი.
unLinkError=მოხსნა შეუძლებელია მიზეზით: {{error}}

View File

@ -17,20 +17,20 @@ edit=แก้ไข
otp-display-name=แอปพลิเคชันพิสูจน์ตัวจริง
linkedEmpty=ไม่มีผู้ให้บริการที่เชื่อมโยง
directMembership=การเป็นสมาชิกโดยตรง
error-invalid-length-too-short=ลักษณะประจำ {0} จะต้องมีความยาวขั้นต่ำ {1}
error-number-out-of-range-too-big=ลักษณะประจำ {0} จะต้องมีค่าสูงสุด {2}
error-invalid-length-too-short=ลักษณะประจำ {{0}} จะต้องมีความยาวขั้นต่ำ {{1}}
error-number-out-of-range-too-big=ลักษณะประจำ {{0}} จะต้องมีค่าสูงสุด {{2}}
updateEmail=อัปเดตอีเมล
two-factor=การตรวจสอบสิทธิ์แบบสองปัจจัย
signedInDevicesExplanation=ลงชื่อออกจากอุปกรณ์ที่ไม่คุ้นเคย
status=สถานะ
error-number-out-of-range-too-small=ลักษณะประจำ {0} จะต้องมีค่าขั้นต่ำ {1}
error-number-out-of-range-too-small=ลักษณะประจำ {{0}} จะต้องมีค่าขั้นต่ำ {{1}}
removeModalMessage=การกระทำนี้จะลบสิทธิ์การเข้าถึงที่ให้ไว้แก่ {{name}} คุณจะต้องอนุญาตการเข้าถึงอีกครั้งหากต้องการใช้แอปพลิเคชันนี้
lastName=นามสกุล
invalidEmailMessage=ที่อยู่อีเมลไม่ถูกต้อง
clients=ไคลเอนต์
filterByName=กรองตามชื่อ ...
refreshPage=รีเฟรชหน้า
error-user-attribute-required=โปรดระบุลักษณะประจำ {0}
error-user-attribute-required=โปรดระบุลักษณะประจำ {{0}}
currentSession=เซสชันปัจจุบัน
error-empty=โปรดระบุค่า
error-invalid-uri-fragment=fragment URL ไม่ถูกต้อง
@ -45,7 +45,7 @@ signOutAllDevicesWarning=การกระทำนี้จะลงชื่
unShareSuccess=ยกเลิกการแบ่งปันทรัพยากรสำเร็จ
signingIn=ลงชื่อเข้าใช้
stopUsingCred=หยุดใช้ {{name}} หรือ?
error-number-out-of-range=ลักษณะประจำ {0} จะต้องเป็นจำนวนระหว่าง {1} และ {2}
error-number-out-of-range=ลักษณะประจำ {{0}} จะต้องเป็นจำนวนระหว่าง {{1}} และ {{2}}
thirdPartyApp=บุคคลที่สาม
started=เริ่มต้น
updateSuccess=อัปเดตทรัพยากรสำเร็จ
@ -58,7 +58,7 @@ myResources=ทรัพยากรของฉัน
linkedAccountsIntroMessage=จัดการการเข้าสู่ระบบผ่านบัญชีของบุคคลที่สาม
groupDescriptionLabel=ดูกลุ่มที่คุณเชื่อมโยงอยู่
resourceAlreadyShared=ทรัพยากรถูกแบ่งปันกับผู้ใช้งานนี้อยู่แล้ว
error-invalid-length-too-long=ลักษณะประจำ {0} จะต้องมีความยาวสูงสุด {2}
error-invalid-length-too-long=ลักษณะประจำ {{0}} จะต้องมีความยาวสูงสุด {{2}}
accountUpdatedMessage=ได้อัพเดตบัญชีของคุณแล้ว
logo=โลโก้
password-help-text=ลงชื่อเข้าใช้โดยป้อนรหัสผ่านของคุณ
@ -89,11 +89,11 @@ signedInDevices=อุปกรณ์ที่ลงชื่อเข้าใ
missingPasswordMessage=โปรดระบุรหัสผ่าน
otp-help-text=ป้อนรหัสยืนยันจากแอปพลิเคชันพิสูจน์ตัวจริง
error-invalid-uri-scheme=scheme URL ไม่ถูกต้อง
error-user-attribute-read-only=เขตข้อมูล {0} เป็นแบบอ่านอย่างเดียว
error-user-attribute-read-only=เขตข้อมูล {{0}} เป็นแบบอ่านอย่างเดียว
error-invalid-date=วันที่ไม่ถูกต้อง
missingEmailMessage=โปรดระบุอีเมล
applicationsIntroMessage=ติดตามและจัดการการอนุญาตให้แอปพลิเคชันเข้าถึงบัญชีของคุณ
error-invalid-length=ลักษณะประจำ {0} จะต้องมีความยาวระหว่าง {1} และ {2}
error-invalid-length=ลักษณะประจำ {{0}} จะต้องมีความยาวระหว่าง {{1}} และ {{2}}
missingLastNameMessage=โปรดระบุนามสกุล
linkedLoginProviders=ผู้ให้บริการเข้าสู่ระบบที่เชื่อมโยง
inUse=กำลังใช้งาน

View File

@ -189,6 +189,6 @@ error-invalid-multivalued-size=屬性 {{0}} 必须至少有 {{1}} 且最多 {{2}
recovery-authn-code=我的恢复验证码
recovery-authn-codes-display-name=恢复验证码
recovery-authn-codes-help-text=如果您的其他 2FA 方式不可用,这些验证码可用于重新获得访问权限。
recovery-codes-number-used={0} 使用的恢复验证码
recovery-codes-number-remaining={0} 剩余的恢复验证码
recovery-codes-number-used={{0}} 使用的恢复验证码
recovery-codes-number-remaining={{0}} 剩余的恢复验证码
recovery-codes-generate-new-codes=生成新验证码以确保访问您的帐户

View File

@ -53,8 +53,10 @@ public class VerifyMessageProperties {
verifyProblematicBlanks();
if (validateMessageFormatQuotes) {
verifyMessageFormatQuotes();
verifyMessageFormatPlaceholders();
} else {
verifyNotMessageFormatQuotes();
verifyNotMessageFormatPlaceholders();
}
} catch (IOException e) {
throw new MojoExecutionException("Can not read file " + file, e);
@ -65,12 +67,7 @@ public class VerifyMessageProperties {
private final static Pattern DOUBLE_SINGLE_QUOTES = Pattern.compile("''");
private void verifyNotMessageFormatQuotes() {
PropertyResourceBundle bundle;
try (FileInputStream fis = new FileInputStream(file)) {
bundle = new PropertyResourceBundle(fis);
} catch (IOException e) {
throw new RuntimeException("unable to read file " + file, e);
}
PropertyResourceBundle bundle = getPropertyResourceBundle();
bundle.getKeys().asIterator().forEachRemaining(key -> {
String value = bundle.getString(key);
@ -87,12 +84,7 @@ public class VerifyMessageProperties {
private static final Pattern SINGLE_QUOTE_START = Pattern.compile("^'[^']");
private void verifyMessageFormatQuotes() {
PropertyResourceBundle bundle;
try (FileInputStream fis = new FileInputStream(file)) {
bundle = new PropertyResourceBundle(fis);
} catch (IOException e) {
throw new RuntimeException("unable to read file " + file, e);
}
PropertyResourceBundle bundle = getPropertyResourceBundle();
bundle.getKeys().asIterator().forEachRemaining(key -> {
String value = bundle.getString(key);
@ -106,6 +98,52 @@ public class VerifyMessageProperties {
});
}
private static final Pattern DOUBLE_CURLY_BRACES_START = Pattern.compile("\\{\\{[0-9]");
private static final Pattern DOUBLE_CURLY_BRACES_END = Pattern.compile("[0-9]}}");
private void verifyMessageFormatPlaceholders() {
PropertyResourceBundle bundle = getPropertyResourceBundle();
bundle.getKeys().asIterator().forEachRemaining(key -> {
String value = bundle.getString(key);
if (DOUBLE_CURLY_BRACES_START.matcher(value).find()
|| DOUBLE_CURLY_BRACES_END.matcher(value).find()) {
messages.add("Double curly braces are not allowed in message formats in the backend for in '" + key + "' for file " + file + ": " + value);
}
});
}
private static final Pattern SINGLE_CURLY_BRACE_MIDDLE = Pattern.compile("[^{]\\{[0-9]");
private static final Pattern SINGLE_CURLY_BRACE_END = Pattern.compile("[0-9]}$");
private static final Pattern SINGLE_CURLY_BRACE_START = Pattern.compile("^\\{[0-9]");
private void verifyNotMessageFormatPlaceholders() {
PropertyResourceBundle bundle = getPropertyResourceBundle();
bundle.getKeys().asIterator().forEachRemaining(key -> {
String value = bundle.getString(key);
if (SINGLE_CURLY_BRACE_START.matcher(value).find()
|| SINGLE_CURLY_BRACE_MIDDLE.matcher(value).find()
|| SINGLE_CURLY_BRACE_END.matcher(value).find()) {
messages.add("Single curly quotes are not supported as placeholders for the frontend in '" + key + "' for file " + file + ": " + value);
}
});
}
private PropertyResourceBundle getPropertyResourceBundle() {
PropertyResourceBundle bundle;
try (FileInputStream fis = new FileInputStream(file)) {
bundle = new PropertyResourceBundle(fis);
} catch (IOException e) {
throw new RuntimeException("unable to read file " + file, e);
}
return bundle;
}
PolicyFactory POLICY_SOME_HTML = new org.owasp.html.HtmlPolicyBuilder()
.allowElements(
"br", "p", "strong", "b"
@ -114,12 +152,7 @@ public class VerifyMessageProperties {
PolicyFactory POLICY_NO_HTML = new org.owasp.html.HtmlPolicyBuilder().toFactory();
private void verifySafeHtml() {
PropertyResourceBundle bundle;
try (FileInputStream fis = new FileInputStream(file)) {
bundle = new PropertyResourceBundle(fis);
} catch (IOException e) {
throw new RuntimeException("unable to read file " + file, e);
}
PropertyResourceBundle bundle = getPropertyResourceBundle();
PropertyResourceBundle bundleEnglish;
String englishFile = file.getAbsolutePath().replaceAll("resources-community", "resources")
@ -174,12 +207,7 @@ public class VerifyMessageProperties {
// Only check EN original files, as the other files are checked by the translation tools
return;
}
PropertyResourceBundle bundle;
try (FileInputStream fis = new FileInputStream(file)) {
bundle = new PropertyResourceBundle(fis);
} catch (IOException e) {
throw new RuntimeException("unable to read file " + file, e);
}
PropertyResourceBundle bundle = getPropertyResourceBundle();
bundle.getKeys().asIterator().forEachRemaining(key -> {
String value = bundle.getString(key);

View File

@ -51,6 +51,31 @@ class VerifyMessagePropertiesTest {
MatcherAssert.assertThat(verify, Matchers.hasItem(Matchers.containsString("Didn't find anchor tag")));
}
@Test
void verifySingleCurlyBraces() throws MojoExecutionException {
List<String> verify = getFile("doubleCurlyBraces_en.properties").withValidateMessageFormatQuotes(true).verify();
MatcherAssert.assertThat(verify, Matchers.hasItem(Matchers.containsString("Double curly braces are not allowed")));
}
@Test
void verifyNoDoubleCurlyBrances() throws MojoExecutionException {
List<String> verify = getFile("doubleCurlyBraces_en.properties").withValidateMessageFormatQuotes(true).verify();
MatcherAssert.assertThat(verify, Matchers.hasItem(Matchers.containsString("Double curly braces are not allowed")));
}
@Test
void verifyNoSingleCurlyBraces() throws MojoExecutionException {
List<String> verify = getFile("singleCurlyBracesEnd_en.properties").withValidateMessageFormatQuotes(false).verify();
MatcherAssert.assertThat(verify, Matchers.hasItem(Matchers.containsString("Single curly quotes are not supported")));
verify = getFile("singleCurlyBracesMiddle_en.properties").withValidateMessageFormatQuotes(false).verify();
MatcherAssert.assertThat(verify, Matchers.hasItem(Matchers.containsString("Single curly quotes are not supported")));
verify = getFile("singleCurlyBracesStart_en.properties").withValidateMessageFormatQuotes(false).verify();
MatcherAssert.assertThat(verify, Matchers.hasItem(Matchers.containsString("Single curly quotes are not supported")));
}
@Test
void verifyNoSingleQuoteForMessageFormat() throws MojoExecutionException {
List<String> verify = getFile("singleQuotesStart_en.properties").withValidateMessageFormatQuotes(true).verify();

View File

@ -0,0 +1,17 @@
#
# Copyright 2025 Red Hat, Inc. and/or its affiliates
# and other contributors as indicated by the @author tags.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
key={{0}}

View File

@ -0,0 +1,17 @@
#
# Copyright 2025 Red Hat, Inc. and/or its affiliates
# and other contributors as indicated by the @author tags.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
key=x{0}

View File

@ -0,0 +1,17 @@
#
# Copyright 2025 Red Hat, Inc. and/or its affiliates
# and other contributors as indicated by the @author tags.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
key=x{0}x

View File

@ -0,0 +1,17 @@
#
# Copyright 2025 Red Hat, Inc. and/or its affiliates
# and other contributors as indicated by the @author tags.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
key={0}x