diff --git a/apps/panoramablick/components/AppApartment.vue b/apps/panoramablick/components/AppApartment.vue index ca30385..cd489b8 100644 --- a/apps/panoramablick/components/AppApartment.vue +++ b/apps/panoramablick/components/AppApartment.vue @@ -54,7 +54,7 @@ diff --git a/apps/panoramablick/components/AppFooter.vue b/apps/panoramablick/components/AppFooter.vue index 3a4be71..93cb1c0 100644 --- a/apps/panoramablick/components/AppFooter.vue +++ b/apps/panoramablick/components/AppFooter.vue @@ -73,7 +73,7 @@ diff --git a/apps/panoramablick/components/AppHeader.vue b/apps/panoramablick/components/AppHeader.vue index ddd78be..6677c18 100644 --- a/apps/panoramablick/components/AppHeader.vue +++ b/apps/panoramablick/components/AppHeader.vue @@ -10,15 +10,16 @@ @@ -26,6 +27,6 @@ diff --git a/apps/panoramablick/components/AppTitleText.vue b/apps/panoramablick/components/AppTitleText.vue index 2b3a934..975a4a2 100644 --- a/apps/panoramablick/components/AppTitleText.vue +++ b/apps/panoramablick/components/AppTitleText.vue @@ -23,5 +23,5 @@ const props = defineProps<{ i18nKey: string }>() -const {t, tm, rt} = useI18n() +const {t, tm, rt} = useVariantData() diff --git a/apps/panoramablick/i18n/locales/de.json b/apps/panoramablick/i18n/locales/de.json index fb79925..ed92e05 100644 --- a/apps/panoramablick/i18n/locales/de.json +++ b/apps/panoramablick/i18n/locales/de.json @@ -3,7 +3,10 @@ "home": "Landhaus Panoramablick", "apartments": "Apartments & Preise", "book": "Buchen", - "contact": "Kontakt" + "contact": { + "#su": "KontaktS", + "#wi": "KontaktW" + } }, "footer": { "questions": "Fragen oder Wünsche?", @@ -83,7 +86,10 @@ "list": [ { "id": "apartment-1", - "title": "Apartment 1", + "title": { + "#su": "Appartment 1 (Sommer)", + "#wi": "Appartment 1 (Winter)" + }, "subtitle": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", "thumbnail": "/ap-1/1.webp", "highlights": [ diff --git a/apps/panoramablick/i18n/locales/en.json b/apps/panoramablick/i18n/locales/en.json index 069772b..75ecf7f 100644 --- a/apps/panoramablick/i18n/locales/en.json +++ b/apps/panoramablick/i18n/locales/en.json @@ -3,7 +3,10 @@ "home": "Landhaus Panoramablick", "apartments": "Apartments & Rates", "book": "Book", - "contact": "Contact" + "contact": { + "#su": "ContactS", + "#wi": "ContactW" + } }, "footer": { "questions": "Fragen oder Wünsche?", @@ -83,7 +86,10 @@ "list": [ { "id": "apartment-1", - "title": "Apartment 1", + "title": { + "#su": "Appartment 1 (Summer)", + "#wi": "Appartment 1 (Winter)" + }, "subtitle": "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.", "thumbnail": "/ap-1/1.webp", "highlights": [ diff --git a/apps/panoramablick/nuxt.config.ts b/apps/panoramablick/nuxt.config.ts index e9c067c..bb2863d 100644 --- a/apps/panoramablick/nuxt.config.ts +++ b/apps/panoramablick/nuxt.config.ts @@ -27,7 +27,7 @@ export default defineNuxtConfig({ } }, websites: { - defaultVariant: 'sumu', + defaultVariant: 'su', variants: [ { code: 'su', name: 'Summer' }, { code: 'wi', name: 'Winter' } diff --git a/apps/panoramablick/pages/[[variant]]/apartments.vue b/apps/panoramablick/pages/[[variant]]/apartments.vue index ecd41b7..5217277 100644 --- a/apps/panoramablick/pages/[[variant]]/apartments.vue +++ b/apps/panoramablick/pages/[[variant]]/apartments.vue @@ -21,5 +21,5 @@ \ No newline at end of file diff --git a/apps/panoramablick/pages/[[variant]]/contact.vue b/apps/panoramablick/pages/[[variant]]/contact.vue index dcfa084..eb25f1e 100644 --- a/apps/panoramablick/pages/[[variant]]/contact.vue +++ b/apps/panoramablick/pages/[[variant]]/contact.vue @@ -96,7 +96,7 @@ \ No newline at end of file diff --git a/apps/panoramablick/pages/[[variant]]/legal.vue b/apps/panoramablick/pages/[[variant]]/legal.vue index 7052eab..06d2b1b 100644 --- a/apps/panoramablick/pages/[[variant]]/legal.vue +++ b/apps/panoramablick/pages/[[variant]]/legal.vue @@ -26,5 +26,5 @@ \ No newline at end of file diff --git a/packages/ui/src/module.ts b/packages/ui/src/module.ts index 485f283..065b1e3 100644 --- a/packages/ui/src/module.ts +++ b/packages/ui/src/module.ts @@ -8,14 +8,7 @@ export default defineNuxtModule({ name: 'websites', configKey: 'websites', }, - defaults: { - defaultVariant: "su", - variants: [ - { code: 'su', name: 'Summer' }, - { code: 'wi', name: 'Winter' } - ] - }, - setup(_options, _nuxt) { + setup(options, nuxt) { const resolver = createResolver(import.meta.url) addComponentsDir({ path: resolver.resolve('./runtime/components'), @@ -24,5 +17,6 @@ export default defineNuxtModule({ global: true, }) addImportsDir(resolver.resolve('./runtime/composables')) + nuxt.options.runtimeConfig.public.websites = options } }) diff --git a/packages/ui/src/runtime/components/WVariantSwitcher.vue b/packages/ui/src/runtime/components/WVariantSwitcher.vue new file mode 100644 index 0000000..1e02027 --- /dev/null +++ b/packages/ui/src/runtime/components/WVariantSwitcher.vue @@ -0,0 +1,18 @@ + + + diff --git a/packages/ui/src/runtime/composables/useSwitchVariantPath.ts b/packages/ui/src/runtime/composables/useSwitchVariantPath.ts new file mode 100644 index 0000000..46bed22 --- /dev/null +++ b/packages/ui/src/runtime/composables/useSwitchVariantPath.ts @@ -0,0 +1,18 @@ +export function useSwitchVariantPath() { + const route = useRoute() + return (variant) => { + // Clone current params and replace variant + const params = { ...route.params, variant } + // Build a new path with the new params + // This uses named routes (recommended). If not, fallback to direct path replace: + if (route.name) { + return { name: route.name, params } + } else { + // fallback: replace variant in path + return route.fullPath.replace( + `/${route.params.variant || ''}`, + `/${variant}` + ) + } + } +} diff --git a/packages/ui/src/runtime/composables/useVariantData.ts b/packages/ui/src/runtime/composables/useVariantData.ts new file mode 100644 index 0000000..7006fef --- /dev/null +++ b/packages/ui/src/runtime/composables/useVariantData.ts @@ -0,0 +1,42 @@ +export function useVariantData() { + const { t, tm, rt } = useI18n() + const route = useRoute() + const config = useRuntimeConfig() + + function vtm(key: string) { + // Get the latest variant *each time* this runs for reactivity! + const variant = route.params.variant || config.public.websites.defaultVariant + const value = tm(key) + if (value && typeof value === 'object' && value[`#${variant}`] !== undefined) { + return value[`#${variant}`] + } + return value + } + + function vt(key: string) { + try { + return rt(vtm(key)) + } catch { + return key + } + } + + function vrt(value) { + const variant = route.params.variant || config.public.websites.defaultVariant + if (value && typeof value === 'object' && value[`#${variant}`]) { + value = value[`#${variant}`] + } + try { + return rt(value) + } catch (err) { + console.error('Exception in vrt:', err) + return value || err + } + } + + return { + t: vt, + tm: vtm, + rt: vrt, + } +} diff --git a/packages/ui/src/runtime/composables/useVariants.ts b/packages/ui/src/runtime/composables/useVariants.ts new file mode 100644 index 0000000..0bd7bdc --- /dev/null +++ b/packages/ui/src/runtime/composables/useVariants.ts @@ -0,0 +1,13 @@ +export function useVariants() { + const config = useRuntimeConfig() + const route = useRoute() + const variants = config.public.websites.variants || [] + const defaultVariant = config.public.websites.defaultVariant + + // Make current a computed so it tracks route changes + const current = computed(() => route.params.variant || defaultVariant) + return { + variants, + current, + } +}