Skip to content

Commit 7720fc8

Browse files
committed
feat: implement internationalization for navigation and hero sections across multiple languages
1 parent 7dba4da commit 7720fc8

8 files changed

Lines changed: 213 additions & 68 deletions

File tree

app/components/PublicNavBar.vue

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ defineProps<{
55
activePage?: 'features' | 'jobs' | 'roadmap' | 'blog' | 'docs'
66
}>()
77
8+
const { t } = useI18n()
89
const localePath = useLocalePath()
910
const { data: session } = await authClient.useSession(useFetch)
1011
</script>
@@ -36,7 +37,7 @@ const { data: session } = await authClient.useSession(useFetch)
3637
class="rounded-md px-3 py-1.5 text-[13px] font-medium transition"
3738
:class="activePage === 'jobs' ? 'text-white' : 'text-surface-400 hover:text-white'"
3839
>
39-
Open Positions
40+
{{ t('home.nav.openPositions') }}
4041
</NuxtLink>
4142
<a
4243
href="https://github.com/reqcore-inc/reqcore"
@@ -45,32 +46,33 @@ const { data: session } = await authClient.useSession(useFetch)
4546
class="flex items-center gap-1.5 rounded-md px-3 py-1.5 text-[13px] font-medium text-surface-400 transition hover:text-white"
4647
>
4748
<Github class="h-3.5 w-3.5" />
48-
GitHub
49+
{{ t('home.nav.github') }}
4950
</a>
5051
</div>
5152

52-
<!-- Right: session actions -->
53+
<!-- Right: session actions + language switcher -->
5354
<div class="flex items-center gap-2">
55+
<LanguageSwitcher />
5456
<template v-if="session?.user">
5557
<NuxtLink
5658
:to="localePath('/dashboard')"
5759
class="rounded-md bg-white px-3.5 py-1.5 text-[13px] font-semibold text-[#09090b] transition hover:bg-white/90"
5860
>
59-
Dashboard
61+
{{ t('home.nav.dashboard') }}
6062
</NuxtLink>
6163
</template>
6264
<template v-else>
6365
<NuxtLink
6466
:to="localePath('/auth/sign-in')"
6567
class="hidden rounded-md px-3 py-1.5 text-[13px] font-medium text-surface-400 transition hover:text-white sm:inline-flex"
6668
>
67-
Log In
69+
{{ t('home.nav.logIn') }}
6870
</NuxtLink>
6971
<NuxtLink
7072
:to="localePath('/auth/sign-up')"
7173
class="rounded-md bg-white px-3.5 py-1.5 text-[13px] font-semibold text-[#09090b] transition hover:bg-white/90"
7274
>
73-
Get Started
75+
{{ t('home.nav.signUp') }}
7476
</NuxtLink>
7577
</template>
7678
</div>

app/pages/index.vue

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
<script setup lang="ts">
22
import { Github, Shield, Database, Users, Briefcase, ArrowRight } from 'lucide-vue-next'
33
4+
const { t } = useI18n()
45
const localePath = useLocalePath()
56
const { data: session } = await authClient.useSession(useFetch)
67
7-
const pillars = [
8-
{ icon: Database, label: 'Your data', desc: 'Postgres + MinIO on your infrastructure. Nothing leaves your network.' },
9-
{ icon: Shield, label: 'Fully auditable', desc: 'Open source — every line of matching logic is visible and overridable.' },
10-
{ icon: Users, label: 'Unlimited seats', desc: 'Add your whole hiring team. No per-seat pricing, ever.' },
11-
]
8+
const pillars = computed(() => [
9+
{ icon: Database, label: t('home.pillars.yourData.label'), desc: t('home.pillars.yourData.desc') },
10+
{ icon: Shield, label: t('home.pillars.auditable.label'), desc: t('home.pillars.auditable.desc') },
11+
{ icon: Users, label: t('home.pillars.unlimitedSeats.label'), desc: t('home.pillars.unlimitedSeats.desc') },
12+
])
1213
1314
useHead({ title: 'Reqcore' })
1415
definePageMeta({ layout: false })
@@ -28,15 +29,15 @@ definePageMeta({ layout: false })
2829
<!-- ── Hero ── -->
2930
<div class="flex flex-col items-center text-center">
3031
<h1 class="hero-animate hero-delay-1 text-5xl font-bold leading-[1.1] tracking-tight sm:text-6xl lg:text-7xl">
31-
Your hiring.
32+
{{ $t('home.hero.titleLine1') }}
3233
<br />
3334
<span class="bg-gradient-to-r from-brand-400 to-accent-400 bg-clip-text text-transparent">
34-
Your infrastructure.
35+
{{ $t('home.hero.titleHighlight') }}
3536
</span>
3637
</h1>
3738

