feat(i18n): add multilingual support to case-submission and media-inquiry pages

Adds German and French translations for form submission pages with
dynamic message handling and language selector integration.

**Pages Updated:**
- case-submission.html: Added data-i18n attributes and language selector
- media-inquiry.html: Added data-i18n attributes and language selector

**Translation Files Created:**
- EN/DE/FR for case-submission (form labels, help text, dynamic messages)
- EN/DE/FR for media-inquiry (form labels, help text, dynamic messages)

**JavaScript Updates:**
- case-submission.js: Added i18n translation helper for dynamic content
- media-inquiry.js: Added i18n translation helper for dynamic content
- Submit buttons and error messages now translate based on selected language

**Features:**
- Language flags visible in navbar for easy switching
- Form labels and help text translate on language change
- Submit button text updates during submission ("Submitting..." → "Einreichen..." in DE)
- Success/error messages display in user's selected language
- All translations via DeepL API for professional quality

**Technical Details:**
- Uses cache-busting timestamps for translation fetches (prevents stale cache)
- Submit buttons use <span data-i18n> for translatable content
- Form JavaScript uses window.i18nTranslations for dynamic text

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
TheFlow 2025-10-26 16:41:54 +13:00
parent 4105a860f0
commit b21cda335d
10 changed files with 300 additions and 48 deletions

View file

