refactor: optimize socket connection handling by removing polling transport and implementing lazy connection strategy in SocketManager for improved performance

This commit is contained in:
sebseb7
2025-07-23 07:29:15 +02:00
parent d8f438c3f3
commit bbd1371eb2
44 changed files with 206 additions and 407 deletions

View File

@@ -11,3 +11,43 @@ Entpacken & Doppelklick auf `start-dev-seedheads.bat` - das Skript wird:
- Abhängigkeiten automatisch installieren falls nötig
- Entwicklungsserver mit API-Proxy zu seedheads.de starten
- Browser öffnen auf http://localhost:9500
## Socket Connection Optimization
The application uses Socket.IO for real-time communication with the server. To improve initial loading performance, sockets are now connected lazily:
- Sockets are created with `autoConnect: false` and only establish a connection when:
- The first `emit` is called on the socket
- An explicit connection is requested via the context methods
### Usage
```jsx
// In a component
import React, { useContext, useEffect } from 'react';
import SocketContext from '../contexts/SocketContext';
import { emitAsync } from '../utils/socketUtils';
const MyComponent = () => {
const { socket, socketB } = useContext(SocketContext);
useEffect(() => {
// The socket will automatically connect when emit is called
socket.emit('someEvent', { data: 'example' });
// Or use the utility for Promise-based responses
emitAsync(socket, 'getData', { id: 123 })
.then(response => console.log(response))
.catch(error => console.error(error));
}, [socket]);
return <div>My Component</div>;
};
```
### Benefits
- Reduced initial page load time
- Connections established only when needed
- Automatic fallback to polling if WebSocket fails
- Promise-based utilities for easier async/await usage

View File