3839
<p class="hero-animate hero-delay-2 mt-6 max-w-md text-base leading-relaxed text-surface-400 sm:text-lg">
39-
Open-source applicant tracking built for teams that self-host.
40+
{{ $t('home.hero.subtitle') }}
4041
</p>
4142

4243
<div class="hero-animate hero-delay-3 mt-10 flex flex-wrap items-center justify-center gap-3">
@@ -45,22 +46,22 @@ definePageMeta({ layout: false })
4546
:to="localePath('/dashboard')"
4647
class="group flex items-center gap-2 rounded-lg bg-white px-6 py-3 text-[14px] font-semibold text-[#09090b] transition hover:bg-white/90"
4748
>
48-
Go to Dashboard
49+
{{ $t('home.hero.goToDashboard') }}
4950
<ArrowRight class="h-4 w-4 transition-transform group-hover:translate-x-0.5" />
5051
</NuxtLink>
5152
<template v-else>
5253
<NuxtLink
5354
:to="localePath('/auth/sign-in')"
5455
class="group flex items-center gap-2 rounded-lg bg-white px-6 py-3 text-[14px] font-semibold text-[#09090b] transition hover:bg-white/90"
5556
>
56-
Sign in
57+
{{ $t('home.hero.signIn') }}
5758
<ArrowRight class="h-4 w-4 transition-transform group-hover:translate-x-0.5" />
5859
</NuxtLink>
5960
<NuxtLink
6061
:to="localePath('/auth/sign-up')"
6162
class="rounded-lg border border-white/[0.08] bg-white/[0.03] px-6 py-3 text-[14px] font-medium text-surface-300 transition hover:border-white/[0.14] hover:bg-white/[0.06]"
6263
>
63-
Create account
64+
{{ $t('home.hero.createAccount') }}
6465
</NuxtLink>
6566
</template>
6667
</div>
@@ -89,18 +90,18 @@ definePageMeta({ layout: false })
8990
class="flex items-center gap-1.5 text-[13px] text-surface-500 transition hover:text-surface-300"
9091
>
9192
<Github class="h-4 w-4" />
92-
Source
93+
{{ $t('home.footer.source') }}
9394
</a>
9495
<NuxtLink
9596
:to="localePath('/jobs')"
9697
class="flex items-center gap-1.5 text-[13px] text-surface-500 transition hover:text-surface-300"
9798
>
9899
<Briefcase class="h-3.5 w-3.5" />
99-
Open Positions
100+
{{ $t('home.nav.openPositions') }}
100101
</NuxtLink>
101102
</div>
102103
<p class="text-[12px] text-surface-600">
103-
Reqcore — open-source applicant tracking
104+
{{ $t('home.footer.tagline') }}
104105
</p>
105106
</footer>
106107
</main>

i18n/locales/de.json

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,44 @@
77
},
88
"home": {
99
"nav": {
10-
"features": "Features",
11-
"openPositions": "Open Positions",
10+
"features": "Funktionen",
11+
"openPositions": "Offene Stellen",
1212
"roadmap": "Roadmap",
1313
"blog": "Blog",
1414
"github": "GitHub",
1515
"dashboard": "Dashboard",
16-
"logIn": "Log in",
17-
"signUp": "Sign up"
16+
"logIn": "Anmelden",
17+
"signUp": "Registrieren"
1818
},
19-
"badge": "Open Source ATS for Developer Teams",
19+
"badge": "Open-Source-ATS für Entwicklerteams",
2020
"hero": {
21-
"titleLine1": "Hiring software",
22-
"titleHighlight": "built for developer teams",
23-
"subtitleLine1": "Most ATS tools were designed for HR departments.",
24-
"subtitleLine2": "Reqcore is open source, self-hosted, and built with a stack you already know.",
25-
"ctaDemo": "Try live demo",
26-
"ctaStart": "View on GitHub",
27-
"hint": "Early open-source release — try the demo with sample data, no sign-up needed"
21+
"titleLine1": "Ihr Recruiting.",
22+
"titleHighlight": "Ihre Infrastruktur.",
23+
"subtitle": "Open-Source-Bewerbermanagement für Teams, die selbst hosten.",
24+
"goToDashboard": "Zum Dashboard",
25+
"signIn": "Anmelden",
26+
"createAccount": "Konto erstellen",
27+
"ctaDemo": "Live-Demo testen",
28+
"ctaStart": "Auf GitHub ansehen",
29+
"hint": "Frühe Open-Source-Version — testen Sie die Demo mit Beispieldaten, ohne Registrierung"
30+
},
31+
"pillars": {
32+
"yourData": {
33+
"label": "Ihre Daten",
34+
"desc": "Postgres + MinIO auf Ihrer Infrastruktur. Nichts verlässt Ihr Netzwerk."
35+
},
36+
"auditable": {
37+
"label": "Vollständig auditierbar",
38+
"desc": "Open Source — jede Zeile der Matching-Logik ist sichtbar und anpassbar."
39+
},
40+
"unlimitedSeats": {
41+
"label": "Unbegrenzte Plätze",
42+
"desc": "Fügen Sie Ihr gesamtes Recruiting-Team hinzu. Kein Preis pro Platz, nie."
43+
}
44+
},
45+
"footer": {
46+
"source": "Quellcode",
47+
"tagline": "Reqcore — Open-Source-Bewerbermanagement"
2848
}
2949
}
3050
}