@ -1,9 +1,9 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" data-page="case-submission">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Submit Case Study | Tractatus AI Safety</title>
<title data-i18n="page.title">Submit Case Study | Tractatus AI Safety</title>
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761447293715">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761447293715">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761447293715">
@ -79,23 +79,24 @@
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761447293715"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761447293715"></script>
<!-- Main Content -->
<main id="main-content" class="max-w-4xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<!-- Header -->
<div class="mb-8">
<h1 class="text-3xl font-bold text-gray-900 mb-3">Submit Case Study</h1>
<h1 data-i18n="page.heading" class="text-3xl font-bold text-gray-900 mb-3">Submit Case Study</h1>
<p class="text-lg text-gray-600 mb-4">
Share real-world examples of AI safety failures that could have been prevented by the Tractatus Framework.
</p>
<div class="bg-sky-50 border-l-4 p-4 rounded" class="border-l-tractatus">
<h3 class="font-semibold mb-2" class="text-tractatus-link">What makes a good case study?</h3>
<h3 data-i18n="good_case_study.heading" class="font-semibold mb-2" class="text-tractatus-link">What makes a good case study?</h3>
<ul class="text-gray-700 text-sm space-y-1">
<li><strong>Documented failure:</strong> Real incident with evidence (not hypothetical)</li>
<li><strong>Clear failure mode:</strong> Specific way the AI system went wrong</li>
<li><strong>Tractatus relevance:</strong> Shows how framework boundaries could have helped</li>
<li><strong>Public interest:</strong> Contributes to AI safety knowledge</li>
<li data-i18n="good_case_study.criteria.0"><strong>Documented failure:</strong> Real incident with evidence (not hypothetical)</li>
<li data-i18n="good_case_study.criteria.1"><strong>Clear failure mode:</strong> Specific way the AI system went wrong</li>
<li data-i18n="good_case_study.criteria.2"><strong>Tractatus relevance:</strong> Shows how framework boundaries could have helped</li>
<li data-i18n="good_case_study.criteria.3"><strong>Public interest:</strong> Contributes to AI safety knowledge</li>
</ul>
</div>
</div>
@ -109,26 +110,26 @@
<form id="case-submission-form">
<!-- Submitter Information -->
<h2 class="text-xl font-semibold text-gray-900 mb-6">Your Information</h2>
<h2 data-i18n="form.submitter_info_heading" class="text-xl font-semibold text-gray-900 mb-6">Your Information</h2>
<div class="form-group">
<label for="submitter-name" class="form-label">
Your Name <span class="required">*</span>
<span data-i18n="form.submitter_name_label">Your Name</span> <span class="required">*</span>
</label>
<input type="text" id="submitter-name" name="submitter.name" class="form-input" required aria-required="true">
</div>
<div class="form-group">
<label for="submitter-email" class="form-label">
Email Address <span class="required">*</span>
<span data-i18n="form.submitter_email_label">Email Address</span> <span class="required">*</span>
</label>
<input type="email" id="submitter-email" name="submitter.email" class="form-input" required aria-required="true" aria-describedby="email-help">
<p id="email-help" class="form-help">We'll only use this to follow up on your submission</p>
<p id="email-help" class="form-help" data-i18n="form.submitter_email_help">We'll only use this to follow up on your submission</p>
</div>
<div class="form-group">
<label for="submitter-organization" class="form-label">
Organization (optional)
<span data-i18n="form.submitter_organization_label">Organization (optional)</span>
</label>
<input type="text" id="submitter-organization" name="submitter.organization" class="form-input">
</div>
@ -137,21 +138,21 @@
<div class="checkbox-group">
<input type="checkbox" id="submitter-public" name="submitter.public">
<label for="submitter-public" class="text-gray-700">
I consent to my name being published with this case study
<span data-i18n="form.submitter_public_label">I consent to my name being published with this case study</span> being published with this case study
</label>
</div>
<p class="form-help ml-7">Leave unchecked to remain anonymous</p>
<p class="form-help ml-7" data-i18n="form.submitter_public_help">Leave unchecked to remain anonymous</p>
</div>
<!-- Case Study Details -->
<h2 class="text-xl font-semibold text-gray-900 mb-6 mt-8">Case Study Details</h2>
<h2 data-i18n="form.case_details_heading" class="text-xl font-semibold text-gray-900 mb-6 mt-8">Case Study Details</h2>
<div class="form-group">
<label for="case-title" class="form-label">
Case Study Title <span class="required">*</span>
<span data-i18n="form.case_title_label">Case Study Title</span> <span class="required">*</span>
</label>
<input type="text" id="case-title" name="case_study.title" class="form-input" required aria-required="true" aria-describedby="title-help">
<p id="title-help" class="form-help">Brief, descriptive title (e.g., "ChatGPT Port 27027 Failure")</p>
<p id="title-help" class="form-help" data-i18n="form.case_title_help">Brief, descriptive title (e.g., "ChatGPT Port 27027 Failure")</p>
</div>
<div class="form-group">
@ -159,12 +160,12 @@
Detailed Description <span class="required">*</span>
</label>
<textarea id="case-description" name="case_study.description" class="form-textarea" required aria-required="true" aria-describedby="description-help"></textarea>
<p id="description-help" class="form-help">What happened? Provide context, timeline, and outcomes</p>
<p id="description-help" class="form-help" data-i18n="form.case_description_help">What happened? Provide context, timeline, and outcomes</p>
</div>
<div class="form-group">
<label for="case-failure-mode" class="form-label">
Failure Mode <span class="required">*</span>
<span data-i18n="form.case_failure_mode_label">Failure Mode</span> <span class="required">*</span>
</label>
<textarea id="case-failure-mode" name="case_study.failure_mode" class="form-textarea" required aria-required="true" aria-describedby="failure-help"></textarea>
<p id="failure-help" class="form-help">
@ -174,7 +175,7 @@
<div class="form-group">
<label for="case-tractatus" class="form-label">
Tractatus Applicability <span class="required">*</span>
<span data-i18n="form.case_tractatus_label">Tractatus Applicability</span> <span class="required">*</span>
</label>
<textarea id="case-tractatus" name="case_study.tractatus_applicability" class="form-textarea" required aria-required="true" aria-describedby="tractatus-help"></textarea>
<p id="tractatus-help" class="form-help">
@ -184,7 +185,7 @@
<div class="form-group">
<label for="case-evidence" class="form-label">
Evidence/Sources
<span data-i18n="form.case_evidence_label">Evidence/Sources</span>
</label>
<textarea id="case-evidence" name="case_study.evidence" class="form-textarea"></textarea>
<p class="form-help">
@ -195,7 +196,7 @@
<!-- Submit Button -->
<div class="mt-8">
<button type="submit" id="submit-button" class="w-full bg-blue-600 text-white px-6 py-3 rounded-lg font-semibold transition-all duration-200 hover:bg-blue-700 hover:shadow-lg hover:-translate-y-0.5">
Submit Case Study
<span data-i18n="form.submit_button">Submit Case Study</span>
</button>
<p class="form-help mt-3 text-center">
We review all submissions. High-quality case studies are published with attribution (if consented).
@ -217,6 +218,7 @@
</main>
<!-- Footer -->
<script src="/js/components/language-selector.js?v=0.1.0.1761447293715"></script>
<script src="/js/case-submission.js?v=0.1.0.1761447293715"></script>
<!-- Footer Component -->

