fix(locale): align DE/EN component structures, fix dynamic language switcher slug mapping, and localize referenzen map
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 22s
Build & Deploy / 🧪 QA (push) Successful in 1m6s
Build & Deploy / 🏗️ Build (push) Successful in 2m48s
Build & Deploy / 🚀 Deploy (push) Successful in 27s
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s
All checks were successful
Build & Deploy / 🔍 Prepare (push) Successful in 22s
Build & Deploy / 🧪 QA (push) Successful in 1m6s
Build & Deploy / 🏗️ Build (push) Successful in 2m48s
Build & Deploy / 🚀 Deploy (push) Successful in 27s
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 2s
This commit is contained in:
@@ -75,9 +75,9 @@ export default async function ReferenzenOverview(props: { params: Promise<{ loca
|
||||
{/* Map Hero Section */}
|
||||
<InteractiveGermanyMap
|
||||
isHero={true}
|
||||
badge="Unsere Referenzen"
|
||||
title={<>Erfolgreich umgesetzte<br/>Projekte.</>}
|
||||
description="Vom Breitbandausbau bis zur komplexen 110kV-Trasse: Ein Auszug unserer bundesweiten Projekte, bei denen wir Infrastruktur für die Zukunft geschaffen haben. Entdecken Sie unsere Standorte."
|
||||
badge={locale === 'en' ? 'Our References' : 'Unsere Referenzen'}
|
||||
title={locale === 'en' ? <>Successfully realized<br/>projects.</> : <>Erfolgreich umgesetzte<br/>Projekte.</>}
|
||||
description={locale === 'en' ? 'From broadband expansion to complex 110kV lines: A selection of our nationwide projects where we have created infrastructure for the future. Discover our locations.' : 'Vom Breitbandausbau bis zur komplexen 110kV-Trasse: Ein Auszug unserer bundesweiten Projekte, bei denen wir Infrastruktur für die Zukunft geschaffen haben. Entdecken Sie unsere Standorte.'}
|
||||
locations={enrichedLocations}
|
||||
/>
|
||||
|
||||
|
||||
70
components/layout/LanguageSwitcher.test.tsx
Normal file
70
components/layout/LanguageSwitcher.test.tsx
Normal file
@@ -0,0 +1,70 @@
|
||||
import * as React from 'react';
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||||
import { render, screen } from '@testing-library/react';
|
||||
import { LanguageSwitcher } from './LanguageSwitcher';
|
||||
import { usePathname } from 'next/navigation';
|
||||
|
||||
// Mock next/navigation
|
||||
vi.mock('next/navigation', () => ({
|
||||
usePathname: vi.fn(),
|
||||
}));
|
||||
|
||||
// Mock TransitionLink to render standard anchor tag and forward all props
|
||||
vi.mock('@/components/ui/TransitionLink', () => ({
|
||||
TransitionLink: ({ children, href, onClick, ...props }: any) => (
|
||||
<a href={href} onClick={onClick} {...props}>
|
||||
{children}
|
||||
</a>
|
||||
),
|
||||
}));
|
||||
|
||||
// Mock HoverShineOverlay
|
||||
vi.mock('@/components/ui/HoverShineOverlay', () => ({
|
||||
HoverShineOverlay: () => <div data-testid="hover-shine" />,
|
||||
}));
|
||||
|
||||
describe('LanguageSwitcher TDD', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks();
|
||||
});
|
||||
|
||||
it('translates /en/events to /de/messen when switching to German', () => {
|
||||
vi.mocked(usePathname).mockReturnValue('/en/events');
|
||||
render(<LanguageSwitcher />);
|
||||
|
||||
const deLink = screen.getByLabelText('Switch to Deutsch');
|
||||
expect(deLink.getAttribute('href')).toBe('/de/messen');
|
||||
});
|
||||
|
||||
it('translates /de/messen to /en/events when switching to English', () => {
|
||||
vi.mocked(usePathname).mockReturnValue('/de/messen');
|
||||
render(<LanguageSwitcher />);
|
||||
|
||||
const enLink = screen.getByLabelText('Switch to English');
|
||||
expect(enLink.getAttribute('href')).toBe('/en/events');
|
||||
});
|
||||
|
||||
it('translates /en/about-us to /de/ueber-uns when switching to German', () => {
|
||||
vi.mocked(usePathname).mockReturnValue('/en/about-us');
|
||||
render(<LanguageSwitcher />);
|
||||
|
||||
const deLink = screen.getByLabelText('Switch to Deutsch');
|
||||
expect(deLink.getAttribute('href')).toBe('/de/ueber-uns');
|
||||
});
|
||||
|
||||
it('translates /de/ueber-uns to /en/about-us when switching to English', () => {
|
||||
vi.mocked(usePathname).mockReturnValue('/de/ueber-uns');
|
||||
render(<LanguageSwitcher />);
|
||||
|
||||
const enLink = screen.getByLabelText('Switch to English');
|
||||
expect(enLink.getAttribute('href')).toBe('/en/about-us');
|
||||
});
|
||||
|
||||
it('preserves nested paths like blog posts', () => {
|
||||
vi.mocked(usePathname).mockReturnValue('/de/blog/some-post');
|
||||
render(<LanguageSwitcher />);
|
||||
|
||||
const enLink = screen.getByLabelText('Switch to English');
|
||||
expect(enLink.getAttribute('href')).toBe('/en/blog/some-post');
|
||||
});
|
||||
});
|
||||
@@ -3,6 +3,41 @@
|
||||
import { TransitionLink } from '@/components/ui/TransitionLink';
|
||||
import { usePathname } from 'next/navigation';
|
||||
import { HoverShineOverlay } from '@/components/ui/HoverShineOverlay';
|
||||
import enMessages from '@/messages/en.json';
|
||||
import deMessages from '@/messages/de.json';
|
||||
|
||||
const getMessages = (locale: string) => {
|
||||
return locale === 'de' ? deMessages : enMessages;
|
||||
};
|
||||
|
||||
// Synchronous version of mapSlugToFileSlug
|
||||
function syncMapSlugToFileSlug(translatedSlug: string, locale: string): string {
|
||||
const messages = getMessages(locale);
|
||||
const slugs = messages.Slugs;
|
||||
|
||||
if (slugs.pages && translatedSlug in slugs.pages) {
|
||||
return slugs.pages[translatedSlug as keyof typeof slugs.pages];
|
||||
}
|
||||
return translatedSlug;
|
||||
}
|
||||
|
||||
// Synchronous version of mapFileSlugToTranslated
|
||||
function syncMapFileSlugToTranslated(fileSlug: string, locale: string): string {
|
||||
const messages = getMessages(locale);
|
||||
const slugs = messages.Slugs;
|
||||
|
||||
const sections = [slugs.pages];
|
||||
for (const sectionData of sections) {
|
||||
if (sectionData && typeof sectionData === 'object') {
|
||||
for (const [translatedSlug, mappedSlug] of Object.entries(sectionData)) {
|
||||
if (mappedSlug === fileSlug) {
|
||||
return translatedSlug;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return fileSlug;
|
||||
}
|
||||
|
||||
interface LanguageSwitcherProps {
|
||||
mobile?: boolean;
|
||||
@@ -14,8 +49,23 @@ export function LanguageSwitcher({ mobile = false, isSolidMode = false }: Langua
|
||||
const currentLocale = pathname.startsWith('/en') ? 'en' : 'de';
|
||||
|
||||
const getSwitchedUrl = (newLocale: string) => {
|
||||
const pathWithoutLocale = pathname.replace(/^\/(en|de)/, '');
|
||||
return `/${newLocale}${pathWithoutLocale === '' ? '' : pathWithoutLocale}`;
|
||||
const segments = pathname.split('/').filter(Boolean);
|
||||
if (segments.length === 0) {
|
||||
return `/${newLocale}`;
|
||||
}
|
||||
|
||||
const currentLoc = segments[0] === 'en' || segments[0] === 'de' ? segments[0] : 'de';
|
||||
const hasLocale = segments[0] === 'en' || segments[0] === 'de';
|
||||
const pathSegments = hasLocale ? segments.slice(1) : segments;
|
||||
|
||||
if (pathSegments.length === 1) {
|
||||
const slug = pathSegments[0];
|
||||
const fileSlug = syncMapSlugToFileSlug(slug, currentLoc);
|
||||
const translatedSlug = syncMapFileSlugToTranslated(fileSlug, newLocale);
|
||||
return `/${newLocale}/${translatedSlug}`;
|
||||
}
|
||||
|
||||
return `/${newLocale}/${pathSegments.join('/')}`;
|
||||
};
|
||||
|
||||
const locales = [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "Trenchless Line Laying"
|
||||
date: "2024-03-20"
|
||||
excerpt: "Precise horizontal directional drilling and earth rockets in all soil classes for surface-friendly and trenchless line laying."
|
||||
excerpt: "Precise horizontal directional drilling and earth rockets in all soil classes for surface-friendly and efficient line laying."
|
||||
layout: "fullBleed"
|
||||
---
|
||||
|
||||
@@ -15,12 +15,29 @@ layout: "fullBleed"
|
||||
ctaHref="/en/kontakt"
|
||||
/>
|
||||
|
||||
<div className="container px-4 max-w-7xl mx-auto py-16">
|
||||
<blockquote>
|
||||
If classic trench construction is out of the question for space, environmental or cost reasons, we rely on the most modern trenchless techniques. We protect nature and minimize restoration costs.
|
||||
</blockquote>
|
||||
|
||||
## Maximum Efficiency, Minimal Intervention
|
||||
|
||||
Trenchless line laying is the smartest solution for complex construction projects. This process shows its absolute strengths particularly when crossing highly frequented roads, railway lines, highways or sensitive bodies of water. Traffic continues to flow, nature remains untouched and complex surfaces such as expensive paving or asphalt do not have to be destroyed.
|
||||
|
||||
## HDD Boreholes and Earth Rockets
|
||||
|
||||
With our specialized machinery, we master a wide variety of processes. With the **Horizontal Directional Drilling (HDD) process**, we steer the drill head precisely underground. We achieve drilling lengths of up to 250 meters in one piece and can pull in protective pipes with a diameter of up to 400 mm.
|
||||
|
||||
For shorter distances, such as fast and gentle house connections, we use our **earth rockets** (soil displacement method). Here we achieve drilling lengths of up to 15 meters for pipes up to 160 mm in diameter - ideal for leaving front gardens and driveways completely intact.
|
||||
|
||||
<DeepDrillAnimation />
|
||||
</div>
|
||||
|
||||
<ServiceDetailGrid
|
||||
badge="Procedures"
|
||||
title="Efficient & Environmentally Friendly"
|
||||
title="Our Drilling Technology in Detail"
|
||||
descriptionParagraphs={[
|
||||
"If classic trench construction is out of the question for reasons of space, environment, or cost, we rely on **state-of-the-art trenchless techniques**.",
|
||||
"This not only protects nature but also significantly saves on restoration costs for complex surfaces."
|
||||
"We select the exactly matching drilling method for each soil class and local condition to guarantee maximum economic efficiency."
|
||||
]}
|
||||
panels={[
|
||||
{
|
||||
@@ -32,27 +49,29 @@ layout: "fullBleed"
|
||||
[
|
||||
"Max. drilling length: 250 m",
|
||||
"Max. diameter: 400mm pipe",
|
||||
"Complex crossing of railways, highways & water bodies"
|
||||
"Precision control and steerability",
|
||||
"Crossing of railways, highways & water bodies"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "erdrakete",
|
||||
title: "Earth Rocket",
|
||||
title: "Soil Displacement (Earth Rocket)",
|
||||
icon: "hdd",
|
||||
fullWidth: false,
|
||||
lists: [
|
||||
[
|
||||
"Max. crossing length: 15 m",
|
||||
"Max. diameter: 160mm pipe",
|
||||
"Fast house connections without trenches"
|
||||
"Fast house connections without trenches",
|
||||
"No surface opening necessary"
|
||||
]
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
|
||||
<DeepDrillAnimation />
|
||||
<HomeReferencesSlider badge="Case Studies" title="Completed Drilling Projects" description="Successful HDD drilling and trenchless cable laying under the most complex conditions." />
|
||||
|
||||
<CallToAction
|
||||
title="Looking for a trenchless solution?"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "Cable Civil Engineering in Telecommunications"
|
||||
date: "2024-03-20"
|
||||
excerpt: "Future-proof infrastructure through competent cable civil engineering for fiber optic and telecommunications networks."
|
||||
excerpt: "Future-proof infrastructure through competent cable civil engineering for fiber optic and telecommunications networks (FTTX)."
|
||||
layout: "fullBleed"
|
||||
---
|
||||
|
||||
@@ -15,12 +15,27 @@ layout: "fullBleed"
|
||||
ctaHref="/en/kontakt"
|
||||
/>
|
||||
|
||||
<div className="container px-4 max-w-7xl mx-auto py-16">
|
||||
<blockquote>
|
||||
A life without electricity or high-speed internet is unimaginable today - that is why we lay cables. We build the backbone of the digital society.
|
||||
</blockquote>
|
||||
|
||||
## The Backbone of Digitalization
|
||||
|
||||
Fast internet and state-of-the-art telecommunications networks require an absolutely smooth and highly professional network expansion. With highly specialized assembly teams and our own modern fleet of machinery, E-TIB ensures the highest execution quality in nationwide fiber optic expansion.
|
||||
|
||||
## FTTX Expansion from a Single Source
|
||||
|
||||
As a powerful partner for telecommunications providers, we cover every step of physical network creation. We take over the construction of complete empty conduit routes as well as cable and pipe trenches. In addition, we position and build multi-function enclosures at strategic network nodes.
|
||||
|
||||
Our service does not end with pure civil engineering: We take care of the professional pulling and blowing in of highly sensitive fiber optic and telecommunication cables over long distances and carry out all required cable assemblies. In this way, we guarantee that the digital infrastructure can go into operation safely and performantly.
|
||||
</div>
|
||||
|
||||
<ServiceDetailGrid
|
||||
badge="Service Portfolio"
|
||||
title="Backbone of Digitalization"
|
||||
title="Complete Fiber Optic Expansion"
|
||||
descriptionParagraphs={[
|
||||
"Fast internet and state-of-the-art telecommunications networks require a **smooth and professional network expansion**.",
|
||||
"With state-of-the-art machinery and specialized assembly teams, E-TIB ensures the highest quality in fiber optic expansion."
|
||||
"From the empty conduit route to the finished fiber optic assembly - we deliver turnkey telecommunication infrastructure at the highest level."
|
||||
]}
|
||||
panels={[
|
||||
{
|
||||
@@ -31,8 +46,9 @@ layout: "fullBleed"
|
||||
lists: [
|
||||
[
|
||||
"Production of cable and pipe trenches",
|
||||
"Production of empty conduit routes",
|
||||
"Setting up multi-function enclosures"
|
||||
"Production of complete empty conduit routes",
|
||||
"Setting up multi-function enclosures (MFG)",
|
||||
"Network node connection"
|
||||
]
|
||||
]
|
||||
},
|
||||
@@ -44,14 +60,17 @@ layout: "fullBleed"
|
||||
lists: [
|
||||
[
|
||||
"Pulling of TK/FO cables",
|
||||
"Blowing in of fiber optic cables",
|
||||
"Cable assembly TK/FO"
|
||||
"Pneumatic blowing in of fiber optic cables",
|
||||
"Cable assembly TK/FO",
|
||||
"Splicing and measuring work"
|
||||
]
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
|
||||
<HomeReferencesSlider badge="Case Studies" title="Completed Broadband Projects" description="We have already successfully realized hundreds of kilometers of FTTX networks. Discover our references." />
|
||||
|
||||
<CallToAction
|
||||
title="Are you planning an FTTX expansion?"
|
||||
text="We are happy to advise you on all aspects of FTTX and fiber optic expansion."
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "Cable Civil Engineering in Medium and Low Voltage"
|
||||
title: "Cable Civil Engineering"
|
||||
date: "2024-03-20"
|
||||
excerpt: "Professional cable civil engineering for medium and low voltage networks: From the construction of cable routes to cable assemblies and street lighting."
|
||||
excerpt: "Professional cable civil engineering for medium and low voltage networks. We guarantee maximum safety standards and seamless documentation for your project."
|
||||
layout: "fullBleed"
|
||||
---
|
||||
|
||||
@@ -15,12 +15,31 @@ layout: "fullBleed"
|
||||
ctaHref="/en/kontakt"
|
||||
/>
|
||||
|
||||
<div className="container px-4 max-w-7xl mx-auto py-16">
|
||||
<blockquote>
|
||||
Everywhere digging and drilling is happening, but unfortunately a lot also goes wrong. We focus on quality, the highest safety standards and legally compliant documentation - so that your construction project does not turn into a cost trap.
|
||||
</blockquote>
|
||||
|
||||
## Quality instead of a Cost Trap
|
||||
|
||||
On many construction sites, cheap providers from abroad are increasingly being used, which often leads to **safety standards and documentation requirements being ignored**. The consequences are severe: accidents, damaged external lines (such as electricity, water and gas) as well as massive construction delays and expensive supplements. A supposed bargain quickly turns out to be a financial burden.
|
||||
|
||||
Particularly for funded infrastructure projects, retrieving the funding is extremely problematic without absolutely seamless, standard-compliant documentation.
|
||||
|
||||
## Everything from a Single Source
|
||||
|
||||
Thanks to our many years of experience, we identify problems early on and work out safe and satisfactory solutions for our clients in advance. E-TIB GmbH has fully specialized in cable civil engineering.
|
||||
|
||||
We offer you the complete range of services for the construction of cable routes from a single source - with our own ultra-modern machine fleet and permanent specialist staff from the region. In direct cooperation with our partner office, E-TIB Ingenieurgesellschaft mbH, we can also rule out planning errors at an early stage and sovereignly meet even the most complex documentation requirements.
|
||||
|
||||
<DataGridPulse />
|
||||
</div>
|
||||
|
||||
<ServiceDetailGrid
|
||||
badge="Service Portfolio"
|
||||
title="Everything for your network"
|
||||
title="Everything for Your Network"
|
||||
descriptionParagraphs={[
|
||||
"Our services cover the **complete spectrum** for the construction of modern cable routes and energy infrastructure.",
|
||||
"We offer the highest precision, modern machines, and certified experts for every project."
|
||||
"We offer the highest precision, modern machines and certified experts for every civil engineering project - from cable laying to transformer stations."
|
||||
]}
|
||||
panels={[
|
||||
{
|
||||
@@ -31,29 +50,30 @@ layout: "fullBleed"
|
||||
lists: [
|
||||
[
|
||||
"Production of cable and pipe trenches",
|
||||
"Cable laying from 0.4 kV - 110 kV",
|
||||
"Cable assembly 0.4 kV - 30 kV"
|
||||
"Cable laying from 0.4 kV to 110 kV",
|
||||
"Cable assembly from 0.4 kV to 30 kV",
|
||||
"Cable plowing works for fast laying"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "anlagen",
|
||||
title: "Systems & Lighting",
|
||||
title: "Systems & Infrastructure",
|
||||
icon: "energy",
|
||||
fullWidth: false,
|
||||
lists: [
|
||||
[
|
||||
"Construction of transformer stations",
|
||||
"Establishment of grounding systems",
|
||||
"Establishment of complex grounding systems",
|
||||
"Erection of street lighting",
|
||||
"Switching operations"
|
||||
"Certified switching operations"
|
||||
]
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
|
||||
<DataGridPulse />
|
||||
<HomeReferencesSlider badge="Case Studies" title="Completed Civil Engineering Projects" description="We have laid hundreds of kilometers of cables. Take a look at our reference projects." />
|
||||
|
||||
<CallToAction
|
||||
title="Do you have a specific project?"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "Planning and Consulting"
|
||||
date: "2024-03-20"
|
||||
excerpt: "Professional planning and consulting in the field of energy and telecommunications networks: route planning, approval procedures, and project review."
|
||||
excerpt: "Professional planning and consulting in the field of energy and telecommunications networks: route planning, approval procedures and project control from a single source."
|
||||
layout: "fullBleed"
|
||||
---
|
||||
|
||||
@@ -15,48 +15,65 @@ layout: "fullBleed"
|
||||
ctaHref="/en/kontakt"
|
||||
/>
|
||||
|
||||
<div className="container px-4 max-w-7xl mx-auto py-16">
|
||||
<blockquote>
|
||||
We offer our clients everything from a single source - from the rough planning of your project idea and cable civil engineering to the construction of your renewable energy project.
|
||||
</blockquote>
|
||||
|
||||
## Foundation for Project Success
|
||||
|
||||
Solid planning is the crucial foundation for every successful infrastructure project. Projects often fail or are massively delayed because the complexity of civil engineering planning and approval procedures was underestimated. Through our combined competence, you avoid expensive planning errors and frictional losses at the interfaces.
|
||||
|
||||
Both for the highly topical broadband expansion and for the demanding grid connection of solar or wind projects, absolutely precise and high-quality cable route planning is required. To do this, we inspect the route on site, analyze all potential construction conflicts at an early stage and ensure that all necessary applications for the laying are submitted completely and on time to the authorities.
|
||||
|
||||
## Strong Engineering Competence
|
||||
|
||||
In close cooperation with our specialized partner engineering firm, **E-TIB Ingenieurgesellschaft mbH**, we accompany you through all service phases. Whether structural planning for route optimization, complex approval planning or detailed execution planning - we steer your project from the first feasibility study to successful construction supervision and acceptance.
|
||||
</div>
|
||||
|
||||
<ServiceDetailGrid
|
||||
badge="Engineering Services"
|
||||
title="Foundation for Success"
|
||||
title="Our Planning Services"
|
||||
descriptionParagraphs={[
|
||||
"Solid planning is the foundation of every successful construction project. Avoid expensive planning errors and benefit from our comprehensive expertise.",
|
||||
"Our partner engineering firm **E-TIB Ingenieurgesellschaft mbH** supports us in the smooth implementation of complex network expansion projects."
|
||||
"Minimize risks and interfaces. We combine planning know-how with practical civil engineering expertise."
|
||||
]}
|
||||
panels={[
|
||||
{
|
||||
id: "planung",
|
||||
title: "Planning",
|
||||
title: "Route & Approval Planning",
|
||||
icon: "planning",
|
||||
fullWidth: false,
|
||||
lists: [
|
||||
[
|
||||
"Structural planning",
|
||||
"Approval planning",
|
||||
"Execution planning",
|
||||
"Structural planning (route optimization)",
|
||||
"Approval planning & authority management",
|
||||
"Detailed execution planning",
|
||||
"Consent planning"
|
||||
]
|
||||
]
|
||||
},
|
||||
{
|
||||
id: "beratung",
|
||||
title: "Consulting & Management",
|
||||
title: "Control & Supervision",
|
||||
icon: "planning",
|
||||
fullWidth: false,
|
||||
lists: [
|
||||
[
|
||||
"Tendering & awarding",
|
||||
"Construction supervision",
|
||||
"Project review",
|
||||
"Feasibility studies"
|
||||
"Tendering & awarding (AVA)",
|
||||
"Specialist construction supervision",
|
||||
"Project review & controlling",
|
||||
"Sound feasibility studies"
|
||||
]
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
|
||||
<HomeReferencesSlider badge="Case Studies" title="Planning in Practice" description="Successfully planned and accompanied infrastructure projects of our group." />
|
||||
|
||||
<CallToAction
|
||||
title="Do you need planning security?"
|
||||
text="Let's talk about your project. We are at your side with help and advice."
|
||||
text="Let's talk about your project. We are at your side with our engineering knowledge."
|
||||
buttonText="Contact us"
|
||||
buttonLink="/en/kontakt"
|
||||
/>
|
||||
|
||||
@@ -89,16 +89,6 @@ layout: "fullBleed"
|
||||
]}
|
||||
/>
|
||||
|
||||
<InteractiveGermanyMap
|
||||
badge="Operating Areas"
|
||||
title={<>Nationwide<br/>at your service.</>}
|
||||
description="From our strategic locations in Guben and Bülstedt, we control and realize complex infrastructure projects across the entire federal territory."
|
||||
stats={[
|
||||
{ value: '100', suffix: '%', label: 'Nationwide Reach' },
|
||||
{ value: '2', suffix: '+', label: 'Operating Locations' }
|
||||
]}
|
||||
/>
|
||||
|
||||
<div id="structure">
|
||||
<HomeSubCompanyTiles
|
||||
badge="Structure"
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
---
|
||||
title: "Surveying and Documentation"
|
||||
date: "2024-03-20"
|
||||
excerpt: "Precise surveying, staking out, and digital documentation of line routes to ensure the highest safety and quality standards."
|
||||
excerpt: "Precise GIS surveying, staking out and digital documentation of line routes to ensure the highest construction and safety standards."
|
||||
layout: "fullBleed"
|
||||
---
|
||||
|
||||
@@ -15,24 +15,42 @@ layout: "fullBleed"
|
||||
ctaHref="/en/kontakt"
|
||||
/>
|
||||
|
||||
<div className="container px-4 max-w-7xl mx-auto py-16">
|
||||
<blockquote>
|
||||
We work with highly precise GPS equipment for the seamless documentation of our clients' projects. For this purpose, we independently develop app integrations to automate surveying.
|
||||
</blockquote>
|
||||
|
||||
## Highest Precision Protects Against Surprises
|
||||
|
||||
In today's times, legal documentation requirements and strict safety standards are growing rapidly. Many conventional civil engineering companies are hardly able to cleanly meet these highly complex requirements - especially for funded broadband expansion. Missing or incorrect documentation inevitably leads to massive problems during construction acceptance and project financing.
|
||||
|
||||
We identified this bottleneck early on and proactively specialized in the highly precise surveying and digital documentation of cable routes.
|
||||
|
||||
## Digital Recording at the State of the Art
|
||||
|
||||
With state-of-the-art GPS technology and self-developed digital app integrations, we ensure highly automated, seamless and absolutely legally compliant recording of all laid lines and systems.
|
||||
|
||||
In addition to classic GPS staking and surveying, we create complete geodatabases for our clients for transparent project accounting and offer seamless 360° photo and video recording of the construction field. In this way, you keep full track of your underground infrastructure at all times.
|
||||
</div>
|
||||
|
||||
<ServiceDetailGrid
|
||||
badge="Precision"
|
||||
title="Highest Safety Standards"
|
||||
title="Digital Safety Standards"
|
||||
descriptionParagraphs={[
|
||||
"Increasing documentation requirements and strict safety standards demand **the highest precision on the construction site**.",
|
||||
"With state-of-the-art technology, we ensure seamless and legally compliant recording of all lines. This is the best protection against unpleasant surprises during construction acceptance."
|
||||
"We do not only deliver a clean route, but also the perfect data. Legally compliant, digital and precise to the centimeter."
|
||||
]}
|
||||
panels={[
|
||||
{
|
||||
id: "vermessung",
|
||||
title: "Geodesy",
|
||||
title: "Classic Geodesy",
|
||||
icon: "survey",
|
||||
fullWidth: false,
|
||||
lists: [
|
||||
[
|
||||
"Staking out of line routes",
|
||||
"Surveying of line routes",
|
||||
"GPS-supported terrain recording"
|
||||
"Staking out of line routes with centimeter precision",
|
||||
"Surveying of existing routes and new lines",
|
||||
"Highly precise GPS-supported terrain recording",
|
||||
"Automated app-based measuring procedures"
|
||||
]
|
||||
]
|
||||
},
|
||||
@@ -44,17 +62,20 @@ layout: "fullBleed"
|
||||
lists: [
|
||||
[
|
||||
"Creation of databases for project accounting",
|
||||
"360° photo/video recording of the construction site",
|
||||
"Integration into geographic information systems (GIS)"
|
||||
"360° photo and video recording of the construction field",
|
||||
"Integration and processing for Geographic Information Systems (GIS)",
|
||||
"Audit-proof inventory plans"
|
||||
]
|
||||
]
|
||||
}
|
||||
]}
|
||||
/>
|
||||
|
||||
<HomeReferencesSlider badge="Case Studies" title="Documented Projects" description="We have precisely surveyed and digitally documented hundreds of kilometers of routes." />
|
||||
|
||||
<CallToAction
|
||||
title="Are you facing high documentation requirements?"
|
||||
text="Contact us for professional surveying and documentation services."
|
||||
text="Contact us for professional surveying and GIS services."
|
||||
buttonText="Contact us"
|
||||
buttonLink="/en/kontakt"
|
||||
/>
|
||||
|
||||
52
scripts/compare-mdx-parity.ts
Normal file
52
scripts/compare-mdx-parity.ts
Normal file
@@ -0,0 +1,52 @@
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
const CONTENT_DIR = path.join(process.cwd(), 'content');
|
||||
const deDir = path.join(CONTENT_DIR, 'de');
|
||||
const enDir = path.join(CONTENT_DIR, 'en');
|
||||
|
||||
function extractComponents(filePath: string): string[] {
|
||||
const content = fs.readFileSync(filePath, 'utf8');
|
||||
// Match any tag starting with uppercase letter, e.g. <HomeHero or <InteractiveGermanyMap
|
||||
const matches = content.match(/<[A-Z][a-zA-Z0-9]*/g) || [];
|
||||
return matches.map(m => m.substring(1));
|
||||
}
|
||||
|
||||
function checkParity() {
|
||||
const deFiles = fs.readdirSync(deDir).filter(f => f.endsWith('.mdx'));
|
||||
let hasErrors = false;
|
||||
|
||||
console.log('🔍 Checking MDX Component Parity between DE and EN...');
|
||||
|
||||
deFiles.forEach(file => {
|
||||
const dePath = path.join(deDir, file);
|
||||
const enPath = path.join(enDir, file);
|
||||
|
||||
if (!fs.existsSync(enPath)) {
|
||||
console.log(`❌ Missing English file: ${file}`);
|
||||
hasErrors = true;
|
||||
return;
|
||||
}
|
||||
|
||||
const deComponents = extractComponents(dePath);
|
||||
const enComponents = extractComponents(enPath);
|
||||
|
||||
const deStr = deComponents.join(', ');
|
||||
const enStr = enComponents.join(', ');
|
||||
|
||||
if (deStr !== enStr) {
|
||||
console.log(`❌ Mismatch in ${file}:`);
|
||||
console.log(` DE components: [${deStr}]`);
|
||||
console.log(` EN components: [${enStr}]`);
|
||||
hasErrors = true;
|
||||
} else {
|
||||
console.log(`✅ ${file} is in perfect parity.`);
|
||||
}
|
||||
});
|
||||
|
||||
if (!hasErrors) {
|
||||
console.log('🎉 PERFECT PARITY DETECTED! All MDX components are identical.');
|
||||
}
|
||||
}
|
||||
|
||||
checkParity();
|
||||
Reference in New Issue
Block a user