- Implemented astro-i18next for multi-language support, including English, Dutch, and Italian. - Configured default locale and language fallback settings. - Defined routes for localized content in the configuration. - Updated package.json and package-lock.json to include new dependencies for i18next and related plugins.
807 lines
40 KiB
JavaScript
807 lines
40 KiB
JavaScript
import { d as createAstro, c as createComponent, r as renderComponent, F as Fragment, a as renderTemplate, u as unescapeHTML, m as maybeRenderHead, s as spreadAttributes, b as addAttribute, e as renderHead, f as renderSlot } from './astro/server_DJC9Xx9K.mjs';
|
|
import 'kleur/colors';
|
|
import i18next, { t as t$1 } from 'i18next';
|
|
/* empty css */
|
|
import 'clsx';
|
|
import '@proload/core';
|
|
import '@proload/plugin-tsm';
|
|
import { P, T } from './page-ssr_ChKiSmuh.mjs';
|
|
import localeEmoji from 'locale-emoji';
|
|
import ISO6991 from 'iso-639-1';
|
|
|
|
const SITE = {
|
|
title: "Tiber365",
|
|
description: "Professional IT services for freelancers and small businesses. Microsoft 365 support, networking solutions, web hosting, and custom IT projects.",
|
|
author: "Tiber365",
|
|
ogImage: "/images/og-image.jpg"};
|
|
const LANGUAGES = {
|
|
en: "English",
|
|
nl: "Nederlands",
|
|
it: "Italiano"
|
|
};
|
|
const NAVIGATION = [
|
|
{
|
|
label: "nav.home",
|
|
href: "/",
|
|
type: "internal"
|
|
},
|
|
{
|
|
label: "nav.services",
|
|
href: "/services",
|
|
type: "internal"
|
|
},
|
|
{
|
|
label: "nav.about",
|
|
href: "/about",
|
|
type: "internal"
|
|
},
|
|
{
|
|
label: "nav.blog",
|
|
href: "https://blog.tiber365.it",
|
|
type: "external"
|
|
},
|
|
{
|
|
label: "nav.support",
|
|
href: "https://support.tiber365.it",
|
|
type: "external"
|
|
}
|
|
];
|
|
const SERVICES = [
|
|
{
|
|
id: "microsoft365",
|
|
icon: "🏢",
|
|
titleKey: "services.microsoft365.title",
|
|
descriptionKey: "services.microsoft365.description",
|
|
features: [
|
|
"services.microsoft365.features.migrations",
|
|
"services.microsoft365.features.apps",
|
|
"services.microsoft365.features.teams",
|
|
"services.microsoft365.features.sharepoint",
|
|
"services.microsoft365.features.admin"
|
|
]
|
|
},
|
|
{
|
|
id: "management",
|
|
icon: "⚙️",
|
|
titleKey: "services.management.title",
|
|
descriptionKey: "services.management.description",
|
|
features: [
|
|
"services.management.features.automation",
|
|
"services.management.features.monitoring",
|
|
"services.management.features.maintenance",
|
|
"services.management.features.optimization"
|
|
]
|
|
},
|
|
{
|
|
id: "networking",
|
|
icon: "🌐",
|
|
titleKey: "services.networking.title",
|
|
descriptionKey: "services.networking.description",
|
|
features: [
|
|
"services.networking.features.ubiquiti",
|
|
"services.networking.features.infrastructure",
|
|
"services.networking.features.security",
|
|
"services.networking.features.monitoring"
|
|
]
|
|
},
|
|
{
|
|
id: "hosting",
|
|
icon: "🚀",
|
|
titleKey: "services.hosting.title",
|
|
descriptionKey: "services.hosting.description",
|
|
features: [
|
|
"services.hosting.features.webhosting",
|
|
"services.hosting.features.domains",
|
|
"services.hosting.features.ssl",
|
|
"services.hosting.features.backup"
|
|
]
|
|
},
|
|
{
|
|
id: "custom",
|
|
icon: "🛠️",
|
|
titleKey: "services.custom.title",
|
|
descriptionKey: "services.custom.description",
|
|
features: [
|
|
"services.custom.features.consultation",
|
|
"services.custom.features.development",
|
|
"services.custom.features.integration",
|
|
"services.custom.features.support"
|
|
]
|
|
}
|
|
];
|
|
const TESTIMONIALS = [
|
|
{
|
|
id: 1,
|
|
nameKey: "testimonials.1.name",
|
|
companyKey: "testimonials.1.company",
|
|
contentKey: "testimonials.1.content",
|
|
rating: 5
|
|
},
|
|
{
|
|
id: 2,
|
|
nameKey: "testimonials.2.name",
|
|
companyKey: "testimonials.2.company",
|
|
contentKey: "testimonials.2.content",
|
|
rating: 5
|
|
},
|
|
{
|
|
id: 3,
|
|
nameKey: "testimonials.3.name",
|
|
companyKey: "testimonials.3.company",
|
|
contentKey: "testimonials.3.content",
|
|
rating: 5
|
|
}
|
|
];
|
|
|
|
const interpolate = (i18nKey, referenceString, namespace = null) => {
|
|
const localizedString = t$1(i18nKey, { ns: namespace });
|
|
if (localizedString === i18nKey) {
|
|
console.warn(`WARNING(astro-i18next): missing translation key ${i18nKey}.`);
|
|
return referenceString;
|
|
}
|
|
const tagsRegex = /<([\w\d]+)([^>]*)>/gi;
|
|
const referenceStringMatches = referenceString.match(tagsRegex);
|
|
if (!referenceStringMatches) {
|
|
console.warn(
|
|
"WARNING(astro-i18next): default slot does not include any HTML tag to interpolate! You should use the `t` function directly."
|
|
);
|
|
return localizedString;
|
|
}
|
|
const referenceTags = [];
|
|
referenceStringMatches.forEach((tagNode) => {
|
|
const [, name, attributes] = tagsRegex.exec(tagNode);
|
|
referenceTags.push({ name, attributes });
|
|
tagsRegex.exec("");
|
|
});
|
|
let interpolatedString = localizedString;
|
|
for (let index = 0; index < referenceTags.length; index++) {
|
|
const referencedTag = referenceTags[index];
|
|
interpolatedString = interpolatedString.replaceAll(
|
|
`<${index}>`,
|
|
`<${referencedTag.name}${referencedTag.attributes}>`
|
|
);
|
|
interpolatedString = interpolatedString.replaceAll(
|
|
`</${index}>`,
|
|
`</${referencedTag.name}>`
|
|
);
|
|
}
|
|
return interpolatedString;
|
|
};
|
|
const createReferenceStringFromHTML = (html) => {
|
|
const allowedTags = ["strong", "br", "em", "i", "b"];
|
|
let forbiddenStrings = [];
|
|
if (i18next.options) {
|
|
forbiddenStrings = [
|
|
"keySeparator",
|
|
"nsSeparator",
|
|
"pluralSeparator",
|
|
"contextSeparator"
|
|
].map((key) => {
|
|
return {
|
|
key,
|
|
str: i18next.options[key]
|
|
};
|
|
}).filter(function(val) {
|
|
return typeof val !== "undefined";
|
|
});
|
|
}
|
|
const tagsRegex = /<([\w\d]+)([^>]*)>/gi;
|
|
const referenceStringMatches = html.match(tagsRegex);
|
|
if (!referenceStringMatches) {
|
|
console.warn(
|
|
"WARNING(astro-i18next): default slot does not include any HTML tag to interpolate! You should use the `t` function directly."
|
|
);
|
|
return html;
|
|
}
|
|
const referenceTags = [];
|
|
referenceStringMatches.forEach((tagNode) => {
|
|
const [, name, attributes] = tagsRegex.exec(tagNode);
|
|
referenceTags.push({ name, attributes });
|
|
tagsRegex.exec("");
|
|
});
|
|
let sanitizedString = html.replace(/\s+/g, " ").trim();
|
|
for (let index = 0; index < referenceTags.length; index++) {
|
|
const referencedTag = referenceTags[index];
|
|
if (allowedTags.includes(referencedTag.name) && referencedTag.attributes.trim().length === 0) {
|
|
continue;
|
|
}
|
|
sanitizedString = sanitizedString.replaceAll(
|
|
new RegExp(`<${referencedTag.name}[^>]*?\\s*\\/>`, "gi"),
|
|
`<${index}/>`
|
|
);
|
|
sanitizedString = sanitizedString.replaceAll(
|
|
`<${referencedTag.name}${referencedTag.attributes}>`,
|
|
`<${index}>`
|
|
);
|
|
sanitizedString = sanitizedString.replaceAll(
|
|
`</${referencedTag.name}>`,
|
|
`</${index}>`
|
|
);
|
|
}
|
|
for (let index = 0; index < forbiddenStrings.length; index++) {
|
|
const { key, str } = forbiddenStrings[index];
|
|
if (sanitizedString.includes(str)) {
|
|
console.warn(
|
|
`WARNING(astro-i18next): "${str}" was found in a <Trans> translation key, but it is also used as ${key}. Either explicitly set an i18nKey or change the value of ${key}.`
|
|
);
|
|
}
|
|
}
|
|
return sanitizedString;
|
|
};
|
|
|
|
const $$Astro$3 = createAstro("https://tiber365.it");
|
|
const $$Trans = createComponent(async ($$result, $$props, $$slots) => {
|
|
const Astro2 = $$result.createAstro($$Astro$3, $$props, $$slots);
|
|
Astro2.self = $$Trans;
|
|
const { i18nKey, ns } = Astro2.props;
|
|
const referenceString = await Astro2.slots.render("default");
|
|
let key;
|
|
if (typeof i18nKey === "string") {
|
|
key = i18nKey;
|
|
} else {
|
|
key = createReferenceStringFromHTML(referenceString);
|
|
}
|
|
return renderTemplate`${renderComponent($$result, "Fragment", Fragment, {}, { "default": async ($$result2) => renderTemplate`${unescapeHTML(interpolate(key, referenceString, ns))}` })}`;
|
|
}, "/Users/richard/Website Development/tiber365/node_modules/astro-i18next/src/components/Trans.astro", void 0);
|
|
|
|
const $$Astro$2 = createAstro("https://tiber365.it");
|
|
const $$LanguageSelector = createComponent(($$result, $$props, $$slots) => {
|
|
const Astro2 = $$result.createAstro($$Astro$2, $$props, $$slots);
|
|
Astro2.self = $$LanguageSelector;
|
|
const supportedLanguages = i18next.languages;
|
|
const currentLanguage = i18next.language;
|
|
const { pathname } = Astro2.url;
|
|
const { showFlag = false, languageMapping, ...attributes } = Astro2.props;
|
|
return renderTemplate`${maybeRenderHead()}<select onchange="location = this.value;"${spreadAttributes(attributes)}> ${supportedLanguages.map((supportedLanguage) => {
|
|
let value = P(pathname, supportedLanguage);
|
|
const flag = showFlag ? localeEmoji(supportedLanguage) + " " : "";
|
|
let nativeName = "";
|
|
if (languageMapping && languageMapping.hasOwnProperty(supportedLanguage)) {
|
|
nativeName = languageMapping[supportedLanguage];
|
|
} else {
|
|
nativeName = ISO6991.getNativeName(supportedLanguage);
|
|
}
|
|
const label = flag + nativeName;
|
|
return renderTemplate`<option${addAttribute(value, "value")}${addAttribute(supportedLanguage === currentLanguage, "selected")}> ${label} </option>`;
|
|
})} </select>`;
|
|
}, "/Users/richard/Website Development/tiber365/node_modules/astro-i18next/src/components/LanguageSelector.astro", void 0);
|
|
|
|
const $$Astro$1 = createAstro("https://tiber365.it");
|
|
const $$HeadHrefLangs = createComponent(($$result, $$props, $$slots) => {
|
|
const Astro2 = $$result.createAstro($$Astro$1, $$props, $$slots);
|
|
Astro2.self = $$HeadHrefLangs;
|
|
const supportedLanguages = i18next.languages;
|
|
const currentUrl = Astro2.url.href;
|
|
return renderTemplate`${supportedLanguages.map((supportedLanguage) => renderTemplate`<link rel="alternate"${addAttribute(supportedLanguage, "hreflang")}${addAttribute(T(currentUrl, supportedLanguage), "href")}>`)}`;
|
|
}, "/Users/richard/Website Development/tiber365/node_modules/astro-i18next/src/components/HeadHrefLangs.astro", void 0);
|
|
|
|
const $$Astro = createAstro("https://tiber365.it");
|
|
const $$BaseLayout = createComponent(($$result, $$props, $$slots) => {
|
|
const Astro2 = $$result.createAstro($$Astro, $$props, $$slots);
|
|
Astro2.self = $$BaseLayout;
|
|
const {
|
|
title = SITE.title,
|
|
description = SITE.description,
|
|
image = SITE.ogImage,
|
|
keywords = ""
|
|
} = Astro2.props;
|
|
const lang = i18next.language || "en";
|
|
let canonicalURL;
|
|
let ogImageURL;
|
|
let twitterImageURL;
|
|
try {
|
|
const siteURL = Astro2.site || new URL("http://localhost:4321");
|
|
canonicalURL = new URL(Astro2.url.pathname, siteURL);
|
|
ogImageURL = new URL(image, siteURL);
|
|
twitterImageURL = new URL(image, siteURL);
|
|
} catch (error) {
|
|
const fallbackSite = "https://tiber365.it";
|
|
canonicalURL = new URL(Astro2.url?.pathname || "/", fallbackSite);
|
|
ogImageURL = new URL(image, fallbackSite);
|
|
twitterImageURL = new URL(image, fallbackSite);
|
|
}
|
|
const fullTitle = title === SITE.title ? title : `${title} | ${SITE.title}`;
|
|
return renderTemplate`<html${addAttribute(lang, "lang")} class="scroll-smooth"> <head><meta charset="UTF-8"><meta name="description"${addAttribute(description, "content")}><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator"${addAttribute(Astro2.generator, "content")}>${keywords && renderTemplate`<meta name="keywords"${addAttribute(keywords, "content")}>`}<!-- Canonical URL --><link rel="canonical"${addAttribute(canonicalURL, "href")}><!-- Primary Meta Tags --><title>${fullTitle}</title><meta name="title"${addAttribute(fullTitle, "content")}><meta name="description"${addAttribute(description, "content")}><meta name="author"${addAttribute(SITE.author, "content")}><!-- Prevent automatic language redirects --><meta name="google" content="notranslate"><meta http-equiv="Content-Language"${addAttribute(lang, "content")}><!-- Theme Color --><meta name="theme-color" content="#ffffff"><meta name="msapplication-TileColor" content="#3b82f6"><!-- Open Graph / Facebook --><meta property="og:type" content="website"><meta property="og:url"${addAttribute(canonicalURL, "content")}><meta property="og:title"${addAttribute(fullTitle, "content")}><meta property="og:description"${addAttribute(description, "content")}><meta property="og:image"${addAttribute(ogImageURL, "content")}><meta property="og:site_name"${addAttribute(SITE.title, "content")}><meta property="og:locale"${addAttribute(lang === "en" ? "en_US" : lang === "nl" ? "nl_NL" : "it_IT", "content")}><!-- Twitter --><meta property="twitter:card" content="summary_large_image"><meta property="twitter:url"${addAttribute(canonicalURL, "content")}><meta property="twitter:title"${addAttribute(fullTitle, "content")}><meta property="twitter:description"${addAttribute(description, "content")}><meta property="twitter:image"${addAttribute(twitterImageURL, "content")}><!-- Favicons --><link rel="icon" type="image/svg+xml" href="/favicon.svg"><link rel="manifest" href="/manifest.json"><!-- Language alternates -->${renderComponent($$result, "HeadHrefLangs", $$HeadHrefLangs, {})}${renderHead()}</head> <body class="min-h-screen bg-background text-foreground"> ${renderSlot($$result, $$slots["default"])} <!-- Initialize animations --> </body> </html>`;
|
|
}, "/Users/richard/Website Development/tiber365/src/layouts/BaseLayout.astro", void 0);
|
|
|
|
const translations = {
|
|
en: {
|
|
"meta": {
|
|
"title": "Tiber365 - Professional IT Services",
|
|
"description": "Professional IT services for freelancers and small businesses. Microsoft 365 support, networking solutions, web hosting, and custom IT projects.",
|
|
"keywords": "IT services, Microsoft 365, networking, web hosting, automation, small business IT"
|
|
},
|
|
"nav": {
|
|
"home": "Home",
|
|
"services": "Services",
|
|
"about": "About",
|
|
"contact": "Contact",
|
|
"blog": "Blog",
|
|
"support": "Support",
|
|
"language": "Language",
|
|
"theme": {
|
|
"toggle": "Toggle theme"
|
|
}
|
|
},
|
|
"hero": {
|
|
"title": "Professional IT Services for Your Business",
|
|
"subtitle": "Empowering freelancers and small businesses with reliable Microsoft 365 support, networking solutions, web hosting, and custom IT projects.",
|
|
"trusted": "Trusted by businesses across Italy",
|
|
"cta": {
|
|
"primary": "Get Started Today",
|
|
"secondary": "View Our Services"
|
|
}
|
|
},
|
|
"services": {
|
|
"title": "Our Services",
|
|
"subtitle": "Comprehensive IT solutions tailored for small businesses and freelancers",
|
|
"viewAll": "View All Services",
|
|
"microsoft365": {
|
|
"title": "Microsoft 365 Support",
|
|
"description": "Complete Microsoft 365 setup, migration, and ongoing support for your business.",
|
|
"features": {
|
|
"migrations": "Email & data migrations",
|
|
"apps": "Office apps configuration",
|
|
"teams": "Microsoft Teams setup",
|
|
"sharepoint": "SharePoint collaboration",
|
|
"admin": "Admin portal management"
|
|
}
|
|
},
|
|
"management": {
|
|
"title": "Full M365 Management",
|
|
"description": "Let us handle your entire Microsoft 365 environment with proactive management.",
|
|
"features": {
|
|
"automation": "Automated workflows",
|
|
"monitoring": "24/7 system monitoring",
|
|
"maintenance": "Regular maintenance",
|
|
"optimization": "Performance optimization"
|
|
}
|
|
},
|
|
"networking": {
|
|
"title": "Networking & Infrastructure",
|
|
"description": "Professional networking solutions using Ubiquiti and UniFi equipment.",
|
|
"features": {
|
|
"ubiquiti": "Ubiquiti/UniFi specialists",
|
|
"infrastructure": "Network infrastructure",
|
|
"security": "Network security",
|
|
"monitoring": "Traffic monitoring"
|
|
}
|
|
},
|
|
"hosting": {
|
|
"title": "Web Hosting & Management",
|
|
"description": "Reliable web hosting with full management and maintenance included.",
|
|
"features": {
|
|
"webhosting": "Reliable web hosting",
|
|
"domains": "Domain management",
|
|
"ssl": "SSL certificates",
|
|
"backup": "Automated backups"
|
|
}
|
|
},
|
|
"custom": {
|
|
"title": "Custom IT Projects",
|
|
"description": "Tailored IT solutions designed specifically for your business needs.",
|
|
"features": {
|
|
"consultation": "IT consultation",
|
|
"development": "Custom development",
|
|
"integration": "System integration",
|
|
"support": "Ongoing support"
|
|
}
|
|
}
|
|
},
|
|
"testimonials": {
|
|
"title": "What Our Clients Say",
|
|
"subtitle": "Don't just take our word for it - see what our satisfied clients have to say",
|
|
"1": {
|
|
"name": "Marco Rossi",
|
|
"company": "Freelance Designer",
|
|
"content": "Tiber365 transformed our Microsoft 365 setup. Professional service and excellent support!"
|
|
},
|
|
"2": {
|
|
"name": "Sofia Bianchi",
|
|
"company": "Small Business Owner",
|
|
"content": "Their networking solutions are top-notch. Our office runs smoothly thanks to their expertise."
|
|
},
|
|
"3": {
|
|
"name": "Giuseppe Verdi",
|
|
"company": "Consultant",
|
|
"content": "Reliable web hosting and great customer service. Highly recommend Tiber365!"
|
|
}
|
|
},
|
|
"about": {
|
|
"title": "About Us",
|
|
"subtitle": "Your trusted IT partner",
|
|
"description": "We specialize in providing comprehensive IT services to freelancers and small businesses.",
|
|
"mission": "Our mission is to make technology work for you, not against you.",
|
|
"experience": "Years of Experience",
|
|
"clients": "Happy Clients",
|
|
"projects": "Projects Completed"
|
|
},
|
|
"contact": {
|
|
"title": "Get In Touch",
|
|
"subtitle": "Ready to transform your IT infrastructure? Let's talk!",
|
|
"info": {
|
|
"email": "info@tiber365.it",
|
|
"phone": "+39 123 456 7890",
|
|
"address": "Rome, Italy"
|
|
},
|
|
"form": {
|
|
"name": "Name",
|
|
"email": "Email",
|
|
"company": "Company",
|
|
"service": "Service",
|
|
"message": "Message",
|
|
"send": "Send Message"
|
|
}
|
|
},
|
|
"cta": {
|
|
"title": "Ready to Get Started?",
|
|
"subtitle": "Let's discuss how we can help transform your IT infrastructure.",
|
|
"button": "Contact Us Today"
|
|
},
|
|
"footer": {
|
|
"description": "Professional IT services for freelancers and small businesses.",
|
|
"copyright": "© 2024 Tiber365. All rights reserved.",
|
|
"links": {
|
|
"contact": "Contact",
|
|
"privacy": "Privacy Policy",
|
|
"terms": "Terms of Service"
|
|
}
|
|
},
|
|
"404": {
|
|
"title": "Page Not Found",
|
|
"description": "Sorry, we couldn't find the page you're looking for.",
|
|
"button": "Go back home"
|
|
}
|
|
},
|
|
nl: {
|
|
"meta": {
|
|
"title": "Tiber365 - Professionele IT Services",
|
|
"description": "Professionele IT-diensten voor freelancers en kleine bedrijven. Microsoft 365 ondersteuning, netwerkoplossingen, webhosting en aangepaste IT-projecten.",
|
|
"keywords": "IT diensten, Microsoft 365, netwerken, webhosting, automatisering, kleine bedrijven IT"
|
|
},
|
|
"nav": {
|
|
"home": "Home",
|
|
"services": "Diensten",
|
|
"about": "Over Ons",
|
|
"contact": "Contact",
|
|
"blog": "Blog",
|
|
"support": "Ondersteuning",
|
|
"language": "Taal",
|
|
"theme": {
|
|
"toggle": "Thema wisselen"
|
|
}
|
|
},
|
|
"hero": {
|
|
"title": "Professionele IT Services voor Uw Bedrijf",
|
|
"subtitle": "Ondersteuning van freelancers en kleine bedrijven met betrouwbare Microsoft 365 ondersteuning, netwerkoplossingen, webhosting en aangepaste IT-projecten.",
|
|
"trusted": "Vertrouwd door bedrijven in heel Italië",
|
|
"cta": {
|
|
"primary": "Begin Vandaag",
|
|
"secondary": "Bekijk Onze Diensten"
|
|
}
|
|
},
|
|
"services": {
|
|
"title": "Onze Diensten",
|
|
"subtitle": "Uitgebreide IT-oplossingen op maat voor kleine bedrijven en freelancers",
|
|
"viewAll": "Alle Diensten Bekijken",
|
|
"microsoft365": {
|
|
"title": "Microsoft 365 Ondersteuning",
|
|
"description": "Complete Microsoft 365 installatie, migratie en doorlopende ondersteuning.",
|
|
"features": {
|
|
"migrations": "E-mail & data migraties",
|
|
"apps": "Office apps configuratie",
|
|
"teams": "Microsoft Teams installatie",
|
|
"sharepoint": "SharePoint samenwerking",
|
|
"admin": "Beheerportaal management"
|
|
}
|
|
},
|
|
"management": {
|
|
"title": "Volledig M365 Beheer",
|
|
"description": "Laat ons uw volledige Microsoft 365 omgeving beheren met proactief management.",
|
|
"features": {
|
|
"automation": "Geautomatiseerde workflows",
|
|
"monitoring": "24/7 systeembewaking",
|
|
"maintenance": "Regelmatig onderhoud",
|
|
"optimization": "Prestatie optimalisatie"
|
|
}
|
|
},
|
|
"networking": {
|
|
"title": "Netwerken & Infrastructuur",
|
|
"description": "Professionele netwerkoplossingen met Ubiquiti en UniFi apparatuur.",
|
|
"features": {
|
|
"ubiquiti": "Ubiquiti/UniFi specialisten",
|
|
"infrastructure": "Netwerkinfrastructuur",
|
|
"security": "Netwerkbeveiliging",
|
|
"monitoring": "Verkeer monitoring"
|
|
}
|
|
},
|
|
"hosting": {
|
|
"title": "Webhosting & Beheer",
|
|
"description": "Betrouwbare webhosting met volledig beheer en onderhoud inbegrepen.",
|
|
"features": {
|
|
"webhosting": "Betrouwbare webhosting",
|
|
"domains": "Domeinbeheer",
|
|
"ssl": "SSL certificaten",
|
|
"backup": "Geautomatiseerde backups"
|
|
}
|
|
},
|
|
"custom": {
|
|
"title": "Aangepaste IT Projecten",
|
|
"description": "Op maat gemaakte IT-oplossingen speciaal ontworpen voor uw bedrijfsbehoeften.",
|
|
"features": {
|
|
"consultation": "IT consultatie",
|
|
"development": "Aangepaste ontwikkeling",
|
|
"integration": "Systeemintegratie",
|
|
"support": "Doorlopende ondersteuning"
|
|
}
|
|
}
|
|
},
|
|
"testimonials": {
|
|
"title": "Wat Onze Klanten Zeggen",
|
|
"subtitle": "Geloof ons niet zomaar - zie wat onze tevreden klanten te zeggen hebben",
|
|
"1": {
|
|
"name": "Marco Rossi",
|
|
"company": "Freelance Designer",
|
|
"content": "Tiber365 heeft onze Microsoft 365 installatie getransformeerd. Professionele service en uitstekende ondersteuning!"
|
|
},
|
|
"2": {
|
|
"name": "Sofia Bianchi",
|
|
"company": "Kleine Bedrijfseigenaar",
|
|
"content": "Hun netwerkoplossingen zijn eersteklas. Ons kantoor draait soepel dankzij hun expertise."
|
|
},
|
|
"3": {
|
|
"name": "Giuseppe Verdi",
|
|
"company": "Consultant",
|
|
"content": "Betrouwbare webhosting en geweldige klantenservice. Beveel Tiber365 ten zeerste aan!"
|
|
}
|
|
},
|
|
"about": {
|
|
"title": "Over Ons",
|
|
"subtitle": "Uw vertrouwde IT-partner",
|
|
"description": "Wij zijn gespecialiseerd in het leveren van uitgebreide IT-diensten aan freelancers en kleine bedrijven.",
|
|
"mission": "Onze missie is om technologie voor u te laten werken, niet tegen u.",
|
|
"experience": "Jaren Ervaring",
|
|
"clients": "Tevreden Klanten",
|
|
"projects": "Voltooide Projecten"
|
|
},
|
|
"contact": {
|
|
"title": "Neem Contact Op",
|
|
"subtitle": "Klaar om uw IT-infrastructuur te transformeren? Laten we praten!",
|
|
"info": {
|
|
"email": "info@tiber365.it",
|
|
"phone": "+39 123 456 7890",
|
|
"address": "Rome, Italië"
|
|
},
|
|
"form": {
|
|
"name": "Naam",
|
|
"email": "E-mail",
|
|
"company": "Bedrijf",
|
|
"service": "Dienst",
|
|
"message": "Bericht",
|
|
"send": "Bericht Versturen"
|
|
}
|
|
},
|
|
"cta": {
|
|
"title": "Klaar om te Beginnen?",
|
|
"subtitle": "Laten we bespreken hoe wij uw IT-infrastructuur kunnen transformeren.",
|
|
"button": "Neem Vandaag Contact Op"
|
|
},
|
|
"footer": {
|
|
"description": "Professionele IT-diensten voor freelancers en kleine bedrijven.",
|
|
"copyright": "© 2024 Tiber365. Alle rechten voorbehouden.",
|
|
"links": {
|
|
"contact": "Contact",
|
|
"privacy": "Privacybeleid",
|
|
"terms": "Servicevoorwaarden"
|
|
}
|
|
},
|
|
"404": {
|
|
"title": "Pagina Niet Gevonden",
|
|
"description": "Sorry, we konden de pagina die u zoekt niet vinden.",
|
|
"button": "Ga terug naar home"
|
|
}
|
|
},
|
|
it: {
|
|
"meta": {
|
|
"title": "Tiber365 - Servizi IT Professionali",
|
|
"description": "Servizi IT professionali per freelancer e piccole imprese. Supporto Microsoft 365, soluzioni di rete, hosting web e progetti IT personalizzati.",
|
|
"keywords": "servizi IT, Microsoft 365, networking, web hosting, automazione, IT piccole imprese"
|
|
},
|
|
"nav": {
|
|
"home": "Home",
|
|
"services": "Servizi",
|
|
"about": "Chi Siamo",
|
|
"contact": "Contatti",
|
|
"blog": "Blog",
|
|
"support": "Supporto",
|
|
"language": "Lingua",
|
|
"theme": {
|
|
"toggle": "Cambia tema"
|
|
}
|
|
},
|
|
"hero": {
|
|
"title": "Servizi IT Professionali per la Tua Azienda",
|
|
"subtitle": "Supportiamo freelancer e piccole imprese con supporto Microsoft 365 affidabile, soluzioni di rete, hosting web e progetti IT personalizzati.",
|
|
"trusted": "Fidato dalle aziende in tutta Italia",
|
|
"cta": {
|
|
"primary": "Inizia Oggi",
|
|
"secondary": "Vedi i Nostri Servizi"
|
|
}
|
|
},
|
|
"services": {
|
|
"title": "I Nostri Servizi",
|
|
"subtitle": "Soluzioni IT complete su misura per piccole imprese e freelancer",
|
|
"viewAll": "Vedi Tutti i Servizi",
|
|
"microsoft365": {
|
|
"title": "Supporto Microsoft 365",
|
|
"description": "Installazione completa, migrazione e supporto continuo per Microsoft 365.",
|
|
"features": {
|
|
"migrations": "Migrazioni email e dati",
|
|
"apps": "Configurazione app Office",
|
|
"teams": "Configurazione Microsoft Teams",
|
|
"sharepoint": "Collaborazione SharePoint",
|
|
"admin": "Gestione portale amministratore"
|
|
}
|
|
},
|
|
"management": {
|
|
"title": "Gestione Completa M365",
|
|
"description": "Lascia che ci occupiamo dell'intero ambiente Microsoft 365 con gestione proattiva.",
|
|
"features": {
|
|
"automation": "Flussi di lavoro automatizzati",
|
|
"monitoring": "Monitoraggio sistema 24/7",
|
|
"maintenance": "Manutenzione regolare",
|
|
"optimization": "Ottimizzazione prestazioni"
|
|
}
|
|
},
|
|
"networking": {
|
|
"title": "Networking e Infrastruttura",
|
|
"description": "Soluzioni di rete professionali con apparecchiature Ubiquiti e UniFi.",
|
|
"features": {
|
|
"ubiquiti": "Specialisti Ubiquiti/UniFi",
|
|
"infrastructure": "Infrastruttura di rete",
|
|
"security": "Sicurezza di rete",
|
|
"monitoring": "Monitoraggio traffico"
|
|
}
|
|
},
|
|
"hosting": {
|
|
"title": "Web Hosting e Gestione",
|
|
"description": "Hosting web affidabile con gestione completa e manutenzione inclusa.",
|
|
"features": {
|
|
"webhosting": "Hosting web affidabile",
|
|
"domains": "Gestione domini",
|
|
"ssl": "Certificati SSL",
|
|
"backup": "Backup automatizzati"
|
|
}
|
|
},
|
|
"custom": {
|
|
"title": "Progetti IT Personalizzati",
|
|
"description": "Soluzioni IT su misura progettate specificamente per le tue esigenze aziendali.",
|
|
"features": {
|
|
"consultation": "Consulenza IT",
|
|
"development": "Sviluppo personalizzato",
|
|
"integration": "Integrazione sistemi",
|
|
"support": "Supporto continuo"
|
|
}
|
|
}
|
|
},
|
|
"testimonials": {
|
|
"title": "Cosa Dicono i Nostri Clienti",
|
|
"subtitle": "Non prendere solo la nostra parola - vedi cosa hanno da dire i nostri clienti soddisfatti",
|
|
"1": {
|
|
"name": "Marco Rossi",
|
|
"company": "Designer Freelance",
|
|
"content": "Tiber365 ha trasformato la nostra configurazione Microsoft 365. Servizio professionale e supporto eccellente!"
|
|
},
|
|
"2": {
|
|
"name": "Sofia Bianchi",
|
|
"company": "Proprietaria Piccola Impresa",
|
|
"content": "Le loro soluzioni di rete sono di prim'ordine. Il nostro ufficio funziona perfettamente grazie alla loro competenza."
|
|
},
|
|
"3": {
|
|
"name": "Giuseppe Verdi",
|
|
"company": "Consulente",
|
|
"content": "Hosting web affidabile e ottimo servizio clienti. Raccomando vivamente Tiber365!"
|
|
}
|
|
},
|
|
"about": {
|
|
"title": "Chi Siamo",
|
|
"subtitle": "Il tuo partner IT di fiducia",
|
|
"description": "Siamo specializzati nel fornire servizi IT completi a freelancer e piccole imprese.",
|
|
"mission": "La nostra missione è far sì che la tecnologia lavori per te, non contro di te.",
|
|
"experience": "Anni di Esperienza",
|
|
"clients": "Clienti Soddisfatti",
|
|
"projects": "Progetti Completati"
|
|
},
|
|
"contact": {
|
|
"title": "Contattaci",
|
|
"subtitle": "Pronto a trasformare la tua infrastruttura IT? Parliamone!",
|
|
"info": {
|
|
"email": "info@tiber365.it",
|
|
"phone": "+39 123 456 7890",
|
|
"address": "Roma, Italia"
|
|
},
|
|
"form": {
|
|
"name": "Nome",
|
|
"email": "Email",
|
|
"company": "Azienda",
|
|
"service": "Servizio",
|
|
"message": "Messaggio",
|
|
"send": "Invia Messaggio"
|
|
}
|
|
},
|
|
"cta": {
|
|
"title": "Pronto per Iniziare?",
|
|
"subtitle": "Discutiamo di come possiamo aiutare a trasformare la tua infrastruttura IT.",
|
|
"button": "Contattaci Oggi"
|
|
},
|
|
"footer": {
|
|
"description": "Servizi IT professionali per freelancer e piccole imprese.",
|
|
"copyright": "© 2024 Tiber365. Tutti i diritti riservati.",
|
|
"links": {
|
|
"contact": "Contatti",
|
|
"privacy": "Privacy Policy",
|
|
"terms": "Termini di Servizio"
|
|
}
|
|
},
|
|
"404": {
|
|
"title": "Pagina Non Trovata",
|
|
"description": "Spiacenti, non siamo riusciti a trovare la pagina che stai cercando.",
|
|
"button": "Torna alla home"
|
|
}
|
|
}
|
|
};
|
|
const SUPPORTED_LOCALES = ["en", "nl", "it"];
|
|
function getCurrentLocaleFromStorage() {
|
|
if (typeof window !== "undefined") {
|
|
try {
|
|
const savedLocale = localStorage.getItem("tiber365-locale");
|
|
if (savedLocale && SUPPORTED_LOCALES.includes(savedLocale)) {
|
|
return savedLocale;
|
|
}
|
|
} catch (error) {
|
|
console.warn("Error accessing localStorage:", error);
|
|
}
|
|
}
|
|
return "en";
|
|
}
|
|
function t(key, locale) {
|
|
try {
|
|
const targetLocale = locale || getCurrentLocaleFromStorage();
|
|
const keys = key.split(".");
|
|
let value = translations[targetLocale];
|
|
for (const k of keys) {
|
|
value = value?.[k];
|
|
if (value === void 0) {
|
|
console.warn(`Translation missing for key "${key}" in locale "${targetLocale}"`);
|
|
break;
|
|
}
|
|
}
|
|
if (!value && targetLocale !== "en") {
|
|
console.warn(`Falling back to English for key "${key}"`);
|
|
value = t(key, "en");
|
|
}
|
|
return value || key;
|
|
} catch (error) {
|
|
console.error(`Translation error for key "${key}":`, error);
|
|
return key;
|
|
}
|
|
}
|
|
|
|
const $$ThemeToggle = createComponent(($$result, $$props, $$slots) => {
|
|
return renderTemplate`${maybeRenderHead()}<button id="theme-toggle" class="inline-flex items-center justify-center p-2 rounded-md text-muted-foreground hover:text-foreground hover:bg-accent focus:outline-none focus:ring-2 focus:ring-primary"${addAttribute(t("nav.theme.toggle"), "aria-label")}${addAttribute(t("nav.theme.toggle"), "title")}> <!-- Sun icon (light mode) --> <svg id="theme-toggle-light-icon" class="h-5 w-5" fill="currentColor" viewBox="0 0 20 20"> <path fill-rule="evenodd" d="M10 2a1 1 0 011 1v1a1 1 0 11-2 0V3a1 1 0 011-1zm4 8a4 4 0 11-8 0 4 4 0 018 0zm-.464 4.95l.707.707a1 1 0 001.414-1.414l-.707-.707a1 1 0 00-1.414 1.414zm2.12-10.607a1 1 0 010 1.414l-.706.707a1 1 0 11-1.414-1.414l.707-.707a1 1 0 011.414 0zM17 11a1 1 0 100-2h-1a1 1 0 100 2h1zm-7 4a1 1 0 011 1v1a1 1 0 11-2 0v-1a1 1 0 011-1zM5.05 6.464A1 1 0 106.465 5.05l-.708-.707a1 1 0 00-1.414 1.414l.707.707zm1.414 8.486l-.707.707a1 1 0 01-1.414-1.414l.707-.707a1 1 0 011.414 1.414zM4 11a1 1 0 100-2H3a1 1 0 000 2h1z" clip-rule="evenodd"></path> </svg> <!-- Moon icon (dark mode) --> <svg id="theme-toggle-dark-icon" class="h-5 w-5 hidden" fill="currentColor" viewBox="0 0 20 20"> <path d="M17.293 13.293A8 8 0 016.707 2.707a8.001 8.001 0 1010.586 10.586z"></path> </svg> </button> `;
|
|
}, "/Users/richard/Website Development/tiber365/src/components/ThemeToggle.astro", void 0);
|
|
|
|
const $$LanguageSwitcher = createComponent(($$result, $$props, $$slots) => {
|
|
return renderTemplate`${maybeRenderHead()}<div class="relative inline-block text-left" data-astro-cid-a2mxz4y6> ${renderComponent($$result, "LanguageSelector", $$LanguageSelector, { "class": "inline-flex items-center justify-center p-2 rounded-md text-muted-foreground hover:text-foreground hover:bg-accent focus:outline-none focus:ring-2 focus:ring-primary", "showFlag": true, "languageMapping": LANGUAGES, "data-astro-cid-a2mxz4y6": true })} </div> `;
|
|
}, "/Users/richard/Website Development/tiber365/src/components/LanguageSwitcher.astro", void 0);
|
|
|
|
const $$Header = createComponent(($$result, $$props, $$slots) => {
|
|
return renderTemplate`${maybeRenderHead()}<header class="sticky top-0 z-50 w-full border-b border-border/40 bg-background/95 backdrop-blur supports-[backdrop-filter]:bg-background/60"> <nav class="container-custom"> <div class="flex h-16 items-center justify-between"> <!-- Logo --> <div class="flex items-center"> <a href="/" class="flex items-center space-x-2"> <div class="h-8 w-8 flex items-center justify-center"> <img src="/images/TIBER365.png" alt="Tiber365 Logo" class="h-6 w-6 object-contain"> </div> <span class="font-display font-bold text-xl text-foreground">Tiber365</span> </a> </div> <!-- Desktop Navigation --> <div class="hidden md:flex items-center space-x-6"> ${NAVIGATION.map((item) => renderTemplate`<a${addAttribute(item.href, "href")}${addAttribute(item.type === "external" ? "_blank" : void 0, "target")}${addAttribute(item.type === "external" ? "noopener noreferrer" : void 0, "rel")} class="text-sm font-medium text-muted-foreground hover:text-foreground transition-colors relative group"> ${t(item.label)} ${item.type === "external" && renderTemplate`<svg class="inline h-3 w-3 ml-1 opacity-70" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path> </svg>`} <span class="absolute inset-x-0 -bottom-1 h-0.5 bg-primary scale-x-0 group-hover:scale-x-100 transition-transform origin-left"></span> </a>`)} </div> <!-- Theme Toggle & Language Switcher --> <div class="flex items-center space-x-4"> ${renderComponent($$result, "LanguageSwitcher", $$LanguageSwitcher, {})} ${renderComponent($$result, "ThemeToggle", $$ThemeToggle, {})} <!-- Mobile Menu Button --> <button id="mobile-menu-button" class="md:hidden inline-flex items-center justify-center p-2 rounded-md text-muted-foreground hover:text-foreground hover:bg-accent focus:outline-none focus:ring-2 focus:ring-primary" aria-expanded="false" aria-label="Toggle mobile menu"> <svg id="mobile-menu-icon" class="h-6 w-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path> </svg> <svg id="mobile-close-icon" class="h-6 w-6 hidden" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path> </svg> </button> </div> </div> <!-- Mobile Navigation --> <div id="mobile-menu" class="md:hidden hidden border-t border-border"> <div class="px-2 pt-2 pb-3 space-y-1"> ${NAVIGATION.map((item) => renderTemplate`<a${addAttribute(item.href, "href")}${addAttribute(item.type === "external" ? "_blank" : void 0, "target")}${addAttribute(item.type === "external" ? "noopener noreferrer" : void 0, "rel")} class="block px-3 py-2 text-base font-medium text-muted-foreground hover:text-foreground hover:bg-accent rounded-md transition-colors"> ${t(item.label)} ${item.type === "external" && renderTemplate`<svg class="inline h-4 w-4 ml-1 opacity-70" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path> </svg>`} </a>`)} </div> </div> </nav> </header> `;
|
|
}, "/Users/richard/Website Development/tiber365/src/components/Header.astro", void 0);
|
|
|
|
const $$Footer = createComponent(($$result, $$props, $$slots) => {
|
|
return renderTemplate`${maybeRenderHead()}<footer class="bg-secondary-900 text-secondary-100 pt-16 pb-8"> <div class="container-custom"> <!-- Main footer content --> <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-8 mb-8"> <!-- Company info --> <div class="lg:col-span-2"> <!-- Logo --> <div class="flex items-center space-x-2 mb-4"> <div class="h-8 w-8 flex items-center justify-center"> <img src="/images/TIBER365.png" alt="Tiber365 Logo" class="h-6 w-6 object-contain"> </div> <span class="font-display font-bold text-xl text-white">Tiber365</span> </div> <!-- Description --> <p class="text-secondary-300 mb-6 max-w-md leading-relaxed"> ${t("footer.description")} </p> <!-- Contact info --> <div class="space-y-2"> <div class="flex items-center text-secondary-300"> <svg class="h-5 w-5 mr-3 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 8l7.89 4.26a2 2 0 002.22 0L21 8M5 19h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v10a2 2 0 002 2z"></path> </svg> ${t("contact.info.email")} </div> <div class="flex items-center text-secondary-300"> <svg class="h-5 w-5 mr-3 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M3 5a2 2 0 012-2h3.28a1 1 0 01.948.684l1.498 4.493a1 1 0 01-.502 1.21l-2.257 1.13a11.042 11.042 0 005.516 5.516l1.13-2.257a1 1 0 011.21-.502l4.493 1.498a1 1 0 01.684.949V19a2 2 0 01-2 2h-1C9.716 21 3 14.284 3 6V5z"></path> </svg> ${t("contact.info.phone")} </div> <div class="flex items-center text-secondary-300"> <svg class="h-5 w-5 mr-3 text-primary" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M17.657 16.657L13.414 20.9a1.998 1.998 0 01-2.827 0l-4.244-4.243a8 8 0 1111.314 0z"></path> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M15 11a3 3 0 11-6 0 3 3 0 016 0z"></path> </svg> ${t("contact.info.address")} </div> </div> </div> <!-- Quick Links --> <div> <h3 class="font-semibold text-white mb-4">Quick Links</h3> <ul class="space-y-2"> ${NAVIGATION.filter((item) => item.type === "internal").map((item) => renderTemplate`<li> <a${addAttribute(item.href, "href")} class="text-secondary-300 hover:text-primary transition-colors"> ${t(item.label)} </a> </li>`)} <li> <a href="/contact" class="text-secondary-300 hover:text-primary transition-colors"> ${t("footer.links.contact")} </a> </li> </ul> </div> <!-- External Links --> <div> <h3 class="font-semibold text-white mb-4">Resources</h3> <ul class="space-y-2"> ${NAVIGATION.filter((item) => item.type === "external").map((item) => renderTemplate`<li> <a${addAttribute(item.href, "href")} target="_blank" rel="noopener noreferrer" class="text-secondary-300 hover:text-primary transition-colors inline-flex items-center"> ${t(item.label)} <svg class="h-3 w-3 ml-1" fill="none" stroke="currentColor" viewBox="0 0 24 24"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 6H6a2 2 0 00-2 2v10a2 2 0 002 2h10a2 2 0 002-2v-4M14 4h6m0 0v6m0-6L10 14"></path> </svg> </a> </li>`)} <li> <a href="/privacy" class="text-secondary-300 hover:text-primary transition-colors"> ${t("footer.links.privacy")} </a> </li> <li> <a href="/terms" class="text-secondary-300 hover:text-primary transition-colors"> ${t("footer.links.terms")} </a> </li> </ul> </div> </div> <!-- Footer bottom --> <div class="border-t border-secondary-800 pt-8"> <div class="flex flex-col md:flex-row justify-between items-center"> <!-- Copyright --> <p class="text-secondary-400 text-sm"> ${t("footer.copyright")} </p> <!-- Social links placeholder --> <div class="flex items-center space-x-4 mt-4 md:mt-0"> <a href="https://blog.tiber365.it" target="_blank" rel="noopener noreferrer" class="text-secondary-400 hover:text-primary transition-colors" aria-label="Blog"> <svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24"> <path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"></path> </svg> </a> <a href="https://support.tiber365.it" target="_blank" rel="noopener noreferrer" class="text-secondary-400 hover:text-primary transition-colors" aria-label="Support Portal"> <svg class="h-5 w-5" fill="currentColor" viewBox="0 0 24 24"> <path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm-2 15l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"></path> </svg> </a> </div> </div> </div> </div> </footer>`;
|
|
}, "/Users/richard/Website Development/tiber365/src/components/Footer.astro", void 0);
|
|
|
|
export { $$BaseLayout as $, SERVICES as S, TESTIMONIALS as T, $$Header as a, $$Footer as b, $$Trans as c, t };
|