View file

@ -7,6 +7,19 @@ const submitButton = document.getElementById('submit-button');
const successMessage = document.getElementById('success-message');
const errorMessage = document.getElementById('error-message');
// Helper to get translated text
function t(key) {
if (window.i18nTranslations) {
const keys = key.split('.');
let value = window.i18nTranslations;
for (const k of keys) {
value = value?.[k];
}
return value || key;
}
return key;
}
form.addEventListener('submit', async (e) => {
e.preventDefault();
@ -16,7 +29,7 @@ form.addEventListener('submit', async (e) => {
// Disable submit button
submitButton.disabled = true;
submitButton.textContent = 'Submitting...';
submitButton.querySelector('span').textContent = t('messages.submitting');
// Collect form data
const evidenceText = document.getElementById('case-evidence').value;
@ -54,25 +67,25 @@ form.addEventListener('submit', async (e) => {
if (response.ok) {
// Success
successMessage.textContent = data.message || 'Thank you for your submission. We will review it shortly.';
successMessage.textContent = data.message || t('messages.success');
successMessage.style.display = 'block';
form.reset();
window.scrollTo({ top: 0, behavior: 'smooth' });
} else {
// Error
errorMessage.textContent = data.message || 'An error occurred. Please try again.';
errorMessage.textContent = data.message || t('messages.error');
errorMessage.style.display = 'block';
window.scrollTo({ top: 0, behavior: 'smooth' });
}
} catch (error) {
console.error('Submit error:', error);
errorMessage.textContent = 'Network error. Please check your connection and try again.';
errorMessage.textContent = t('messages.network_error');
errorMessage.style.display = 'block';
window.scrollTo({ top: 0, behavior: 'smooth' });
} finally {
// Re-enable submit button
submitButton.disabled = false;
submitButton.textContent = 'Submit Case Study';
submitButton.querySelector('span').textContent = t('form.submit_button');
}
});

View file

@ -7,6 +7,19 @@ const submitButton = document.getElementById('submit-button');
const successMessage = document.getElementById('success-message');
const errorMessage = document.getElementById('error-message');
// Helper to get translated text
function t(key) {
if (window.i18nTranslations) {
const keys = key.split('.');
let value = window.i18nTranslations;
for (const k of keys) {
value = value?.[k];
}
return value || key;
}
return key;
}
form.addEventListener('submit', async (e) => {
e.preventDefault();
@ -16,7 +29,7 @@ form.addEventListener('submit', async (e) => {
// Disable submit button
submitButton.disabled = true;
submitButton.textContent = 'Submitting...';
submitButton.querySelector('span').textContent = t('messages.submitting');
// Collect form data
const formData = {
@ -47,25 +60,25 @@ form.addEventListener('submit', async (e) => {
if (response.ok) {
// Success
successMessage.textContent = data.message || 'Thank you for your inquiry. We will review and respond shortly.';
successMessage.textContent = data.message || t('messages.success');
successMessage.style.display = 'block';
form.reset();
window.scrollTo({ top: 0, behavior: 'smooth' });
} else {
// Error
errorMessage.textContent = data.message || 'An error occurred. Please try again.';
errorMessage.textContent = data.message || t('messages.error');
errorMessage.style.display = 'block';
window.scrollTo({ top: 0, behavior: 'smooth' });
}
} catch (error) {
console.error('Submit error:', error);
errorMessage.textContent = 'Network error. Please check your connection and try again.';
errorMessage.textContent = t('messages.network_error');
errorMessage.style.display = 'block';
window.scrollTo({ top: 0, behavior: 'smooth' });
} finally {
// Re-enable submit button
submitButton.disabled = false;
submitButton.textContent = 'Submit Inquiry';
submitButton.querySelector('span').textContent = t('form.submit_button');
}
});

View file

@ -0,0 +1,45 @@
{
"page": {
"title": "Fallstudie einreichen | Tractatus AI Safety",
"heading": "Fallstudie einreichen",
"description": "Teilen Sie reale Beispiele von KI-Sicherheitsfehlern, die durch das Tractatus Framework hätten verhindert werden können."
},
"good_case_study": {
"heading": "Was macht eine gute Fallstudie aus?",
"criteria": [
"<strong>Dokumentiertes Versagen:</strong> Reales Ereignis mit Beweisen (nicht hypothetisch)",
"<strong>Eindeutiger Fehlermodus:</strong> Spezifische Art und Weise, wie das KI-System schiefgelaufen ist",
"<strong>Relevanz des Tractatus:</strong> Zeigt, wie Rahmengrenzen geholfen haben könnten",
"<strong>Öffentliches Interesse:</strong> Trägt zum Wissen über AI-Sicherheit bei"
]
},
"form": {
"submitter_info_heading": "Your Information",
"submitter_name_label": "Your Name",
"submitter_email_label": "E-Mail Adresse",
"submitter_email_help": "Wir verwenden diese Angaben nur, um Ihren Antrag weiterzuverfolgen",
"submitter_organization_label": "Organisation (fakultativ)",
"submitter_public_label": "Ich bin damit einverstanden, dass mein Name mit dieser Fallstudie veröffentlicht wird",
"submitter_public_help": "Unmarkiert lassen, um anonym zu bleiben",
"case_details_heading": "Details zur Fallstudie",
"case_title_label": "Titel der Fallstudie",
"case_title_help": "Kurzer, beschreibender Titel (z. B. \"ChatGPT Port 27027 Failure\")",
"case_description_label": "Detaillierte Beschreibung",
"case_description_help": "Was ist passiert? Geben Sie den Kontext, den Zeitrahmen und die Ergebnisse an",
"case_failure_mode_label": "Fehlermodus",
"case_failure_mode_help": "Wie hat das KI-System versagt? Welches spezifische Verhalten ging schief?",
"case_tractatus_label": "Tractatus Anwendbarkeit",
"case_tractatus_help": "Welche Grenzen des Tractatus hätten diesen Fehler verhindern können? (z.B. Abschnitt 12.1 Werte, CrossReferenceValidator, usw.)",
"case_evidence_label": "Beweise/Quellen",
"case_evidence_help": "Links zu Dokumentation, Screenshots, Artikeln oder anderen Beweisen (einer pro Zeile)",
"submit_button": "Fallstudie einreichen",
"submit_help": "Wir prüfen alle Einsendungen. Qualitativ hochwertige Fallstudien werden mit Quellenangabe veröffentlicht (sofern die Zustimmung vorliegt)."
},
"privacy_note": "Ihre Einsendung wird nach unseren <a href=\"/about/values.html\" class=\"hover:underline transition-colors text-tractatus-link\">Datenschutzgrundsätzen</a> behandelt. Alle Fallstudien werden vor der Veröffentlichung von Menschen geprüft.",
"messages": {
"submitting": "Einreichen...",
"success": "Vielen Dank für Ihren Beitrag. Wir werden sie in Kürze prüfen.",
"error": "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
"network_error": "Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut."
}
}

View file

@ -0,0 +1,29 @@
{
"page": {
"title": "Medienrecherche | Tractatus AI Sicherheit",
"heading": "Medien-Anfrage",
"description": "Presse- und Medienanfragen über den Tractatus-Rahmen. Wir prüfen alle Anfragen und antworten umgehend."
},
"form": {
"contact_info_heading": "Kontaktinformationen",
"contact_name_label": "Your Name",
"contact_email_label": "E-Mail Adresse",
"contact_outlet_label": "Medienvertrieb/Organisation",
"contact_outlet_help": "Veröffentlichung, Website, Podcast oder Organisation, die Sie vertreten",
"contact_phone_label": "Telefonnummer (optional)",
"inquiry_details_heading": "Anfrage Details",
"inquiry_subject_label": "Thema",
"inquiry_message_label": "Nachricht",
"inquiry_deadline_label": "Frist (falls zutreffend)",
"inquiry_deadline_help": "Bis wann benötigen Sie eine Antwort?",
"submit_button": "Anfrage einreichen",
"submit_help": "Wir prüfen alle Medienanfragen und antworten in der Regel innerhalb von 24-48 Stunden."
},
"privacy_note": "Ihre Kontaktinformationen werden nach unseren <a href=\"/about/values.html\" class=\"hover:underline transition-colors text-tractatus-link\">Datenschutzgrundsätzen</a> behandelt. Wir geben Medienanfragen niemals an Dritte weiter.",
"messages": {
"submitting": "Einreichen...",
"success": "Vielen Dank für Ihre Anfrage. Wir werden sie prüfen und in Kürze beantworten.",
"error": "Es ist ein Fehler aufgetreten. Bitte versuchen Sie es erneut.",
"network_error": "Netzwerkfehler. Bitte überprüfen Sie Ihre Verbindung und versuchen Sie es erneut."
}
}

View file

@ -0,0 +1,45 @@
{
"page": {
"title": "Submit Case Study | Tractatus AI Safety",
"heading": "Submit Case Study",
"description": "Share real-world examples of AI safety failures that could have been prevented by the Tractatus Framework."
},
"good_case_study": {
"heading": "What makes a good case study?",
"criteria": [
"<strong>Documented failure:</strong> Real incident with evidence (not hypothetical)",
"<strong>Clear failure mode:</strong> Specific way the AI system went wrong",
"<strong>Tractatus relevance:</strong> Shows how framework boundaries could have helped",
"<strong>Public interest:</strong> Contributes to AI safety knowledge"
]
},
"form": {
"submitter_info_heading": "Your Information",
"submitter_name_label": "Your Name",
"submitter_email_label": "Email Address",
"submitter_email_help": "We'll only use this to follow up on your submission",
"submitter_organization_label": "Organization (optional)",
"submitter_public_label": "I consent to my name being published with this case study",
"submitter_public_help": "Leave unchecked to remain anonymous",
"case_details_heading": "Case Study Details",
"case_title_label": "Case Study Title",
"case_title_help": "Brief, descriptive title (e.g., \"ChatGPT Port 27027 Failure\")",
"case_description_label": "Detailed Description",
"case_description_help": "What happened? Provide context, timeline, and outcomes",
"case_failure_mode_label": "Failure Mode",
"case_failure_mode_help": "How did the AI system fail? What specific behavior went wrong?",
"case_tractatus_label": "Tractatus Applicability",
"case_tractatus_help": "Which Tractatus boundaries could have prevented this failure? (e.g., Section 12.1 Values, CrossReferenceValidator, etc.)",
"case_evidence_label": "Evidence/Sources",
"case_evidence_help": "Links to documentation, screenshots, articles, or other evidence (one per line)",
"submit_button": "Submit Case Study",
"submit_help": "We review all submissions. High-quality case studies are published with attribution (if consented)."
},
"privacy_note": "Your submission is handled according to our <a href=\"/about/values.html\" class=\"hover:underline transition-colors text-tractatus-link\">privacy principles</a>. All case studies undergo human review before publication.",
"messages": {
"submitting": "Submitting...",
"success": "Thank you for your submission. We will review it shortly.",
"error": "An error occurred. Please try again.",
"network_error": "Network error. Please check your connection and try again."
}
}

View file

@ -0,0 +1,29 @@
{
"page": {
"title": "Media Inquiry | Tractatus AI Safety",
"heading": "Media Inquiry",
"description": "Press and media inquiries about the Tractatus Framework. We review all inquiries and respond promptly."
},
"form": {
"contact_info_heading": "Contact Information",
"contact_name_label": "Your Name",
"contact_email_label": "Email Address",
"contact_outlet_label": "Media Outlet/Organization",
"contact_outlet_help": "Publication, website, podcast, or organization you represent",
"contact_phone_label": "Phone Number (optional)",
"inquiry_details_heading": "Inquiry Details",
"inquiry_subject_label": "Subject",
"inquiry_message_label": "Message",
"inquiry_deadline_label": "Deadline (if applicable)",
"inquiry_deadline_help": "When do you need a response by?",
"submit_button": "Submit Inquiry",
"submit_help": "We review all media inquiries and typically respond within 24-48 hours."
},
"privacy_note": "Your contact information is handled according to our <a href=\"/about/values.html\" class=\"hover:underline transition-colors text-tractatus-link\">privacy principles</a>. We never share media inquiries with third parties.",
"messages": {
"submitting": "Submitting...",
"success": "Thank you for your inquiry. We will review and respond shortly.",
"error": "An error occurred. Please try again.",
"network_error": "Network error. Please check your connection and try again."
}
}

View file

@ -0,0 +1,45 @@
{
"page": {
"title": "Soumettre une étude de cas | Tractatus AI Safety",
"heading": "Soumettre une étude de cas",
"description": "Partager des exemples concrets d'échecs en matière de sécurité de l'IA qui auraient pu être évités grâce au cadre Tractatus."
},
"good_case_study": {
"heading": "Qu'est-ce qui fait une bonne étude de cas ?",
"criteria": [
"<strong>Échec documenté :</strong> Incident réel avec preuves (pas hypothétique)",
"<strong>Mode d'échec clair :</strong> Façon spécifique dont le système d'intelligence artificielle a échoué",
"<strong>Pertinence du Tractatus :</strong> Montre comment les limites du cadre auraient pu être utiles",
"<strong>Intérêt public :</strong> Contribue à la connaissance de la sécurité de l'IA"
]
},
"form": {
"submitter_info_heading": "Your Information",
"submitter_name_label": "Votre nom",
"submitter_email_label": "Adresse électronique",
"submitter_email_help": "Nous ne l'utiliserons que pour donner suite à votre demande",
"submitter_organization_label": "Organisation (facultatif)",
"submitter_public_label": "Je consens à ce que mon nom soit publié avec cette étude de cas",
"submitter_public_help": "Ne pas cocher pour rester anonyme",
"case_details_heading": "Détails de l'étude de cas",
"case_title_label": "Titre de l'étude de cas",
"case_title_help": "Titre bref et descriptif (par exemple, \"ChatGPT Port 27027 Failure\")",
"case_description_label": "Description détaillée",
"case_description_help": "Que s'est-il passé ? Présenter le contexte, la chronologie et les résultats",
"case_failure_mode_label": "Mode de défaillance",
"case_failure_mode_help": "Comment le système d'intelligence artificielle a-t-il échoué ? Quel est le comportement spécifique qui n'a pas fonctionné ?",
"case_tractatus_label": "Tractatus Applicabilité",
"case_tractatus_help": "Quelles sont les limites du Tractatus qui auraient pu empêcher cet échec ? (par exemple, Section 12.1 Values, CrossReferenceValidator, etc.)",
"case_evidence_label": "Preuves/Sources",
"case_evidence_help": "Liens vers des documents, des captures d'écran, des articles ou d'autres preuves (un par ligne)",
"submit_button": "Soumettre une étude de cas",
"submit_help": "Nous examinons toutes les propositions. Les études de cas de grande qualité sont publiées avec mention de l'auteur (s'il a donné son accord)."
},
"privacy_note": "Votre demande est traitée conformément à nos <a href=\"/about/values.html\" class=\"hover:underline transition-colors text-tractatus-link\">principes en matière de protection de la vie privée</a>. Toutes les études de cas font l'objet d'un examen humain avant d'être publiées.",
"messages": {
"submitting": "Soumettre...",
"success": "Nous vous remercions pour votre demande. Nous l'examinerons sous peu.",
"error": "Une erreur s'est produite. Veuillez réessayer.",
"network_error": "Erreur de réseau. Veuillez vérifier votre connexion et réessayer."
}
}

View file

@ -0,0 +1,29 @@
{
"page": {
"title": "Interrogation des médias | Tractatus AI Safety",
"heading": "Enquête auprès des médias",
"description": "Demandes de renseignements de la part de la presse et des médias sur le cadre Tractatus. Nous examinons toutes les demandes et y répondons rapidement."
},
"form": {
"contact_info_heading": "Informations sur le contact",
"contact_name_label": "Votre nom",
"contact_email_label": "Adresse électronique",
"contact_outlet_label": "Point de vente des médias/organisation",
"contact_outlet_help": "Publication, site web, podcast ou organisation que vous représentez",
"contact_phone_label": "Numéro de téléphone (facultatif)",
"inquiry_details_heading": "Détails de la demande",
"inquiry_subject_label": "Sujet",
"inquiry_message_label": "Message",
"inquiry_deadline_label": "Date limite (le cas échéant)",
"inquiry_deadline_help": "Quelle est la date limite de réponse ?",
"submit_button": "Soumettre une demande",
"submit_help": "Nous examinons toutes les demandes des médias et y répondons généralement dans les 24 à 48 heures."
},
"privacy_note": "Vos coordonnées sont traitées conformément à nos <a href=\"/about/values.html\" class=\"hover:underline transition-colors text-tractatus-link\">principes de confidentialité</a>. Nous ne transmettons jamais les demandes des médias à des tiers.",
"messages": {
"submitting": "Soumettre...",
"success": "Nous vous remercions de votre demande. Nous l'examinerons et vous répondrons dans les plus brefs délais.",
"error": "Une erreur s'est produite. Veuillez réessayer.",
"network_error": "Erreur de réseau. Veuillez vérifier votre connexion et réessayer."
}
}

View file

@ -1,9 +1,9 @@
<!DOCTYPE html>
<html lang="en">
<html lang="en" data-page="media-inquiry">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Media Inquiry | Tractatus AI Safety</title>
<title data-i18n="page.title">Media Inquiry | Tractatus AI Safety</title>
<link rel="stylesheet" href="/css/fonts.css?v=0.1.0.1761447293715">
<link rel="stylesheet" href="/css/tailwind.css?v=0.1.0.1761447293715">
<link rel="stylesheet" href="/css/tractatus-theme.min.css?v=0.1.0.1761447293715">
@ -69,13 +69,14 @@
<!-- Navigation (injected by navbar.js) -->
<script src="/js/components/navbar.js?v=0.1.0.1761447293715"></script>
<script src="/js/i18n-simple.js?v=0.1.0.1761447293715"></script>
<!-- Main Content -->
<main id="main-content" class="max-w-3xl mx-auto px-4 sm:px-6 lg:px-8 py-12">
<!-- Header -->
<div class="mb-8">
<h1 class="text-3xl font-bold text-gray-900 mb-3">Media Inquiry</h1>
<h1 data-i18n="page.heading" class="text-3xl font-bold text-gray-900 mb-3">Media Inquiry</h1>
<p class="text-lg text-gray-600">
Press and media inquiries about the Tractatus Framework. We review all inquiries and respond promptly.
</p>
@ -90,66 +91,66 @@
<form id="media-inquiry-form">
<!-- Contact Information -->
<h2 class="text-xl font-semibold text-gray-900 mb-6">Contact Information</h2>
<h2 data-i18n="form.contact_info_heading" class="text-xl font-semibold text-gray-900 mb-6">Contact Information</h2>
<div class="form-group">
<label for="contact-name" class="form-label">
Your Name <span class="required">*</span>
<span data-i18n="form.contact_name_label">Your Name</span> <span class="required">*</span>
</label>
<input type="text" id="contact-name" name="contact.name" class="form-input" required aria-required="true">
</div>
<div class="form-group">
<label for="contact-email" class="form-label">
Email Address <span class="required">*</span>
<span data-i18n="form.contact_email_label">Email Address</span> <span class="required">*</span>
</label>
<input type="email" id="contact-email" name="contact.email" class="form-input" required aria-required="true">
</div>
<div class="form-group">
<label for="contact-outlet" class="form-label">
Media Outlet/Organization <span class="required">*</span>
<span data-i18n="form.contact_outlet_label">Media Outlet/Organization</span> <span class="required">*</span>
</label>
<input type="text" id="contact-outlet" name="contact.outlet" class="form-input" required aria-required="true" aria-describedby="outlet-help">
<p id="outlet-help" class="form-help">Publication, website, podcast, or organization you represent</p>
<p id="outlet-help" class="form-help" data-i18n="form.contact_outlet_help">Publication, website, podcast, or organization you represent</p>
</div>
<div class="form-group">
<label for="contact-phone" class="form-label">
Phone Number (optional)
<span data-i18n="form.contact_phone_label">Phone Number (optional)</span>
</label>
<input type="tel" id="contact-phone" name="contact.phone" class="form-input">
</div>
<!-- Inquiry Details -->
<h2 class="text-xl font-semibold text-gray-900 mb-6 mt-8">Inquiry Details</h2>
<h2 data-i18n="form.inquiry_details_heading" class="text-xl font-semibold text-gray-900 mb-6 mt-8">Inquiry Details</h2>
<div class="form-group">
<label for="inquiry-subject" class="form-label">
Subject <span class="required">*</span>
<span data-i18n="form.inquiry_subject_label">Subject</span> <span class="required">*</span>
</label>
<input type="text" id="inquiry-subject" name="inquiry.subject" class="form-input" required aria-required="true">
</div>
<div class="form-group">
<label for="inquiry-message" class="form-label">
Message <span class="required">*</span>
<span data-i18n="form.inquiry_message_label">Message</span> <span class="required">*</span>
</label>
<textarea id="inquiry-message" name="inquiry.message" class="form-textarea" required aria-required="true"></textarea>
</div>
<div class="form-group">
<label for="inquiry-deadline" class="form-label">
Deadline (if applicable)
<span data-i18n="form.inquiry_deadline_label">Deadline (if applicable)</span>
</label>
<input type="datetime-local" id="inquiry-deadline" name="inquiry.deadline" class="form-input" aria-describedby="deadline-help">
<p id="deadline-help" class="form-help">When do you need a response by?</p>
<p id="deadline-help" class="form-help" data-i18n="form.inquiry_deadline_help">When do you need a response by?</p>
</div>
<!-- Submit Button -->
<div class="mt-8">
<button type="submit" id="submit-button" class="w-full text-white px-6 py-3 rounded-lg font-semibold transition-all duration-200 hover:shadow-lg hover:-translate-y-0.5 bg-gradient-cyan-blue">
Submit Inquiry
<span data-i18n="form.submit_button">Submit Inquiry</span>
</button>
<p class="form-help mt-3 text-center">
We review all media inquiries and typically respond within 24-48 hours.
@ -171,6 +172,7 @@
</main>
<!-- Footer -->
<script src="/js/components/language-selector.js?v=0.1.0.1761447293715"></script>
<script src="/js/media-inquiry.js?v=0.1.0.1761447293715"></script>
<!-- Footer Component -->