Skip to content

Commit 3eccac2

Browse files
author
root
committed
fix(tools): add comprehensive translations for all tool pages and ensure two-line hero titles
1 parent 2e35ea8 commit 3eccac2

7 files changed

Lines changed: 2089 additions & 477 deletions

File tree

components/GlobalFooter.vue

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
© {{ new Date().getFullYear() }} -
4141
<nuxt-link :to="$localePath('/about')">About</nuxt-link>
4242
-
43-
<nuxt-link :to="$localePath('/tools')">Tools</nuxt-link>
43+
<nuxt-link :to="$localePath('/tools')">{{
44+
$t("toolsHub.headerTools") || "Tools"
45+
}}</nuxt-link>
4446
-
4547
<nuxt-link :to="$localePath('/impressum')">Imprint</nuxt-link>
4648
-
@@ -67,6 +69,10 @@ export default {
6769
name: "tools/proof-of-relationship",
6870
text: "pageNameRelationship",
6971
},
72+
{
73+
name: "tools/inactivity",
74+
text: "pageNameInactivity",
75+
},
7076
{
7177
name: "switch-from-whatsapp-to-signal",
7278
text: "pageNameSignal",

components/GlobalHeader.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
<v-icon size="16" class="mr-1" color="#000000"
2121
>mdi-toolbox-outline</v-icon
2222
>
23-
<span>Tools</span>
23+
<span>{{ $t("toolsHub.headerTools") || "Tools" }}</span>
2424
</nuxt-link>
2525

2626
<v-btn

components/landing/LandingHero.vue

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
</template>
3232
</nav>
3333
<p v-if="eyebrow" class="landing-hero__eyebrow">{{ eyebrow }}</p>
34-
<h1 class="landing-hero__title" v-html="title"></h1>
34+
<h1 class="landing-hero__title" v-html="renderedTitle"></h1>
3535
<p v-if="subtitle" class="landing-hero__subtitle">{{ subtitle }}</p>
3636
<div v-if="ctaText" class="landing-hero__actions">
3737
<LandingButton :to="ctaTo">{{ ctaText }}</LandingButton>
@@ -60,6 +60,24 @@ export default {
6060
data() {
6161
return { visible: false };
6262
},
63+
computed: {
64+
renderedTitle() {
65+
if (!this.title) return "";
66+
if (this.title.includes("landing-hero__title-line")) {
67+
return this.title;
68+
}
69+
if (/<br\s*\/?>/i.test(this.title)) {
70+
return this.title
71+
.split(/<br\s*\/?>/i)
72+
.map(
73+
(part) =>
74+
`<span class="landing-hero__title-line">${part.trim()}</span>`
75+
)
76+
.join("");
77+
}
78+
return this.title;
79+
},
80+
},
6381
mounted() {
6482
requestAnimationFrame(() => {
6583
this.visible = true;
@@ -140,12 +158,16 @@ export default {
140158
}
141159
142160
.landing-hero__title {
143-
font-size: clamp(2.5rem, 7vw, 4.8rem);
161+
font-size: clamp(2.2rem, 5.5vw, 4.2rem);
144162
font-weight: 700;
145-
line-height: 1.05;
163+
line-height: 1.1;
146164
letter-spacing: -0.02em;
147165
margin: 0 auto;
148166
max-width: 18ch;
167+
168+
:deep(.landing-hero__title-line) {
169+
display: block;
170+
}
149171
}
150172
151173
.landing-hero__subtitle {
@@ -183,6 +205,12 @@ export default {
183205
.landing-hero__title {
184206
margin: 0;
185207
max-width: none;
208+
font-size: clamp(2rem, 4.4vw, 3.6rem);
209+
210+
:deep(.landing-hero__title-line) {
211+
display: block;
212+
white-space: nowrap;
213+
}
186214
}
187215
188216
.landing-hero__subtitle {
@@ -195,4 +223,16 @@ export default {
195223
justify-content: flex-start;
196224
}
197225
}
226+
227+
@media (max-width: 600px) {
228+
.landing-hero--left .landing-hero__title {
229+
font-size: clamp(1.35rem, 5.2vw, 2rem);
230+
}
231+
}
232+
233+
@media (max-width: 380px) {
234+
.landing-hero--left .landing-hero__title {
235+
font-size: clamp(1.15rem, 5vw, 1.5rem);
236+
}
237+
}
198238
</style>

components/tools/ToolDropzone.vue

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,11 @@
33
<!-- Technical Security Banner -->
44
<div class="tech-spec-bar">
55
<span class="pulse-dot"></span>
6-
<span class="mono-label">LOCAL CLIENT ENGINE</span>
6+
<span class="mono-label">{{ t("toolDropzone.localEngine") }}</span>
77
<span class="separator">•</span>
8-
<span class="mono-label">ZERO CLOUD TRANSMISSION</span>
8+
<span class="mono-label">{{ t("toolDropzone.zeroCloud") }}</span>
99
<span class="separator">•</span>
10-
<span class="mono-label">100% PRIVATE</span>
10+
<span class="mono-label">{{ t("toolDropzone.private") }}</span>
1111
</div>
1212

1313
<!-- Drop Container Card (Styled like LandingDocMock / LandingStatsMock) -->
@@ -40,29 +40,27 @@
4040
<v-icon size="32" color="#21a68d">mdi-tray-arrow-down</v-icon>
4141
</div>
4242

43-
<h3 class="dropzone-title">Drop your WhatsApp chat export here</h3>
44-
<p class="dropzone-subtitle">
45-
Accepts exported <code>.txt</code> or <code>.zip</code> chat files
46-
</p>
43+
<h3 class="dropzone-title">{{ t("toolDropzone.dropTitle") }}</h3>
44+
<p class="dropzone-subtitle">{{ t("toolDropzone.dropSubtitle") }}</p>
4745

4846
<div class="action-buttons" @click.stop>
4947
<button type="button" class="btn-primary" @click="triggerFileDialog">
5048
<v-icon size="18" class="mr-1">mdi-file-upload-outline</v-icon>
51-
Select Chat File
49+
{{ t("toolDropzone.selectFile") }}
5250
</button>
5351
<button type="button" class="btn-ghost" @click="loadSampleChat">
5452
<v-icon size="18" class="mr-1">mdi-play-circle-outline</v-icon>
55-
Try With Sample Chat
53+
{{ t("toolDropzone.trySample") }}
5654
</button>
5755
</div>
5856
</div>
5957

6058
<!-- Loading / Parsing State -->
6159
<div v-else-if="loading" class="dropzone-content loading-state">
6260
<div class="spinner-ring"></div>
63-
<h4 class="loading-title">Analyzing Conversation Gaps...</h4>
61+
<h4 class="loading-title">{{ t("toolDropzone.analyzingTitle") }}</h4>
6462
<p class="loading-meta mono-label">
65-
Computing timestamps, response latencies, and participant inactivity
63+
{{ t("toolDropzone.analyzingSubtitle") }}
6664
</p>
6765
</div>
6866

@@ -73,8 +71,12 @@
7371
<div class="file-info">
7472
<span class="file-name">{{ loadedFileName }}</span>
7573
<span class="file-meta mono-label">
76-
{{ parsedMessageCount.toLocaleString() }} messages • analyzed in
77-
{{ parseDurationMs }}ms
74+
{{
75+
t("toolDropzone.messagesAnalyzedIn", {
76+
count: parsedMessageCount.toLocaleString(),
77+
time: parseDurationMs,
78+
})
79+
}}
7880
</span>
7981
</div>
8082
</div>
@@ -85,7 +87,7 @@
8587
@click="triggerFileDialog"
8688
>
8789
<v-icon size="16" class="mr-1">mdi-swap-horizontal</v-icon>
88-
Switch File
90+
{{ t("toolDropzone.switchFile") }}
8991
</button>
9092
</div>
9193

@@ -102,6 +104,8 @@
102104

103105
<script setup lang="ts">
104106
import { ref } from "vue";
107+
108+
const { t } = useI18n();
105109
import {
106110
parseChatFile,
107111
useSharedChat,

0 commit comments

Comments
 (0)