315 lines
30 KiB
Go
315 lines
30 KiB
Go
package app
|
||
|
||
import (
|
||
"net/http"
|
||
"strings"
|
||
|
||
"github.com/b1tsblog/ai-disclosure-standard/internal/i18n"
|
||
)
|
||
|
||
type legalItem struct {
|
||
Label string
|
||
Value string
|
||
URL string
|
||
}
|
||
|
||
type legalSection struct {
|
||
Title string
|
||
Paragraphs []string
|
||
Items []legalItem
|
||
}
|
||
|
||
type legalPage struct {
|
||
Kind string
|
||
Title string
|
||
Lead string
|
||
Sections []legalSection
|
||
NoticeTitle string
|
||
Notice string
|
||
}
|
||
|
||
type legalCopy struct {
|
||
LegalLabel, PrivacyLabel, AccessibilityLabel string
|
||
LegalTitle, LegalLead string
|
||
Operator, Representative, Contact string
|
||
Address, Email, Phone, Register, RegisterNo string
|
||
VAT, Editorial, EditorialAddress string
|
||
DisputeTitle, DisputeNA, DisputeNo, DisputeYes string
|
||
PrivacyTitle, PrivacyLead string
|
||
Controller, DataProtection, Hosting string
|
||
HostingAddress, Logs, Retention, Recipients string
|
||
Transfers, Authority string
|
||
PrivacyTechTitle, PrivacyTechText string
|
||
AccessibilityTitle, AccessibilityLead string
|
||
AccessibilityContact, AccessibilityStatus string
|
||
AccessibilityTechTitle, AccessibilityTechText string
|
||
NoticeTitle, Notice string
|
||
}
|
||
|
||
func legalLabels(lang string) legalCopy {
|
||
base := legalCopy{
|
||
LegalLabel: "Legal notice", PrivacyLabel: "Privacy", AccessibilityLabel: "Accessibility",
|
||
LegalTitle: "Legal notice", LegalLead: "Operator and contact information for this service.",
|
||
Operator: "Operator", Representative: "Represented by", Contact: "Contact", Address: "Address", Email: "Email", Phone: "Phone", Register: "Register", RegisterNo: "Register number", VAT: "VAT ID", Editorial: "Editorial responsibility", EditorialAddress: "Address of editorially responsible person",
|
||
DisputeTitle: "Consumer dispute resolution", DisputeNA: "The operator has assessed the general information obligation as not applicable to this service.", DisputeNo: "The operator states that it does not participate in consumer dispute resolution proceedings unless legally required otherwise.", DisputeYes: "The operator states that it participates in consumer dispute resolution proceedings before the body listed below.",
|
||
PrivacyTitle: "Privacy information", PrivacyLead: "Information about the operation of this service and the processing of technical connection data.",
|
||
Controller: "Controller / operator", DataProtection: "Data protection contact", Hosting: "Hosting provider", HostingAddress: "Hosting address", Logs: "Server logs", Retention: "Log retention", Recipients: "Recipients / processors", Transfers: "Third-country transfers", Authority: "Supervisory authority",
|
||
PrivacyTechTitle: "Technical design", PrivacyTechText: "The application itself does not require advertising trackers or third-party analytics. Depending on the deployment, the reverse proxy, hosting platform or surrounding infrastructure may process connection and log data. The operator must keep the information on this page aligned with the actual deployment.",
|
||
AccessibilityTitle: "Accessibility", AccessibilityLead: "Information and contact options relating to the accessibility of this service.", AccessibilityContact: "Accessibility contact", AccessibilityStatus: "Accessibility status",
|
||
AccessibilityTechTitle: "Technical approach", AccessibilityTechText: "The application uses semantic HTML, keyboard-operable controls and language metadata. This statement is not a certification. The operator remains responsible for testing the deployed service, custom content, branding and integrations against the requirements applicable to it.",
|
||
NoticeTitle: "Important", Notice: "These pages are configurable operator information, not legal advice. Their completeness and legal applicability depend on the operator, jurisdiction, business model and actual technical deployment.",
|
||
}
|
||
switch normalizeLanguage(lang) {
|
||
case "de":
|
||
base.LegalLabel, base.PrivacyLabel, base.AccessibilityLabel = "Impressum", "Datenschutz", "Barrierefreiheit"
|
||
base.LegalTitle, base.LegalLead = "Impressum und Anbieterinformationen", "Angaben zum Betreiber und zu den Kontaktmöglichkeiten dieses Dienstes."
|
||
base.Operator, base.Representative, base.Contact = "Anbieter / Betreiber", "Vertreten durch", "Kontakt"
|
||
base.Address, base.Email, base.Phone, base.Register, base.RegisterNo, base.VAT = "Anschrift", "E-Mail", "Telefon", "Register", "Registernummer", "Umsatzsteuer-ID"
|
||
base.Editorial, base.EditorialAddress = "Journalistisch-redaktionell verantwortlich", "Anschrift der verantwortlichen Person"
|
||
base.DisputeTitle = "Verbraucherstreitbeilegung"
|
||
base.DisputeNA = "Der Betreiber hat die allgemeine Informationspflicht zur Verbraucherstreitbeilegung für dieses Angebot als nicht anwendbar eingeordnet."
|
||
base.DisputeNo = "Der Betreiber erklärt, nicht an Streitbeilegungsverfahren vor einer Verbraucherschlichtungsstelle teilzunehmen, soweit keine gesetzliche Verpflichtung besteht."
|
||
base.DisputeYes = "Der Betreiber erklärt, an Streitbeilegungsverfahren vor der nachfolgend genannten Verbraucherschlichtungsstelle teilzunehmen."
|
||
base.PrivacyTitle, base.PrivacyLead = "Datenschutzhinweise", "Informationen zum Betrieb dieses Dienstes und zur Verarbeitung technischer Verbindungsdaten."
|
||
base.Controller, base.DataProtection, base.Hosting, base.HostingAddress = "Verantwortlicher / Betreiber", "Datenschutzkontakt", "Hosting-Anbieter", "Anschrift des Hosting-Anbieters"
|
||
base.Logs, base.Retention, base.Recipients, base.Transfers, base.Authority = "Server-Protokolle", "Speicherdauer der Protokolle", "Empfänger / Auftragsverarbeiter", "Drittlandübermittlungen", "Aufsichtsbehörde"
|
||
base.PrivacyTechTitle = "Technische Ausgestaltung"
|
||
base.PrivacyTechText = "Die Anwendung selbst benötigt keine Werbetracker oder Drittanbieter-Analytics. Je nach Deployment können Reverse Proxy, Hosting-Plattform oder umgebende Infrastruktur Verbindungs- und Protokolldaten verarbeiten. Der Betreiber muss die Angaben auf dieser Seite mit dem tatsächlichen Betrieb abgleichen."
|
||
base.AccessibilityTitle, base.AccessibilityLead = "Barrierefreiheit", "Informationen und Kontaktmöglichkeiten zur Barrierefreiheit dieses Dienstes."
|
||
base.AccessibilityContact, base.AccessibilityStatus = "Kontakt zur Barrierefreiheit", "Stand der Barrierefreiheit"
|
||
base.AccessibilityTechTitle = "Technischer Ansatz"
|
||
base.AccessibilityTechText = "Die Anwendung verwendet semantisches HTML, tastaturbedienbare Steuerelemente und Sprachmetadaten. Diese Angabe ist keine Zertifizierung. Der Betreiber bleibt dafür verantwortlich, das konkrete Deployment, eigene Inhalte, Branding und Integrationen anhand der für ihn geltenden Anforderungen zu prüfen."
|
||
base.NoticeTitle, base.Notice = "Wichtiger Hinweis", "Diese Seiten stellen konfigurierbare Betreiberinformationen und keine Rechtsberatung dar. Vollständigkeit und rechtliche Anwendbarkeit hängen vom Betreiber, der Rechtsordnung, dem Geschäftsmodell und dem tatsächlichen technischen Betrieb ab."
|
||
case "fr":
|
||
base.LegalLabel, base.PrivacyLabel, base.AccessibilityLabel = "Mentions légales", "Confidentialité", "Accessibilité"
|
||
base.LegalTitle, base.LegalLead = "Mentions légales", "Informations sur l’exploitant et les moyens de contact de ce service."
|
||
base.Operator, base.Representative, base.Contact = "Exploitant", "Représenté par", "Contact"
|
||
base.Address, base.Email, base.Phone, base.Register, base.RegisterNo, base.VAT = "Adresse", "E-mail", "Téléphone", "Registre", "Numéro d’enregistrement", "Numéro de TVA"
|
||
base.Editorial, base.EditorialAddress = "Responsabilité éditoriale", "Adresse de la personne responsable"
|
||
base.DisputeTitle, base.DisputeNA = "Règlement des litiges de consommation", "L’exploitant a considéré que l’obligation générale d’information relative au règlement des litiges de consommation n’est pas applicable à ce service."
|
||
base.DisputeNo = "L’exploitant déclare ne pas participer à une procédure de règlement des litiges de consommation, sauf obligation légale contraire."
|
||
base.DisputeYes = "L’exploitant déclare participer à une procédure de règlement des litiges devant l’organisme indiqué ci-dessous."
|
||
base.PrivacyTitle, base.PrivacyLead = "Informations sur la confidentialité", "Informations sur l’exploitation du service et le traitement des données techniques de connexion."
|
||
base.Controller, base.DataProtection, base.Hosting, base.HostingAddress = "Responsable / exploitant", "Contact protection des données", "Hébergeur", "Adresse de l’hébergeur"
|
||
base.Logs, base.Retention, base.Recipients, base.Transfers, base.Authority = "Journaux serveur", "Durée de conservation des journaux", "Destinataires / sous-traitants", "Transferts vers des pays tiers", "Autorité de contrôle"
|
||
base.PrivacyTechTitle, base.PrivacyTechText = "Conception technique", "L’application elle-même ne nécessite ni traceurs publicitaires ni outils d’analyse tiers. Selon le déploiement, le proxy inverse, l’hébergement ou l’infrastructure environnante peuvent traiter des données de connexion et de journalisation. L’exploitant doit maintenir ces informations conformes au fonctionnement réel."
|
||
base.AccessibilityTitle, base.AccessibilityLead = "Accessibilité", "Informations et contact concernant l’accessibilité de ce service."
|
||
base.AccessibilityContact, base.AccessibilityStatus = "Contact accessibilité", "État d’accessibilité"
|
||
base.AccessibilityTechTitle, base.AccessibilityTechText = "Approche technique", "L’application utilise du HTML sémantique, des contrôles utilisables au clavier et des métadonnées de langue. Cette indication n’est pas une certification. L’exploitant reste responsable de l’évaluation du déploiement, des contenus personnalisés, de l’identité visuelle et des intégrations."
|
||
base.NoticeTitle, base.Notice = "Remarque importante", "Ces pages fournissent des informations configurables sur l’exploitant et ne constituent pas un conseil juridique. Leur exhaustivité dépend du déploiement et du droit applicable."
|
||
case "es":
|
||
base.LegalLabel, base.PrivacyLabel, base.AccessibilityLabel = "Aviso legal", "Privacidad", "Accesibilidad"
|
||
base.LegalTitle, base.LegalLead = "Aviso legal", "Información sobre el operador y los medios de contacto de este servicio."
|
||
base.Operator, base.Representative, base.Contact = "Operador", "Representado por", "Contacto"
|
||
base.Address, base.Email, base.Phone, base.Register, base.RegisterNo, base.VAT = "Dirección", "Correo electrónico", "Teléfono", "Registro", "Número registral", "NIF-IVA"
|
||
base.Editorial, base.EditorialAddress = "Responsabilidad editorial", "Dirección de la persona responsable"
|
||
base.DisputeTitle, base.DisputeNA = "Resolución de litigios de consumo", "El operador ha considerado que la obligación general de información sobre resolución de litigios de consumo no es aplicable a este servicio."
|
||
base.DisputeNo = "El operador declara que no participa en procedimientos de resolución de litigios de consumo salvo obligación legal."
|
||
base.DisputeYes = "El operador declara que participa en procedimientos de resolución de litigios ante el organismo indicado a continuación."
|
||
base.PrivacyTitle, base.PrivacyLead = "Información de privacidad", "Información sobre la operación del servicio y el tratamiento de datos técnicos de conexión."
|
||
base.Controller, base.DataProtection, base.Hosting, base.HostingAddress = "Responsable / operador", "Contacto de protección de datos", "Proveedor de alojamiento", "Dirección del proveedor de alojamiento"
|
||
base.Logs, base.Retention, base.Recipients, base.Transfers, base.Authority = "Registros del servidor", "Conservación de registros", "Destinatarios / encargados", "Transferencias a terceros países", "Autoridad de control"
|
||
base.PrivacyTechTitle, base.PrivacyTechText = "Diseño técnico", "La aplicación no requiere rastreadores publicitarios ni analítica de terceros. Según el despliegue, el proxy inverso, el alojamiento o la infraestructura circundante pueden procesar datos de conexión y registros. El operador debe mantener esta información alineada con el funcionamiento real."
|
||
base.AccessibilityTitle, base.AccessibilityLead = "Accesibilidad", "Información y contacto sobre la accesibilidad de este servicio."
|
||
base.AccessibilityContact, base.AccessibilityStatus = "Contacto de accesibilidad", "Estado de accesibilidad"
|
||
base.AccessibilityTechTitle, base.AccessibilityTechText = "Enfoque técnico", "La aplicación utiliza HTML semántico, controles operables mediante teclado y metadatos de idioma. Esta información no es una certificación. El operador sigue siendo responsable de evaluar el despliegue, el contenido personalizado, la marca y las integraciones."
|
||
base.NoticeTitle, base.Notice = "Aviso importante", "Estas páginas contienen información configurable del operador y no constituyen asesoramiento jurídico. Su suficiencia depende del despliegue y de la normativa aplicable."
|
||
case "it":
|
||
base.LegalLabel, base.PrivacyLabel, base.AccessibilityLabel = "Note legali", "Privacy", "Accessibilità"
|
||
base.LegalTitle, base.LegalLead = "Note legali", "Informazioni sul gestore e sui contatti di questo servizio."
|
||
base.Operator, base.Representative, base.Contact = "Gestore", "Rappresentato da", "Contatto"
|
||
base.Address, base.Email, base.Phone, base.Register, base.RegisterNo, base.VAT = "Indirizzo", "E-mail", "Telefono", "Registro", "Numero di registrazione", "Partita IVA"
|
||
base.Editorial, base.EditorialAddress = "Responsabilità editoriale", "Indirizzo del responsabile editoriale"
|
||
base.DisputeTitle, base.DisputeNA = "Risoluzione delle controversie dei consumatori", "Il gestore ha valutato come non applicabile a questo servizio l’obbligo generale di informazione sulla risoluzione delle controversie dei consumatori."
|
||
base.DisputeNo = "Il gestore dichiara di non partecipare a procedure di risoluzione delle controversie dei consumatori salvo diverso obbligo di legge."
|
||
base.DisputeYes = "Il gestore dichiara di partecipare a procedure di risoluzione delle controversie dinanzi all’organismo indicato di seguito."
|
||
base.PrivacyTitle, base.PrivacyLead = "Informativa privacy", "Informazioni sul funzionamento del servizio e sul trattamento dei dati tecnici di connessione."
|
||
base.Controller, base.DataProtection, base.Hosting, base.HostingAddress = "Titolare / gestore", "Contatto privacy", "Fornitore di hosting", "Indirizzo del fornitore di hosting"
|
||
base.Logs, base.Retention, base.Recipients, base.Transfers, base.Authority = "Log del server", "Conservazione dei log", "Destinatari / responsabili", "Trasferimenti verso paesi terzi", "Autorità di controllo"
|
||
base.PrivacyTechTitle, base.PrivacyTechText = "Configurazione tecnica", "L’applicazione non richiede tracker pubblicitari o analytics di terze parti. A seconda del deployment, reverse proxy, hosting o infrastruttura circostante possono trattare dati di connessione e log. Il gestore deve mantenere queste informazioni coerenti con il funzionamento effettivo."
|
||
base.AccessibilityTitle, base.AccessibilityLead = "Accessibilità", "Informazioni e contatti relativi all’accessibilità di questo servizio."
|
||
base.AccessibilityContact, base.AccessibilityStatus = "Contatto accessibilità", "Stato di accessibilità"
|
||
base.AccessibilityTechTitle, base.AccessibilityTechText = "Approccio tecnico", "L’applicazione utilizza HTML semantico, controlli utilizzabili da tastiera e metadati linguistici. Questa indicazione non è una certificazione. Il gestore resta responsabile della verifica del deployment, dei contenuti personalizzati, del branding e delle integrazioni."
|
||
base.NoticeTitle, base.Notice = "Avviso importante", "Queste pagine contengono informazioni configurabili del gestore e non costituiscono consulenza legale. La loro completezza dipende dal deployment e dalla normativa applicabile."
|
||
case "nl":
|
||
base.LegalLabel, base.PrivacyLabel, base.AccessibilityLabel = "Juridische informatie", "Privacy", "Toegankelijkheid"
|
||
base.LegalTitle, base.LegalLead = "Juridische informatie", "Informatie over de exploitant en contactmogelijkheden van deze dienst."
|
||
base.Operator, base.Representative, base.Contact = "Exploitant", "Vertegenwoordigd door", "Contact"
|
||
base.Address, base.Email, base.Phone, base.Register, base.RegisterNo, base.VAT = "Adres", "E-mail", "Telefoon", "Register", "Registratienummer", "Btw-nummer"
|
||
base.Editorial, base.EditorialAddress = "Redactionele verantwoordelijkheid", "Adres van de redactioneel verantwoordelijke"
|
||
base.DisputeTitle, base.DisputeNA = "Consumentengeschillen", "De exploitant heeft beoordeeld dat de algemene informatieplicht over consumentengeschillen niet van toepassing is op deze dienst."
|
||
base.DisputeNo = "De exploitant verklaart niet deel te nemen aan procedures voor consumentengeschillen, tenzij dit wettelijk verplicht is."
|
||
base.DisputeYes = "De exploitant verklaart deel te nemen aan procedures voor consumentengeschillen bij de hieronder genoemde instantie."
|
||
base.PrivacyTitle, base.PrivacyLead = "Privacy-informatie", "Informatie over de werking van de dienst en verwerking van technische verbindingsgegevens."
|
||
base.Controller, base.DataProtection, base.Hosting, base.HostingAddress = "Verwerkingsverantwoordelijke / exploitant", "Privacycontact", "Hostingprovider", "Adres van hostingprovider"
|
||
base.Logs, base.Retention, base.Recipients, base.Transfers, base.Authority = "Serverlogs", "Bewaartermijn logs", "Ontvangers / verwerkers", "Doorgiften naar derde landen", "Toezichthouder"
|
||
base.PrivacyTechTitle, base.PrivacyTechText = "Technische inrichting", "De toepassing zelf vereist geen advertentietrackers of externe analytics. Afhankelijk van de deployment kunnen reverse proxy, hostingplatform of omliggende infrastructuur verbindings- en loggegevens verwerken. De exploitant moet deze informatie laten aansluiten op de werkelijke werking."
|
||
base.AccessibilityTitle, base.AccessibilityLead = "Toegankelijkheid", "Informatie en contact over de toegankelijkheid van deze dienst."
|
||
base.AccessibilityContact, base.AccessibilityStatus = "Contact toegankelijkheid", "Toegankelijkheidsstatus"
|
||
base.AccessibilityTechTitle, base.AccessibilityTechText = "Technische aanpak", "De toepassing gebruikt semantische HTML, toetsenbordbedienbare besturingselementen en taalmetadata. Dit is geen certificering. De exploitant blijft verantwoordelijk voor het toetsen van deployment, aangepaste inhoud, huisstijl en integraties."
|
||
base.NoticeTitle, base.Notice = "Belangrijk", "Deze pagina’s bevatten configureerbare exploitantinformatie en zijn geen juridisch advies. Volledigheid hangt af van deployment en toepasselijk recht."
|
||
case "pt":
|
||
base.LegalLabel, base.PrivacyLabel, base.AccessibilityLabel = "Informação legal", "Privacidade", "Acessibilidade"
|
||
base.LegalTitle, base.LegalLead = "Informação legal", "Informações sobre o operador e os contactos deste serviço."
|
||
base.Operator, base.Representative, base.Contact = "Operador", "Representado por", "Contacto"
|
||
base.Address, base.Email, base.Phone, base.Register, base.RegisterNo, base.VAT = "Morada", "E-mail", "Telefone", "Registo", "Número de registo", "N.º de IVA"
|
||
base.Editorial, base.EditorialAddress = "Responsabilidade editorial", "Morada da pessoa editorialmente responsável"
|
||
base.DisputeTitle, base.DisputeNA = "Resolução de litígios de consumo", "O operador avaliou que a obrigação geral de informação sobre resolução de litígios de consumo não se aplica a este serviço."
|
||
base.DisputeNo = "O operador declara que não participa em procedimentos de resolução de litígios de consumo, salvo obrigação legal."
|
||
base.DisputeYes = "O operador declara que participa em procedimentos de resolução de litígios perante a entidade indicada abaixo."
|
||
base.PrivacyTitle, base.PrivacyLead = "Informação de privacidade", "Informações sobre o funcionamento do serviço e o tratamento de dados técnicos de ligação."
|
||
base.Controller, base.DataProtection, base.Hosting, base.HostingAddress = "Responsável / operador", "Contacto de proteção de dados", "Fornecedor de alojamento", "Morada do fornecedor de alojamento"
|
||
base.Logs, base.Retention, base.Recipients, base.Transfers, base.Authority = "Registos do servidor", "Conservação dos registos", "Destinatários / subcontratantes", "Transferências para países terceiros", "Autoridade de controlo"
|
||
base.PrivacyTechTitle, base.PrivacyTechText = "Configuração técnica", "A aplicação não necessita de rastreadores publicitários nem de analytics de terceiros. Dependendo do deployment, o proxy inverso, o alojamento ou a infraestrutura envolvente podem tratar dados de ligação e registos. O operador deve manter esta informação alinhada com o funcionamento real."
|
||
base.AccessibilityTitle, base.AccessibilityLead = "Acessibilidade", "Informações e contacto sobre a acessibilidade deste serviço."
|
||
base.AccessibilityContact, base.AccessibilityStatus = "Contacto de acessibilidade", "Estado de acessibilidade"
|
||
base.AccessibilityTechTitle, base.AccessibilityTechText = "Abordagem técnica", "A aplicação utiliza HTML semântico, controlos operáveis por teclado e metadados de idioma. Esta indicação não é uma certificação. O operador continua responsável por testar o deployment, os conteúdos personalizados, a marca e as integrações."
|
||
base.NoticeTitle, base.Notice = "Aviso importante", "Estas páginas contêm informações configuráveis do operador e não constituem aconselhamento jurídico. A suficiência depende do deployment e da legislação aplicável."
|
||
case "pl":
|
||
base.LegalLabel, base.PrivacyLabel, base.AccessibilityLabel = "Informacje prawne", "Prywatność", "Dostępność"
|
||
base.LegalTitle, base.LegalLead = "Informacje prawne", "Informacje o operatorze i możliwościach kontaktu z usługą."
|
||
base.Operator, base.Representative, base.Contact = "Operator", "Reprezentowany przez", "Kontakt"
|
||
base.Address, base.Email, base.Phone, base.Register, base.RegisterNo, base.VAT = "Adres", "E-mail", "Telefon", "Rejestr", "Numer rejestracyjny", "NIP UE"
|
||
base.Editorial, base.EditorialAddress = "Odpowiedzialność redakcyjna", "Adres osoby odpowiedzialnej redakcyjnie"
|
||
base.DisputeTitle, base.DisputeNA = "Rozwiązywanie sporów konsumenckich", "Operator ocenił, że ogólny obowiązek informacyjny dotyczący rozwiązywania sporów konsumenckich nie ma zastosowania do tej usługi."
|
||
base.DisputeNo = "Operator oświadcza, że nie uczestniczy w postępowaniach dotyczących pozasądowego rozwiązywania sporów konsumenckich, chyba że obowiązek taki wynika z prawa."
|
||
base.DisputeYes = "Operator oświadcza, że uczestniczy w postępowaniach dotyczących rozwiązywania sporów przed wskazanym poniżej podmiotem."
|
||
base.PrivacyTitle, base.PrivacyLead = "Informacje o prywatności", "Informacje o działaniu usługi i przetwarzaniu technicznych danych połączenia."
|
||
base.Controller, base.DataProtection, base.Hosting, base.HostingAddress = "Administrator / operator", "Kontakt ds. ochrony danych", "Dostawca hostingu", "Adres dostawcy hostingu"
|
||
base.Logs, base.Retention, base.Recipients, base.Transfers, base.Authority = "Logi serwera", "Okres przechowywania logów", "Odbiorcy / podmioty przetwarzające", "Transfery do państw trzecich", "Organ nadzorczy"
|
||
base.PrivacyTechTitle, base.PrivacyTechText = "Rozwiązania techniczne", "Sama aplikacja nie wymaga trackerów reklamowych ani zewnętrznych narzędzi analitycznych. W zależności od wdrożenia reverse proxy, hosting lub infrastruktura otaczająca mogą przetwarzać dane połączeń i logi. Operator musi dostosować informacje na tej stronie do rzeczywistego działania systemu."
|
||
base.AccessibilityTitle, base.AccessibilityLead = "Dostępność", "Informacje i kontakt w sprawie dostępności tej usługi."
|
||
base.AccessibilityContact, base.AccessibilityStatus = "Kontakt ds. dostępności", "Stan dostępności"
|
||
base.AccessibilityTechTitle, base.AccessibilityTechText = "Podejście techniczne", "Aplikacja wykorzystuje semantyczny HTML, elementy obsługiwane klawiaturą oraz metadane językowe. Informacja ta nie stanowi certyfikacji. Operator nadal odpowiada za sprawdzenie konkretnego wdrożenia, własnych treści, identyfikacji wizualnej i integracji."
|
||
base.NoticeTitle, base.Notice = "Ważna informacja", "Te strony zawierają konfigurowalne informacje operatora i nie stanowią porady prawnej. Ich kompletność zależy od wdrożenia i właściwego prawa."
|
||
}
|
||
return base
|
||
}
|
||
|
||
func normalizeLanguage(lang string) string {
|
||
lang = strings.ToLower(strings.TrimSpace(lang))
|
||
if i := strings.IndexByte(lang, '-'); i >= 0 {
|
||
lang = lang[:i]
|
||
}
|
||
return lang
|
||
}
|
||
|
||
func legalLabel(lang, kind string) string {
|
||
copy := legalLabels(lang)
|
||
switch kind {
|
||
case "privacy":
|
||
return copy.PrivacyLabel
|
||
case "accessibility":
|
||
return copy.AccessibilityLabel
|
||
default:
|
||
return copy.LegalLabel
|
||
}
|
||
}
|
||
|
||
func (s *Server) operatorPage(lang, kind string) legalPage {
|
||
c := legalLabels(lang)
|
||
nonEmpty := func(label, value string) []legalItem {
|
||
if strings.TrimSpace(value) == "" {
|
||
return nil
|
||
}
|
||
return []legalItem{{Label: label, Value: value}}
|
||
}
|
||
appendItem := func(items []legalItem, label, value, link string) []legalItem {
|
||
if strings.TrimSpace(value) == "" {
|
||
return items
|
||
}
|
||
return append(items, legalItem{Label: label, Value: value, URL: link})
|
||
}
|
||
|
||
switch kind {
|
||
case "privacy":
|
||
operator := []legalItem{}
|
||
operator = appendItem(operator, c.Controller, s.cfg.LegalName, "")
|
||
operator = appendItem(operator, c.Address, s.cfg.LegalAddress, "")
|
||
operator = appendItem(operator, c.Email, s.cfg.LegalEmail, mailto(s.cfg.LegalEmail))
|
||
operator = appendItem(operator, c.DataProtection, s.cfg.DataProtectionContact, mailtoIfEmail(s.cfg.DataProtectionContact))
|
||
hosting := []legalItem{}
|
||
hosting = appendItem(hosting, c.Hosting, s.cfg.HostingProvider, "")
|
||
hosting = appendItem(hosting, c.HostingAddress, s.cfg.HostingAddress, "")
|
||
processing := []legalItem{}
|
||
processing = appendItem(processing, c.Retention, s.cfg.LogRetention, "")
|
||
processing = appendItem(processing, c.Recipients, s.cfg.DataRecipients, "")
|
||
processing = appendItem(processing, c.Transfers, s.cfg.ThirdCountryTransfers, "")
|
||
processing = appendItem(processing, c.Authority, s.cfg.SupervisoryAuthorityName, s.cfg.SupervisoryAuthorityURL)
|
||
sections := []legalSection{{Title: c.Controller, Items: operator}, {Title: c.Hosting, Items: hosting}, {Title: c.PrivacyTechTitle, Paragraphs: []string{c.PrivacyTechText}, Items: processing}}
|
||
return legalPage{Kind: kind, Title: c.PrivacyTitle, Lead: c.PrivacyLead, Sections: sections, NoticeTitle: c.NoticeTitle, Notice: c.Notice}
|
||
case "accessibility":
|
||
items := []legalItem{}
|
||
items = appendItem(items, c.AccessibilityContact, s.cfg.AccessibilityContact, mailtoIfEmail(s.cfg.AccessibilityContact))
|
||
items = appendItem(items, c.AccessibilityStatus, s.cfg.AccessibilityStatus, "")
|
||
sections := []legalSection{{Title: c.AccessibilityTitle, Items: items}, {Title: c.AccessibilityTechTitle, Paragraphs: []string{c.AccessibilityTechText}}}
|
||
return legalPage{Kind: kind, Title: c.AccessibilityTitle, Lead: c.AccessibilityLead, Sections: sections, NoticeTitle: c.NoticeTitle, Notice: c.Notice}
|
||
default:
|
||
operator := []legalItem{}
|
||
operator = appendItem(operator, c.Operator, s.cfg.LegalName, "")
|
||
operator = appendItem(operator, c.Address, s.cfg.LegalAddress, "")
|
||
operator = appendItem(operator, c.Representative, s.cfg.LegalRepresentative, "")
|
||
operator = appendItem(operator, c.Email, s.cfg.LegalEmail, mailto(s.cfg.LegalEmail))
|
||
operator = appendItem(operator, c.Phone, s.cfg.LegalPhone, tel(s.cfg.LegalPhone))
|
||
operator = appendItem(operator, c.Register, s.cfg.LegalRegister, "")
|
||
operator = appendItem(operator, c.RegisterNo, s.cfg.LegalRegisterNumber, "")
|
||
operator = appendItem(operator, c.VAT, s.cfg.LegalVATID, "")
|
||
sections := []legalSection{{Title: c.Operator, Items: operator}}
|
||
if strings.TrimSpace(s.cfg.EditorialResponsibleName) != "" || strings.TrimSpace(s.cfg.EditorialResponsibleAddress) != "" {
|
||
items := []legalItem{}
|
||
items = appendItem(items, c.Editorial, s.cfg.EditorialResponsibleName, "")
|
||
items = appendItem(items, c.EditorialAddress, s.cfg.EditorialResponsibleAddress, "")
|
||
sections = append(sections, legalSection{Title: c.Editorial, Items: items})
|
||
}
|
||
disputeText := c.DisputeNA
|
||
if s.cfg.ConsumerDisputeStatus == "not_participating" {
|
||
disputeText = c.DisputeNo
|
||
} else if s.cfg.ConsumerDisputeStatus == "participating" {
|
||
disputeText = c.DisputeYes
|
||
}
|
||
disputeItems := nonEmpty(c.DisputeTitle, s.cfg.ConsumerDisputeBody)
|
||
if len(disputeItems) > 0 && strings.TrimSpace(s.cfg.ConsumerDisputeURL) != "" {
|
||
disputeItems[0].URL = s.cfg.ConsumerDisputeURL
|
||
}
|
||
sections = append(sections, legalSection{Title: c.DisputeTitle, Paragraphs: []string{disputeText}, Items: disputeItems})
|
||
return legalPage{Kind: "legal", Title: c.LegalTitle, Lead: c.LegalLead, Sections: sections, NoticeTitle: c.NoticeTitle, Notice: c.Notice}
|
||
}
|
||
}
|
||
|
||
func (s *Server) handleOperatorPage(kind string) http.HandlerFunc {
|
||
return func(w http.ResponseWriter, r *http.Request) {
|
||
lang := s.language(r)
|
||
data := pageData{
|
||
Name: s.cfg.PublicName, BaseURL: s.cfg.BaseURL, ContactURL: s.cfg.ContactURL, Lang: lang, Text: i18n.Get(lang).Text,
|
||
Languages: i18nLanguages(), LegalPage: s.operatorPage(lang, kind), License: s.licenses.Status(),
|
||
WhiteLabel: s.cfg.WhiteLabel && s.licenses.Has(FeatureWhiteLabel),
|
||
}
|
||
s.renderHTML(w, "operator.html", data)
|
||
}
|
||
}
|
||
|
||
func i18nLanguages() []i18n.LanguageOption { return i18n.Languages() }
|
||
|
||
func mailto(value string) string {
|
||
value = strings.TrimSpace(value)
|
||
if value == "" {
|
||
return ""
|
||
}
|
||
return "mailto:" + value
|
||
}
|
||
func mailtoIfEmail(value string) string {
|
||
value = strings.TrimSpace(value)
|
||
if strings.Contains(value, "@") && !strings.ContainsAny(value, " \t\r\n") {
|
||
return "mailto:" + value
|
||
}
|
||
return ""
|
||
}
|
||
func tel(value string) string {
|
||
value = strings.TrimSpace(value)
|
||
if value == "" {
|
||
return ""
|
||
}
|
||
replacer := strings.NewReplacer(" ", "", "-", "", "(", "", ")", "", "/", "")
|
||
return "tel:" + replacer.Replace(value)
|
||
}
|