diff --git a/custom/languages/en.ini b/custom/languages/en.ini
index 27a00db..aeb9ba8 100644
--- a/custom/languages/en.ini
+++ b/custom/languages/en.ini
@@ -8,72 +8,85 @@ language_name_no = "Norsk"
categories = "Categories"
tags = "Tags"
-; FAQ
-faq_summary_label = "In short:"
-faq_read_full_answer = "Read full answer"
+[faq]
+summary_label = "In short:"
+read_full_answer = "Read full answer"
-; Footer
-footer_social = "Follow us on Mastodon"
-footer_copyright = "Copyright"
-footer_follow_mastodon = "Follow us on Mastodon"
-footer_handcoded = "This website was hand-coded by Ruben Solvang using HTML, CSS and minimal doses of PHP. It took"
-footer_page_time = "ms to generate this page."
+[footer]
+social = "Follow us on Mastodon"
+copyright = "Copyright"
+follow_mastodon = "Follow us on Mastodon"
+handcoded = "This website was hand-coded by Ruben Solvang using HTML, CSS and minimal doses of PHP. It took"
+page_time = "ms to generate this page."
-; Petition form
-petition.form_title = "Sign the Petition"
-petition.firstname_label = "First name"
-petition.firstname_placeholder = "Your first name"
-petition.firstname_required = "First name is required"
-petition.surname_label = "Surname"
-petition.surname_placeholder = "Your surname"
-petition.surname_required = "Surname is required"
-petition.email_label = "Email"
-petition.email_placeholder = "your@email.com"
-petition.email_help = "Not shown publicly, only for confirmation"
-petition.email_required = "Valid email is required"
-petition.region_label = "Region"
-petition.region_required = "Please select a region"
-petition.region_placeholder = "Select region..."
-petition.display_legend = "How should you appear in the list?"
-petition.display_semi = "Show my first name and region (default)"
-petition.display_anonymous = "Anonymous - only show my region"
-petition.anonymous_name = "Anonymous"
-petition.from_region = "from"
-petition.display_full = "Show my full name and region"
-petition.submit_button = "Sign the Petition"
-petition.signatures_title = "Signatures"
-petition.signature_count = "{count} signature"
-petition.signature_count_plural = "{count} signatures"
-petition.newest_first = "Newest first"
-petition.error_csrf = "Security error. Please try again."
-petition.error_honeypot = "Invalid submission."
-petition.error_rate_limit = "Please wait a moment before submitting again."
-petition.error_time_check = "Multiple signature attempts were sent from the same computer within a short time. Please wait a moment and try again."
-petition.error_referrer = "Invalid request."
-petition.error_validation = "Please correct the errors in the form."
-petition.error_email_send = "Could not send confirmation email. Please try again later."
-petition.error_already_signed = "This email address has already signed this petition."
-petition.success_pending = "Thank you! Check your email to confirm your signature."
-petition.confirm_success = "Thank you! Your signature has been confirmed and added to the list."
-petition.confirm_error = "Invalid or expired confirmation link."
-petition.confirm_already = "This signature has already been confirmed."
-petition.email_subject = "Confirm your signature"
-petition.email_greeting = "Hello {name},"
-petition.email_thanks = "Thank you for signing the petition \"{title}\"."
-petition.email_confirm = "Please confirm your signature by clicking this link:"
-petition.email_ignore = "If you did not sign this petition, please ignore this email."
-petition.email_signature = "Best regards"
-petition.email_org = "Stop the Suffering"
+[petition]
+form_title = "Sign the Petition"
+firstname_label = "First name"
+firstname_placeholder = "Your first name"
+firstname_required = "First name is required"
+surname_label = "Surname"
+surname_placeholder = "Your surname"
+surname_required = "Surname is required"
+email_label = "Email"
+email_placeholder = "your@email.com"
+email_help = "Not shown publicly, only for confirmation"
+email_required = "Valid email is required"
+region_label = "Region"
+region_required = "Please select a region"
+region_placeholder = "Select region..."
+display_legend = "How should you appear in the list?"
+display_semi = "Show my first name and region (default)"
+display_anonymous = "Anonymous - only show my region"
+anonymous_name = "Anonymous"
+from_region = "from"
+display_full = "Show my full name and region"
+submit_button = "Sign the Petition"
+signatures_title = "Signatures"
+signature_count = "{count} signature"
+signature_count_plural = "{count} signatures"
+newest_first = "Newest first"
+error_csrf = "Security error. Please try again."
+error_honeypot = "Invalid submission."
+error_rate_limit = "Please wait a moment before submitting again."
+error_ip_rate_limit = "Too many attempts from your IP address. Please wait 5 minutes before trying again."
+error_time_check = "Multiple signature attempts were sent from the same computer within a short time. Please wait a moment and try again."
+error_referrer = "Invalid request."
+error_validation = "Please correct the errors in the form."
+error_email_send = "Could not send confirmation email. Please try again later."
+error_already_signed = "This email address has already signed this petition."
+success_pending = "Thank you! Check your email to confirm your signature."
+confirm_success = "Thank you! Your signature has been confirmed and added to the list."
+confirm_error = "Invalid confirmation link."
+confirm_expired = "This confirmation link has expired (max 30 days). Please sign the petition again if you still wish to support it."
+confirm_already = "This signature has already been confirmed."
+email_subject = "Confirm your signature"
+email_greeting = "Hello {name},"
+email_thanks = "Thank you for signing the petition \"{title}\"."
+email_confirm = "Please confirm your signature by clicking this link:"
+email_expiry_notice = "This link is valid for 30 days for privacy reasons (GDPR compliance)."
+email_ignore = "If you did not sign this petition, please ignore this email."
+email_signature = "Best regards"
+email_org = "Stop the Suffering"
+email_thankyou_subject = "Thank you for your signature"
+email_thankyou_confirmed = "Your signature on the petition \"{title}\" has been confirmed and registered."
+email_delete_info = "If you wish to withdraw your signature, you can do so at any time by clicking this link:"
+delete_success = "Your signature has been deleted."
+delete_error = "Could not delete the signature. The link may be invalid."
; Norwegian regions (fylker) - kept in Norwegian as they are proper nouns
-regions.oslo = "Oslo"
-regions.rogaland = "Rogaland"
-regions.more_og_romsdal = "Møre og Romsdal"
-regions.nordland = "Nordland"
-regions.viken = "Viken"
-regions.innlandet = "Innlandet"
-regions.vestfold_og_telemark = "Vestfold og Telemark"
-regions.agder = "Agder"
-regions.vestland = "Vestland"
-regions.trondelag = "Trøndelag"
-regions.troms_og_finnmark = "Troms og Finnmark"
+[regions]
+agder = "Agder"
+akershus = "Akershus"
+buskerud = "Buskerud"
+finnmark = "Finnmark"
+innlandet = "Innlandet"
+more_og_romsdal = "Møre og Romsdal"
+nordland = "Nordland"
+oslo = "Oslo"
+rogaland = "Rogaland"
+telemark = "Telemark"
+troms = "Troms"
+trondelag = "Trøndelag"
+vestfold = "Vestfold"
+vestland = "Vestland"
+ostfold = "Østfold"
diff --git a/custom/languages/no.ini b/custom/languages/no.ini
index 06ae11d..0b90902 100644
--- a/custom/languages/no.ini
+++ b/custom/languages/no.ini
@@ -8,72 +8,84 @@ language_name_en = "English"
categories = "Kategorier"
tags = "Stikkord"
-; FAQ
-faq_summary_label = "Kort oppsumert:"
-faq_read_full_answer = "Les hele svaret"
+[faq]
+summary_label = "Kort oppsumert:"
+read_full_answer = "Les hele svaret"
-; Footer
-footer_social = "Følg oss på Facebook, Instagram og Mastodon"
-footer_copyright = "Opphavsrett"
-footer_follow_mastodon = "Følg oss på Mastodon"
-footer_handcoded = "Nettsiden er håndkodet av Ruben Solvang ved hjelp av HTML, CSS og minimale doser PHP. Det tok"
-footer_page_time = "ms å generere siden."
+[footer]
+social = "Følg oss på Facebook, Instagram og Mastodon"
+copyright = "Opphavsrett"
+follow_mastodon = "Følg oss på Mastodon"
+handcoded = "Nettsiden er håndkodet av Ruben Solvang ved hjelp av HTML, CSS og minimale doser PHP. Det tok"
+page_time = "ms å generere siden."
-; Petition form
-petition.form_title = "Signer underskriftskampanjen"
-petition.firstname_label = "Fornavn"
-petition.firstname_placeholder = "Ditt fornavn"
-petition.firstname_required = "Fornavn er påkrevd"
-petition.surname_label = "Etternavn"
-petition.surname_placeholder = "Ditt etternavn"
-petition.surname_required = "Etternavn er påkrevd"
-petition.email_label = "E-post"
-petition.email_placeholder = "din@epost.no"
-petition.email_help = "Vises ikke offentlig, kun for bekreftelse"
-petition.email_required = "Gyldig e-post er påkrevd"
-petition.region_label = "Fylke"
-petition.region_required = "Velg fylke"
-petition.region_placeholder = "Velg fylke..."
-petition.display_legend = "Hvordan vil du vises i listen?"
-petition.display_semi = "Vis mitt fornavn og fylke (standard)"
-petition.display_anonymous = "Anonym - vis bare mitt fylke"
-petition.anonymous_name = "Anonym"
-petition.from_region = "fra"
-petition.display_full = "Vis mitt fulle navn og fylke"
-petition.submit_button = "Signer underskriftskampanjen"
-petition.signatures_title = "Underskrifter"
-petition.signature_count = "{count} underskrift"
-petition.signature_count_plural = "{count} underskrifter"
-petition.newest_first = "Nyeste først"
-petition.error_csrf = "Sikkerhetsfeil. Vennligst prøv igjen."
-petition.error_honeypot = "Ugyldig innsending."
-petition.error_rate_limit = "Vennligst vent litt før du sender på nytt."
-petition.error_time_check = "Flere underskrifter ble forsøkt levert fra samme PC innen et kort tidsrom. Vennligst vent en stund og prøv på nytt."
-petition.error_referrer = "Ugyldig forespørsel."
-petition.error_validation = "Vennligst rett opp feilene i skjemaet."
-petition.error_email_send = "Kunne ikke sende bekreftelsesmail. Vennligst prøv igjen senere."
-petition.error_already_signed = "Denne e-postadressen har allerede signert denne kampanjen."
-petition.success_pending = "Takk! Sjekk din e-post for å bekrefte signaturen."
-petition.confirm_success = "Takk! Din signatur er nå bekreftet og lagt til i listen."
-petition.confirm_error = "Ugyldig eller utløpt bekreftelseslenke."
-petition.confirm_already = "Denne signaturen er allerede bekreftet."
-petition.email_subject = "Bekreft din signatur"
-petition.email_greeting = "Hei {name},"
-petition.email_thanks = "Takk for at du signerte underskriftskampanjen «{title}»."
-petition.email_confirm = "Vennligst bekreft din signatur ved å klikke på denne lenken:"
-petition.email_ignore = "Hvis du ikke signerte denne kampanjen, kan du ignorere denne e-posten."
-petition.email_signature = "Med vennlig hilsen"
-petition.email_org = "Stopp Lidelsen"
+[petition]
+form_title = "Signer underskriftskampanjen"
+firstname_label = "Fornavn"
+firstname_placeholder = "Ditt fornavn"
+firstname_required = "Fornavn er påkrevd"
+surname_label = "Etternavn"
+surname_placeholder = "Ditt etternavn"
+surname_required = "Etternavn er påkrevd"
+email_label = "E-post"
+email_placeholder = "din@epost.no"
+email_help = "Vises ikke offentlig, kun for bekreftelse"
+email_required = "Gyldig e-post er påkrevd"
+region_label = "Fylke"
+region_required = "Velg fylke"
+region_placeholder = "Velg fylke..."
+display_legend = "Hvordan vil du vises i listen?"
+display_semi = "Vis mitt fornavn og fylke (standard)"
+display_anonymous = "Anonym - vis bare mitt fylke"
+anonymous_name = "Anonym"
+from_region = "fra"
+display_full = "Vis mitt fulle navn og fylke"
+submit_button = "Signer underskriftskampanjen"
+signatures_title = "Underskrifter"
+signature_count = "{count} underskrift"
+signature_count_plural = "{count} underskrifter"
+newest_first = "Nyeste først"
+error_csrf = "Sikkerhetsfeil. Vennligst prøv igjen."
+error_honeypot = "Ugyldig innsending."
+error_rate_limit = "Vennligst vent litt før du sender på nytt."
+error_ip_rate_limit = "For mange forsøk fra din IP-adresse. Vennligst vent 5 minutter før du prøver igjen."
+error_time_check = "Flere underskrifter ble forsøkt levert fra samme PC innen et kort tidsrom. Vennligst vent en stund og prøv på nytt."
+error_referrer = "Ugyldig forespørsel."
+error_validation = "Vennligst rett opp feilene i skjemaet."
+error_email_send = "Kunne ikke sende bekreftelsesmail. Vennligst prøv igjen senere."
+error_already_signed = "Denne e-postadressen har allerede signert denne kampanjen."
+success_pending = "Takk! Sjekk din e-post for å bekrefte signaturen."
+confirm_success = "Takk! Din signatur er nå bekreftet og lagt til i listen."
+confirm_error = "Ugyldig bekreftelseslenke."
+confirm_expired = "Denne bekreftelseslenken har utløpt (maks 30 dager). Vennligst signer kampanjen på nytt hvis du fortsatt ønsker å støtte den."
+confirm_already = "Denne signaturen er allerede bekreftet."
+email_subject = "Bekreft din signatur"
+email_greeting = "Hei {name},"
+email_thanks = "Takk for at du signerte underskriftskampanjen «{title}»."
+email_confirm = "Vennligst bekreft din signatur ved å klikke på denne lenken:"
+email_expiry_notice = "Denne lenken er gyldig i 30 dager av personvernhensyn (GDPR)."
+email_ignore = "Hvis du ikke signerte denne kampanjen, kan du ignorere denne e-posten."
+email_signature = "Med vennlig hilsen"
+email_org = "Stopp Lidelsen"
+email_thankyou_subject = "Takk for din signatur"
+email_thankyou_confirmed = "Din signatur på underskriftskampanjen «{title}» er nå bekreftet og registrert."
+email_delete_info = "Hvis du ønsker å trekke tilbake din signatur, kan du gjøre det når som helst ved å klikke på denne lenken:"
+delete_success = "Din signatur er nå slettet."
+delete_error = "Kunne ikke slette signaturen. Lenken kan være ugyldig."
-; Norwegian regions (fylker)
-regions.oslo = "Oslo"
-regions.rogaland = "Rogaland"
-regions.more_og_romsdal = "Møre og Romsdal"
-regions.nordland = "Nordland"
-regions.viken = "Viken"
-regions.innlandet = "Innlandet"
-regions.vestfold_og_telemark = "Vestfold og Telemark"
-regions.agder = "Agder"
-regions.vestland = "Vestland"
-regions.trondelag = "Trøndelag"
-regions.troms_og_finnmark = "Troms og Finnmark"
+[regions]
+agder = "Agder"
+akershus = "Akershus"
+buskerud = "Buskerud"
+finnmark = "Finnmark"
+innlandet = "Innlandet"
+more_og_romsdal = "Møre og Romsdal"
+nordland = "Nordland"
+oslo = "Oslo"
+rogaland = "Rogaland"
+telemark = "Telemark"
+troms = "Troms"
+trondelag = "Trøndelag"
+vestfold = "Vestfold"
+vestland = "Vestland"
+ostfold = "Østfold"