i18n/locales/en.json

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,33 @@
1818
},
1919
"badge": "Open Source ATS for Developer Teams",
2020
"hero": {
21-
"titleLine1": "Hiring software",
22-
"titleHighlight": "built for developer teams",
23-
"subtitleLine1": "Most ATS tools were designed for HR departments.",
24-
"subtitleLine2": "Reqcore is open source, self-hosted, and built with a stack you already know.",
21+
"titleLine1": "Your hiring.",
22+
"titleHighlight": "Your infrastructure.",
23+
"subtitle": "Open-source applicant tracking built for teams that self-host.",
24+
"goToDashboard": "Go to Dashboard",
25+
"signIn": "Sign in",
26+
"createAccount": "Create account",
2527
"ctaDemo": "Try live demo",
2628
"ctaStart": "View on GitHub",
2729
"hint": "Early open-source release — try the demo with sample data, no sign-up needed"
30+
},
31+
"pillars": {
32+
"yourData": {
33+
"label": "Your data",
34+
"desc": "Postgres + MinIO on your infrastructure. Nothing leaves your network."
35+
},
36+
"auditable": {
37+
"label": "Fully auditable",
38+
"desc": "Open source — every line of matching logic is visible and overridable."
39+
},
40+
"unlimitedSeats": {
41+
"label": "Unlimited seats",
42+
"desc": "Add your whole hiring team. No per-seat pricing, ever."
43+
}
44+
},
45+
"footer": {
46+
"source": "Source",
47+
"tagline": "Reqcore — open-source applicant tracking"
2848
}
2949
}
3050
}

i18n/locales/es.json

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,47 @@
44
"selectLanguage": "Seleccionar idioma",
55
"save": "Guardar",
66
"cancel": "Cancelar"
7+
},
8+
"home": {
9+
"nav": {
10+
"features": "Características",
11+
"openPositions": "Posiciones abiertas",
12+
"roadmap": "Hoja de ruta",
13+
"blog": "Blog",
14+
"github": "GitHub",
15+
"dashboard": "Panel de control",
16+
"logIn": "Iniciar sesión",
17+
"signUp": "Registrarse"
18+
},
19+
"badge": "ATS de código abierto para equipos de desarrollo",
20+
"hero": {
21+
"titleLine1": "Tu contratación.",
22+
"titleHighlight": "Tu infraestructura.",
23+
"subtitle": "Seguimiento de candidatos de código abierto para equipos que alojan en sus propios servidores.",
24+
"goToDashboard": "Ir al panel",
25+
"signIn": "Iniciar sesión",
26+
"createAccount": "Crear cuenta",
27+
"ctaDemo": "Probar demo en vivo",
28+
"ctaStart": "Ver en GitHub",
29+
"hint": "Versión temprana de código abierto — prueba la demo con datos de ejemplo, sin registro"
30+
},
31+
"pillars": {
32+
"yourData": {
33+
"label": "Tus datos",
34+
"desc": "Postgres + MinIO en tu infraestructura. Nada sale de tu red."
35+
},
36+
"auditable": {
37+
"label": "Totalmente auditable",
38+
"desc": "Código abierto — cada línea de lógica de matching es visible y personalizable."
39+
},
40+
"unlimitedSeats": {
41+
"label": "Puestos ilimitados",
42+
"desc": "Agrega a todo tu equipo de contratación. Sin precio por puesto, nunca."
43+
}
44+
},
45+
"footer": {
46+
"source": "Código fuente",
47+
"tagline": "Reqcore — seguimiento de candidatos de código abierto"
48+
}
749
}
850
}

