feat(localization): implement localePath for project links across components
- Updated HytaleDemoGrid.vue, ProjectCard.vue, FeaturedProjectsSection.vue, about.vue, and project/[id].vue to utilize localePath for project links, enhancing localization support. - This change ensures that project URLs are correctly localized, improving user experience across different languages. This commit strengthens the site's multilingual capabilities by standardizing project link paths.
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
import { hytaleDemos } from '~/data/hytaleDemos'
|
import { hytaleDemos } from '~/data/hytaleDemos'
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
const localePath = useLocalePath()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -76,6 +77,15 @@ const { t } = useI18n()
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="flex flex-wrap gap-2 mt-2">
|
<div class="flex flex-wrap gap-2 mt-2">
|
||||||
|
<UButton
|
||||||
|
:to="localePath(`/project/${demo.id}`)"
|
||||||
|
color="primary"
|
||||||
|
variant="soft"
|
||||||
|
size="sm"
|
||||||
|
trailing-icon="i-lucide-arrow-right"
|
||||||
|
>
|
||||||
|
{{ t('projects.buttons.viewProject') }}
|
||||||
|
</UButton>
|
||||||
<UButton
|
<UButton
|
||||||
v-if="demo.website"
|
v-if="demo.website"
|
||||||
:to="demo.website"
|
:to="demo.website"
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ interface Props {
|
|||||||
|
|
||||||
const props = defineProps<Props>()
|
const props = defineProps<Props>()
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
const localePath = useLocalePath()
|
||||||
|
|
||||||
const translatedCategory = computed(() => {
|
const translatedCategory = computed(() => {
|
||||||
if (!props.project.category) return ''
|
if (!props.project.category) return ''
|
||||||
@@ -22,7 +23,7 @@ const translatedCategory = computed(() => {
|
|||||||
itemtype="https://schema.org/CreativeWork"
|
itemtype="https://schema.org/CreativeWork"
|
||||||
>
|
>
|
||||||
<!-- Image -->
|
<!-- Image -->
|
||||||
<NuxtLink :to="`/project/${project.id}`" class="block relative overflow-hidden">
|
<NuxtLink :to="localePath(`/project/${project.id}`)" class="block relative overflow-hidden">
|
||||||
<NuxtImg
|
<NuxtImg
|
||||||
:src="project.image"
|
:src="project.image"
|
||||||
:alt="`${project.title} - ${project.description.slice(0, 60)}...`"
|
:alt="`${project.title} - ${project.description.slice(0, 60)}...`"
|
||||||
@@ -81,7 +82,7 @@ const translatedCategory = computed(() => {
|
|||||||
|
|
||||||
<!-- Hidden SEO link -->
|
<!-- Hidden SEO link -->
|
||||||
<NuxtLink
|
<NuxtLink
|
||||||
:to="`/project/${project.id}`"
|
:to="localePath(`/project/${project.id}`)"
|
||||||
class="absolute inset-0 z-10"
|
class="absolute inset-0 z-10"
|
||||||
:aria-label="`${t('projects.buttons.viewProject')} - ${project.title}`"
|
:aria-label="`${t('projects.buttons.viewProject')} - ${project.title}`"
|
||||||
itemprop="url"
|
itemprop="url"
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
const { featuredProjects } = useProjects()
|
const { featuredProjects } = useProjects()
|
||||||
|
const localePath = useLocalePath()
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -13,7 +14,7 @@ const { featuredProjects } = useProjects()
|
|||||||
<h2 class="text-3xl sm:text-4xl lg:text-5xl font-bold mt-3 bg-gradient-to-r from-gray-900 via-gray-800 to-gray-600 dark:from-white dark:via-gray-200 dark:to-gray-500 bg-clip-text text-transparent">{{ t('home.featuredProjects.title') }}</h2>
|
<h2 class="text-3xl sm:text-4xl lg:text-5xl font-bold mt-3 bg-gradient-to-r from-gray-900 via-gray-800 to-gray-600 dark:from-white dark:via-gray-200 dark:to-gray-500 bg-clip-text text-transparent">{{ t('home.featuredProjects.title') }}</h2>
|
||||||
<p class="text-lg text-gray-500 dark:text-gray-400 mt-4 max-w-2xl leading-relaxed">{{ t('home.featuredProjects.subtitle') }}</p>
|
<p class="text-lg text-gray-500 dark:text-gray-400 mt-4 max-w-2xl leading-relaxed">{{ t('home.featuredProjects.subtitle') }}</p>
|
||||||
</div>
|
</div>
|
||||||
<UButton to="/projects" variant="ghost" trailing-icon="i-lucide-arrow-right" class="shrink-0 self-start md:self-auto group">
|
<UButton :to="localePath('/projects')" variant="ghost" trailing-icon="i-lucide-arrow-right" class="shrink-0 self-start md:self-auto group">
|
||||||
{{ t('home.cta.viewProjects') }}
|
{{ t('home.cta.viewProjects') }}
|
||||||
</UButton>
|
</UButton>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
+3
-2
@@ -2,6 +2,7 @@
|
|||||||
import { techStack } from '~/data/techstack'
|
import { techStack } from '~/data/techstack'
|
||||||
|
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
const localePath = useLocalePath()
|
||||||
|
|
||||||
useSeoMeta({
|
useSeoMeta({
|
||||||
title: () => t('seo.about.title'),
|
title: () => t('seo.about.title'),
|
||||||
@@ -180,9 +181,9 @@ const approachCards = computed(() => [
|
|||||||
:title="t('about.cta.title')"
|
:title="t('about.cta.title')"
|
||||||
:subtitle="t('about.cta.description')"
|
:subtitle="t('about.cta.description')"
|
||||||
:primary-text="t('about.cta.button')"
|
:primary-text="t('about.cta.button')"
|
||||||
primary-to="/contact"
|
:primary-to="localePath('/contact')"
|
||||||
:secondary-text="t('home.cta.viewProjects')"
|
:secondary-text="t('home.cta.viewProjects')"
|
||||||
secondary-to="/projects"
|
:secondary-to="localePath('/projects')"
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
const route = useRoute()
|
const route = useRoute()
|
||||||
const { t } = useI18n()
|
const { t } = useI18n()
|
||||||
|
const localePath = useLocalePath()
|
||||||
const { findById, projects } = useProjects()
|
const { findById, projects } = useProjects()
|
||||||
|
|
||||||
const project = findById(route.params.id as string)
|
const project = findById(route.params.id as string)
|
||||||
@@ -52,7 +53,7 @@ useSeoMeta({
|
|||||||
variant="solid"
|
variant="solid"
|
||||||
color="neutral"
|
color="neutral"
|
||||||
icon="i-lucide-arrow-left"
|
icon="i-lucide-arrow-left"
|
||||||
to="/projects"
|
:to="localePath('/projects')"
|
||||||
size="sm"
|
size="sm"
|
||||||
class="shadow-lg backdrop-blur-sm"
|
class="shadow-lg backdrop-blur-sm"
|
||||||
>
|
>
|
||||||
@@ -215,7 +216,7 @@ useSeoMeta({
|
|||||||
<NuxtLink
|
<NuxtLink
|
||||||
v-for="related in relatedProjects"
|
v-for="related in relatedProjects"
|
||||||
:key="related.id"
|
:key="related.id"
|
||||||
:to="`/project/${related.id}`"
|
:to="localePath(`/project/${related.id}`)"
|
||||||
class="flex gap-3 p-3 rounded-xl border border-transparent hover:border-brand-500/20 hover:bg-brand-500/5 transition-all duration-200 group"
|
class="flex gap-3 p-3 rounded-xl border border-transparent hover:border-brand-500/20 hover:bg-brand-500/5 transition-all duration-200 group"
|
||||||
>
|
>
|
||||||
<NuxtImg
|
<NuxtImg
|
||||||
|
|||||||
Reference in New Issue
Block a user