@@ -68,7 +68,7 @@ const renderSingleProduct = async (productSeoName) => {
const socket = io(socketUrl, {
path: "/socket.io/",
transports: ["polling", "websocket"],
transports: ["websocket"],
reconnection: false,
timeout: 10000,
});

View File

@@ -148,7 +148,7 @@ const renderProductWorker = async (productSeoNames, workerId, progressCallback,
const socketUrl = "http://127.0.0.1:9303";
const workerSocket = io(socketUrl, {
path: "/socket.io/",
transports: ["polling", "websocket"],
transports: ["websocket"],
reconnection: false,
timeout: 10000,
});
@@ -809,7 +809,7 @@ const fetchCategoryDataAndRender = () => {
const socket = io(socketUrl, {
path: "/socket.io/",
transports: ["polling", "websocket"], // Using polling first is more robust
transports: [ "websocket"],
reconnection: false,
timeout: 10000,
});

View File

@@ -15,8 +15,6 @@ import Tooltip from "@mui/material/Tooltip";
import SmartToyIcon from "@mui/icons-material/SmartToy";
import PaletteIcon from "@mui/icons-material/Palette";
import SocketProvider from "./providers/SocketProvider.js";
import SocketContext from "./contexts/SocketContext.js";
import { CarouselProvider } from "./contexts/CarouselContext.js";
import config from "./config.js";
import ScrollToTop from "./components/ScrollToTop.js";
@@ -33,13 +31,9 @@ import MainPageLayout from "./components/MainPageLayout.js";
// TEMPORARILY DISABLE ALL LAZY LOADING TO ELIMINATE CircularProgress
import Content from "./components/Content.js";
import ProductDetailWithSocket from "./components/ProductDetailWithSocket.js";
import ProfilePageWithSocket from "./pages/ProfilePage.js";
import ProductDetail from "./components/ProductDetail.js";
import ProfilePage from "./pages/ProfilePage.js";
import ResetPassword from "./pages/ResetPassword.js";
// const Content = lazy(() => import(/* webpackChunkName: "content" */ "./components/Content.js"));
// const ProductDetailWithSocket = lazy(() => import(/* webpackChunkName: "product-detail" */ "./components/ProductDetailWithSocket.js"));
// const ProfilePageWithSocket = lazy(() => import(/* webpackChunkName: "profile" */ "./pages/ProfilePage.js"));
// const ResetPassword = lazy(() => import(/* webpackChunkName: "reset-password" */ "./pages/ResetPassword.js"));
// Lazy load admin pages - only loaded when admin users access them
const AdminPage = lazy(() => import(/* webpackChunkName: "admin" */ "./pages/AdminPage.js"));
@@ -77,26 +71,6 @@ const deleteMessages = () => {
window.chatMessages = [];
};
// Component to initialize telemetry service with socket
const TelemetryInitializer = ({ socket }) => {
const telemetryServiceRef = useRef(null);
useEffect(() => {
if (socket && !telemetryServiceRef.current) {
//telemetryServiceRef.current = new TelemetryService(socket);
//telemetryServiceRef.current.init();
}
return () => {
if (telemetryServiceRef.current) {
telemetryServiceRef.current.destroy();
telemetryServiceRef.current = null;
}
};
}, [socket]);
return null; // This component doesn't render anything
};
const AppContent = ({ currentTheme, onThemeChange }) => {
// State to manage chat visibility
@@ -164,9 +138,6 @@ const AppContent = ({ currentTheme, onThemeChange }) => {
// Check if we're in development mode
const isDevelopment = process.env.NODE_ENV === "development";
const {socket,socketB} = useContext(SocketContext);
console.log("AppContent: socket", socket);
return (
<Box
sx={{
@@ -179,7 +150,6 @@ const AppContent = ({ currentTheme, onThemeChange }) => {
}}
>
<ScrollToTop />
<TelemetryInitializer socket={socket} />
<Header active categoryId={categoryId} key={authVersion} />
<Box sx={{ flexGrow: 1 }}>
<Suspense fallback={
@@ -213,19 +183,19 @@ const AppContent = ({ currentTheme, onThemeChange }) => {
{/* Category page - Render Content in parallel */}
<Route
path="/Kategorie/:categoryId"
element={<Content socket={socket} socketB={socketB} />}
element={<Content/>}
/>
{/* Single product page */}
<Route
path="/Artikel/:seoName"
element={<ProductDetailWithSocket />}
element={<ProductDetail/>}
/>
{/* Search page - Render Content in parallel */}
<Route path="/search" element={<Content socket={socket} socketB={socketB} />} />
<Route path="/search" element={<Content/>} />
{/* Profile page */}
<Route path="/profile" element={<ProfilePageWithSocket />} />
<Route path="/profile" element={<ProfilePage/>} />
{/* Payment success page for Mollie redirects */}
<Route path="/payment/success" element={<PaymentSuccess />} />
@@ -233,17 +203,17 @@ const AppContent = ({ currentTheme, onThemeChange }) => {
{/* Reset password page */}
<Route
path="/resetPassword"
element={<ResetPassword socket={socket} socketB={socketB} />}
element={<ResetPassword/>}
/>
{/* Admin page */}
<Route path="/admin" element={<AdminPage socket={socket} socketB={socketB} />} />
<Route path="/admin" element={<AdminPage/>} />
{/* Admin Users page */}
<Route path="/admin/users" element={<UsersPage socket={socket} socketB={socketB} />} />
<Route path="/admin/users" element={<UsersPage/>} />
{/* Admin Server Logs page */}
<Route path="/admin/logs" element={<ServerLogsPage socket={socket} socketB={socketB} />} />
<Route path="/admin/logs" element={<ServerLogsPage/>} />
{/* Legal pages */}
<Route path="/datenschutz" element={<Datenschutz />} />
@@ -257,7 +227,7 @@ const AppContent = ({ currentTheme, onThemeChange }) => {
<Route path="/widerrufsrecht" element={<Widerrufsrecht />} />
{/* Grow Tent Configurator */}
<Route path="/Konfigurator" element={<GrowTentKonfigurator socket={socket} socketB={socketB} />} />
<Route path="/Konfigurator" element={<GrowTentKonfigurator/>} />
{/* Separate pages that are truly different */}
<Route path="/presseverleih" element={<PresseverleihPage />} />
@@ -285,7 +255,6 @@ const AppContent = ({ currentTheme, onThemeChange }) => {
<ChatAssistant
open={isChatOpen}
onClose={handleChatClose}
socket={socket}
/>
</Suspense>
)}
@@ -390,34 +359,10 @@ const App = () => {
<LanguageProvider i18n={i18n}>
<ThemeProvider theme={dynamicTheme}>
<CssBaseline />
<SocketProvider
url={config.apiBaseUrl}
fallback={
typeof window !== "undefined" && window.__PRERENDER_FALLBACK__ ? (
<div
dangerouslySetInnerHTML={{
__html: window.__PRERENDER_FALLBACK__.content,
}}
/>
) : (
<Box
sx={{
display: "flex",
justifyContent: "center",
alignItems: "center",
height: "100vh",
}}
>
<CircularProgress color="primary" />
</Box>
)
}
>
<AppContent
currentTheme={currentTheme}
onThemeChange={handleThemeChange}
/>
</SocketProvider>
</ThemeProvider>
</LanguageProvider>
);

View File

@@ -20,14 +20,14 @@ class CartItem extends Component {
this.setState({image:window.tinyPicCache[picid],loading:false, error: false})
}else{
this.setState({image: null, loading: true, error: false});
if(this.props.socket && this.props.socket.connected){
//if(this.props.socket && this.props.socket.connected){
this.props.socket.emit('getPic', { bildId:picid, size:'tiny' }, (res) => {
if(res.success){
window.tinyPicCache[picid] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
this.setState({image: window.tinyPicCache[picid], loading: false});
}
})
}
// }
}
}
}

View File

@@ -61,7 +61,7 @@ const CategoryBox = ({
}
// If socket is available and connected, fetch the image
if (context && context.socket && context.socket.connected && id && !isLoading) {
if (context && context.socket /*&& context.socket.connected*/ && id && !isLoading) {
setIsLoading(true);
context.socket.emit('getCategoryPic', { categoryId: id }, (response) => {

View File

@@ -278,12 +278,12 @@ class Content extends Component {
return;
}
if (!this.props.socket || !this.props.socket.connected) {
//if (!this.props.socket || !this.props.socket.connected) {
// Socket not connected yet, but don't show error immediately on first load
// The componentDidUpdate will retry when socket connects
console.log("Socket not connected yet, waiting for connection to fetch category data");
return;
}
// console.log("Socket not connected yet, waiting for connection to fetch category data");
// return;
//}
console.log(`productList:${categoryId}`);
this.props.socket.off(`productList:${categoryId}`);
@@ -365,12 +365,12 @@ class Content extends Component {
}
fetchSearchData(query) {
if (!this.props.socket || !this.props.socket.connected) {
// if (!this.props.socket || !this.props.socket.connected) {
// Socket not connected yet, but don't show error immediately on first load
// The componentDidUpdate will retry when socket connects
console.log("Socket not connected yet, waiting for connection to fetch search data");
return;
}
// console.log("Socket not connected yet, waiting for connection to fetch search data");
// return;
// }
this.props.socket.emit("getSearchProducts", { query },
(response) => {

View File

@@ -230,10 +230,10 @@ class ProductDetailPage extends Component {
}
// If not cached, fetch from server (similar to loadProductData)
if (!this.props.socket || !this.props.socket.connected) {
console.log("Socket not connected yet, waiting for connection to load komponent data");
return;
}
//if (!this.props.socket || !this.props.socket.connected) {
// console.log("Socket not connected yet, waiting for connection to load komponent data");
// return;
//}
// Mark this komponent as loading
this.setState(prevState => ({

View File

@@ -148,8 +148,8 @@ class ProductSelector extends Component {
return (
<Box sx={{ mb: 4 }}>
<Typography variant="h2" component="h2" gutterBottom sx={{ color: '#2e7d32', fontWeight: 'bold' }}>
{title}
</Typography>
{title}
</Typography>
{subtitle && (
<Typography variant="body1" color="text.secondary" sx={{ mb: 3 }}>
{subtitle}

View File

@@ -181,8 +181,6 @@ class CategoryList extends Component {
fetchCategories = () => {
const { socket } = this.props;
if (!socket || !socket.connected) {
// Socket not connected yet, but don't show error immediately on first load
// The componentDidUpdate will retry when socket connects
console.log("Socket not connected yet, waiting for connection to fetch categories");
return;
}

View File

@@ -8,8 +8,8 @@ export default {
},
"descriptions": {
"standard": "الشحن العادي",
"standardFree": "الشحن العادي - مجاني للطلبات فوق 100€!",
"notAvailable": "غير متاح للاختيار لأن عنصر واحد أو أكثر يمكن استلامه فقط",
"standardFree": "الشحن العادي - مجاني من قيمة طلب 100€!",
"notAvailable": "غير قابل للاختيار لأن عنصر واحد أو أكثر يمكن استلامه فقط",
"bulky": "للعناصر الكبيرة والثقيلة",
"pickupOnly": "الاستلام فقط"
},
@@ -27,7 +27,7 @@ export default {
},
"selector": {
"title": "اختر طريقة الشحن",
"freeShippingInfo": "💡 شحن مجاني للطلبات فوق 100€!",
"freeShippingInfo": "💡 الشحن مجاني من قيمة طلب 100€!",
"remainingForFree": "أضف {{amount}}€ أخرى للشحن المجاني.",
"congratsFreeShipping": "🎉 مبروك! حصلت على شحن مجاني!",
"cartQualifiesFree": "سلة مشترياتك بقيمة {{amount}}€ مؤهلة للشحن المجاني."

View File

@@ -46,5 +46,5 @@ export default {
"confirm": "إلغاء الطلب",
"cancelling": "جارٍ الإلغاء..."
},
"processing": "يتم إكمال الطلب...",
"processing": "يتم إكمال الطلب..."
};

View File

@@ -1,7 +1,7 @@
export default {
"seeds": "بذور",
"stecklinge": "قصاصات",
"oilPress": "استعارة معصرة زيت",
"oilPress": "استعارة معصرة الزيت",
"thcTest": "اختبار THC",
"address1": "Trachenberger Straße 14",
"address2": "01129 Dresden",

View File

@@ -8,7 +8,7 @@ export default {
"termsAccept": "Прочетох Общите условия, Политиката за поверителност и разпоредбите за правото на отказ",
"selectDeliveryMethod": "Изберете метод на доставка",
"selectPaymentMethod": "Изберете метод на плащане",
"orderSummary": "Обобщение на поръчката",
"orderSummary": "Резюме на поръчката",
"addressValidationError": "Моля, проверете въведените данни в полетата за адрес.",
"processingOrder": "Поръчката се обработва...",
"completeOrder": "Завърши поръчката",

View File

@@ -21,9 +21,9 @@ export default {
"sperrgut": "28.99 €"
},
"times": {
"cutting14Days": "Срок за доставка: 14 дни",
"standard2to3Days": "Срок за доставка: 2-3 дни",
"supplier7to9Days": "Срок за доставка: 7-9 дни"
"cutting14Days": "Срок на доставка: 14 дни",
"standard2to3Days": "Срок на доставка: 2-3 дни",
"supplier7to9Days": "Срок на доставка: 7-9 дни"
},
"selector": {
"title": "Изберете метод на доставка",

View File

@@ -4,9 +4,9 @@ export default {
"deliveryTerms": {
"1": "Доставката отнема между 1 и 7 дни.",
"2": "Стоките остават собственост на Growheads до пълното им заплащане.",
"3": "Ако се подозира, че стоките са повредени по време на транспорта или липсват артикули, опаковката за изпращане трябва да се запази за преглед от експерт. Всякакви повреди на опаковката трябва да бъдат потвърдени от превозвача в товарителницата, като се посочи видът и обхватът. Повредите при транспортиране трябва незабавно да бъдат съобщени на Growheads писмено по факс, имейл или поща. За това трябва да се направят снимки на повредените стоки, както и на повредената опаковка за изпращане с етикета с адреса. Повредената опаковка за изпращане също трябва да се запази. Те са необходими за предявяване на претенция към транспортната фирма.",
"3": "Ако се подозира, че стоките са повредени по време на транспорта или липсват артикули, опаковката за изпращане трябва да се запази за преглед от експерт. Всяка повреда на опаковката трябва да бъде потвърдена от превозвача в товарителницата, като се посочи видът и обхватът. Повредите при транспортиране трябва незабавно да бъдат съобщени на Growheads писмено чрез факс, имейл или по пощата. За това трябва да се направят снимки на повредените стоки, както и на повредената опаковка за изпращане с етикета с адреса. Повредената опаковка също трябва да се запази. Те са необходими за предявяване на претенция към транспортната фирма.",
"4": "При връщане на дефектни стоки клиентът трябва да се увери, че стоките са правилно опаковани.",
"5": "Всички връщания трябва да бъдат предварително регистрирани в Growheads.",
"5": "Всички връщания трябва да бъдат предварително регистрирани при Growheads.",
"6": "Рискът при изпращане на артикули към нас се носи от клиента, освен ако не става въпрос за връщане на дефектни стоки.",
"7": "Growheads има право да организира вземането на стоките от Deutsche Post/GLS или превозвач по свой избор.",
"8": "Разходите за пощенски услуги се изчисляват според теглото. Growheads си запазва правото да прехвърля евентуални увеличения на цените от транспортните компании (такси, горивни надбавки).",
@@ -15,7 +15,7 @@ export default {
"11": "Плащането може да се извърши предварително чрез банков превод по посочената банкова сметка.",
"12": "Ако има забавяне на доставката, за което ние носим отговорност, срокът за предоставяне на допълнителен срок, който купувачът има право да определи, е ограничен до две седмици. Срокът започва с получаването на уведомлението за допълнителния срок от Growheads.",
"13": "Очевидни дефекти на стоките трябва да бъдат съобщени писмено незабавно след доставката. Ако клиентът не го направи, претенции по гаранцията за очевидни дефекти са изключени.",
"14": "Ако клиентът подаде рекламация за дефект, той трябва да върне дефектните стоки при нас с възможно най-точно описание на дефекта. Копие от нашата фактура трябва да бъде приложено към пратката. Стоките трябва да бъдат върнати в оригиналната опаковка или в опаковка, която защитава стоките по същия начин като оригиналната, за да се избегнат повреди по време на връщането."
"14": "Ако клиентът подаде рекламация за дефект, той трябва да върне дефектните стоки при нас с възможно най-точно описание на дефекта. Към пратката трябва да бъде приложено копие от нашата фактура. Стоките трябва да бъдат върнати в оригиналната опаковка или в опаковка, която защитава стоките по същия начин като оригиналната, за да се избегнат повреди по време на връщането."
},
"consultationLiability": {
"title": "Консултации и отговорност",
@@ -41,7 +41,7 @@ export default {
},
"2": {
"title": "Резервация",
"content": "Ако не всички поръчани артикули са налични за доставка, си запазваме правото да извършваме частични доставки, ако това е разумно за клиента. Отделни артикули могат да се различават от илюстрациите и описанията в каталога и на уебсайта. Това важи особено за стоки, изработени ръчно. Затова си запазваме правото да доставяме стоки с равностойно качество и цена, ако е необходимо."
"content": "Ако не всички поръчани артикули са налични за доставка, си запазваме правото на частични доставки, ако това е разумно за клиента. Отделни артикули могат да се различават от илюстрациите и описанията в каталога и на уебсайта. Това важи особено за стоки, изработени ръчно. Затова си запазваме правото да доставим стоки с равностойно качество и цена, ако е необходимо."
},
"3": {
"title": "Цени и данъци",
@@ -54,7 +54,7 @@ export default {
},
"6": {
"title": "Право на връщане / Право на отказ",
"content": "Клиентът има 14-дневно право на връщане.\nСрокът започва с получаването на стоките от клиента и се спазва чрез навременното изпращане на отказа до Growheads. Изключени от това са храни и други бързоразвалящи се стоки, както и поръчки по индивидуален дизайн или стоки, специално поръчани по желание на клиента. Връщането трябва да се извърши чрез изпращане на стоките обратно в срока. Ако стоките не могат да бъдат изпратени, в срока трябва да бъде изпратено искане за връщане до нас по писмо, пощенска картичка, имейл или друг траен носител на данни. За спазване на срока е достатъчно навременното изпращане до посочения под точка 7) адрес на фирмата. Отказът не изисква посочване на причина. Цената на покупката и евентуалните разходи за доставка и изпращане ще бъдат възстановени след получаване на стоките от нас. Решаваща е стойността на върнатите стоки към момента на покупката, а не стойността на цялата поръчка. Growheads обикновено може да организира вземането от вас."
"content": "Клиентът има 14-дневно право на връщане.\nСрокът започва с получаването на стоките от клиента и се спазва чрез навременното изпращане на отказа до Growheads. Изключени от това са храни и други бързоразвалящи се стоки, както и поръчки по индивидуален дизайн или стоки, специално поръчани по желание на клиента. Връщането трябва да се извърши чрез изпращане на стоките обратно в срока. Ако стоките не могат да бъдат изпратени, в срока трябва да бъде изпратено искане за връщане до нас по писмо, пощенска картичка, имейл или друг траен носител. За спазване на срока е достатъчно навременното изпращане до посочения под точка 7) адрес на фирмата. Отказът не изисква посочване на причина. Цената на покупката и евентуалните разходи за доставка и изпращане ще бъдат възстановени след получаване на стоките от нас. Решаваща е стойността на върнатите стоки към момента на покупката, а не стойността на цялата поръчка. Growheads обикновено може да организира вземането от вас."
},
"7": {
"title": "Име и адрес на фирмата, рекламации, призовки",

View File

@@ -3,6 +3,6 @@ export default {
"intro": "Във връзка с продажбата на батерии или доставката на устройства, съдържащи батерии, ние сме задължени да ви информираме за следното:",
"returnObligation": "Като краен потребител сте законово задължени да връщате използвани батерии. Можете да върнете стари батерии, които ние имаме или сме имали в продуктовия си асортимент като нови батерии, безплатно в нашия склад за изпращане (адрес за доставка).",
"symbolsInfo": "Символите, показани на батериите, имат следното значение:",
"wasteSymbol": "Символът на пресечената кофа за отпадъци означава, че батерията не трябва да се изхвърля с битовите отпадъци.",
"wasteSymbol": "Символът на пресеченото кошче за отпадъци означава, че батерията не трябва да се изхвърля с битовите отпадъци.",
"chemicalSymbols": "Pb = Батерията съдържа повече от 0,004 масови процента олово\nCd = Батерията съдържа повече от 0,002 масови процента кадмий\nHg = Батерията съдържа повече от 0,0005 масови процента живак."
};

View File

@@ -15,11 +15,11 @@ export default {
},
"disclaimer": {
"title": "Отказ от отговорност:",
"content": "Не поемаме отговорност за съдържанието на външни интернет адреси, свързани на тези страници. Съответните оператори са отговорни за съдържанието на домейни, които не са част от компанията."
"content": "Не поемаме отговорност за съдържанието на външни интернет адреси, свързани на тези страници. Съответните оператори носят отговорност за съдържанието на домейни, които не са част от компанията."
},
"copyright": {
"title": "Клауза за авторски права:",
"content": "Представеното тук съдържание е общо взето защитено с авторски права и може да бъде разпространявано само с писмено разрешение.\nПравата върху фото- или текстов материал от други страни не са ограничени или отменени с тази клауза."
"content": "Представеното тук съдържание обикновено е защитено с авторски права и може да бъде разпространявано само с писмено разрешение.\nПравата върху фото- или текстови материали от трети страни не са ограничени или отменени с тази клауза."
}
}
};

View File

@@ -3,9 +3,9 @@ export default {
"withdrawalRight": "Имате право да се откажете от този договор в рамките на четиринадесет дни без да посочвате причина. Срокът за отказ е четиринадесет дни от деня, в който вие или трето лице, посочено от вас, което не е превозвачът, сте взели притежание на стоките.",
"exerciseWithdrawal": "За да упражните правото си на отказ, трябва да ни уведомите",
"contactInfo": "Growheads\nTrachenberger Straße 14\n01129 Dresden\nE-Mail: service@growheads.de",
"withdrawalProcess": "чрез ясно изявление (например писмо, изпратено по пощата, факс или имейл) за решението ви да се откажете от този договор. Можете да използвате приложената образец-форма за отказ, но това не е задължително. За спазване на срока за отказ е достатъчно да изпратите уведомлението си за упражняване на правото на отказ преди изтичането на срока за отказ.",
"withdrawalProcess": "чрез ясно изявление (например писмо, изпратено по пощата, факс или електронна поща) за решението ви да се откажете от този договор. Можете да използвате приложената образец-форма за отказ, но това не е задължително. За спазване на срока за отказ е достатъчно да изпратите уведомлението си за упражняване на правото на отказ преди изтичането на срока за отказ.",
"consequencesTitle": "Последствия от отказа",
"consequences": "Ако се откажете от този договор, ние ще ви възстановим всички плащания, които сме получили от вас, включително разходите за доставка (с изключение на допълнителните разходи, възникнали поради избора ви на вид доставка, различен от най-евтината стандартна доставка, предлагана от нас), без неоправдано забавяне и най-късно в рамките на четиринадесет дни от деня, в който получихме уведомлението за вашия отказ от този договор. За това възстановяване ще използваме същото платежно средство, което сте използвали при първоначалната транзакция, освен ако изрично не е уговорено друго с вас; в никакъв случай няма да ви бъдат начислявани такси за това възстановяване. Можем да откажем възстановяване, докато не получим обратно стоките или докато не предоставите доказателство, че сте изпратили обратно стоките, в зависимост от това кое настъпи по-рано. Трябва да върнете или предадете стоките без неоправдано забавяне и във всеки случай не по-късно от четиринадесет дни от деня, в който ни уведомите за отказа си от този договор. Срокът се счита за спазен, ако изпратите стоките преди изтичането на четиринадесетдневния срок. Вие носите преки разходи за връщане на стоките. Отговаряте само за намалена стойност на стоките, която се дължи на боравене с тях, различно от необходимото за установяване на характера, характеристиките и функционирането на стоките.",
"consequences": "Ако се откажете от този договор, ние ще ви възстановим всички плащания, които сме получили от вас, включително разходите за доставка (с изключение на допълнителните разходи, възникнали поради избора ви на вид доставка, различен от най-евтината стандартна доставка, предлагана от нас), без неоправдано забавяне и най-късно в рамките на четиринадесет дни от деня, в който получим уведомлението за вашия отказ от този договор. За това възстановяване ще използваме същото средство за плащане, което сте използвали при първоначалната транзакция, освен ако изрично не е уговорено друго с вас; в никакъв случай няма да ви бъдат начислявани такси за това възстановяване. Можем да откажем възстановяване, докато не получим обратно стоките или докато не предоставите доказателство, че сте изпратили обратно стоките, в зависимост от това кое настъпи по-рано. Трябва да изпратите обратно или предадете стоките без неоправдано забавяне и във всеки случай не по-късно от четиринадесет дни от деня, в който ни уведомите за отказа си от този договор. Срокът се счита за спазен, ако изпратите стоките преди изтичането на срока от четиринадесет дни. Вие носите преки разходи за връщането на стоките. Отговаряте само за намаляване на стойността на стоките, което се дължи на боравене с тях, различно от необходимото за установяване на естеството, характеристиките и функционирането на стоките.",
"noWithdrawalTitle": "Уведомление за липса на право на отказ",
"noWithdrawal": "Правото на отказ не се прилага за стоки, които са изработени или пригодени по поръчка на клиента (фолиа и тръби), но може да бъде предоставено по споразумение. Контейнерите за торове, чието уплътнение е премахнато или унищожено при отваряне, също са изключени от правото на отказ.",
"noWithdrawal": "Правото на отказ не се прилага за стоки, които са изработени или пригодени по поръчка на клиента (фолиа и тръби), но може да бъде предоставено по споразумение. Контейнерите за торове, чието уплътнително фолио е премахнато или унищожено при отваряне, също са изключени от правото на отказ.",
};

View File

@@ -17,20 +17,20 @@ export default {
"items": "Артикули",
"total": "Общо",
"actions": "Действия",
"viewDetails": "Виж детайли"
"viewDetails": "Виж подробности"
},
"tooltips": {
"viewDetails": "Виж детайли",
"viewDetails": "Виж подробности",
"cancelOrder": "Отмени поръчката"
},
"noOrders": "Все още не сте направили поръчки.",
"details": {
"title": "Детайли на поръчка: {{orderId}}",
"title": "Подробности за поръчка: {{orderId}}",
"deliveryAddress": "Адрес за доставка",
"invoiceAddress": "Адрес за фактура",
"orderDetails": "Детайли на поръчката",
"deliveryMethod": "Метод на доставка:",
"paymentMethod": "Метод на плащане:",
"orderDetails": "Подробности за поръчката",
"deliveryMethod": "Начин на доставка:",
"paymentMethod": "Начин на плащане:",
"notSpecified": "Не е посочено",
"orderedItems": "Поръчани артикули",
"item": "Артикул",

View File

@@ -1,10 +1,10 @@
export default {
"successful": "Плащането беше успешно!",
"failed": "Плащането не беше успешно",
"failed": "Плащането не бе успешно",
"orderCompleted": "🎉 Вашата поръчка беше успешно завършена! Сега можете да видите вашите поръчки.",
"orderProcessing": "Вашето плащане беше обработено успешно. Поръчката ще бъде завършена автоматично.",
"paymentError": "Вашето плащане не можа да бъде обработено. Моля, опитайте отново или изберете друг метод на плащане.",
"viewOrders": "Вижте моите поръчки",
"viewOrders": "Виж моите поръчки",
"loadingPaymentComponent": "Зареждане на платежния компонент...",
"methods": {
"selectPaymentMethod": "Изберете метод на плащане",
@@ -14,7 +14,7 @@ export default {
"cardPaymentDescription": "Платете с карта или Sofortüberweisung",
"cardPaymentMinAmount": "Платете с карта или Sofortüberweisung (минимална сума: €0.50)",
"cashOnDelivery": "Плащане при доставка",
"cashOnDeliveryDescription": "Платете при доставка (надбавка от €8.99)",
"cashOnDeliveryDescription": "Платете при доставка (надбавка €8.99)",
"cashInStore": "Плащане в магазина",
"cashInStoreDescription": "Платете при получаване",
}

View File

@@ -5,18 +5,18 @@ export default {
"pickupDate": "Na který datum je požadován odběr řízků?",
"note": "Poznámka",
"sameAddress": "Dodací adresa je shodná s fakturační adresou",
"termsAccept": "Přečetl(a) jsem si Obchodní podmínky, Zásady ochrany osobních údajů a ustanovení o právu na odstoupení",
"termsAccept": "Přečetl(a) jsem si Obchodní podmínky, Zásady ochrany osobních údajů a ustanovení o právu na odstoupení od smlouvy",
"selectDeliveryMethod": "Vyberte způsob doručení",
"selectPaymentMethod": "Vyberte způsob platby",
"orderSummary": "Souhrn objednávky",
"addressValidationError": "Zkontrolujte prosím své údaje v polích adresy.",
"processingOrder": "Objednávka se zpracovává...",
"completeOrder": "Dokončit objednávku",
"termsValidationError": "Pro pokračování prosím přijměte Obchodní podmínky, Zásady ochrany osobních údajů a právo na odstoupení.",
"termsValidationError": "Pro pokračování prosím přijměte Obchodní podmínky, Zásady ochrany osobních údajů a právo na odstoupení od smlouvy.",
"addressFields": {
"firstName": "Jméno",
"lastName": "Příjmení",
"addressSupplement": "Doplňující informace k adrese",
"addressSupplement": "Doplňující údaje k adrese",
"street": "Ulice",
"houseNumber": "Číslo domu",
"postalCode": "PSČ",

View File

@@ -8,17 +8,17 @@ export default {
},
"descriptions": {
"standard": "Standardní doprava",
"standardFree": "Standardní doprava - ZDARMA od hodnoty objednávky 100€!",
"notAvailable": "Nelze vybrat, protože jeden nebo více položek lze pouze vyzvednout",
"bulky": "Pro velké a těžké položky",
"standardFree": "Standardní doprava - ZDARMA od objednávky nad 100€!",
"notAvailable": "Nelze vybrat, protože jeden nebo více produktů lze pouze vyzvednout",
"bulky": "Pro velké a těžké předměty",
"pickupOnly": "Pouze osobní odběr"
},
"prices": {
"free": "zdarma",
"freeFrom100": "(zdarma od 100€)",
"dhl": "6.99 €",
"dpd": "4.90 €",
"sperrgut": "28.99 €"
"dhl": "6,99 €",
"dpd": "4,90 €",
"sperrgut": "28,99 €"
},
"times": {
"cutting14Days": "Doba dodání: 14 dní",
@@ -27,7 +27,7 @@ export default {
},
"selector": {
"title": "Vyberte způsob dopravy",
"freeShippingInfo": "💡 Doprava zdarma od hodnoty objednávky 100€!",
"freeShippingInfo": "💡 Doprava zdarma od objednávky nad 100€!",
"remainingForFree": "Přidejte ještě {{amount}}€ pro dopravu zdarma.",
"congratsFreeShipping": "🎉 Gratulujeme! Máte dopravu zdarma!",
"cartQualifiesFree": "Váš košík za {{amount}}€ má nárok na dopravu zdarma."

View File

@@ -1,21 +1,21 @@
export default {
"title": "Všeobecné obchodní podmínky",
"deliveryShippingConditions": "Podmínky dodání a přepravy",
"deliveryShippingConditions": "Podmínky dodání a dopravy",
"deliveryTerms": {
"1": "Doručení trvá mezi 1 a 7 dny.",
"1": "Doprava trvá mezi 1 a 7 dny.",
"2": "Zboží zůstává majetkem Growheads až do úplného zaplacení.",
"3": "Pokud je podezření, že zboží bylo během přepravy poškozeno nebo něco chybí, musí být přepravní obal uchován pro kontrolu znalcem. Jakékoli poškození obalu musí být potvrzeno dopravcem na dodacím listu s uvedením druhu a rozsahu. Škody vzniklé při přepravě musí být neprodleně písemně nahlášeny Growheads faxem, e-mailem nebo poštou. K tomu je nutné pořídit fotografie poškozeného zboží i poškozené přepravní krabice včetně adresního štítku. Poškozená přepravní krabice musí být také uchována. Tyto doklady jsou nezbytné pro uplatnění nároku vůči přepravní společnosti.",
"4": "Při vracení vadného zboží musí zákazník zajistit, aby bylo zboží řádně zabalené.",
"3": "Pokud je podezření, že zboží bylo během přepravy poškozeno nebo něco chybí, musí být přepravní obal uchován pro kontrolu znalcem. Jakékoli poškození obalu musí být potvrzeno dopravcem na dodacím listu s uvedením druhu a rozsahu. Poškození při přepravě musí být Growheads neprodleně písemně nahlášeno faxem, e-mailem nebo poštou. K tomu je nutné pořídit fotografie poškozeného zboží i poškozené přepravní krabice včetně adresního štítku. Poškozená přepravní krabice musí být také uchována. Tyto doklady jsou potřebné k uplatnění nároku vůči přepravní společnosti.",
"4": "Při vrácení vadného zboží musí zákazník zajistit, aby bylo zboží řádně zabalené.",
"5": "Všechny vrácené zásilky musí být předem nahlášeny Growheads.",
"6": "Zákazník nese riziko při zasílání předmětů nám, pokud se nejedná o vrácení vadného zboží.",
"6": "Za riziko při zasílání předmětů k nám nese zákazník odpovědnost, pokud se nejedná o vrácení vadného zboží.",
"7": "Growheads je oprávněn nechat si zboží vyzvednout Deutsche Post/GLS nebo dopravcem dle vlastního výběru.",
"8": "Poštovné se počítá podle hmotnosti. Growheads si vyhrazuje právo přenést případné zvýšení cen přepravních společností (mýtné, příplatky za palivo) na zákazníka.",
"9": "Naše zásilky jsou obvykle odesílány prostřednictvím: GLS, DHL & Deutsche Post AG.",
"10": "U zvláště těžkých nebo objemných položek si vyhrazujeme právo účtovat příplatky k nákladům na doručení. Tyto příplatky jsou obvykle uvedeny v ceníku.",
"8": "Poštovné se počítá podle hmotnosti. Growheads si vyhrazuje právo přenést případné zvýšení cen přepravních společností (mýtné, příplatky za palivo).",
"9": "Naše zásilky jsou obvykle odesílány prostřednictvím: GLS, DHL a Deutsche Post AG.",
"10": "U zvláště těžkých nebo objemných položek si vyhrazujeme právo účtovat příplatky za dopravu. Tyto příplatky jsou obvykle uvedeny v ceníku.",
"11": "Platba může být provedena předem bankovním převodem na uvedený bankovní účet.",
"12": "V případě zpoždění dodávky, za které neseme odpovědnost, je lhůta pro dodatečné plnění, kterou je kupující oprávněn stanovit, omezena na dva týdny. Lhůta začíná dnem doručení výzvy k dodatečnému plnění Growheads.",
"13": "Zjevné vady zboží musí být písemně nahlášeny ihned po dodání. Pokud tak zákazník neučiní, jsou nároky z odpovědnosti za zjevné vady vyloučeny.",
"14": "Pokud zákazník reklamuje vadu, musí nám vadné zboží vrátit s co nejpřesnějším popisem vady. K zásilce musí být přiložena kopie naší faktury. Zboží musí být vráceno v originálním obalu nebo v obalu, který zboží chrání stejně jako originální, aby se předešlo poškození během zpětné přepravy."
"12": "Pokud dojde k prodlení s dodáním, za které jsme odpovědní, je lhůta pro poskytnutí náhradní doby, kterou může kupující stanovit, omezena na dva týdny. Lhůta začíná dnem doručení oznámení o náhradní lhůtě Growheads.",
"13": "Zjevné vady zboží musí být písemně nahlášeny ihned po dodání. Pokud tak zákazník neučiní, jsou nároky z odpovědnosti za vady zjevné povahy vyloučeny.",
"14": "Pokud zákazník reklamuje vadu, musí nám vadné zboží vrátit s co nejpřesnějším popisem vady. K zásilce musí být přiložena kopie naší faktury. Zboží musí být vráceno v originálním obalu nebo v obalu, který zboží chrání stejně jako originální, aby se zabránilo poškození během zpětné přepravy."
},
"consultationLiability": {
"title": "Poradenství a odpovědnost",
@@ -29,7 +29,7 @@ export default {
},
"retentionOfTitle": {
"title": "Vlastnické právo",
"content": "Dodané zboží zůstává majetkem Growheads, dokud kupující nezaplatí všechny vůči němu existující pohledávky. Pokud prodávající zboží prodá dál, tímto postoupí nám pohledávky vzniklé z prodeje. Pokud kupující zpozdí platby, můžeme kdykoli požadovat vrácení zboží, aniž bychom odstoupili od smlouvy."
"content": "Dodané zboží zůstává majetkem Growheads, dokud kupující nezaplatí všechny vůči němu existující pohledávky. Pokud prodávající zboží prodá dál, tímto nám postoupí pohledávky vzniklé z prodeje. Pokud kupující není včas se svými platbami, můžeme kdykoli požadovat vrácení zboží, aniž bychom odstoupili od smlouvy."
},
"distanceSelling": {
"title": "Informace podle zákona o prodeji na dálku",
@@ -54,7 +54,7 @@ export default {
},
"6": {
"title": "Právo na vrácení / právo na odstoupení",
"content": "Zákazník má 14denní právo na vrácení.\nLhůta začíná dnem převzetí zboží zákazníkem a je dodržena včasným odesláním odstoupení od smlouvy Growheads. Výjimkou jsou potraviny a jiné rychle se kazící zboží, stejně jako zboží vyrobené na zakázku nebo zboží speciálně objednané na přání zákazníka. Vrácení musí být provedeno zasláním zboží zpět v rámci lhůty. Pokud zboží nelze zaslat, musí být v rámci lhůty zaslána žádost o vrácení dopisem, pohlednicí, e-mailem nebo jiným trvalým nosičem dat. Pro dodržení lhůty stačí včasné odeslání na firemní adresu uvedenou v bodě 7). Odstoupení nevyžaduje uvedení důvodu. Kupní cena a případné náklady na dodání a přepravu budou po obdržení zboží vráceny. Rozhodující je hodnota vráceného zboží v době nákupu, nikoli hodnota celé objednávky. Growheads obvykle zajistí vyzvednutí u vás."
"content": "Zákazník má 14denní právo na vrácení.\nLhůta začíná dnem převzetí zboží zákazníkem a je dodržena včasným odesláním odstoupení od smlouvy Growheads. Výjimkou jsou potraviny a další rychle se kazící zboží, stejně jako zboží vyrobené na zakázku nebo zboží speciálně objednané na přání zákazníka. Vrácení musí být provedeno zasláním zboží zpět v rámci lhůty. Pokud zboží nelze odeslat, musí být v rámci lhůty zaslána žádost o vrácení dopisem, pohlednicí, e-mailem nebo jiným trvalým nosičem dat. K dodržení lhůty stačí včasné odeslání na adresu společnosti uvedenou v bodě 7). Odstoupení od smlouvy není třeba zdůvodňovat. Kupní cena a případné náklady na dodání a dopravu budou po obdržení zboží u nás vráceny. Rozhodující je hodnota vráceného zboží v době nákupu, nikoli hodnota celé objednávky. Growheads obvykle zajistí vyzvednutí u vás."
},
"7": {
"title": "Název a adresa společnosti, reklamace, předvolání",

View File

@@ -1,8 +1,8 @@
export default {
"title": "Informace o zákoně o bateriích",
"intro": "V souvislosti s prodejem baterií nebo dodávkou zařízení obsahujících baterie jsme povinni vás informovat o následujícím:",
"returnObligation": "Jako konečný uživatel jste zákonně povinni vrátit použité baterie. Staré baterie, které máme nebo jsme měli v našem sortimentu jako nové baterie, můžete bezplatně vrátit na naše expediční sklad (expediční adresa).",
"returnObligation": "Jako koncový uživatel jste zákonně povinni vracet použité baterie. Staré baterie, které máme nebo jsme měli v našem sortimentu jako nové baterie, můžete bezplatně vrátit na naše expediční sklad (expediční adresa).",
"symbolsInfo": "Symboly zobrazené na bateriích mají následující význam:",
"wasteSymbol": "Symbol přeškrtnuté popelnice znamená, že baterii nesmí být likvidována spolu s domácím odpadem.",
"wasteSymbol": "Symbol přeškrtnuté popelnice znamená, že baterie nesmí být likvidována spolu s komunálním odpadem.",
"chemicalSymbols": "Pb = Baterie obsahuje více než 0,004 hmotnostního procenta olova\nCd = Baterie obsahuje více než 0,002 hmotnostního procenta kadmia\nHg = Baterie obsahuje více než 0,0005 hmotnostního procenta rtuti."
};

View File

@@ -18,8 +18,8 @@ export default {
"content": "Nebereme žádnou odpovědnost za obsah externích internetových adres odkazovaných na těchto stránkách. Za obsah cizích provozoven jsou odpovědní příslušní provozovatelé."
},
"copyright": {
"title": "Ustanovení o autorských právech:",
"content": "Zde uvedený obsah je obecně chráněn autorským právem a může být šířen pouze s písemným svolením.\nPráva k fotografickému nebo textovému materiálu od jiných subjektů nejsou tímto ustanovením omezena ani zrušena."
"title": "Klausule o autorských právech:",
"content": "Zde uvedený obsah je obecně chráněn autorským právem a může být šířen pouze s písemným svolením.\nPráva k fotografickému nebo textovému materiálu od jiných stran nejsou touto klauzulí omezena ani zrušena."
}
}
};

View File

@@ -3,9 +3,9 @@ export default {
"withdrawalRight": "Máte právo odstoupit od této smlouvy do čtrnácti dnů bez udání důvodu. Lhůta pro odstoupení je čtrnáct dní ode dne, kdy jste vy nebo třetí osoba vámi určená, která není dopravcem, převzali zboží.",
"exerciseWithdrawal": "Pro uplatnění práva na odstoupení nás musíte informovat",
"contactInfo": "Growheads\nTrachenberger Straße 14\n01129 Dresden\nE-Mail: service@growheads.de",
"withdrawalProcess": "jasným prohlášením (např. dopisem zaslaným poštou, faxem nebo e-mailem) o vašem rozhodnutí odstoupit od této smlouvy. K tomuto účelu můžete použít přiložený vzorový formulář pro odstoupení, není to však povinné. Pro dodržení lhůty pro odstoupení stačí, když nám oznámení o uplatnění práva na odstoupení odešlete před uplynutím této lhůty.",
"withdrawalProcess": "jasným prohlášením (např. dopisem zaslaným poštou, faxem nebo e-mailem) o vašem rozhodnutí odstoupit od této smlouvy. K tomuto účelu můžete použít přiložený vzorový formulář pro odstoupení, který však není povinný. Pro dodržení lhůty pro odstoupení stačí, když odešlete oznámení o uplatnění práva na odstoupení před uplynutím této lhůty.",
"consequencesTitle": "Následky odstoupení",
"consequences": "Pokud odstoupíte od této smlouvy, vrátíme vám všechny platby, které jsme od vás obdrželi, včetně nákladů na dodání (s výjimkou dodatečných nákladů vzniklých vaším výběrem jiného způsobu dodání než nejlevnějšího standardního dodání, které nabízíme), bez zbytečného odkladu a nejpozději do čtrnácti dnů ode dne, kdy jsme obdrželi oznámení o vašem odstoupení od této smlouvy. Pro tuto refundaci použijeme stejný způsob platby, jaký jste použili při původní transakci, pokud s vámi nebylo výslovně dohodnuto jinak; v žádném případě vám nebudou účtovány poplatky za tuto refundaci. Můžeme odmítnout refundaci, dokud neobdržíme zpět zboží nebo dokud nám nedoložíte, že jste zboží odeslali zpět, podle toho, co nastane dříve. Zboží nám musíte bez zbytečného odkladu a v každém případě nejpozději do čtrnácti dnů ode dne, kdy nás informujete o odstoupení od této smlouvy, zaslat zpět nebo předat. Lhůta je dodržena, pokud zboží odešlete před uplynutím lhůty čtrnácti dnů. Přímé náklady na vrácení zboží nesete vy. Odpovídáte pouze za snížení hodnoty zboží způsobené zacházením jiným, než je nezbytné k určení povahy, vlastností a funkčnosti zboží.",
"consequences": "Pokud odstoupíte od této smlouvy, vrátíme vám všechny platby, které jsme od vás obdrželi, včetně nákladů na dodání (s výjimkou dodatečných nákladů vzniklých vaším výběrem jiného způsobu dodání než nejlevnějšího standardního dodání nabízeného námi), bez zbytečného odkladu a nejpozději do čtrnácti dnů ode dne, kdy jsme obdrželi oznámení o vašem odstoupení od této smlouvy. Pro tuto refundaci použijeme stejný způsob platby, jaký jste použili při původní transakci, pokud s vámi nebylo výslovně dohodnuto jinak; v žádném případě vám nebudou účtovány poplatky za tuto refundaci. Můžeme odmítnout refundaci, dokud neobdržíme zpět zboží nebo dokud neprokážete, že jste zboží odeslali, podle toho, co nastane dříve. Zboží nám musíte bez zbytečného odkladu a v každém případě nejpozději do čtrnácti dnů ode dne, kdy nás informujete o odstoupení od této smlouvy, vrátit nebo předat. Lhůta je dodržena, pokud zboží odešlete před uplynutím lhůty čtrnácti dnů. Přímé náklady na vrácení zboží nesete vy. Odpovídáte pouze za snížení hodnoty zboží způsobené zacházením jiným, než je nezbytné k určení povahy, vlastností a funkčnosti zboží.",
"noWithdrawalTitle": "Upozornění na neexistenci práva na odstoupení",
"noWithdrawal": "Právo na odstoupení se nevztahuje na zboží vyrobené nebo upravené podle přání zákazníka (folie a hadice), může však být dohodou poskytnuto. Dále jsou z práva na odstoupení vyloučeny nádoby na hnojiva, u nichž bylo odstraněno nebo otevřením zničeno uzavírací pečeť.",
"noWithdrawal": "Právo na odstoupení se nevztahuje na zboží vyrobené nebo upravené podle přání zákazníka (folie a hadice), může však být dohodnuto. Dále jsou z práva na odstoupení vyloučeny nádoby na hnojiva, u kterých bylo odstraněno nebo poškozeno uzavírací pečeť otevřením.",
};

View File

@@ -3,7 +3,7 @@ export default {
"failed": "Platba selhala",
"orderCompleted": "🎉 Vaše objednávka byla úspěšně dokončena! Nyní si můžete prohlédnout své objednávky.",
"orderProcessing": "Vaše platba byla úspěšně zpracována. Objednávka bude automaticky dokončena.",
"paymentError": "Vaši platbu nebylo možné zpracovat. Zkuste to prosím znovu nebo zvolte jiný způsob platby.",
"paymentError": "Vaši platbu se nepodařilo zpracovat. Zkuste to prosím znovu nebo zvolte jiný způsob platby.",
"viewOrders": "Zobrazit mé objednávky",
"loadingPaymentComponent": "Načítání platební komponenty...",
"methods": {
@@ -12,10 +12,10 @@ export default {
"bankTransferDescription": "Zaplaťte bankovním převodem",
"cardPayment": "Karta, Sofortüberweisung, Apple Pay, Google Pay, PayPal",
"cardPaymentDescription": "Zaplaťte kartou nebo Sofortüberweisung",
"cardPaymentMinAmount": "Zaplaťte kartou nebo Sofortüberweisung (minimální částka: €0.50)",
"cardPaymentMinAmount": "Zaplaťte kartou nebo Sofortüberweisung (minimální částka: 0,50 €)",
"cashOnDelivery": "Dobírka",
"cashOnDeliveryDescription": "Zaplaťte při doručení (příplatek €8.99)",
"cashInStore": "Platba na prodejně",
"cashOnDeliveryDescription": "Platba při doručení (příplatek 8,99 €)",
"cashInStore": "Platba v obchodě",
"cashInStoreDescription": "Zaplaťte při vyzvednutí",
}
};

View File

@@ -2,13 +2,13 @@ export default {
"methods": {
"dhl": "DHL",
"dpd": "DPD",
"sperrgut": "Ογκώδη είδη",
"sperrgutName": "Ογκώδη είδη",
"sperrgut": "Χονδρά είδη",
"sperrgutName": "Χονδρά είδη",
"pickup": "Παραλαβή από το κατάστημα"
},
"descriptions": {
"standard": "Κανονική αποστολή",
"standardFree": "Κανονική αποστολή - ΔΩΡΕΑΝ από παραγγελίες άνω των 100€!",
"standard": "Τυπική αποστολή",
"standardFree": "Τυπική αποστολή - ΔΩΡΕΑΝ από παραγγελίες άνω των 100€!",
"notAvailable": "Δεν είναι επιλέξιμο γιατί ένα ή περισσότερα είδη μπορούν να παραληφθούν μόνο από το κατάστημα",
"bulky": "Για μεγάλα και βαριά αντικείμενα",
"pickupOnly": "Μόνο παραλαβή"
@@ -27,9 +27,9 @@ export default {
},
"selector": {
"title": "Επιλέξτε μέθοδο αποστολής",
"freeShippingInfo": "💡 Δωρεάν αποστολή από 100€ παραγγελία!",
"freeShippingInfo": "💡 Δωρεάν αποστολή από παραγγελίες άνω των 100€!",
"remainingForFree": "Προσθέστε ακόμα {{amount}}€ για δωρεάν αποστολή.",
"congratsFreeShipping": "🎉 Συγχαρητήρια! Έχετε δωρεάν αποστολή!",
"cartQualifiesFree": "Το καλάθι σας των {{amount}}€ πληροί τις προϋποθέσεις για δωρεάν αποστολή."
"cartQualifiesFree": "Το καλάθι σας αξίας {{amount}}€ δικαιούται δωρεάν αποστολή."
}
};

View File

@@ -3,58 +3,58 @@ export default {
"deliveryShippingConditions": "Όροι Παράδοσης & Αποστολής",
"deliveryTerms": {
"1": "Η αποστολή διαρκεί από 1 έως 7 ημέρες.",
"2": "Τα εμπορεύματα παραμένουν ιδιοκτησία της Growheads μέχρι να ληφθεί πλήρης πληρωμή.",
"2": "Τα εμπορεύματα παραμένουν ιδιοκτησία της Growheads μέχρι να ληφθεί η πλήρης πληρωμή.",
"3": "Εάν υπάρχει υποψία ότι τα εμπορεύματα έχουν υποστεί ζημιά κατά τη μεταφορά ή λείπουν αντικείμενα, η συσκευασία αποστολής πρέπει να διατηρηθεί για επιθεώρηση από εμπειρογνώμονα. Οποιαδήποτε ζημιά στη συσκευασία πρέπει να επιβεβαιωθεί από τον μεταφορέα στο δελτίο παράδοσης, προσδιορίζοντας τον τύπο και την έκταση. Οι ζημιές κατά την αποστολή πρέπει να αναφέρονται αμέσως γραπτώς στη Growheads μέσω φαξ, email ή ταχυδρομείου. Για αυτό απαιτούνται φωτογραφίες των κατεστραμμένων εμπορευμάτων καθώς και της κατεστραμμένης συσκευασίας αποστολής μαζί με την ετικέτα διεύθυνσης. Η κατεστραμμένη συσκευασία αποστολής πρέπει επίσης να διατηρηθεί. Αυτά απαιτούνται για την αξίωση αποζημίωσης από την εταιρεία μεταφορών.",
"4": "Κατά την επιστροφή ελαττωματικών εμπορευμάτων, ο πελάτης πρέπει να διασφαλίσει ότι τα εμπορεύματα είναι σωστά συσκευασμένα.",
"5": "Όλες οι επιστροφές πρέπει να καταχωρούνται εκ των προτέρων στη Growheads.",
"6": "Ο πελάτης φέρει τον κίνδυνο για την αποστολή αντικειμένων σε εμάς, εκτός εάν πρόκειται για επιστροφή ελαττωματικών εμπορευμάτων.",
"6": "Ο πελάτης φέρει τον κίνδυνο για την αποστολή αντικειμένων σε εμάς, εκτός αν πρόκειται για επιστροφή ελαττωματικών εμπορευμάτων.",
"7": "Η Growheads έχει το δικαίωμα να παραλάβει τα εμπορεύματα μέσω Deutsche Post/GLS ή μεταφορέα της επιλογής της.",
"8": "Τα έξοδα αποστολής υπολογίζονται βάσει βάρους. Η Growheads διατηρεί το δικαίωμα να μεταβιβάσει τυχόν αυξήσεις τιμών από τις εταιρείες μεταφορών (διόδια, επιβαρύνσεις καυσίμων).",
"8": "Τα έξοδα αποστολής υπολογίζονται βάσει βάρους. Η Growheads διατηρεί το δικαίωμα να μετακυλίσει τυχόν αυξήσεις τιμών από τις εταιρείες αποστολής (διόδια, επιβαρύνσεις καυσίμων).",
"9": "Τα πακέτα μας αποστέλλονται συνήθως με: GLS, DHL & Deutsche Post AG.",
"10": "Για ιδιαίτερα βαριά ή ογκώδη αντικείμενα, διατηρούμε το δικαίωμα να επιβάλλουμε επιβαρύνσεις στα έξοδα παράδοσης. Αυτές οι επιβαρύνσεις αναφέρονται συνήθως στον τιμοκατάλογο.",
"11": "Η πληρωμή μπορεί να γίνει προκαταβολικά με τραπεζική μεταφορά στον καθορισμένο τραπεζικό λογαριασμό.",
"12": "Σε περίπτωση καθυστέρησης παράδοσης για την οποία ευθυνόμαστε, η προθεσμία χάριτος που δικαιούται να θέσει ο αγοραστής περιορίζεται σε δύο εβδομάδες. Η προθεσμία αρχίζει με την παραλαβή της ειδοποίησης προθεσμίας από τη Growheads.",
"13": "Προφανή ελαττώματα στα εμπορεύματα πρέπει να αναφέρονται γραπτώς αμέσως μετά την παράδοση. Εάν ο πελάτης δεν το πράξει, αποκλείονται αξιώσεις εγγύησης για προφανή ελαττώματα.",
"14": "Εάν ο πελάτης διαμαρτύρεται για ελάττωμα, πρέπει να επιστρέψει τα ελαττωματικά εμπορεύματα σε εμάς με όσο το δυνατόν ακριβέστερη περιγραφή του ελαττώματος. Στην αποστολή πρέπει να επισυνάπτεται αντίγραφο του τιμολογίου μας. Τα εμπορεύματα πρέπει να επιστραφούν στην αρχική συσκευασία ή σε συσκευασία που προστατεύει τα εμπορεύματα με τον ίδιο τρόπο όπως η αρχική, ώστε να αποφευχθούν ζημιές κατά τη μεταφορά επιστροφής."
"14": "Εάν ο πελάτης διαμαρτύρεται για ελάττωμα, πρέπει να επιστρέψει τα ελαττωματικά εμπορεύματα σε εμάς με όσο το δυνατόν ακριβέστερη περιγραφή του ελαττώματος. Στην αποστολή πρέπει να επισυνάπτεται αντίγραφο του τιμολογίου μας. Τα εμπορεύματα πρέπει να επιστραφούν στην αρχική συσκευασία ή σε συσκευασία που προστατεύει τα εμπορεύματα με τον ίδιο τρόπο όπως η αρχική, ώστε να αποφευχθούν ζημιές κατά τη μεταφορά επιστροφής.",
},
"consultationLiability": {
"title": "Συμβουλευτική και Ευθύνη",
"1": "Παρέχουμε τεχνικές συμβουλές εφαρμογής με βάση τις γνώσεις και την εμπειρία μας.",
"2": "Ο αγοραστής είναι υπεύθυνος για τη συμμόρφωση με τις νομικές διατάξεις σχετικά με την αποθήκευση, τη μεταφορά και τη χρήση των εμπορευμάτων μας."
"1": "Παρέχουμε τεχνικές συμβουλές εφαρμογής με βάση την εμπειρία και τις γνώσεις μας, κατά το καλύτερο γνώρισμά μας.",
"2": "Ο αγοραστής είναι υπεύθυνος για την τήρηση των νομικών διατάξεων σχετικά με την αποθήκευση, τη μεταφορά και τη χρήση των εμπορευμάτων μας.",
},
"paymentConditions": {
"title": "Όροι Πληρωμής",
"1": "Τα εμπορεύματα παραμένουν ιδιοκτησία της Growheads μέχρι να ληφθεί πλήρης πληρωμή.",
"2": "Τα τιμολόγια πληρώνονται προκαταβολικά με τραπεζική μεταφορά στον λογαριασμό μας. Εάν πληρώσετε προκαταβολικά, τα εμπορεύματα θα αποσταλούν μόλις το ποσό πιστωθεί στον λογαριασμό μας."
"1": "Τα εμπορεύματα παραμένουν ιδιοκτησία της Growheads μέχρι να ληφθεί η πλήρης πληρωμή.",
"2": "Τα τιμολόγια πληρώνονται προκαταβολικά με τραπεζική μεταφορά στον λογαριασμό μας. Εάν πληρώσετε προκαταβολικά, τα εμπορεύματα θα αποσταλούν μόλις πιστωθεί το ποσό στον λογαριασμό μας.",
},
"retentionOfTitle": {
"title": "Διατήρηση Ιδιοκτησίας",
"content": "Τα παραδοθέντα εμπορεύματα παραμένουν ιδιοκτησία της Growheads μέχρι ο αγοραστής να έχει εξοφλήσει όλες τις απαιτήσεις εναντίον του. Εάν ο πωλητής μεταπωλήσει τα εμπορεύματα, εκχωρεί ήδη σε εμάς τις απαιτήσεις που προκύπτουν από την πώληση. Εάν ο αγοραστής καθυστερεί τις πληρωμές του, μπορούμε οποτεδήποτε να απαιτήσουμε την επιστροφή των εμπορευμάτων χωρίς να αποχωρήσουμε από τη σύμβαση."
"content": "Τα παραδοθέντα εμπορεύματα παραμένουν ιδιοκτησία της Growheads μέχρι ο αγοραστής να έχει εξοφλήσει όλες τις απαιτήσεις εναντίον του. Εάν ο πωλητής μεταπωλήσει τα εμπορεύματα, εκχωρεί ήδη σε εμάς τις απαιτήσεις που προκύπτουν από την πώληση. Εάν ο αγοραστής καθυστερεί τις πληρωμές του, μπορούμε οποτεδήποτε να απαιτήσουμε την επιστροφή των εμπορευμάτων χωρίς να αποσύρουμε τη σύμβαση.",
},
"distanceSelling": {
"title": "Πληροφορίες σύμφωνα με το Νόμο περί Πωλήσεων από Απόσταση",
"intro": "Οι ακόλουθες πληροφορίες ισχύουν μόνο για συμβάσεις που συνάπτονται μεταξύ της Growheads και καταναλωτών μέσω παραγγελίας καταλόγου, παραγγελίας μέσω διαδικτύου ή άλλων μέσων επικοινωνίας από απόσταση. Περιορίζονται σε καταναλωτές εντός της ΕΕ.",
"intro": "Οι ακόλουθες πληροφορίες ισχύουν μόνο για συμβάσεις που συνάπτονται μεταξύ της Growheads και καταναλωτών μέσω παραγγελίας καταλόγου, παραγγελίας μέσω διαδικτύου ή άλλων μέσων εξ αποστάσεως επικοινωνίας. Περιορίζονται σε καταναλωτές εντός της ΕΕ.",
"sections": {
"1": {
"title": "Βασικά Χαρακτηριστικά των Εμπορευμάτων",
"content": "Παρακαλούμε ανατρέξτε στις εξηγήσεις στον κατάλογο ή στην ιστοσελίδα μας για τα βασικά χαρακτηριστικά των εμπορευμάτων. Οι προσφορές στον κατάλογό μας και στην ιστοσελίδα μας είναι μη δεσμευτικές. Οι παραγγελίες που γίνονται σε εμάς θεωρούνται δεσμευτικές προσφορές. Η Growheads μπορεί να τις αποδεχτεί εντός 14 ημερών από την παραλαβή της παραγγελίας με αποστολή επιβεβαίωσης παραγγελίας ή αποστολή των εμπορευμάτων."
"title": "Ουσιαστικά Χαρακτηριστικά των Εμπορευμάτων",
"content": "Παρακαλούμε ανατρέξτε στις εξηγήσεις στον κατάλογο ή στην ιστοσελίδα μας για τα ουσιαστικά χαρακτηριστικά των εμπορευμάτων. Οι προσφορές στον κατάλογό μας και στην ιστοσελίδα μας είναι μη δεσμευτικές. Οι παραγγελίες που γίνονται σε εμάς θεωρούνται δεσμευτικές προσφορές. Η Growheads μπορεί να τις αποδεχτεί εντός 14 ημερών από την παραλαβή της παραγγελίας με αποστολή επιβεβαίωσης παραγγελίας ή με αποστολή των εμπορευμάτων.",
},
"2": {
"title": "Προϋπόθεση",
"content": "Εάν δεν είναι διαθέσιμα όλα τα παραγγελθέντα είδη για παράδοση, διατηρούμε το δικαίωμα μερικών παραδόσεων, εφόσον αυτό είναι λογικό για τον πελάτη. Μεμονωμένα είδη μπορεί να διαφέρουν από τις απεικονίσεις και τις περιγραφές στον κατάλογο και στην ιστοσελίδα. Αυτό ισχύει ιδιαίτερα για χειροποίητα προϊόντα. Επομένως, διατηρούμε το δικαίωμα να παραδώσουμε προϊόντα ίσης ποιότητας και τιμής, εάν είναι απαραίτητο."
"title": "Αποποίηση",
"content": "Εάν δεν είναι διαθέσιμα όλα τα παραγγελθέντα είδη για παράδοση, διατηρούμε το δικαίωμα μερικών παραδόσεων, εφόσον αυτό είναι λογικό για τον πελάτη. Μεμονωμένα είδη μπορεί να διαφέρουν από τις απεικονίσεις και τις περιγραφές στον κατάλογο και στην ιστοσελίδα. Αυτό ισχύει ιδιαίτερα για χειροποίητα προϊόντα. Επομένως, διατηρούμε το δικαίωμα να παραδώσουμε προϊόντα ίσης ποιότητας και τιμής, εάν είναι απαραίτητο.",
},
"3": {
"title": "Τιμές και Φόροι",
"content": "Μπορείτε να βρείτε τις τιμές των μεμονωμένων ειδών συμπεριλαμβανομένου του ΦΠΑ στον κατάλογο ή στην ιστοσελίδα μας. Οι τιμές παύουν να ισχύουν με την έκδοση νέου καταλόγου."
"content": "Μπορείτε να βρείτε τις τιμές των μεμονωμένων ειδών συμπεριλαμβανομένου του ΦΠΑ στον κατάλογο ή στην ιστοσελίδα μας. Οι τιμές παύουν να ισχύουν με την έκδοση νέου καταλόγου.",
},
"4": "Όλες οι τιμές υπόκεινται σε λάθη ή διακυμάνσεις τιμών. Σε περίπτωση αλλαγής τιμής, ο αγοραστής μπορεί να ασκήσει το δικαίωμα επιστροφής.",
"4": "Όλες οι τιμές υπόκεινται σε λάθη ή διακυμάνσεις τιμών. Εάν υπάρξει αλλαγή τιμής, ο αγοραστής μπορεί να ασκήσει το δικαίωμα επιστροφής του.",
"5": {
"title": "Περίοδος Εγγύησης",
"content": "Ισχύει η νόμιμη περίοδος εγγύησης 24 (είκοσι τέσσερις) μηνών. Σε μεμονωμένες περιπτώσεις μπορεί να ισχύουν μεγαλύτερες περίοδοι εάν χορηγηθούν από τον κατασκευαστή."
"content": "Ισχύει η νόμιμη περίοδος εγγύησης των 24 (είκοσι τεσσάρων) μηνών. Σε μεμονωμένες περιπτώσεις μπορεί να ισχύουν μεγαλύτερες περίοδοι εάν χορηγηθούν από τον κατασκευαστή.",
},
"6": {
"title": "Δικαίωμα Επιστροφής / Δικαίωμα Ανάκλησης",
"content": "Ο πελάτης έχει δικαίωμα επιστροφής 14 ημερών.\nΗ προθεσμία αρχίζει με την παραλαβή των εμπορευμάτων από τον πελάτη και τηρείται με την έγκαιρη αποστολή της ανάκλησης στη Growheads. Εξαιρούνται τα τρόφιμα και άλλα ευπαθή προϊόντα, καθώς και προϊόντα κατά παραγγελία ή ειδικά παραγγελθέντα κατόπιν αιτήματος του πελάτη. Η επιστροφή πρέπει να γίνει με αποστολή των εμπορευμάτων εντός της προθεσμίας. Εάν τα εμπορεύματα δεν μπορούν να αποσταλούν, πρέπει εντός της προθεσμίας να αποσταλεί αίτημα επιστροφής με επιστολή, καρτ ποστάλ, email ή άλλο ανθεκτικό μέσο. Η έγκαιρη αποστολή στη διεύθυνση της εταιρείας που αναφέρεται στο σημείο 7) είναι επαρκής για την τήρηση της προθεσμίας. Η ανάκληση δεν απαιτεί αιτιολόγηση. Το τίμημα αγοράς και τυχόν έξοδα παράδοσης και αποστολής θα επιστραφούν μετά την παραλαβή των εμπορευμάτων από εμάς. Καθοριστική είναι η αξία των επιστρεφόμενων εμπορευμάτων κατά την αγορά, όχι η αξία ολόκληρης της παραγγελίας. Η Growheads μπορεί συνήθως να κανονίσει την παραλαβή από εσάς."
"content": "Ο πελάτης έχει 14 ημέρες δικαίωμα επιστροφής.\nΗ προθεσμία αρχίζει με την παραλαβή των εμπορευμάτων από τον πελάτη και τηρείται με την έγκαιρη αποστολή της ανάκλησης στη Growheads. Εξαιρούνται τα τρόφιμα και άλλα ευπαθή προϊόντα, καθώς και προϊόντα κατά παραγγελία ή ειδικά παραγγελθέντα κατόπιν αιτήματος του πελάτη. Η επιστροφή πρέπει να γίνει με αποστολή των εμπορευμάτων εντός της προθεσμίας. Εάν τα εμπορεύματα δεν μπορούν να αποσταλούν, πρέπει εντός της προθεσμίας να αποσταλεί αίτημα επιστροφής με επιστολή, καρτ ποστάλ, email ή άλλο ανθεκτικό μέσο. Η έγκαιρη αποστολή στη διεύθυνση της εταιρείας που αναφέρεται στο σημείο 7) είναι αρκετή για την τήρηση της προθεσμίας. Η ανάκληση δεν απαιτεί αιτιολόγηση. Το τίμημα αγοράς και τυχόν έξοδα παράδοσης και αποστολής θα επιστραφούν μετά την παραλαβή των εμπορευμάτων από εμάς. Καθοριστική είναι η αξία των επιστραφέντων εμπορευμάτων κατά την αγορά, όχι η αξία ολόκληρης της παραγγελίας. Η Growheads μπορεί συνήθως να κανονίσει την παραλαβή από εσάς.",
},
"7": {
"title": "Όνομα και Διεύθυνση της Εταιρείας, Παραπομπές, Κλήσεις",
@@ -62,7 +62,7 @@ export default {
},
"8": {
"title": "Τόπος Εκτέλεσης και Δικαιοδοσία",
"content": "Ο τόπος εκτέλεσης και η δικαιοδοσία για όλες τις αξιώσεις είναι το Δρέσδη, εκτός εάν υποχρεωτικές νομικές διατάξεις ορίζουν διαφορετικά."
"content": "Ο τόπος εκτέλεσης και η δικαιοδοσία για όλες τις αξιώσεις είναι το Δρέσδη, εκτός εάν υποχρεωτικές νομικές διατάξεις ορίζουν διαφορετικά.",
}
}
}

View File

@@ -1,8 +1,8 @@
export default {
"title": "Πληροφορίες Νόμου για τις Μπαταρίες",
"title": "Πληροφορίες για το Νόμο περί Μπαταριών",
"intro": "Σε σχέση με την πώληση μπαταριών ή την παράδοση συσκευών που περιέχουν μπαταρίες, είμαστε υποχρεωμένοι να σας ενημερώσουμε για τα εξής:",
"returnObligation": "Ως τελικός χρήστης, έχετε νομική υποχρέωση να επιστρέφετε τις χρησιμοποιημένες μπαταρίες. Μπορείτε να επιστρέψετε παλιές μπαταρίες που έχουμε ή είχαμε στο προϊόντικό μας εύρος ως νέες μπαταρίες δωρεάν στην αποθήκη αποστολής μας (διεύθυνση αποστολής).",
"returnObligation": "Ως τελικός χρήστης, έχετε νομική υποχρέωση να επιστρέψετε τις χρησιμοποιημένες μπαταρίες. Μπορείτε να επιστρέψετε παλιές μπαταρίες που έχουμε ή είχαμε στο προϊόντικό μας εύρος ως νέες μπαταρίες δωρεάν στην αποθήκη αποστολής μας (διεύθυνση αποστολής).",
"symbolsInfo": "Τα σύμβολα που εμφανίζονται στις μπαταρίες έχουν τις ακόλουθες σημασίες:",
"wasteSymbol": "Το σύμβολο του διαγραμμένου κάδου απορριμμάτων σημαίνει ότι η μπαταρία δεν πρέπει να απορρίπτεται μαζί με τα οικιακά απορρίμματα.",
"chemicalSymbols": "Pb = Η μπαταρία περιέχει περισσότερο από 0,004% κατά μάζα μόλυβδο\nCd = Η μπαταρία περιέχει περισσότερο από 0,002% κατά μάζα κάδμιο\nHg = Η μπαταρία περιέχει περισσότερο από 0,0005% κατά μάζα υδράργυρο."
"chemicalSymbols": "Pb = Η μπαταρία περιέχει περισσότερο από 0,004% κατά βάρος μόλυβδο\nCd = Η μπαταρία περιέχει περισσότερο από 0,002% κατά βάρος κάδμιο\nHg = Η μπαταρία περιέχει περισσότερο από 0,0005% κατά βάρος υδράργυρο."
};

View File

@@ -15,7 +15,7 @@ export default {
},
"disclaimer": {
"title": "Αποποίηση ευθύνης:",
"content": "Δεν αναλαμβάνουμε καμία ευθύνη για το περιεχόμενο εξωτερικών διαδικτυακών διευθύνσεων που συνδέονται σε αυτές τις σελίδες. Οι αντίστοιχοι φορείς λειτουργίας είναι υπεύθυνοι για το περιεχόμενο μη εταιρικών κατοικιών."
"content": "Δεν αναλαμβάνουμε καμία ευθύνη για το περιεχόμενο εξωτερικών διευθύνσεων διαδικτύου που συνδέονται σε αυτές τις σελίδες. Οι αντίστοιχοι φορείς λειτουργίας είναι υπεύθυνοι για το περιεχόμενο μη εταιρικών τοποθεσιών."
},
"copyright": {
"title": "Ρήτρα πνευματικών δικαιωμάτων:",

View File

@@ -1,11 +1,11 @@
export default {
"title": "Δικαίωμα Ανάκλησης",
"withdrawalRight": "Έχετε το δικαίωμα να ανακαλέσετε αυτή τη σύμβαση εντός δεκατεσσάρων ημερών χωρίς να δώσετε κανέναν λόγο. Η προθεσμία ανάκλησης είναι δεκατέσσερις ημέρες από την ημέρα κατά την οποία εσείς ή τρίτο πρόσωπο που έχετε ορίσει και δεν είναι ο μεταφορέας, έχετε λάβει την κατοχή των αγαθών.",
"withdrawalRight": "Έχετε το δικαίωμα να ανακαλέσετε αυτή τη σύμβαση εντός δεκατεσσάρων ημερών χωρίς να δώσετε κανέναν λόγο. Η περίοδος ανάκλησης είναι δεκατέσσερις ημέρες από την ημέρα κατά την οποία εσείς ή τρίτο πρόσωπο που έχετε ορίσει και δεν είναι ο μεταφορέας, έχετε λάβει την κατοχή των αγαθών.",
"exerciseWithdrawal": "Για να ασκήσετε το δικαίωμά σας ανάκλησης, πρέπει να μας ενημερώσετε",
"contactInfo": "Growheads\nTrachenberger Straße 14\n01129 Dresden\nE-Mail: service@growheads.de",
"withdrawalProcess": "μέσω σαφούς δήλωσης (π.χ. επιστολή που αποστέλλεται ταχυδρομικώς, φαξ ή e-mail) σχετικά με την απόφασή σας να ανακαλέσετε αυτή τη σύμβαση. Μπορείτε να χρησιμοποιήσετε το συνημμένο υπόδειγμα φόρμας ανάκλησης για το σκοπό αυτό, αλλά δεν είναι υποχρεωτικό. Για την τήρηση της προθεσμίας ανάκλησης, αρκεί να αποστείλετε την ειδοποίησή σας σχετικά με την άσκηση του δικαιώματος ανάκλησης πριν λήξει η προθεσμία ανάκλησης.",
"withdrawalProcess": "μέσω σαφούς δήλωσης (π.χ. επιστολή που αποστέλλεται ταχυδρομικώς, φαξ ή e-mail) σχετικά με την απόφασή σας να ανακαλέσετε αυτή τη σύμβαση. Μπορείτε να χρησιμοποιήσετε το συνημμένο υπόδειγμα φόρμας ανάκλησης για αυτόν τον σκοπό, αλλά δεν είναι υποχρεωτικό. Για την τήρηση της προθεσμίας ανάκλησης, αρκεί να αποστείλετε την ειδοποίησή σας σχετικά με την άσκηση του δικαιώματος ανάκλησης πριν λήξει η περίοδος ανάκλησης.",
"consequencesTitle": "Συνέπειες της Ανάκλησης",
"consequences": "Εάν ανακαλέσετε αυτή τη σύμβαση, θα σας επιστρέψουμε όλες τις πληρωμές που έχουμε λάβει από εσάς, συμπεριλαμβανομένων των εξόδων παράδοσης (εκτός από τα πρόσθετα έξοδα που προκύπτουν από την επιλογή σας για τύπο παράδοσης διαφορετικό από την φθηνότερη κανονική παράδοση που προσφέρουμε), χωρίς αδικαιολόγητη καθυστέρηση και το αργότερο εντός δεκατεσσάρων ημερών από την ημέρα που λάβαμε την ειδοποίηση της ανάκλησής σας από αυτή τη σύμβαση. Για αυτή την επιστροφή θα χρησιμοποιήσουμε τον ίδιο τρόπο πληρωμής που χρησιμοποιήσατε για την αρχική συναλλαγή, εκτός αν έχει συμφωνηθεί ρητά διαφορετικά μαζί σας· σε καμία περίπτωση δεν θα σας χρεωθούν τέλη για αυτή την επιστροφή. Μπορούμε να αρνηθούμε την επιστροφή μέχρι να λάβουμε πίσω τα αγαθά ή να μας προσκομίσετε απόδειξη ότι έχετε αποστείλει τα αγαθά, όποιο από τα δύο συμβεί πρώτο. Πρέπει να επιστρέψετε ή να παραδώσετε τα αγαθά σε εμάς χωρίς αδικαιολόγητη καθυστέρηση και σε κάθε περίπτωση όχι αργότερα από δεκατέσσερις ημέρες από την ημέρα που μας ενημερώσατε για την ανάκληση αυτής της σύμβασης. Η προθεσμία τηρείται εάν αποστείλετε τα αγαθά πριν λήξει η περίοδος των δεκατεσσάρων ημερών. Φέρνετε το άμεσο κόστος της επιστροφής των αγαθών. Είστε υπεύθυνοι μόνο για τυχόν μείωση της αξίας των αγαθών που προκύπτει από χειρισμό πέραν αυτού που είναι απαραίτητος για να διαπιστωθεί η φύση, τα χαρακτηριστικά και η λειτουργία των αγαθών.",
"consequences": "Εάν ανακαλέσετε αυτή τη σύμβαση, θα σας επιστρέψουμε όλες τις πληρωμές που έχουμε λάβει από εσάς, συμπεριλαμβανομένων των εξόδων παράδοσης (εκτός από τα πρόσθετα έξοδα που προκύπτουν από την επιλογή σας για έναν τύπο παράδοσης διαφορετικό από την φθηνότερη κανονική παράδοση που προσφέρουμε), χωρίς αδικαιολόγητη καθυστέρηση και το αργότερο εντός δεκατεσσάρων ημερών από την ημέρα που λάβαμε την ειδοποίηση της ανάκλησής σας από αυτή τη σύμβαση. Για αυτήν την επιστροφή θα χρησιμοποιήσουμε τον ίδιο τρόπο πληρωμής που χρησιμοποιήσατε για την αρχική συναλλαγή, εκτός αν έχει συμφωνηθεί ρητά διαφορετικά μαζί σας· σε καμία περίπτωση δεν θα σας χρεωθούν τέλη για αυτήν την επιστροφή. Μπορούμε να αρνηθούμε την επιστροφή μέχρι να λάβουμε πίσω τα αγαθά ή να μας προσκομίσετε απόδειξη ότι έχετε αποστείλει τα αγαθά, όποιο από τα δύο συμβεί πρώτο. Πρέπει να επιστρέψετε ή να παραδώσετε τα αγαθά σε εμάς χωρίς αδικαιολόγητη καθυστέρηση και σε κάθε περίπτωση όχι αργότερα από δεκατέσσερις ημέρες από την ημέρα που μας ενημερώσατε για την ανάκληση αυτής της σύμβασης. Η προθεσμία τηρείται εάν αποστείλετε τα αγαθά πριν λήξει η περίοδος των δεκατεσσάρων ημερών. Φέρνετε το άμεσο κόστος της επιστροφής των αγαθών. Είστε υπεύθυνοι μόνο για τυχόν μείωση της αξίας των αγαθών που προκύπτει από χειρισμό πέραν αυτού που είναι απαραίτητος για να διαπιστωθεί η φύση, τα χαρακτηριστικά και η λειτουργία των αγαθών.",
"noWithdrawalTitle": "Ειδοποίηση για Μη Υπαρξη Δικαιώματος Ανάκλησης",
"noWithdrawal": "Το δικαίωμα ανάκλησης δεν ισχύει για αγαθά που έχουν κατασκευαστεί ή προσαρμοστεί σύμφωνα με τις προδιαγραφές του πελάτη (φιλμ και σωλήνες), αλλά μπορεί να χορηγηθεί κατόπιν συμφωνίας. Δοχεία λιπασμάτων των οποίων η σφραγίδα έχει αφαιρεθεί ή καταστραφεί με το άνοιγμα, εξαιρούνται επίσης από το δικαίωμα ανάκλησης.",
"noWithdrawal": "Το δικαίωμα ανάκλησης δεν ισχύει για αγαθά που έχουν κατασκευαστεί ή προσαρμοστεί σύμφωνα με τις προδιαγραφές του πελάτη (φιλμ και σωλήνες), αλλά μπορεί να χορηγηθεί κατόπιν συμφωνίας. Δοχεία λιπασμάτων των οποίων η σφραγίδα έχει αφαιρεθεί ή καταστραφεί με το άνοιγμα, εξαιρούνται επίσης από το δικαίωμα ανάκλησης."
};

View File

@@ -1,5 +1,5 @@
export default {
"home": "Kiváló kannabisz magok és dugványok",
"home": "Minőségi kannabisz magok és dugványok",
"aktionen": "Aktuális promóciók és ajánlatok",
"filiale": "Üzletünk Drezdában",
};

View File

@@ -1,5 +1,5 @@
export default {
"home": "Dobre nasiona i sadzonki konopi",
"aktionen": "Aktualne promocje i oferty",
"filiale": "Nasz sklep w Dreźnie",
"home": "Dobre Nasiona i Szczepki Konopi",
"aktionen": "Aktualne Promocje i Oferty",
"filiale": "Nasz Sklep w Dreźnie",
};

View File

@@ -1,5 +1,5 @@
export default {
"home": "Semințe și Butași de Cannabis de Calitate",
"aktionen": "Promoții și Oferte Curente",
"filiale": "Magazinul Nostru din Dresden",
"home": "Semințe și butași de cannabis de calitate",
"aktionen": "Promoții și oferte curente",
"filiale": "Magazinul nostru din Dresda",
};

View File

@@ -1,5 +1,5 @@
export default {
"home": "Kvalitné semená a odrezky konope",
"aktionen": "Aktuálne akcie a ponuky",
"filiale": "Náš obchod v Drážďanoch",
"filiale": "Naša predajňa v Drážďanoch",
};

View File

@@ -1,5 +1,5 @@
export default {
"home": "Kvalitetni semenki i reznici kanabisa",
"home": "Kvalitetni seme i reznice kanabisa",
"aktionen": "Trenutne promocije i ponude",
"filiale": "Naša prodavnica u Dresdenu",
};

View File

@@ -1,5 +1,5 @@
export default {
"home": "Kaliteli Kenevir Tohumları ve Çelikleri",
"aktionen": "Mevcut Kampanyalar ve Teklifler",
"aktionen": "Güncel Kampanyalar ve Teklifler",
"filiale": "Dresden'deki Mağazamız",
};

View File

@@ -3,6 +3,7 @@ import ReactDOM from "react-dom/client";
import "./index.css";
import App from "./App.js";
import { BrowserRouter } from "react-router-dom";
import "./services/SocketManager";
// Create a wrapper component with our class-based GoogleAuthProvider
// This avoids the "Invalid hook call" error from GoogleOAuthProvider

View File

@@ -143,10 +143,10 @@ class GrowTentKonfigurator extends Component {
return;
}
if (!this.props.socket || !this.props.socket.connected) {
console.log("Socket not connected yet, waiting for connection to fetch category data");
return;
}
//if (!this.props.socket || !this.props.socket.connected) {
// console.log("Socket not connected yet, waiting for connection to fetch category data");
// return;
//}
console.log(`productList:${categoryId}`);
this.props.socket.off(`productList:${categoryId}`);

View File

@@ -1,205 +0,0 @@
import React, { Component } from "react";
import io from "socket.io-client";
import SocketContext from "../contexts/SocketContext.js";
import { isUserLoggedIn } from "../components/LoginComponent.js";
class SocketProvider extends Component {
constructor(props) {
super(props);
this.socket = null;
this.socketB = null;
this.state = {
connected: false,
connectedB: false,
showPrerenderFallback: true,
};
}
connectToSocket(url) {
if (this.socket) {
this.socket.disconnect();
}
console.log(`SocketProvider: Connecting to socket server... ${url}`);
this.socket = io(url, {
transports: ["polling", "websocket"],
upgrade: true,
rememberUpgrade: true,
});
this.socket.on("connect", () => {
const user = isUserLoggedIn();
console.log("SocketProvider: connected", user);
// Check for ID parameter in URL and emit setId if present
const urlParams = new URLSearchParams(window.location.search);
const id = urlParams.get("id");
if (id) {
console.log("SocketProvider: Emitting setId with ID:", id);
this.socket.emit("setId", { id });
}
if (user && user.isLoggedIn && user.user.token)
this.socket.emit(
"verifyToken",
{ token: user.user.token },
(response) => {
console.log("SocketProvider: verifyToken", response);
if (response.success) {
try {
window.cart = JSON.parse(response.user.cart);
window.dispatchEvent(new CustomEvent("cart"));
} catch (error) {
console.error("Error parsing cart :", response.user, error);
}
} else {
sessionStorage.removeItem("user");
window.location.reload();
}
}
);
this.setState({ connected: true, showPrerenderFallback: false });
console.log("SocketProvider: Socket connected successfully");
});
this.socket.on("disconnect", () => {
this.setState({ connected: false });
console.log("SocketProvider: Socket disconnected");
});
this.socket.on("connect_error", (error) => {
// Only log connection errors in development mode to reduce noise in production
if (process.env.NODE_ENV === "development") {
console.error("SocketProvider: Connection error:", error);
}
this.handleConnectionFailure();
});
this.socket.on("reconnect_attempt", (attemptNumber) => {
console.log(`SocketProvider: Reconnection attempt ${attemptNumber}`);
});
this.socket.on("reconnect_failed", () => {
console.error("SocketProvider: Failed to reconnect");
this.handleConnectionFailure();
});
this.socketB = io(url, {
transports: ["polling", "websocket"],
upgrade: true,
rememberUpgrade: true,
});
this.socketB.on("connect", () => {
console.log("SocketProvider: connectedB");
//this.setState({ connectedB: true });
});
this.socketB.on("disconnect", () => {
//this.setState({ connectedB: false });
console.log("SocketProvider: Socket disconnectedB");
});
this.socketB.on("connect_error", (error) => {
// Only log connection errors in development mode to reduce noise in production
if (process.env.NODE_ENV === "development") {
console.error("SocketProvider: Connection errorB:", error);
}
});
this.socketB.on("reconnect_attempt", (attemptNumber) => {
console.log(`SocketProvider: Reconnection attemptB ${attemptNumber}`);
});
this.socketB.on("reconnect_failed", () => {
console.error("SocketProvider: Failed to reconnectB");
});
this.socketB.waitForConnect = (timeout = 10000) => {
return new Promise((resolve, reject) => {
if (this.socketB.connected) {
resolve();
return;
}
let timeoutId;
const connectHandler = () => {
clearTimeout(timeoutId);
this.socketB.off("connect", connectHandler);
this.socketB.off("connect_error", errorHandler);
resolve();
};
const errorHandler = (error) => {
clearTimeout(timeoutId);
this.socketB.off("connect", connectHandler);
this.socketB.off("connect_error", errorHandler);
reject(new Error(`Socket connection failed: ${error.message}`));
};
// Set up timeout
timeoutId = setTimeout(() => {
this.socketB.off("connect", connectHandler);
this.socketB.off("connect_error", errorHandler);
reject(new Error(`Socket connection timeout after ${timeout}ms`));
}, timeout);
// Add event listeners
this.socketB.on("connect", connectHandler);
this.socketB.on("connect_error", errorHandler);
});
};
}
handleConnectionFailure() {
// Check if prerendered fallback content is available
if (typeof window !== "undefined" && window.__PRERENDER_FALLBACK__) {
console.log("SocketProvider: Using prerendered fallback content");
this.setState({ showPrerenderFallback: true });
}
}
componentDidMount() {
this.connectToSocket(this.props.url);
}
componentWillUnmount() {
if (this.socket) {
console.log("SocketProvider: Disconnecting socket");
this.socket.disconnect();
}
if (this.socketB) {
console.log("SocketProvider: Disconnecting socketB");
this.socketB.disconnect();
}
}
render() {
const showPrerenderFallback = this.state.showPrerenderFallback &&
typeof window !== "undefined" &&
window.__PRERENDER_FALLBACK__;
return (
<SocketContext.Provider value={{socket:this.socket,socketB:this.socketB}}>
{/* Always render children but control visibility style={{ display: this.state.connected ? 'block' : 'none' }}*/}
<div>
{this.props.children}
</div>
{/* Show prerendered fallback when appropriate */}
{showPrerenderFallback && (
<div
dangerouslySetInnerHTML={{
__html: window.__PRERENDER_FALLBACK__.content,
}}
/>
)}
{/* Show default fallback when not connected and no prerendered content {!this.state.connected && !showPrerenderFallback && this.props.fallback} */}
</SocketContext.Provider>
);
}
}
export default SocketProvider;

View File

@@ -14,7 +14,27 @@ class SocketManager {
emit(event, ...args) {
return new Promise((resolve, reject) => {
if (!this.socket.connected) {
// Connect the socket first
this.socket.connect();
// Wait for connection before emitting
this.socket.once('connect', () => {
this.socket.emit(event, ...args);
resolve();
});
// Handle connection error
this.socket.once('connect_error', (error) => {
reject(error);
});
} else {
// Socket already connected, emit directly
this.socket.emit(event, ...args);
resolve();
}
});
}
}

View File

@@ -186,9 +186,9 @@ class InlineCssPlugin {
// Only preload navigation images for main pages (home, categories, aktionen, filiale)
if (!isProductPage && !isSpecialPage) {
criticalImages.forEach(imagePath => {
imagePreloads += `<link rel="preload" href="${imagePath}" as="image">\n`;
});
criticalImages.forEach(imagePath => {
imagePreloads += `<link rel="preload" href="${imagePath}" as="image">\n`;
});
}
// Add inlined CSS to head