i18n/locales/fr.json

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,24 +7,44 @@
77
},
88
"home": {
99
"nav": {
10-
"features": "Features",
11-
"openPositions": "Open Positions",
12-
"roadmap": "Roadmap",
10+
"features": "Fonctionnalités",
11+
"openPositions": "Postes ouverts",
12+
"roadmap": "Feuille de route",
1313
"blog": "Blog",
1414
"github": "GitHub",
15-
"dashboard": "Dashboard",
16-
"logIn": "Log in",
17-
"signUp": "Sign up"
15+
"dashboard": "Tableau de bord",
16+
"logIn": "Se connecter",
17+
"signUp": "S'inscrire"
1818
},
19-
"badge": "Open Source ATS for Developer Teams",
19+
"badge": "ATS Open Source pour les équipes de développeurs",
2020
"hero": {
21-
"titleLine1": "Hiring software",
22-
"titleHighlight": "built for developer teams",
23-
"subtitleLine1": "Most ATS tools were designed for HR departments.",
24-
"subtitleLine2": "Reqcore is open source, self-hosted, and built with a stack you already know.",
25-
"ctaDemo": "Try live demo",
26-
"ctaStart": "View on GitHub",
27-
"hint": "Early open-source release — try the demo with sample data, no sign-up needed"
21+
"titleLine1": "Votre recrutement.",
22+
"titleHighlight": "Votre infrastructure.",
23+
"subtitle": "Suivi de candidatures open source conçu pour les équipes qui auto-hébergent.",
24+
"goToDashboard": "Aller au tableau de bord",
25+
"signIn": "Se connecter",
26+
"createAccount": "Créer un compte",
27+
"ctaDemo": "Essayer la démo",
28+
"ctaStart": "Voir sur GitHub",
29+
"hint": "Version open source précoce — essayez la démo avec des données d'exemple, sans inscription"
30+
},
31+
"pillars": {
32+
"yourData": {
33+
"label": "Vos données",
34+
"desc": "Postgres + MinIO sur votre infrastructure. Rien ne quitte votre réseau."
35+
},
36+
"auditable": {
37+
"label": "Entièrement auditable",
38+
"desc": "Open source — chaque ligne de logique de matching est visible et modifiable."
39+
},
40+
"unlimitedSeats": {
41+
"label": "Utilisateurs illimités",
42+
"desc": "Ajoutez toute votre équipe de recrutement. Pas de tarification par siège, jamais."
43+
}
44+
},
45+
"footer": {
46+
"source": "Code source",
47+
"tagline": "Reqcore — suivi de candidatures open source"
2848
}
2949
}
3050
}

i18n/locales/nb.json

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,33 @@
1818
},
1919
"badge": "Åpen kildekode ATS for utviklerteam",
2020
"hero": {
21-
"titleLine1": "Rekrutteringsverktøy",
22-
"titleHighlight": "bygget for utviklerteam",
23-
"subtitleLine1": "De fleste ATS-verktøy er laget for HR-avdelinger.",
24-
"subtitleLine2": "Reqcore er åpen kildekode, selvdriftet, og bygget med en stack du allerede kjenner.",
21+
"titleLine1": "Din rekruttering.",
22+
"titleHighlight": "Din infrastruktur.",
23+
"subtitle": "Åpen kildekode kandidatsporing bygget for team som drifter selv.",
24+
"goToDashboard": "Gå til kontrollpanel",
25+
"signIn": "Logg inn",
26+
"createAccount": "Opprett konto",
2527
"ctaDemo": "Prøv live demo",
2628
"ctaStart": "Se på GitHub",
2729
"hint": "Tidlig åpen kildekode-utgivelse — prøv demoen med eksempeldata, ingen registrering nødvendig"
30+
},
31+
"pillars": {
32+
"yourData": {
33+
"label": "Dine data",
34+
"desc": "Postgres + MinIO på din infrastruktur. Ingenting forlater nettverket ditt."
35+
},
36+
"auditable": {
37+
"label": "Fullt reviderbar",
38+
"desc": "Åpen kildekode — hver linje med matchingslogikk er synlig og kan overstyres."
39+
},
40+
"unlimitedSeats": {
41+
"label": "Ubegrensede plasser",
42+
"desc": "Legg til hele rekrutteringsteamet ditt. Ingen pris per bruker, noensinne."
43+
}
44+
},
45+
"footer": {
46+
"source": "Kildekode",
47+
"tagline": "Reqcore — åpen kildekode kandidatsporing"
2848
}
2949
}
3050
}

0 commit comments

Comments
 (0)