Compare commits
21 Commits
0b915db9eb
...
live
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9df5642a6e | ||
|
|
a50dd086c3 | ||
|
|
e88370ff3e | ||
|
|
5d3e0832fe | ||
|
|
3347ba2754 | ||
|
|
013a38ca98 | ||
|
|
2d6c8ff25f | ||
|
|
d2ac8d3fc1 | ||
|
|
8928b3f283 | ||
|
|
87db7ba3ea | ||
|
|
766fef2796 | ||
|
|
a08c90a521 | ||
|
|
10d60d5827 | ||
|
|
905eee57d5 | ||
|
|
3389a9b66c | ||
|
|
d63c385a97 | ||
|
|
1b51da69a9 | ||
|
|
da81479d9b | ||
|
|
d8678e261d | ||
|
|
ef91e50aa5 | ||
|
|
061bf5ff17 |
154
docs/nginx.conf
Normal file
@@ -0,0 +1,154 @@
|
||||
server {
|
||||
client_max_body_size 64M;
|
||||
listen 443 ssl;
|
||||
http2 on;
|
||||
server_name example.de;
|
||||
ssl_certificate /etc/letsencrypt/live/example.de/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/example.de/privkey.pem;
|
||||
|
||||
gzip on;
|
||||
gzip_comp_level 6;
|
||||
gzip_min_length 256;
|
||||
gzip_vary on;
|
||||
gzip_proxied any;
|
||||
gzip_types
|
||||
text/css
|
||||
text/javascript
|
||||
application/javascript
|
||||
application/x-javascript
|
||||
application/json
|
||||
application/xml
|
||||
image/svg+xml;
|
||||
|
||||
index index.html;
|
||||
root /example/dist;
|
||||
|
||||
error_log logs/error.log info;
|
||||
access_log logs/access.log combined;
|
||||
|
||||
location /socket.io/ {
|
||||
proxy_pass http://localhost:9303/socket.io/;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection 'upgrade';
|
||||
proxy_set_header Host $host;
|
||||
proxy_cache_bypass $http_upgrade;
|
||||
|
||||
proxy_connect_timeout 3600s;
|
||||
proxy_send_timeout 3600s;
|
||||
proxy_read_timeout 3600s;
|
||||
send_timeout 3600s;
|
||||
|
||||
proxy_buffering off;
|
||||
proxy_cache off;
|
||||
|
||||
keepalive_timeout 65;
|
||||
keepalive_requests 100;
|
||||
}
|
||||
|
||||
location /api/ {
|
||||
proxy_pass http://localhost:9303/api/;
|
||||
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
proxy_set_header User-Agent $http_user_agent;
|
||||
proxy_set_header Content-Type $content_type;
|
||||
proxy_set_header Content-Length $content_length;
|
||||
|
||||
proxy_set_header X-API-Key $http_x_api_key;
|
||||
|
||||
proxy_connect_timeout 30s;
|
||||
proxy_send_timeout 30s;
|
||||
proxy_read_timeout 30s;
|
||||
proxy_buffering off;
|
||||
|
||||
client_max_body_size 10M;
|
||||
}
|
||||
|
||||
location ^~ /Kategorie/ {
|
||||
types {}
|
||||
default_type text/html;
|
||||
}
|
||||
|
||||
location ^~ /Artikel/ {
|
||||
types {}
|
||||
default_type text/html;
|
||||
}
|
||||
|
||||
location = /sitemap.xml {
|
||||
types {}
|
||||
default_type application/xml;
|
||||
}
|
||||
|
||||
location ~ ^/(datenschutz|impressum|batteriegesetzhinweise|widerrufsrecht|sitemap|agb|Kategorien|Konfigurator|404|profile|resetPassword|thc-test|filiale|aktionen|presseverleih|payment/success)(/|$) {
|
||||
types {}
|
||||
default_type text/html;
|
||||
}
|
||||
|
||||
location = /404 {
|
||||
error_page 404 =404 /404-big.html;
|
||||
return 404;
|
||||
}
|
||||
|
||||
location = /404-big.html {
|
||||
internal;
|
||||
alias /home/seb/src/growheads_de/dist/404;
|
||||
default_type text/html;
|
||||
}
|
||||
|
||||
error_page 404 /404.html;
|
||||
|
||||
location = /404.html {
|
||||
internal;
|
||||
default_type text/html;
|
||||
return 404 '<!doctype html><html><body>
|
||||
<script>
|
||||
if (!navigator.userAgent.includes("bot")) { location.href="/404"; }
|
||||
</script>
|
||||
</body></html>';
|
||||
}
|
||||
|
||||
location ~* \.(js|css)\?.*$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
add_header Vary Accept-Encoding;
|
||||
}
|
||||
|
||||
location ~* \.(js|css)$ {
|
||||
if ($uri ~ "\.[a-f0-9]{7,}\.(js|css)$") {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
break;
|
||||
}
|
||||
expires 1d;
|
||||
add_header Cache-Control "public";
|
||||
add_header Vary Accept-Encoding;
|
||||
}
|
||||
|
||||
location ~* \.(ttf|otf|woff|woff2|eot)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public";
|
||||
add_header Access-Control-Allow-Origin "*";
|
||||
}
|
||||
|
||||
location ~* \.(jpg|jpeg|png|gif|ico|svg|webp)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public";
|
||||
add_header Vary Accept-Encoding;
|
||||
}
|
||||
|
||||
location = /prerender.css {
|
||||
expires 1w;
|
||||
add_header Cache-Control "public";
|
||||
add_header Vary Accept-Encoding;
|
||||
}
|
||||
|
||||
location /assets/ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public";
|
||||
add_header Vary Accept-Encoding;
|
||||
}
|
||||
}
|
||||
6
package-lock.json
generated
@@ -4554,9 +4554,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/caniuse-lite": {
|
||||
"version": "1.0.30001727",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz",
|
||||
"integrity": "sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q==",
|
||||
"version": "1.0.30001757",
|
||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001757.tgz",
|
||||
"integrity": "sha512-r0nnL/I28Zi/yjk1el6ilj27tKcdjLsNqAOZr0yVjWPrSQyHgKI2INaEWw21bAQSv2LXRt1XuCS/GomNpWOxsQ==",
|
||||
"dev": true,
|
||||
"funding": [
|
||||
{
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
"start": "cross-env NODE_OPTIONS=\"--no-deprecation\" webpack serve --progress --mode development --no-open",
|
||||
"start:seedheads": "cross-env PROXY_TARGET=https://seedheads.de NODE_OPTIONS=\"--no-deprecation\" webpack serve --progress --mode development --no-open",
|
||||
"prod": "webpack serve --progress --mode production --no-client-overlay --no-client --no-web-socket-server --no-open --no-live-reload --no-hot --compress --no-devtool",
|
||||
"build:client": "cross-env NODE_ENV=production webpack --progress --mode production && shx cp dist/index.html dist/index_template.html",
|
||||
"build:client": "node scripts/convert-images-to-avif.cjs && cross-env NODE_ENV=production webpack --progress --mode production && shx cp dist/index.html dist/index_template.html",
|
||||
"build": "npm run build:client",
|
||||
"analyze": "cross-env ANALYZE=true NODE_ENV=production webpack --progress --mode production",
|
||||
"lint": "eslint src/**/*.{js,jsx}",
|
||||
|
||||
@@ -159,6 +159,7 @@ const Batteriegesetzhinweise =
|
||||
const Widerrufsrecht = require("./src/pages/Widerrufsrecht.js").default;
|
||||
const Sitemap = require("./src/pages/Sitemap.js").default;
|
||||
const PrerenderSitemap = require("./src/PrerenderSitemap.js").default;
|
||||
const PrerenderCategoriesPage = require("./src/PrerenderCategoriesPage.js").default;
|
||||
const AGB = require("./src/pages/AGB.js").default;
|
||||
const NotFound404 = require("./src/pages/NotFound404.js").default;
|
||||
|
||||
@@ -422,6 +423,14 @@ const renderApp = async (categoryData, socket) => {
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Copy index.html to resetPassword (no file extension) for SPA routing
|
||||
if (config.isProduction) {
|
||||
const indexPath = path.resolve(__dirname, config.outputDir, "index.html");
|
||||
const resetPasswordPath = path.resolve(__dirname, config.outputDir, "resetPassword");
|
||||
fs.copyFileSync(indexPath, resetPasswordPath);
|
||||
console.log(`â
Copied index.html to ${resetPasswordPath}`);
|
||||
}
|
||||
|
||||
// Render static pages
|
||||
console.log("\nđ Rendering static pages...");
|
||||
|
||||
@@ -457,6 +466,13 @@ const renderApp = async (categoryData, socket) => {
|
||||
description: "Sitemap page",
|
||||
needsCategoryData: true,
|
||||
},
|
||||
{
|
||||
component: PrerenderCategoriesPage,
|
||||
path: "/Kategorien",
|
||||
filename: "Kategorien",
|
||||
description: "Categories page",
|
||||
needsCategoryData: true,
|
||||
},
|
||||
{ component: AGB, path: "/agb", filename: "agb", description: "AGB page" },
|
||||
{ component: NotFound404, path: "/404", filename: "404", description: "404 Not Found page" },
|
||||
{
|
||||
@@ -551,8 +567,7 @@ const renderApp = async (categoryData, socket) => {
|
||||
try {
|
||||
productData = await fetchCategoryProducts(socket, category.id);
|
||||
console.log(
|
||||
` â
Found ${
|
||||
productData.products ? productData.products.length : 0
|
||||
` â
Found ${productData.products ? productData.products.length : 0
|
||||
} products`
|
||||
);
|
||||
|
||||
|
||||
@@ -152,7 +152,7 @@ const saveProductImages = async (socket, products, categoryName, outputDir) => {
|
||||
"public",
|
||||
"assets",
|
||||
"images",
|
||||
"sh.png"
|
||||
"sh.avif"
|
||||
);
|
||||
|
||||
// Ensure assets/images directory exists
|
||||
@@ -185,7 +185,7 @@ const saveProductImages = async (socket, products, categoryName, outputDir) => {
|
||||
if (imageIds.length > 0) {
|
||||
// Process first image for each product
|
||||
const bildId = parseInt(imageIds[0]);
|
||||
const estimatedFilename = `prod${bildId}.jpg`; // We'll generate a filename based on the ID
|
||||
const estimatedFilename = `prod${bildId}.avif`; // We'll generate a filename based on the ID
|
||||
|
||||
const imagePath = path.join(assetsPath, estimatedFilename);
|
||||
|
||||
@@ -231,12 +231,12 @@ const saveProductImages = async (socket, products, categoryName, outputDir) => {
|
||||
opacity: 0.3,
|
||||
},
|
||||
])
|
||||
.jpeg() // Ensure output is JPEG
|
||||
.avif() // Ensure output is AVIF
|
||||
.toBuffer();
|
||||
|
||||
fs.writeFileSync(imagePath, processedImageBuffer);
|
||||
console.log(
|
||||
` â
Applied centered inverted sh.png overlay to ${estimatedFilename}`
|
||||
` â
Applied centered inverted sh.avif overlay to ${estimatedFilename}`
|
||||
);
|
||||
} catch (overlayError) {
|
||||
console.log(
|
||||
@@ -281,7 +281,7 @@ const saveCategoryImages = async (socket, categories, outputDir) => {
|
||||
// Debug: Log categories that will be processed
|
||||
console.log(" đ Categories to process:");
|
||||
categories.forEach((cat, index) => {
|
||||
console.log(` ${index + 1}. "${cat.name}" (ID: ${cat.id}) -> cat${cat.id}.jpg`);
|
||||
console.log(` ${index + 1}. "${cat.name}" (ID: ${cat.id}) -> cat${cat.id}.avif`);
|
||||
});
|
||||
|
||||
const assetsPath = path.resolve(
|
||||
@@ -308,7 +308,7 @@ const saveCategoryImages = async (socket, categories, outputDir) => {
|
||||
for (const category of categories) {
|
||||
categoriesProcessed++;
|
||||
|
||||
const estimatedFilename = `cat${category.id}.jpg`; // Use 'cat' prefix with category ID
|
||||
const estimatedFilename = `cat${category.id}.avif`; // Use 'cat' prefix with category ID
|
||||
const imagePath = path.join(assetsPath, estimatedFilename);
|
||||
|
||||
// Skip if image already exists
|
||||
|
||||
@@ -1,6 +1,19 @@
|
||||
const generateCategoryJsonLd = (category, products = [], baseUrl, config) => {
|
||||
// Category IDs to skip (seeds, plants, headshop items)
|
||||
const skipCategoryIds = [689, 706, 709, 711, 714, 748, 749, 896, 710, 924, 923, 922, 921, 916, 278, 259, 258];
|
||||
|
||||
// Check if category ID is in skip list
|
||||
if (category.id && skipCategoryIds.includes(parseInt(category.id))) {
|
||||
return '';
|
||||
}
|
||||
|
||||
const categoryUrl = `${baseUrl}/Kategorie/${category.seoName}`;
|
||||
|
||||
// Calculate price valid date (current date + 3 months)
|
||||
const priceValidDate = new Date();
|
||||
priceValidDate.setMonth(priceValidDate.getMonth() + 3);
|
||||
const priceValidUntil = priceValidDate.toISOString().split("T")[0];
|
||||
|
||||
const jsonLd = {
|
||||
"@context": "https://schema.org/",
|
||||
"@type": "CollectionPage",
|
||||
@@ -42,7 +55,7 @@ const generateCategoryJsonLd = (category, products = [], baseUrl, config) => {
|
||||
product.pictureList && product.pictureList.trim()
|
||||
? `${baseUrl}/assets/images/prod${product.pictureList
|
||||
.split(",")[0]
|
||||
.trim()}.jpg`
|
||||
.trim()}.avif`
|
||||
: `${baseUrl}/assets/images/nopicture.jpg`,
|
||||
description: product.description
|
||||
? product.description.replace(/<[^>]*>/g, "").substring(0, 200)
|
||||
@@ -57,6 +70,7 @@ const generateCategoryJsonLd = (category, products = [], baseUrl, config) => {
|
||||
url: `${baseUrl}/Artikel/${product.seoName}`,
|
||||
price: product.price && !isNaN(product.price) ? product.price.toString() : "0.00",
|
||||
priceCurrency: config.currency,
|
||||
priceValidUntil: priceValidUntil,
|
||||
availability: product.available
|
||||
? "https://schema.org/InStock"
|
||||
: "https://schema.org/OutOfStock",
|
||||
|
||||
@@ -535,7 +535,7 @@ const generateProductsXml = (allProductsData = [], baseUrl, config) => {
|
||||
|
||||
// Generate image URL
|
||||
const imageUrl = product.pictureList && product.pictureList.trim()
|
||||
? `${baseUrl}/assets/images/prod${product.pictureList.split(",")[0].trim()}.jpg`
|
||||
? `${baseUrl}/assets/images/prod${product.pictureList.split(",")[0].trim()}.avif`
|
||||
: `${baseUrl}/assets/images/nopicture.jpg`;
|
||||
|
||||
// Generate brand (manufacturer)
|
||||
|
||||
@@ -5,7 +5,7 @@ const generateProductMetaTags = (product, baseUrl, config) => {
|
||||
product.pictureList && product.pictureList.trim()
|
||||
? `${baseUrl}/assets/images/prod${product.pictureList
|
||||
.split(",")[0]
|
||||
.trim()}.jpg`
|
||||
.trim()}.avif`
|
||||
: `${baseUrl}/assets/images/nopicture.jpg`;
|
||||
|
||||
|
||||
@@ -68,7 +68,7 @@ const generateProductJsonLd = (product, baseUrl, config, categoryInfo = null) =>
|
||||
product.pictureList && product.pictureList.trim()
|
||||
? `${baseUrl}/assets/images/prod${product.pictureList
|
||||
.split(",")[0]
|
||||
.trim()}.jpg`
|
||||
.trim()}.avif`
|
||||
: `${baseUrl}/assets/images/nopicture.jpg`;
|
||||
|
||||
// Clean description for JSON-LD (remove HTML tags)
|
||||
|
||||
BIN
public/assets/images/cutlings.avif
Normal file
|
After Width: | Height: | Size: 5.1 KiB |
BIN
public/assets/images/gg.avif
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
public/assets/images/konfigurator.avif
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
public/assets/images/konfigurator.png
Normal file
|
After Width: | Height: | Size: 362 KiB |
BIN
public/assets/images/maps.avif
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/assets/images/seeds.avif
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
public/assets/images/sh.avif
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
61
scripts/convert-images-to-avif.cjs
Normal file
@@ -0,0 +1,61 @@
|
||||
const sharp = require('sharp');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
const imagesToConvert = [
|
||||
{ src: 'sh.png', dest: 'sh.avif' },
|
||||
{ src: 'seeds.jpg', dest: 'seeds.avif' },
|
||||
{ src: 'cutlings.jpg', dest: 'cutlings.avif' },
|
||||
{ src: 'gg.png', dest: 'gg.avif' },
|
||||
{ src: 'konfigurator.png', dest: 'konfigurator.avif' },
|
||||
{ src: 'maps.png', dest: 'maps.avif' }
|
||||
];
|
||||
|
||||
const run = async () => {
|
||||
const imagesDir = path.join(__dirname, '../public/assets/images');
|
||||
let hasError = false;
|
||||
|
||||
for (const image of imagesToConvert) {
|
||||
const inputPath = path.join(imagesDir, image.src);
|
||||
const outputPath = path.join(imagesDir, image.dest);
|
||||
|
||||
console.log('d');
|
||||
if (!fs.existsSync(inputPath)) {
|
||||
console.warn(`â ïž Input file not found: ${inputPath}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if output file exists and compare modification times
|
||||
// Only convert if source is newer or destination doesn't exist
|
||||
let shouldConvert = true;
|
||||
if (fs.existsSync(outputPath)) {
|
||||
const inputStat = fs.statSync(inputPath);
|
||||
const outputStat = fs.statSync(outputPath);
|
||||
if (inputStat.mtime <= outputStat.mtime) {
|
||||
shouldConvert = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (shouldConvert) {
|
||||
try {
|
||||
await sharp(inputPath)
|
||||
.toFormat('avif')
|
||||
.toFile(outputPath);
|
||||
console.log(`â
Converted ${image.src} to ${image.dest}`);
|
||||
} catch (error) {
|
||||
console.error(`â Error converting ${image.src}:`, error.message);
|
||||
hasError = true;
|
||||
}
|
||||
} else {
|
||||
// Silent skip if already up to date to keep logs clean, or use verbose flag
|
||||
// console.log(`Skipping ${image.src} (already up to date)`);
|
||||
}
|
||||
}
|
||||
|
||||
if (hasError) {
|
||||
process.exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
console.log('dsfs');
|
||||
run();
|
||||
26
scripts/convert-logo-to-avif.js
Normal file
@@ -0,0 +1,26 @@
|
||||
const sharp = require('sharp');
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
|
||||
const run = async () => {
|
||||
const inputPath = path.join(__dirname, '../public/assets/images/sh.png');
|
||||
const outputPath = path.join(__dirname, '../public/assets/images/sh.avif');
|
||||
|
||||
if (!fs.existsSync(inputPath)) {
|
||||
console.error('Input file not found:', inputPath);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
try {
|
||||
await sharp(inputPath)
|
||||
.toFormat('avif')
|
||||
.toFile(outputPath);
|
||||
console.log(`Successfully converted ${inputPath} to ${outputPath}`);
|
||||
} catch (error) {
|
||||
console.error('Error converting image:', error);
|
||||
process.exit(1);
|
||||
}
|
||||
};
|
||||
|
||||
run();
|
||||
|
||||
@@ -50,6 +50,7 @@ const Datenschutz = lazy(() => import(/* webpackChunkName: "legal" */ "./pages/D
|
||||
const AGB = lazy(() => import(/* webpackChunkName: "legal" */ "./pages/AGB.js"));
|
||||
//const NotFound404 = lazy(() => import(/* webpackChunkName: "legal" */ "./pages/NotFound404.js")); <Route path="/404" element={<NotFound404 />} />
|
||||
const Sitemap = lazy(() => import(/* webpackChunkName: "sitemap" */ "./pages/Sitemap.js"));
|
||||
const CategoriesPage = lazy(() => import(/* webpackChunkName: "categories" */ "./pages/CategoriesPage.js"));
|
||||
const Impressum = lazy(() => import(/* webpackChunkName: "legal" */ "./pages/Impressum.js"));
|
||||
const Batteriegesetzhinweise = lazy(() => import(/* webpackChunkName: "legal" */ "./pages/Batteriegesetzhinweise.js"));
|
||||
const Widerrufsrecht = lazy(() => import(/* webpackChunkName: "legal" */ "./pages/Widerrufsrecht.js"));
|
||||
@@ -228,7 +229,7 @@ const AppContent = ({ currentTheme, dynamicTheme, onThemeChange }) => {
|
||||
<TitleUpdater />
|
||||
<ScrollToTop />
|
||||
<Header active categoryId={categoryId} key={authVersion} />
|
||||
<Box sx={{ flexGrow: 1 }}>
|
||||
<Box component="main" sx={{ flexGrow: 1 }}>
|
||||
<Suspense fallback={
|
||||
// Use prerender fallback if available, otherwise show loading spinner
|
||||
typeof window !== "undefined" && window.__PRERENDER_FALLBACK__ ? (
|
||||
@@ -296,6 +297,7 @@ const AppContent = ({ currentTheme, dynamicTheme, onThemeChange }) => {
|
||||
<Route path="/datenschutz" element={<Datenschutz />} />
|
||||
<Route path="/agb" element={<AGB />} />
|
||||
<Route path="/sitemap" element={<Sitemap />} />
|
||||
<Route path="/Kategorien" element={<CategoriesPage />} />
|
||||
<Route path="/impressum" element={<Impressum />} />
|
||||
<Route
|
||||
path="/batteriegesetzhinweise"
|
||||
|
||||
@@ -44,7 +44,7 @@ const PrerenderAppContent = (socket) => (
|
||||
<CategoryList categoryId={209} activeCategoryId={null} socket={socket}/>
|
||||
</AppBar>
|
||||
|
||||
<Box sx={{ flexGrow: 1 }}>
|
||||
<Box component="main" sx={{ flexGrow: 1 }}>
|
||||
<CarouselProvider>
|
||||
<Routes>
|
||||
<Route path="/" element={<MainPageLayout />} />
|
||||
|
||||
118
src/PrerenderCategoriesPage.js
Normal file
@@ -0,0 +1,118 @@
|
||||
import React from 'react';
|
||||
import Box from '@mui/material/Box';
|
||||
import Typography from '@mui/material/Typography';
|
||||
import Paper from '@mui/material/Paper';
|
||||
import LegalPage from './pages/LegalPage.js';
|
||||
import CategoryBox from './components/CategoryBox.js';
|
||||
|
||||
const PrerenderCategoriesPage = ({ categoryData }) => {
|
||||
// Helper function to recursively collect all categories from the tree
|
||||
const collectAllCategories = (categoryNode, categories = [], level = 0) => {
|
||||
if (!categoryNode) return categories;
|
||||
|
||||
// Add current category (skip root category 209)
|
||||
if (categoryNode.id !== 209 && categoryNode.seoName) {
|
||||
categories.push({
|
||||
id: categoryNode.id,
|
||||
name: categoryNode.name,
|
||||
seoName: categoryNode.seoName,
|
||||
level: level
|
||||
});
|
||||
}
|
||||
|
||||
// Recursively add children
|
||||
if (categoryNode.children) {
|
||||
for (const child of categoryNode.children) {
|
||||
collectAllCategories(child, categories, level + 1);
|
||||
}
|
||||
}
|
||||
|
||||
return categories;
|
||||
};
|
||||
|
||||
// The categoryData passed prop is the root tree (id: 209)
|
||||
const rootTree = categoryData;
|
||||
|
||||
const renderLevel1Section = (l1Node) => {
|
||||
// Collect all descendants (excluding the L1 node itself, which collectAllCategories would include first)
|
||||
const descendants = collectAllCategories(l1Node).slice(1);
|
||||
|
||||
return (
|
||||
<Paper
|
||||
key={l1Node.id}
|
||||
elevation={1}
|
||||
sx={{
|
||||
p: 2,
|
||||
mb: 3,
|
||||
display: 'flex',
|
||||
flexDirection: { xs: 'column', md: 'row' },
|
||||
alignItems: { xs: 'flex-start', md: 'flex-start' },
|
||||
gap: 3
|
||||
}}
|
||||
>
|
||||
{/* Level 1 Header/Box */}
|
||||
<Box sx={{
|
||||
minWidth: '150px',
|
||||
display: 'flex',
|
||||
flexDirection: 'column',
|
||||
alignItems: 'center',
|
||||
gap: 1
|
||||
}}>
|
||||
<CategoryBox
|
||||
id={l1Node.id}
|
||||
name={l1Node.name}
|
||||
seoName={l1Node.seoName}
|
||||
sx={{
|
||||
boxShadow: 4,
|
||||
width: '150px',
|
||||
height: '150px'
|
||||
}}
|
||||
/>
|
||||
</Box>
|
||||
|
||||
{/* Descendants area */}
|
||||
<Box sx={{ flex: 1 }}>
|
||||
<Box sx={{
|
||||
display: 'flex',
|
||||
flexWrap: 'wrap',
|
||||
gap: 2
|
||||
}}>
|
||||
{descendants.map((cat) => (
|
||||
<CategoryBox
|
||||
key={cat.id}
|
||||
id={cat.id}
|
||||
name={cat.name}
|
||||
seoName={cat.seoName}
|
||||
sx={{
|
||||
width: '100px',
|
||||
height: '100px',
|
||||
minWidth: '100px',
|
||||
minHeight: '100px',
|
||||
boxShadow: 1,
|
||||
fontSize: '0.9rem'
|
||||
}}
|
||||
/>
|
||||
))}
|
||||
</Box>
|
||||
</Box>
|
||||
</Paper>
|
||||
);
|
||||
};
|
||||
|
||||
const content = (
|
||||
<Box>
|
||||
<Box>
|
||||
{rootTree && rootTree.children && rootTree.children.map((child) => (
|
||||
renderLevel1Section(child)
|
||||
))}
|
||||
{(!rootTree || !rootTree.children || rootTree.children.length === 0) && (
|
||||
<Typography>Keine Kategorien gefunden.</Typography>
|
||||
)}
|
||||
</Box>
|
||||
</Box>
|
||||
);
|
||||
|
||||
return <LegalPage title="Kategorien" content={content} />;
|
||||
};
|
||||
|
||||
export default PrerenderCategoriesPage;
|
||||
@@ -111,7 +111,7 @@ const PrerenderCategory = ({ categoryId, categoryName, categorySeoName: _categor
|
||||
component="img"
|
||||
height="200"
|
||||
image={product.pictureList && product.pictureList.trim()
|
||||
? `/assets/images/prod${product.pictureList.split(',')[0].trim()}.jpg`
|
||||
? `/assets/images/prod${product.pictureList.split(',')[0].trim()}.avif`
|
||||
: '/assets/images/nopicture.jpg'
|
||||
}
|
||||
alt={product.name}
|
||||
|
||||
@@ -79,7 +79,7 @@ class ArticleAvailabilityForm extends Component {
|
||||
} else {
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: response.error || 'Ein Fehler ist aufgetreten'
|
||||
error: response.error || this.props.t("productDialogs.errorGeneric")
|
||||
});
|
||||
}
|
||||
|
||||
@@ -114,20 +114,21 @@ class ArticleAvailabilityForm extends Component {
|
||||
|
||||
render() {
|
||||
const { name, email, telegramId, notificationMethod, message, loading, success, error } = this.state;
|
||||
const { t } = this.props;
|
||||
|
||||
return (
|
||||
<Paper id="availability-form" sx={{ p: 3, mt: 4, borderRadius: 2, boxShadow: "0 2px 8px rgba(0,0,0,0.08)" }}>
|
||||
<Typography variant="h5" gutterBottom sx={{ fontWeight: 600, color: '#333' }}>
|
||||
VerfĂŒgbarkeit anfragen
|
||||
{t("productDialogs.availabilityTitle")}
|
||||
</Typography>
|
||||
|
||||
<Typography variant="body2" color="text.secondary" sx={{ mb: 3 }}>
|
||||
Dieser Artikel ist derzeit nicht verfĂŒgbar. Gerne informieren wir Sie, sobald er wieder lieferbar ist.
|
||||
{t("productDialogs.availabilitySubtitle")}
|
||||
</Typography>
|
||||
|
||||
{success && (
|
||||
<Alert severity="success" sx={{ mb: 3 }}>
|
||||
Vielen Dank fĂŒr Ihre Anfrage! Wir werden Sie {notificationMethod === 'email' ? 'per E-Mail' : 'ĂŒber Telegram'} informieren, sobald der Artikel wieder verfĂŒgbar ist.
|
||||
{notificationMethod === 'email' ? t("productDialogs.availabilitySuccessEmail") : t("productDialogs.availabilitySuccessTelegram")}
|
||||
</Alert>
|
||||
)}
|
||||
|
||||
@@ -139,18 +140,18 @@ class ArticleAvailabilityForm extends Component {
|
||||
|
||||
<Box component="form" onSubmit={this.handleSubmit} sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
|
||||
<TextField
|
||||
label="Name"
|
||||
label={t("productDialogs.nameLabel")}
|
||||
value={name}
|
||||
onChange={this.handleInputChange('name')}
|
||||
required
|
||||
fullWidth
|
||||
disabled={loading}
|
||||
placeholder="Ihr Name"
|
||||
placeholder={t("productDialogs.namePlaceholder")}
|
||||
/>
|
||||
|
||||
<FormControl component="fieldset" disabled={loading}>
|
||||
<FormLabel component="legend" sx={{ mb: 1 }}>
|
||||
Wie möchten Sie benachrichtigt werden?
|
||||
{t("productDialogs.notificationMethodLabel")}
|
||||
</FormLabel>
|
||||
<RadioGroup
|
||||
value={notificationMethod}
|
||||
@@ -160,51 +161,51 @@ class ArticleAvailabilityForm extends Component {
|
||||
<FormControlLabel
|
||||
value="email"
|
||||
control={<Radio />}
|
||||
label="E-Mail"
|
||||
label={t("productDialogs.emailLabel")}
|
||||
/>
|
||||
<FormControlLabel
|
||||
value="telegram"
|
||||
control={<Radio />}
|
||||
label="Telegram Bot"
|
||||
label={t("productDialogs.telegramBotLabel")}
|
||||
/>
|
||||
</RadioGroup>
|
||||
</FormControl>
|
||||
|
||||
{notificationMethod === 'email' && (
|
||||
<TextField
|
||||
label="E-Mail"
|
||||
label={t("productDialogs.emailLabel")}
|
||||
type="email"
|
||||
value={email}
|
||||
onChange={this.handleInputChange('email')}
|
||||
required
|
||||
fullWidth
|
||||
disabled={loading}
|
||||
placeholder="ihre.email@example.com"
|
||||
placeholder={t("productDialogs.emailPlaceholder")}
|
||||
/>
|
||||
)}
|
||||
|
||||
{notificationMethod === 'telegram' && (
|
||||
<TextField
|
||||
label="Telegram ID"
|
||||
label={t("productDialogs.telegramIdLabel")}
|
||||
value={telegramId}
|
||||
onChange={this.handleInputChange('telegramId')}
|
||||
required
|
||||
fullWidth
|
||||
disabled={loading}
|
||||
placeholder="@IhrTelegramName oder Telegram ID"
|
||||
helperText="Geben Sie Ihren Telegram-Benutzernamen (mit @) oder Ihre Telegram-ID ein"
|
||||
placeholder={t("productDialogs.telegramPlaceholder")}
|
||||
helperText={t("productDialogs.telegramHelper")}
|
||||
/>
|
||||
)}
|
||||
|
||||
<TextField
|
||||
label="Nachricht (optional)"
|
||||
label={t("productDialogs.messageLabel")}
|
||||
value={message}
|
||||
onChange={this.handleInputChange('message')}
|
||||
fullWidth
|
||||
multiline
|
||||
rows={3}
|
||||
disabled={loading}
|
||||
placeholder="ZusÀtzliche Informationen oder Fragen..."
|
||||
placeholder={t("productDialogs.messagePlaceholder")}
|
||||
/>
|
||||
|
||||
<Button
|
||||
@@ -225,10 +226,10 @@ class ArticleAvailabilityForm extends Component {
|
||||
{loading ? (
|
||||
<>
|
||||
<CircularProgress size={20} sx={{ mr: 1 }} />
|
||||
Wird gesendet...
|
||||
{t("productDialogs.sending")}
|
||||
</>
|
||||
) : (
|
||||
'VerfĂŒgbarkeit anfragen'
|
||||
t("productDialogs.submitAvailability")
|
||||
)}
|
||||
</Button>
|
||||
</Box>
|
||||
|
||||
@@ -98,7 +98,7 @@ class ArticleQuestionForm extends Component {
|
||||
} else {
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: response.error || 'Ein Fehler ist aufgetreten'
|
||||
error: response.error || this.props.t("productDialogs.errorGeneric")
|
||||
});
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ class ArticleQuestionForm extends Component {
|
||||
} catch {
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: 'Fehler beim Verarbeiten der Fotos'
|
||||
error: this.props.t("productDialogs.errorPhotos")
|
||||
});
|
||||
}
|
||||
|
||||
@@ -140,20 +140,21 @@ class ArticleQuestionForm extends Component {
|
||||
|
||||
render() {
|
||||
const { name, email, question, loading, success, error } = this.state;
|
||||
const { t } = this.props;
|
||||
|
||||
return (
|
||||
<Paper sx={{ p: 3, mt: 4, borderRadius: 2, boxShadow: "0 2px 8px rgba(0,0,0,0.08)" }}>
|
||||
<Typography variant="h5" gutterBottom sx={{ fontWeight: 600, color: '#333' }}>
|
||||
Frage zum Artikel
|
||||
{t("productDialogs.questionTitle")}
|
||||
</Typography>
|
||||
|
||||
<Typography variant="body2" color="text.secondary" sx={{ mb: 3 }}>
|
||||
Haben Sie eine Frage zu diesem Artikel? Wir helfen Ihnen gerne weiter.
|
||||
{t("productDialogs.questionSubtitle")}
|
||||
</Typography>
|
||||
|
||||
{success && (
|
||||
<Alert severity="success" sx={{ mb: 3 }}>
|
||||
Vielen Dank fĂŒr Ihre Frage! Wir werden uns schnellstmöglich bei Ihnen melden.
|
||||
{t("productDialogs.questionSuccess")}
|
||||
</Alert>
|
||||
)}
|
||||
|
||||
@@ -165,28 +166,28 @@ class ArticleQuestionForm extends Component {
|
||||
|
||||
<Box component="form" onSubmit={this.handleSubmit} sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
|
||||
<TextField
|
||||
label="Name"
|
||||
label={t("productDialogs.nameLabel")}
|
||||
value={name}
|
||||
onChange={this.handleInputChange('name')}
|
||||
required
|
||||
fullWidth
|
||||
disabled={loading}
|
||||
placeholder="Ihr Name"
|
||||
placeholder={t("productDialogs.namePlaceholder")}
|
||||
/>
|
||||
|
||||
<TextField
|
||||
label="E-Mail"
|
||||
label={t("productDialogs.emailLabel")}
|
||||
type="email"
|
||||
value={email}
|
||||
onChange={this.handleInputChange('email')}
|
||||
required
|
||||
fullWidth
|
||||
disabled={loading}
|
||||
placeholder="ihre.email@example.com"
|
||||
placeholder={t("productDialogs.emailPlaceholder")}
|
||||
/>
|
||||
|
||||
<TextField
|
||||
label="Ihre Frage"
|
||||
label={t("productDialogs.questionLabel")}
|
||||
value={question}
|
||||
onChange={this.handleInputChange('question')}
|
||||
required
|
||||
@@ -194,7 +195,7 @@ class ArticleQuestionForm extends Component {
|
||||
multiline
|
||||
rows={4}
|
||||
disabled={loading}
|
||||
placeholder="Beschreiben Sie Ihre Frage zu diesem Artikel..."
|
||||
placeholder={t("productDialogs.questionPlaceholder")}
|
||||
/>
|
||||
|
||||
<PhotoUpload
|
||||
@@ -202,7 +203,7 @@ class ArticleQuestionForm extends Component {
|
||||
onChange={this.handlePhotosChange}
|
||||
disabled={loading}
|
||||
maxFiles={3}
|
||||
label="Fotos zur Frage anhÀngen (optional)"
|
||||
label={t("productDialogs.photosLabelQuestion")}
|
||||
/>
|
||||
|
||||
<Button
|
||||
@@ -219,10 +220,10 @@ class ArticleQuestionForm extends Component {
|
||||
{loading ? (
|
||||
<>
|
||||
<CircularProgress size={20} sx={{ mr: 1 }} />
|
||||
Wird gesendet...
|
||||
{t("productDialogs.sending")}
|
||||
</>
|
||||
) : (
|
||||
'Frage senden'
|
||||
t("productDialogs.submitQuestion")
|
||||
)}
|
||||
</Button>
|
||||
</Box>
|
||||
|
||||
@@ -106,7 +106,7 @@ class ArticleRatingForm extends Component {
|
||||
} else {
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: response.error || 'Ein Fehler ist aufgetreten'
|
||||
error: response.error || this.props.t("productDialogs.errorGeneric")
|
||||
});
|
||||
}
|
||||
|
||||
@@ -118,7 +118,7 @@ class ArticleRatingForm extends Component {
|
||||
} catch {
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: 'Fehler beim Verarbeiten der Fotos'
|
||||
error: this.props.t("productDialogs.errorPhotos")
|
||||
});
|
||||
}
|
||||
|
||||
@@ -149,20 +149,21 @@ class ArticleRatingForm extends Component {
|
||||
|
||||
render() {
|
||||
const { name, email, rating, review, loading, success, error } = this.state;
|
||||
const { t } = this.props;
|
||||
|
||||
return (
|
||||
<Paper sx={{ p: 3, mt: 4, borderRadius: 2, boxShadow: "0 2px 8px rgba(0,0,0,0.08)" }}>
|
||||
<Typography variant="h5" gutterBottom sx={{ fontWeight: 600, color: '#333' }}>
|
||||
Artikel Bewerten
|
||||
{t("productDialogs.ratingTitle")}
|
||||
</Typography>
|
||||
|
||||
<Typography variant="body2" color="text.secondary" sx={{ mb: 3 }}>
|
||||
Teilen Sie Ihre Erfahrungen mit diesem Artikel und helfen Sie anderen Kunden bei der Entscheidung.
|
||||
{t("productDialogs.ratingSubtitle")}
|
||||
</Typography>
|
||||
|
||||
{success && (
|
||||
<Alert severity="success" sx={{ mb: 3 }}>
|
||||
Vielen Dank fĂŒr Ihre Bewertung! Sie wird nach PrĂŒfung veröffentlicht.
|
||||
{t("productDialogs.ratingSuccess")}
|
||||
</Alert>
|
||||
)}
|
||||
|
||||
@@ -174,30 +175,30 @@ class ArticleRatingForm extends Component {
|
||||
|
||||
<Box component="form" onSubmit={this.handleSubmit} sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>
|
||||
<TextField
|
||||
label="Name"
|
||||
label={t("productDialogs.nameLabel")}
|
||||
value={name}
|
||||
onChange={this.handleInputChange('name')}
|
||||
required
|
||||
fullWidth
|
||||
disabled={loading}
|
||||
placeholder="Ihr Name"
|
||||
placeholder={t("productDialogs.namePlaceholder")}
|
||||
/>
|
||||
|
||||
<TextField
|
||||
label="E-Mail"
|
||||
label={t("productDialogs.emailLabel")}
|
||||
type="email"
|
||||
value={email}
|
||||
onChange={this.handleInputChange('email')}
|
||||
required
|
||||
fullWidth
|
||||
disabled={loading}
|
||||
placeholder="ihre.email@example.com"
|
||||
helperText="Ihre E-Mail wird nicht veröffentlicht"
|
||||
placeholder={t("productDialogs.emailPlaceholder")}
|
||||
helperText={t("productDialogs.emailHelper")}
|
||||
/>
|
||||
|
||||
<Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>
|
||||
<Typography variant="body2" sx={{ fontWeight: 500 }}>
|
||||
Bewertung *
|
||||
{t("productDialogs.ratingLabel")}
|
||||
</Typography>
|
||||
<Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>
|
||||
<Rating
|
||||
@@ -209,20 +210,20 @@ class ArticleRatingForm extends Component {
|
||||
emptyIcon={<StarIcon style={{ opacity: 0.55 }} fontSize="inherit" />}
|
||||
/>
|
||||
<Typography variant="body2" color="text.secondary">
|
||||
{rating > 0 ? `${rating} von 5 Sternen` : 'Bitte bewerten'}
|
||||
{rating > 0 ? t("productDialogs.ratingStars", { rating }) : t("productDialogs.pleaseRate")}
|
||||
</Typography>
|
||||
</Box>
|
||||
</Box>
|
||||
|
||||
<TextField
|
||||
label="Ihre Bewertung (optional)"
|
||||
label={t("productDialogs.reviewLabel")}
|
||||
value={review}
|
||||
onChange={this.handleInputChange('review')}
|
||||
fullWidth
|
||||
multiline
|
||||
rows={4}
|
||||
disabled={loading}
|
||||
placeholder="Beschreiben Sie Ihre Erfahrungen mit diesem Artikel..."
|
||||
placeholder={t("productDialogs.reviewPlaceholder")}
|
||||
/>
|
||||
|
||||
<PhotoUpload
|
||||
@@ -230,7 +231,7 @@ class ArticleRatingForm extends Component {
|
||||
onChange={this.handlePhotosChange}
|
||||
disabled={loading}
|
||||
maxFiles={5}
|
||||
label="Fotos zur Bewertung anhÀngen (optional)"
|
||||
label={t("productDialogs.photosLabelRating")}
|
||||
/>
|
||||
|
||||
<Button
|
||||
@@ -247,10 +248,10 @@ class ArticleRatingForm extends Component {
|
||||
{loading ? (
|
||||
<>
|
||||
<CircularProgress size={20} sx={{ mr: 1 }} />
|
||||
Wird gesendet...
|
||||
{t("productDialogs.sending")}
|
||||
</>
|
||||
) : (
|
||||
'Bewertung abgeben'
|
||||
t("productDialogs.submitRating")
|
||||
)}
|
||||
</Button>
|
||||
</Box>
|
||||
|
||||
@@ -23,7 +23,7 @@ class CartItem extends Component {
|
||||
|
||||
window.socketManager.emit('getPic', { bildId:picid, size:'tiny' }, (res) => {
|
||||
if(res.success){
|
||||
window.tinyPicCache[picid] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
window.tinyPicCache[picid] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/avif' }));
|
||||
this.setState({image: window.tinyPicCache[picid], loading: false});
|
||||
}
|
||||
})
|
||||
|
||||
@@ -47,7 +47,7 @@ const CategoryBox = ({
|
||||
// Create fresh blob URL from cached binary data
|
||||
try {
|
||||
const uint8Array = new Uint8Array(cachedImageData);
|
||||
const blob = new Blob([uint8Array], { type: 'image/jpeg' });
|
||||
const blob = new Blob([uint8Array], { type: 'image/avif' });
|
||||
objectUrl = URL.createObjectURL(blob);
|
||||
setImageUrl(objectUrl);
|
||||
setImageError(false);
|
||||
@@ -73,7 +73,7 @@ const CategoryBox = ({
|
||||
try {
|
||||
// Convert binary data to blob URL
|
||||
const uint8Array = new Uint8Array(imageData);
|
||||
const blob = new Blob([uint8Array], { type: 'image/jpeg' });
|
||||
const blob = new Blob([uint8Array], { type: 'image/avif' });
|
||||
objectUrl = URL.createObjectURL(blob);
|
||||
setImageUrl(objectUrl);
|
||||
setImageError(false);
|
||||
@@ -158,7 +158,7 @@ const CategoryBox = ({
|
||||
position: 'relative',
|
||||
backgroundImage: ((typeof window !== 'undefined' && window.__PRERENDER_FALLBACK__) ||
|
||||
(typeof global !== 'undefined' && global.window && global.window.__PRERENDER_FALLBACK__))
|
||||
? `url("/assets/images/cat${id}.jpg")`
|
||||
? `url("/assets/images/cat${id}.avif")`
|
||||
: (imageUrl && !imageError ? `url("${imageUrl}")` : 'none'),
|
||||
backgroundSize: 'cover',
|
||||
backgroundPosition: 'center',
|
||||
|
||||
@@ -279,17 +279,25 @@ class Content extends Component {
|
||||
}
|
||||
|
||||
processData(response) {
|
||||
const unfilteredProducts = response.products;
|
||||
const rawProducts = response.products;
|
||||
const currentLanguage = this.props.languageContext?.currentLanguage || this.props.i18n?.language || 'de';
|
||||
|
||||
if (!window.individualProductCache) {
|
||||
window.individualProductCache = {};
|
||||
}
|
||||
//console.log("processData", unfilteredProducts);
|
||||
if(unfilteredProducts) unfilteredProducts.forEach(product => {
|
||||
window.individualProductCache[product.id] = {
|
||||
data: product,
|
||||
|
||||
const unfilteredProducts = [];
|
||||
|
||||
//console.log("processData", rawProducts);
|
||||
if(rawProducts) rawProducts.forEach(product => {
|
||||
const effectiveProduct = product.translatedProduct || product;
|
||||
const cacheKey = `${effectiveProduct.id}_${currentLanguage}`;
|
||||
|
||||
window.individualProductCache[cacheKey] = {
|
||||
data: effectiveProduct,
|
||||
timestamp: Date.now()
|
||||
};
|
||||
unfilteredProducts.push(effectiveProduct);
|
||||
});
|
||||
|
||||
this.setState({
|
||||
@@ -450,7 +458,12 @@ class Content extends Component {
|
||||
{ query, language: currentLanguage, requestTranslation: currentLanguage === 'de' ? false : true },
|
||||
(response) => {
|
||||
if (response && response.products) {
|
||||
this.processData(response);
|
||||
// Map products to use translatedProduct if available
|
||||
const enhancedResponse = {
|
||||
...response,
|
||||
products: response.products.map(p => p.translatedProduct || p)
|
||||
};
|
||||
this.processData(enhancedResponse);
|
||||
} else {
|
||||
console.log("fetchSearchData in Content failed", response);
|
||||
}
|
||||
@@ -681,6 +694,7 @@ class Content extends Component {
|
||||
onFilterChange={()=>{this.filterProducts()}}
|
||||
dataType={this.state.dataType}
|
||||
dataParam={this.state.dataParam}
|
||||
categoryName={this.state.categoryName}
|
||||
/>
|
||||
</Box>
|
||||
|
||||
@@ -722,7 +736,7 @@ class Content extends Component {
|
||||
justifyContent: 'center'
|
||||
}}>
|
||||
<img
|
||||
src="/assets/images/seeds.jpg"
|
||||
src="/assets/images/seeds.avif"
|
||||
alt="Seeds"
|
||||
fetchPriority="high"
|
||||
loading="eager"
|
||||
@@ -783,7 +797,7 @@ class Content extends Component {
|
||||
justifyContent: 'center'
|
||||
}}>
|
||||
<img
|
||||
src="/assets/images/cutlings.jpg"
|
||||
src="/assets/images/cutlings.avif"
|
||||
alt="Stecklinge"
|
||||
fetchPriority="high"
|
||||
loading="eager"
|
||||
|
||||
@@ -296,7 +296,7 @@ class Footer extends Component {
|
||||
>
|
||||
<Box
|
||||
component="img"
|
||||
src="/assets/images/gg.png"
|
||||
src="/assets/images/gg.avif"
|
||||
alt="Google Reviews"
|
||||
sx={{
|
||||
height: { xs: 50, md: 60 },
|
||||
@@ -326,7 +326,7 @@ class Footer extends Component {
|
||||
>
|
||||
<Box
|
||||
component="img"
|
||||
src="/assets/images/maps.png"
|
||||
src="/assets/images/maps.avif"
|
||||
alt="Google Maps"
|
||||
sx={{
|
||||
height: { xs: 40, md: 50 },
|
||||
@@ -352,6 +352,9 @@ class Footer extends Component {
|
||||
<Typography variant="body2" sx={{ fontSize: { xs: '11px', md: '14px' }, lineHeight: 1.5 }}>
|
||||
© {new Date().getFullYear()} <StyledDomainLink href="https://growheads.de" target="_blank" rel="noopener noreferrer">GrowHeads.de</StyledDomainLink>
|
||||
</Typography>
|
||||
<Typography variant="body2" sx={{ fontSize: { xs: '9px', md: '9px' }, lineHeight: 1.5, mt: 1 }}>
|
||||
<StyledDomainLink href="https://telegraf.growheads.de" target="_blank" rel="noreferrer">Telegraf - sicherer Chat mit unseren Mitarbeitern</StyledDomainLink>
|
||||
</Typography>
|
||||
</Box>
|
||||
</Stack>
|
||||
</Box>
|
||||
|
||||
@@ -56,7 +56,7 @@ class Images extends Component {
|
||||
pics.push(window.tinyPicCache[bildId]);
|
||||
this.loadPic(this.props.fullscreenOpen ? 'large' : 'medium',bildId,newMainPic);
|
||||
}else{
|
||||
pics.push(`/assets/images/prod${bildId}.jpg`);
|
||||
pics.push(`/assets/images/prod${bildId}.avif`);
|
||||
this.loadPic(this.props.fullscreenOpen ? 'large' : 'medium',bildId,newMainPic);
|
||||
}
|
||||
}else{
|
||||
@@ -84,7 +84,7 @@ class Images extends Component {
|
||||
|
||||
window.socketManager.emit('getPic', { bildId, size }, (res) => {
|
||||
if(res.success){
|
||||
const url = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
const url = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/avif' }));
|
||||
|
||||
if(size === 'medium') window.mediumPicCache[bildId] = url;
|
||||
if(size === 'small') window.smallPicCache[bildId] = url;
|
||||
@@ -118,7 +118,7 @@ class Images extends Component {
|
||||
if (!this.props.pictureList || !this.props.pictureList.trim()) {
|
||||
return '/assets/images/nopicture.jpg';
|
||||
}
|
||||
return `/assets/images/prod${this.props.pictureList.split(',')[0].trim()}.jpg`;
|
||||
return `/assets/images/prod${this.props.pictureList.split(',')[0].trim()}.avif`;
|
||||
};
|
||||
|
||||
return (
|
||||
|
||||
@@ -175,12 +175,12 @@ export class LoginComponent extends Component {
|
||||
const { location, navigate } = this.props;
|
||||
|
||||
if (!email || !password) {
|
||||
this.setState({ error: 'Bitte fĂŒllen Sie alle Felder aus' });
|
||||
this.setState({ error: this.props.t ? this.props.t('auth.errors.fillAllFields') : 'Bitte fĂŒllen Sie alle Felder aus' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.validateEmail(email)) {
|
||||
this.setState({ error: 'Bitte geben Sie eine gĂŒltige E-Mail-Adresse ein' });
|
||||
this.setState({ error: this.props.t ? this.props.t('auth.errors.invalidEmail') : 'Bitte geben Sie eine gĂŒltige E-Mail-Adresse ein' });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -238,7 +238,7 @@ export class LoginComponent extends Component {
|
||||
} else {
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: response.message || 'Anmeldung fehlgeschlagen'
|
||||
error: response.message || (this.props.t ? this.props.t('auth.errors.loginFailed') : 'Anmeldung fehlgeschlagen')
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -248,22 +248,22 @@ export class LoginComponent extends Component {
|
||||
const { email, password, confirmPassword } = this.state;
|
||||
|
||||
if (!email || !password || !confirmPassword) {
|
||||
this.setState({ error: 'Bitte fĂŒllen Sie alle Felder aus' });
|
||||
this.setState({ error: this.props.t ? this.props.t('auth.errors.fillAllFields') : 'Bitte fĂŒllen Sie alle Felder aus' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.validateEmail(email)) {
|
||||
this.setState({ error: 'Bitte geben Sie eine gĂŒltige E-Mail-Adresse ein' });
|
||||
this.setState({ error: this.props.t ? this.props.t('auth.errors.invalidEmail') : 'Bitte geben Sie eine gĂŒltige E-Mail-Adresse ein' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (password !== confirmPassword) {
|
||||
this.setState({ error: 'Passwörter stimmen nicht ĂŒberein' });
|
||||
this.setState({ error: this.props.t ? this.props.t('auth.errors.passwordsNotMatchShort') : 'Passwörter stimmen nicht ĂŒberein' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (password.length < 8) {
|
||||
this.setState({ error: 'Das Passwort muss mindestens 8 Zeichen lang sein' });
|
||||
this.setState({ error: this.props.t ? this.props.t('auth.passwordMinLength') : 'Das Passwort muss mindestens 8 Zeichen lang sein' });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -274,14 +274,14 @@ export class LoginComponent extends Component {
|
||||
if (response.success) {
|
||||
this.setState({
|
||||
loading: false,
|
||||
success: 'Registrierung erfolgreich. Sie können sich jetzt anmelden.',
|
||||
success: this.props.t ? this.props.t('auth.success.registerComplete') : 'Registrierung erfolgreich. Sie können sich jetzt anmelden.',
|
||||
tabValue: 0 // Switch to login tab
|
||||
});
|
||||
} else {
|
||||
let errorMessage = 'Registrierung fehlgeschlagen';
|
||||
let errorMessage = this.props.t ? this.props.t('auth.errors.registerFailed') : 'Registrierung fehlgeschlagen';
|
||||
|
||||
if (response.cause === 'emailExists') {
|
||||
errorMessage = 'Ein Benutzer mit dieser E-Mail-Adresse existiert bereits. Bitte verwenden Sie eine andere E-Mail-Adresse oder melden Sie sich an.';
|
||||
errorMessage = this.props.t ? this.props.t('auth.errors.emailExists') : 'Ein Benutzer mit dieser E-Mail-Adresse existiert bereits. Bitte verwenden Sie eine andere E-Mail-Adresse oder melden Sie sich an.';
|
||||
} else if (response.message) {
|
||||
errorMessage = response.message;
|
||||
}
|
||||
@@ -322,12 +322,12 @@ export class LoginComponent extends Component {
|
||||
const { email } = this.state;
|
||||
|
||||
if (!email) {
|
||||
this.setState({ error: 'Bitte geben Sie Ihre E-Mail-Adresse ein' });
|
||||
this.setState({ error: this.props.t ? this.props.t('auth.errors.enterEmail') : 'Bitte geben Sie Ihre E-Mail-Adresse ein' });
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.validateEmail(email)) {
|
||||
this.setState({ error: 'Bitte geben Sie eine gĂŒltige E-Mail-Adresse ein' });
|
||||
this.setState({ error: this.props.t ? this.props.t('auth.errors.invalidEmail') : 'Bitte geben Sie eine gĂŒltige E-Mail-Adresse ein' });
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -342,12 +342,12 @@ export class LoginComponent extends Component {
|
||||
if (response.success) {
|
||||
this.setState({
|
||||
loading: false,
|
||||
success: 'Ein Link zum ZurĂŒcksetzen des Passworts wurde an Ihre E-Mail-Adresse gesendet.'
|
||||
success: this.props.t ? this.props.t('auth.resetPassword.emailSent') : 'Ein Link zum ZurĂŒcksetzen des Passworts wurde an Ihre E-Mail-Adresse gesendet.'
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: response.message || 'Fehler beim Senden der E-Mail'
|
||||
error: response.message || (this.props.t ? this.props.t('auth.resetPassword.emailError') : 'Fehler beim Senden der E-Mail')
|
||||
});
|
||||
}
|
||||
});
|
||||
@@ -408,7 +408,7 @@ export class LoginComponent extends Component {
|
||||
} else {
|
||||
this.setState({
|
||||
loading: false,
|
||||
error: 'Google-Anmeldung fehlgeschlagen',
|
||||
error: this.props.t ? this.props.t('auth.errors.googleLoginFailed') : 'Google-Anmeldung fehlgeschlagen',
|
||||
showGoogleAuth: false // Reset Google auth state on failed login
|
||||
});
|
||||
}
|
||||
@@ -418,7 +418,7 @@ export class LoginComponent extends Component {
|
||||
handleGoogleLoginError = (error) => {
|
||||
console.error('Google Login Error:', error);
|
||||
this.setState({
|
||||
error: 'Google-Anmeldung fehlgeschlagen',
|
||||
error: this.props.t ? this.props.t('auth.errors.googleLoginFailed') : 'Google-Anmeldung fehlgeschlagen',
|
||||
showGoogleAuth: false, // Reset Google auth state on error
|
||||
loading: false
|
||||
});
|
||||
|
||||
@@ -163,8 +163,8 @@ const MainPageLayout = () => {
|
||||
|
||||
const allContentBoxes = {
|
||||
home: [
|
||||
{ title: t('sections.seeds'), image: "/assets/images/seeds.jpg", bgcolor: "#e1f0d3", link: "/Kategorie/Seeds" },
|
||||
{ title: t('sections.stecklinge'), image: "/assets/images/cutlings.jpg", bgcolor: "#e8f5d6", link: "/Kategorie/Stecklinge" }
|
||||
{ title: t('sections.seeds'), image: "/assets/images/seeds.avif", bgcolor: "#e1f0d3", link: "/Kategorie/Seeds" },
|
||||
{ title: t('sections.stecklinge'), image: "/assets/images/cutlings.avif", bgcolor: "#e8f5d6", link: "/Kategorie/Stecklinge" }
|
||||
],
|
||||
aktionen: [
|
||||
{ title: t('sections.oilPress'), image: "/assets/images/presse.jpg", bgcolor: "#e1f0d3", link: "/presseverleih" },
|
||||
|
||||
@@ -10,6 +10,7 @@ import {
|
||||
} from '@mui/material';
|
||||
import Delete from '@mui/icons-material/Delete';
|
||||
import CloudUpload from '@mui/icons-material/CloudUpload';
|
||||
import { withI18n } from '../i18n/withTranslation.js';
|
||||
|
||||
class PhotoUpload extends Component {
|
||||
constructor(props) {
|
||||
@@ -30,7 +31,7 @@ class PhotoUpload extends Component {
|
||||
// Validate file count
|
||||
if (this.state.files.length + selectedFiles.length > maxFiles) {
|
||||
this.setState({
|
||||
error: `Maximal ${maxFiles} Dateien erlaubt`
|
||||
error: this.props.t("productDialogs.photoUploadErrorMaxFiles", { max: maxFiles })
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -43,14 +44,14 @@ class PhotoUpload extends Component {
|
||||
for (const file of selectedFiles) {
|
||||
if (!validTypes.includes(file.type)) {
|
||||
this.setState({
|
||||
error: 'Nur Bilddateien (JPEG, PNG, GIF, WebP) sind erlaubt'
|
||||
error: this.props.t("productDialogs.photoUploadErrorFileType")
|
||||
});
|
||||
continue;
|
||||
}
|
||||
|
||||
if (file.size > maxSize) {
|
||||
this.setState({
|
||||
error: `Datei zu groĂ. Maximum: ${Math.round(maxSize / (1024 * 1024))}MB`
|
||||
error: this.props.t("productDialogs.photoUploadErrorFileSize", { maxSize: Math.round(maxSize / (1024 * 1024)) })
|
||||
});
|
||||
continue;
|
||||
}
|
||||
@@ -167,12 +168,12 @@ class PhotoUpload extends Component {
|
||||
|
||||
render() {
|
||||
const { files, previews, error } = this.state;
|
||||
const { disabled, label } = this.props;
|
||||
const { disabled, label, t } = this.props;
|
||||
|
||||
return (
|
||||
<Box>
|
||||
<Typography variant="body2" sx={{ mb: 1, fontWeight: 500 }}>
|
||||
{label || 'Fotos anhÀngen (optional)'}
|
||||
{label || t("productDialogs.photoUploadLabelDefault")}
|
||||
</Typography>
|
||||
|
||||
<input
|
||||
@@ -192,7 +193,7 @@ class PhotoUpload extends Component {
|
||||
disabled={disabled}
|
||||
sx={{ mb: 2 }}
|
||||
>
|
||||
Fotos auswÀhlen
|
||||
{t("productDialogs.photoUploadSelect")}
|
||||
</Button>
|
||||
|
||||
{error && (
|
||||
@@ -228,7 +229,7 @@ class PhotoUpload extends Component {
|
||||
size="small"
|
||||
onClick={() => this.handleRemoveFile(index)}
|
||||
disabled={disabled}
|
||||
aria-label="Bild entfernen"
|
||||
aria-label={t("productDialogs.photoUploadRemove")}
|
||||
sx={{
|
||||
position: 'absolute',
|
||||
top: 4,
|
||||
@@ -269,10 +270,10 @@ class PhotoUpload extends Component {
|
||||
|
||||
{files.length > 0 && (
|
||||
<Typography variant="caption" color="text.secondary" sx={{ mt: 1, display: 'block' }}>
|
||||
{files.length} Datei(en) ausgewÀhlt
|
||||
{t("productDialogs.photoUploadSelectedFiles", { count: files.length })}
|
||||
{previews.length > 0 && previews.some(p => p.originalSize && p.compressedSize) && (
|
||||
<span style={{ marginLeft: '8px' }}>
|
||||
(komprimiert fĂŒr Upload)
|
||||
{t("productDialogs.photoUploadCompressed")}
|
||||
</span>
|
||||
)}
|
||||
</Typography>
|
||||
@@ -282,4 +283,4 @@ class PhotoUpload extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
export default PhotoUpload;
|
||||
export default withI18n()(PhotoUpload);
|
||||
@@ -101,7 +101,7 @@ class Product extends Component {
|
||||
console.log('loadImagevisSocket', bildId);
|
||||
window.socketManager.emit('getPic', { bildId, size:'small' }, (res) => {
|
||||
if(res.success){
|
||||
window.smallPicCache[bildId] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
window.smallPicCache[bildId] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/avif' }));
|
||||
if (this._isMounted) {
|
||||
this.setState({image: window.smallPicCache[bildId], loading: false});
|
||||
} else {
|
||||
|
||||
@@ -305,7 +305,7 @@ class ProductDetailPage extends Component {
|
||||
window.socketManager.emit('getPic', { bildId, size: 'small' }, (res) => {
|
||||
if (res.success) {
|
||||
// Cache the image
|
||||
window.smallPicCache[bildId] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
window.smallPicCache[bildId] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/avif' }));
|
||||
|
||||
// Update state
|
||||
this.setState(prevState => ({
|
||||
@@ -546,7 +546,7 @@ class ProductDetailPage extends Component {
|
||||
console.log("getAttributePicture", res);
|
||||
if (res.success && !res.noPicture) {
|
||||
const blob = new Blob([res.imageBuffer], {
|
||||
type: "image/jpeg",
|
||||
type: "image/avif",
|
||||
});
|
||||
const url = URL.createObjectURL(blob);
|
||||
|
||||
@@ -599,13 +599,16 @@ class ProductDetailPage extends Component {
|
||||
const productData = res.translatedProduct || res.product;
|
||||
productData.seoName = this.props.seoName;
|
||||
|
||||
// Use translated attributes if available
|
||||
const attributesData = res.translatedAttributes || res.attributes;
|
||||
|
||||
// Initialize cache if it doesn't exist
|
||||
if (!window.productDetailCache) {
|
||||
window.productDetailCache = {};
|
||||
}
|
||||
|
||||
// Cache the complete response data (product + attributes) - cache the response with translated product
|
||||
const cacheData = { ...res, product: productData };
|
||||
const cacheData = { ...res, product: productData, attributes: attributesData };
|
||||
window.productDetailCache[cacheKey] = cacheData;
|
||||
|
||||
// Clean up prerender fallback since we now have real data
|
||||
@@ -628,7 +631,7 @@ class ProductDetailPage extends Component {
|
||||
upgrading: false, // Clear upgrading state since we now have complete data
|
||||
error: null,
|
||||
imageDialogOpen: false,
|
||||
attributes: res.attributes,
|
||||
attributes: attributesData,
|
||||
komponenten: komponenten,
|
||||
komponentenLoaded: komponenten.length === 0, // If no komponenten, mark as loaded
|
||||
similarProducts: res.similarProducts || []
|
||||
@@ -653,7 +656,7 @@ class ProductDetailPage extends Component {
|
||||
console.log("getProductView", res);
|
||||
|
||||
// Load attribute images
|
||||
this.loadAttributeImages(res.attributes);
|
||||
this.loadAttributeImages(attributesData);
|
||||
} else {
|
||||
console.error(
|
||||
"Error loading product:",
|
||||
@@ -762,7 +765,7 @@ class ProductDetailPage extends Component {
|
||||
handleEmbedShare = () => {
|
||||
const embedCode = `<iframe src="${this.getProductUrl()}" width="100%" height="600" frameborder="0"></iframe>`;
|
||||
navigator.clipboard.writeText(embedCode).then(() => {
|
||||
this.showSnackbar("Einbettungscode wurde in die Zwischenablage kopiert!");
|
||||
this.showSnackbar(this.props.t ? this.props.t("productDialogs.shareSuccessEmbed") : "Einbettungscode wurde in die Zwischenablage kopiert!");
|
||||
}).catch(() => {
|
||||
// Fallback for older browsers
|
||||
try {
|
||||
@@ -772,9 +775,9 @@ class ProductDetailPage extends Component {
|
||||
textArea.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(textArea);
|
||||
this.showSnackbar("Einbettungscode wurde in die Zwischenablage kopiert!");
|
||||
this.showSnackbar(this.props.t ? this.props.t("productDialogs.shareSuccessEmbed") : "Einbettungscode wurde in die Zwischenablage kopiert!");
|
||||
} catch {
|
||||
this.showSnackbar("Fehler beim Kopieren des Einbettungscodes", "error");
|
||||
this.showSnackbar(this.props.t ? this.props.t("productDialogs.shareErrorEmbed") : "Fehler beim Kopieren des Einbettungscodes", "error");
|
||||
}
|
||||
});
|
||||
this.handleShareClose();
|
||||
@@ -782,7 +785,10 @@ class ProductDetailPage extends Component {
|
||||
|
||||
handleWhatsAppShare = () => {
|
||||
const url = this.getProductUrl();
|
||||
const text = `Schau dir dieses Produkt an: ${cleanProductName(this.state.product.name)}`;
|
||||
const productName = cleanProductName(this.state.product.name);
|
||||
const text = this.props.t
|
||||
? this.props.t("productDialogs.shareWhatsAppText", { name: productName })
|
||||
: `Schau dir dieses Produkt an: ${productName}`;
|
||||
const whatsappUrl = `https://wa.me/?text=${encodeURIComponent(text + ' ' + url)}`;
|
||||
window.open(whatsappUrl, '_blank');
|
||||
this.handleShareClose();
|
||||
@@ -797,7 +803,10 @@ class ProductDetailPage extends Component {
|
||||
|
||||
handleTelegramShare = () => {
|
||||
const url = this.getProductUrl();
|
||||
const text = `Schau dir dieses Produkt an: ${cleanProductName(this.state.product.name)}`;
|
||||
const productName = cleanProductName(this.state.product.name);
|
||||
const text = this.props.t
|
||||
? this.props.t("productDialogs.shareTelegramText", { name: productName })
|
||||
: `Schau dir dieses Produkt an: ${productName}`;
|
||||
const telegramUrl = `https://t.me/share/url?url=${encodeURIComponent(url)}&text=${encodeURIComponent(text)}`;
|
||||
window.open(telegramUrl, '_blank');
|
||||
this.handleShareClose();
|
||||
@@ -805,8 +814,18 @@ class ProductDetailPage extends Component {
|
||||
|
||||
handleEmailShare = () => {
|
||||
const url = this.getProductUrl();
|
||||
const subject = `Produktempfehlung: ${cleanProductName(this.state.product.name)}`;
|
||||
const body = `Hallo,\n\nich möchte dir dieses Produkt empfehlen:\n\n${cleanProductName(this.state.product.name)}\n${url}\n\nViele GrĂŒĂe`;
|
||||
const productName = cleanProductName(this.state.product.name);
|
||||
const subject = this.props.t
|
||||
? `${this.props.t("productDialogs.shareEmailSubject")}: ${productName}`
|
||||
: `Produktempfehlung: ${productName}`;
|
||||
|
||||
const body = this.props.t
|
||||
? this.props.t("productDialogs.shareEmailBody", {
|
||||
name: productName,
|
||||
url: url
|
||||
})
|
||||
: `Hallo,\n\nich möchte dir dieses Produkt empfehlen:\n\n${productName}\n${url}\n\nViele GrĂŒĂe`;
|
||||
|
||||
const emailUrl = `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
|
||||
window.location.href = emailUrl;
|
||||
this.handleShareClose();
|
||||
@@ -815,7 +834,7 @@ class ProductDetailPage extends Component {
|
||||
handleLinkCopy = () => {
|
||||
const url = this.getProductUrl();
|
||||
navigator.clipboard.writeText(url).then(() => {
|
||||
this.showSnackbar("Link wurde in die Zwischenablage kopiert!");
|
||||
this.showSnackbar(this.props.t ? this.props.t("productDialogs.shareSuccessLink") : "Link wurde in die Zwischenablage kopiert!");
|
||||
}).catch(() => {
|
||||
// Fallback for older browsers
|
||||
try {
|
||||
@@ -825,7 +844,7 @@ class ProductDetailPage extends Component {
|
||||
textArea.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(textArea);
|
||||
this.showSnackbar("Link wurde in die Zwischenablage kopiert!");
|
||||
this.showSnackbar(this.props.t ? this.props.t("productDialogs.shareSuccessLink") : "Link wurde in die Zwischenablage kopiert!");
|
||||
} catch {
|
||||
this.showSnackbar("Fehler beim Kopieren des Links", "error");
|
||||
}
|
||||
@@ -968,7 +987,7 @@ class ProductDetailPage extends Component {
|
||||
}).format(productData.price)}
|
||||
</Typography>
|
||||
<Typography variant="caption" color="text.secondary">
|
||||
inkl. MwSt.
|
||||
{this.props.t ? this.props.t('product.inclVatSimple') : 'inkl. MwSt.'}
|
||||
</Typography>
|
||||
</Box>
|
||||
</Box>
|
||||
@@ -1047,7 +1066,7 @@ class ProductDetailPage extends Component {
|
||||
console.log('loadEmbeddedProductImage response:', articleNr, res.success);
|
||||
|
||||
if (res.success) {
|
||||
const imageUrl = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
const imageUrl = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/avif' }));
|
||||
this.setState(prevState => {
|
||||
console.log('Setting embedded product image for', articleNr);
|
||||
return {
|
||||
@@ -1331,7 +1350,7 @@ class ProductDetailPage extends Component {
|
||||
whiteSpace: "nowrap"
|
||||
}}
|
||||
>
|
||||
Frage zum Artikel
|
||||
{this.props.t ? this.props.t('productDialogs.questionTitle') : "Frage zum Artikel"}
|
||||
</Button>
|
||||
<Button
|
||||
variant="outlined"
|
||||
@@ -1345,7 +1364,7 @@ class ProductDetailPage extends Component {
|
||||
whiteSpace: "nowrap"
|
||||
}}
|
||||
>
|
||||
Artikel Bewerten
|
||||
{this.props.t ? this.props.t('productDialogs.ratingTitle') : "Artikel Bewerten"}
|
||||
</Button>
|
||||
{(product.available !== 1 && product.availableSupplier !== 1) && (
|
||||
<Button
|
||||
@@ -1366,7 +1385,7 @@ class ProductDetailPage extends Component {
|
||||
}
|
||||
}}
|
||||
>
|
||||
VerfĂŒgbarkeit anfragen
|
||||
{this.props.t ? this.props.t('productDialogs.availabilityTitle') : "VerfĂŒgbarkeit anfragen"}
|
||||
</Button>
|
||||
)}
|
||||
</Stack>
|
||||
@@ -1595,7 +1614,7 @@ class ProductDetailPage extends Component {
|
||||
}}
|
||||
size="small"
|
||||
>
|
||||
Teilen
|
||||
{this.props.t ? this.props.t("productDialogs.shareTitle") : "Teilen"}
|
||||
</Button>
|
||||
<Box
|
||||
sx={{
|
||||
@@ -1669,7 +1688,7 @@ class ProductDetailPage extends Component {
|
||||
<ListItemIcon>
|
||||
<CodeIcon fontSize="small" />
|
||||
</ListItemIcon>
|
||||
<ListItemText primary="Einbetten" />
|
||||
<ListItemText primary={this.props.t ? this.props.t("productDialogs.shareEmbed") : "Einbetten"} />
|
||||
</MenuItem>
|
||||
<MenuItem onClick={this.handleWhatsAppShare}>
|
||||
<ListItemIcon>
|
||||
@@ -1699,7 +1718,7 @@ class ProductDetailPage extends Component {
|
||||
<ListItemIcon>
|
||||
<LinkIcon fontSize="small" />
|
||||
</ListItemIcon>
|
||||
<ListItemText primary="Link kopieren" />
|
||||
<ListItemText primary={this.props.t ? this.props.t("productDialogs.shareCopyLink") : "Link kopieren"} />
|
||||
</MenuItem>
|
||||
</MenuList>
|
||||
</Box>
|
||||
@@ -1953,7 +1972,7 @@ class ProductDetailPage extends Component {
|
||||
gap: 2
|
||||
}}>
|
||||
{this.state.similarProducts.map((similarProductData, index) => {
|
||||
const product = similarProductData.product;
|
||||
const product = similarProductData.translatedProduct || similarProductData.product;
|
||||
return (
|
||||
<Box key={product.id} sx={{ display: 'flex', justifyContent: 'center' }}>
|
||||
<Product
|
||||
|
||||
@@ -209,7 +209,7 @@ class ProductFilters extends Component {
|
||||
color: 'primary.main'
|
||||
}}
|
||||
>
|
||||
{this.props.dataParam}
|
||||
{this.props.categoryName}
|
||||
</Typography>
|
||||
)}
|
||||
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import React from 'react';
|
||||
import { Link } from 'react-router-dom';
|
||||
import Box from "@mui/material/Box";
|
||||
import Typography from "@mui/material/Typography";
|
||||
import IconButton from "@mui/material/IconButton";
|
||||
@@ -274,19 +275,35 @@ class SharedCarousel extends React.Component {
|
||||
|
||||
return (
|
||||
<Box sx={{ mt: 3 }}>
|
||||
<Box
|
||||
component={Link}
|
||||
to="/Kategorien"
|
||||
sx={{
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
justifyContent: "center",
|
||||
textDecoration: "none",
|
||||
color: "primary.main",
|
||||
mb: 2,
|
||||
transition: "all 0.3s ease",
|
||||
"&:hover": {
|
||||
transform: "translateX(5px)",
|
||||
color: "primary.dark"
|
||||
}
|
||||
}}
|
||||
>
|
||||
<Typography
|
||||
variant="h4"
|
||||
component="h1"
|
||||
component="span"
|
||||
sx={{
|
||||
mb: 2,
|
||||
fontFamily: "SwashingtonCP",
|
||||
color: "primary.main",
|
||||
textAlign: "center",
|
||||
textShadow: "3px 3px 10px rgba(0, 0, 0, 0.4)"
|
||||
}}
|
||||
>
|
||||
{t('navigation.categories')}
|
||||
</Typography>
|
||||
<ChevronRight sx={{ fontSize: "2.5rem", ml: 1 }} />
|
||||
</Box>
|
||||
|
||||
<div
|
||||
className="carousel-wrapper"
|
||||
|
||||
@@ -63,7 +63,7 @@ class ExtrasSelector extends Component {
|
||||
this.loadingImages.add(bildId);
|
||||
window.socketManager.emit('getPic', { bildId, size:'small' }, (res) => {
|
||||
if (res.success) {
|
||||
window.smallPicCache[bildId] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/jpeg' }));
|
||||
window.smallPicCache[bildId] = URL.createObjectURL(new Blob([res.imageBuffer], { type: 'image/avif' }));
|
||||
this.forceUpdate();
|
||||
}
|
||||
this.loadingImages.delete(bildId);
|
||||
|
||||
@@ -5,6 +5,7 @@ import CardContent from '@mui/material/CardContent';
|
||||
import Typography from '@mui/material/Typography';
|
||||
import Box from '@mui/material/Box';
|
||||
import Chip from '@mui/material/Chip';
|
||||
import { withI18n } from '../../i18n/withTranslation.js';
|
||||
|
||||
class TentShapeSelector extends Component {
|
||||
// Generate plant layout based on tent shape
|
||||
@@ -180,12 +181,20 @@ class TentShapeSelector extends Component {
|
||||
</Box>
|
||||
|
||||
<Typography variant="body2" color="text.secondary" gutterBottom>
|
||||
{shape.description}
|
||||
{this.props.t && shape.descriptionKey ? this.props.t(shape.descriptionKey) : shape.description}
|
||||
</Typography>
|
||||
|
||||
<Box sx={{ mt: 2 }}>
|
||||
<Chip
|
||||
label={`${shape.minPlants}-${shape.maxPlants} Pflanzen`}
|
||||
label={this.props.t
|
||||
? (
|
||||
shape.minPlants === 1 && shape.maxPlants === 2 ? this.props.t("kitConfig.plants1to2") :
|
||||
shape.minPlants === 2 && shape.maxPlants === 4 ? this.props.t("kitConfig.plants2to4") :
|
||||
shape.minPlants === 4 && shape.maxPlants === 6 ? this.props.t("kitConfig.plants4to6") :
|
||||
shape.minPlants === 3 && shape.maxPlants === 6 ? this.props.t("kitConfig.plants3to6") :
|
||||
`${shape.minPlants}-${shape.maxPlants} Pflanzen`
|
||||
)
|
||||
: `${shape.minPlants}-${shape.maxPlants} Pflanzen`}
|
||||
size="small"
|
||||
sx={{
|
||||
bgcolor: isSelected ? '#2e7d32' : '#f0f0f0',
|
||||
@@ -205,7 +214,7 @@ class TentShapeSelector extends Component {
|
||||
transition: 'opacity 0.3s ease'
|
||||
}}
|
||||
>
|
||||
â AusgewĂ€hlt
|
||||
{this.props.t ? this.props.t("kitConfig.selected") : "â AusgewĂ€hlt"}
|
||||
</Typography>
|
||||
</Box>
|
||||
</CardContent>
|
||||
@@ -238,4 +247,4 @@ class TentShapeSelector extends Component {
|
||||
}
|
||||
}
|
||||
|
||||
export default TentShapeSelector;
|
||||
export default withI18n()(TentShapeSelector);
|
||||
@@ -16,7 +16,7 @@ const Logo = () => {
|
||||
}}
|
||||
>
|
||||
<img
|
||||
src="/assets/images/sh.png"
|
||||
src="/assets/images/sh.avif"
|
||||
alt="SH Logo"
|
||||
width="108px"
|
||||
height="45px"
|
||||
|
||||
@@ -79,7 +79,7 @@ const SearchBar = () => {
|
||||
(response) => {
|
||||
if (response && response.products) {
|
||||
// getSearchProducts returns response.products array
|
||||
const suggestions = response.products.slice(0, 8); // Limit to 8 suggestions
|
||||
const suggestions = response.products.map(p => p.translatedProduct || p).slice(0, 8); // Limit to 8 suggestions
|
||||
setSuggestions(suggestions);
|
||||
setShowSuggestions(suggestions.length > 0);
|
||||
setSelectedIndex(-1); // Reset selection
|
||||
|
||||
@@ -31,6 +31,7 @@ const getStatusTranslation = (status, t) => {
|
||||
new: t ? t('orders.status.new') : "in Bearbeitung",
|
||||
pending: t ? t('orders.status.pending') : "Neu",
|
||||
processing: t ? t('orders.status.processing') : "in Bearbeitung",
|
||||
paid: t ? t('orders.status.paid') : "Bezahlt",
|
||||
cancelled: t ? t('orders.status.cancelled') : "Storniert",
|
||||
shipped: t ? t('orders.status.shipped') : "Verschickt",
|
||||
delivered: t ? t('orders.status.delivered') : "Geliefert",
|
||||
@@ -39,29 +40,23 @@ const getStatusTranslation = (status, t) => {
|
||||
};
|
||||
|
||||
const statusEmojis = {
|
||||
"in Bearbeitung": "âïž",
|
||||
new: "âïž",
|
||||
pending: "âł",
|
||||
processing: "đ",
|
||||
paid: "đŠ",
|
||||
cancelled: "â",
|
||||
Verschickt: "đ",
|
||||
Geliefert: "â
",
|
||||
Storniert: "â",
|
||||
Retoure: "â©ïž",
|
||||
"Teil Retoure": "âȘïž",
|
||||
"Teil geliefert": "âĄ",
|
||||
shipped: "đ",
|
||||
delivered: "â
",
|
||||
};
|
||||
|
||||
const statusColors = {
|
||||
"in Bearbeitung": "#ed6c02", // orange
|
||||
new: "#ed6c02", // orange
|
||||
pending: "#ff9800", // orange for pending
|
||||
processing: "#2196f3", // blue for processing
|
||||
paid: "#2e7d32", // green
|
||||
cancelled: "#d32f2f", // red for cancelled
|
||||
Verschickt: "#2e7d32", // green
|
||||
Geliefert: "#2e7d32", // green
|
||||
Storniert: "#d32f2f", // red
|
||||
Retoure: "#9c27b0", // purple
|
||||
"Teil Retoure": "#9c27b0", // purple
|
||||
"Teil geliefert": "#009688", // teal
|
||||
shipped: "#2e7d32", // green
|
||||
delivered: "#2e7d32", // green
|
||||
};
|
||||
|
||||
const currencyFormatter = new Intl.NumberFormat("de-DE", {
|
||||
@@ -229,11 +224,11 @@ const OrdersTab = ({ orderIdFromHash, t }) => {
|
||||
display: "flex",
|
||||
alignItems: "center",
|
||||
gap: "8px",
|
||||
color: getStatusColor(displayStatus),
|
||||
color: getStatusColor(order.status),
|
||||
}}
|
||||
>
|
||||
<span style={{ fontSize: "1.2rem" }}>
|
||||
{getStatusEmoji(displayStatus)}
|
||||
{getStatusEmoji(order.status)}
|
||||
</span>
|
||||
<Typography
|
||||
variant="body2"
|
||||
@@ -243,6 +238,18 @@ const OrdersTab = ({ orderIdFromHash, t }) => {
|
||||
{displayStatus}
|
||||
</Typography>
|
||||
</Box>
|
||||
{order.delivery_method === 'DHL' && order.trackingCode && (
|
||||
<Box sx={{ mt: 0.5 }}>
|
||||
<a
|
||||
href={`https://www.dhl.de/de/privatkunden/dhl-sendungsverfolgung.html?piececode=${order.trackingCode}`}
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
style={{ fontSize: '0.85rem', color: '#d40511' }}
|
||||
>
|
||||
đŠ {t ? t('orders.trackShipment') : 'Sendung verfolgen'}
|
||||
</a>
|
||||
</Box>
|
||||
)}
|
||||
</TableCell>
|
||||
<TableCell>
|
||||
{order.items
|
||||
|
||||
@@ -206,7 +206,7 @@ const config = {
|
||||
|
||||
// Images
|
||||
images: {
|
||||
logo: "/assets/images/sh.png",
|
||||
logo: "/assets/images/sh.avif",
|
||||
placeholder: "/assets/images/nopicture.jpg"
|
||||
},
|
||||
|
||||
|
||||
@@ -1,9 +1,10 @@
|
||||
// @note Dummy data for grow tent configurator - no backend calls
|
||||
// descriptions now keys for translation
|
||||
export const tentShapes = [
|
||||
{
|
||||
id: '60x60',
|
||||
name: '60x60cm',
|
||||
description: 'Kompakt - ideal fĂŒr kleine RĂ€ume',
|
||||
descriptionKey: 'kitConfig.description60x60',
|
||||
footprint: '60x60',
|
||||
minPlants: 1,
|
||||
maxPlants: 2,
|
||||
@@ -13,7 +14,7 @@ export const tentShapes = [
|
||||
{
|
||||
id: '80x80',
|
||||
name: '80x80cm',
|
||||
description: 'Mittel - perfekte Balance',
|
||||
descriptionKey: 'kitConfig.description80x80',
|
||||
footprint: '80x80',
|
||||
minPlants: 2,
|
||||
maxPlants: 4,
|
||||
@@ -23,7 +24,7 @@ export const tentShapes = [
|
||||
{
|
||||
id: '100x100',
|
||||
name: '100x100cm',
|
||||
description: 'GroĂ - fĂŒr erfahrene Grower',
|
||||
descriptionKey: 'kitConfig.description100x100',
|
||||
footprint: '100x100',
|
||||
minPlants: 4,
|
||||
maxPlants: 6,
|
||||
@@ -33,7 +34,7 @@ export const tentShapes = [
|
||||
{
|
||||
id: '120x60',
|
||||
name: '120x60cm',
|
||||
description: 'Rechteckig - maximale Raumnutzung',
|
||||
descriptionKey: 'kitConfig.description120x60',
|
||||
footprint: '120x60',
|
||||
minPlants: 3,
|
||||
maxPlants: 6,
|
||||
|
||||
@@ -5,6 +5,7 @@ export default {
|
||||
"profile": "ۧÙÙ
ÙÙ Ű§Ùێ۟۔Ù",
|
||||
"email": "ۧÙۚ۱ÙŰŻ ۧÙŰ„ÙÙŰȘ۱ÙÙÙ",
|
||||
"password": "ÙÙÙ
Ű© ۧÙÙ
۱Ù۱",
|
||||
"newPassword": "ÙÙÙ
Ű© ۧÙÙ
۱Ù۱ ۧÙŰŹŰŻÙŰŻŰ©",
|
||||
"confirmPassword": "ŰȘŰŁÙÙŰŻ ÙÙÙ
Ű© ۧÙÙ
۱Ù۱",
|
||||
"forgotPassword": "ÙÙ ÙŰłÙŰȘ ÙÙÙ
Ű© ۧÙÙ
۱Ù۱Ű",
|
||||
"loginWithGoogle": "ŰȘ۳ۏÙÙ Ű§ÙŰŻŰźÙÙ ŰšŰ§ŰłŰȘ۟ۯۧÙ
ŰŹÙŰŹÙ",
|
||||
@@ -13,6 +14,7 @@ export default {
|
||||
"privacyPolicy": "ŰłÙۧ۳۩ ۧÙ۟۔ÙŰ”ÙŰ©",
|
||||
"passwordMinLength": "ÙŰŹŰš ŰŁÙ ŰȘÙÙÙ ÙÙÙ
Ű© ۧÙÙ
۱Ù۱ 8 ŰŁŰŰ±Ù ŰčÙÙ Ű§ÙŰŁÙÙ",
|
||||
"newPasswordMinLength": "ÙŰŹŰš ŰŁÙ ŰȘÙÙÙ ÙÙÙ
Ű© ۧÙÙ
۱Ù۱ ۧÙŰŹŰŻÙŰŻŰ© 8 ŰŁŰŰ±Ù ŰčÙÙ Ű§ÙŰŁÙÙ",
|
||||
"backToHome": "ۧÙŰčÙŰŻŰ© Ű„ÙÙ Ű§ÙŰ”ÙŰŰ© ۧÙ۱ۊÙŰłÙŰ©",
|
||||
"menu": {
|
||||
"profile": "ۧÙÙ
ÙÙ Ű§Ùێ۟۔Ù",
|
||||
"myProfile": "Ù
ÙÙÙ Ű§Ùێ۟۔Ù",
|
||||
@@ -21,5 +23,28 @@ export default {
|
||||
"settings": "ۧÙŰ„ŰčۯۧۯۧŰȘ",
|
||||
"adminDashboard": "ÙÙŰŰ© ŰȘŰÙÙ
ۧÙÙ
۳ۀÙÙ",
|
||||
"adminUsers": "Ù
ŰłŰȘ۟ۯÙ
Ù Ű§ÙÙ
۳ۀÙÙ"
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "Ű„Űčۧۯ۩ ŰȘŰčÙÙÙ ÙÙÙ
Ű© ۧÙÙ
۱Ù۱",
|
||||
"button": "Ű„Űčۧۯ۩ ŰȘŰčÙÙÙ ÙÙÙ
Ű© ۧÙÙ
۱Ù۱",
|
||||
"success": "ŰȘÙ
Ű„Űčۧۯ۩ ŰȘŰčÙÙÙ ÙÙÙ
Ű© ۧÙÙ
۱Ù۱ ŰšÙۏۧŰ! ŰłÙŰȘÙ
ŰȘÙŰŹÙÙÙ ÙŰȘ۳ۏÙÙ Ű§ÙŰŻŰźÙÙ Ù۱ÙŰšÙۧ...",
|
||||
"invalidToken": "ÙÙ
ÙŰȘÙ
ۧÙŰčŰ«Ù۱ ŰčÙÙ Ű±Ù
ŰČ Ű”Ű§ÙŰ. ÙŰ±ŰŹÙ Ű§ŰłŰȘ۟ۯۧÙ
ۧÙ۱ۧۚ۷ Ù
Ù ŰšŰ±ÙŰŻÙ Ű§ÙŰ„ÙÙŰȘ۱ÙÙÙ.",
|
||||
"error": "ŰŰŻŰ« ۟۷ۣ ŰŁŰ«Ùۧۥ Ű„Űčۧۯ۩ ŰȘŰčÙÙÙ ÙÙÙ
Ű© ۧÙÙ
۱Ù۱",
|
||||
"emailSent": "ŰȘÙ
Ű„Ű±ŰłŰ§Ù Ű±Ű§ŰšŰ· ÙŰ„Űčۧۯ۩ ŰȘŰčÙÙÙ ÙÙÙ
Ű© ۧÙÙ
۱Ù۱ Ű„ÙÙ ŰšŰ±ÙŰŻÙ Ű§ÙŰ„ÙÙŰȘ۱ÙÙÙ.",
|
||||
"emailError": "ŰŰŻŰ« ۟۷ۣ ŰŁŰ«Ùۧۥ Ű„Ű±ŰłŰ§Ù Ű§Ùۚ۱ÙŰŻ ۧÙŰ„ÙÙŰȘ۱ÙÙÙ"
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "ÙŰ±ŰŹÙ Ù
ÙŰĄ ŰŹÙ
ÙŰč ۧÙŰÙÙÙ",
|
||||
"invalidEmail": "ÙŰ±ŰŹÙ Ű„ŰŻŰźŰ§Ù ŰšŰ±ÙŰŻ Ű„ÙÙŰȘ۱ÙÙÙ Ű”Ű§ÙŰ",
|
||||
"passwordsNotMatch": "ÙÙÙ
ۧŰȘ ۧÙÙ
۱Ù۱ ŰșÙ۱ Ù
ŰȘ۷ۧۚÙŰ©",
|
||||
"passwordsNotMatchShort": "ÙÙÙ
ۧŰȘ ۧÙÙ
۱Ù۱ ŰșÙ۱ Ù
ŰȘ۷ۧۚÙŰ©",
|
||||
"enterEmail": "ÙŰ±ŰŹÙ Ű„ŰŻŰźŰ§Ù ŰšŰ±ÙŰŻÙ Ű§ÙŰ„ÙÙŰȘ۱ÙÙÙ",
|
||||
"loginFailed": "ÙŰŽÙ ŰȘ۳ۏÙÙ Ű§ÙŰŻŰźÙÙ",
|
||||
"registerFailed": "ÙŰŽÙ Ű§ÙŰȘ۳ۏÙÙ",
|
||||
"googleLoginFailed": "ÙŰŽÙ ŰȘ۳ۏÙÙ Ű§ÙŰŻŰźÙÙ Űčۚ۱ ŰŹÙŰŹÙ",
|
||||
"emailExists": "ÙÙŰŹŰŻ Ù
ŰłŰȘ۟ۯÙ
ŰšÙ۰ۧ ۧÙۚ۱ÙŰŻ ۧÙŰ„ÙÙŰȘ۱ÙÙÙ ŰšŰ§ÙÙŰčÙ. ÙŰ±ŰŹÙ Ű§ŰłŰȘ۟ۯۧÙ
ۚ۱ÙŰŻ Ű„ÙÙŰȘ۱ÙÙÙ ŰąŰźŰ± ŰŁÙ ŰȘ۳ۏÙÙ Ű§ÙŰŻŰźÙÙ."
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "ŰȘÙ
ۧÙŰȘ۳ۏÙÙ ŰšÙۏۧŰ. ÙÙ
ÙÙÙ Ű§ÙŰąÙ ŰȘ۳ۏÙÙ Ű§ÙŰŻŰźÙÙ."
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
43
src/i18n/locales/ar/kitConfig.js
Normal file
@@ -0,0 +1,43 @@
|
||||
export default {
|
||||
"pageTitle": "đ± Ù
ÙÙÙÙÙ ŰŹŰ±ÙŰšÙÙŰł",
|
||||
"pageSubtitle": "۱ÙÙŰš Ű„Űčۯۧۯ ۧÙÙÙ
Ù Ű§Ùۯۧ۟ÙÙ Ű§ÙÙ
۫ۧÙÙ ŰšŰȘۧŰčÙ",
|
||||
"bundleDiscountTitle": "đŻ Ű§ŰŰ”Ù ŰčÙÙ ŰźŰ”Ù
ۧÙۚۧÙŰ©!",
|
||||
"loadingProducts": "ŰŹŰ§Ű±Ù ŰȘŰÙ
ÙÙ Ù
ÙŰȘۏۧŰȘ ۧÙۏ۱ÙŰšÙÙŰł...",
|
||||
"loadingLighting": "ŰŹŰ§Ű±Ù ŰȘŰÙ
ÙÙ Ù
ÙŰȘۏۧŰȘ ۧÙۄ۶ۧۥ۩...",
|
||||
"loadingVentilation": "ŰŹŰ§Ű±Ù ŰȘŰÙ
ÙÙ Ù
ÙŰȘۏۧŰȘ ۧÙŰȘÙÙÙŰ©...",
|
||||
"loadingExtras": "ŰŹŰ§Ű±Ù ŰȘŰÙ
ÙÙ Ű§Ùۄ۶ۧÙۧŰȘ...",
|
||||
"noProductsAvailable": "Ùۧ ŰȘÙŰŹŰŻ Ù
ÙŰȘۏۧŰȘ Ù
ŰȘۧŰŰ© ÙÙ۰ۧ ۧÙŰŰŹÙ
",
|
||||
"noLightingAvailable": "Ùۧ ŰȘÙŰŹŰŻ ۣ۶Ùۧۥ Ù
Ùۧ۳ۚ۩ ÙŰŰŹÙ
ۧÙŰźÙÙ
Ű© {{shape}}.",
|
||||
"noVentilationAvailable": "Ùۧ ŰȘÙŰŹŰŻ ŰȘÙÙÙŰ© Ù
Ùۧ۳ۚ۩ ÙŰŰŹÙ
ۧÙŰźÙÙ
Ű© {{shape}}.",
|
||||
"noExtrasAvailable": "Ùۧ ŰȘÙŰŹŰŻ ۄ۶ۧÙۧŰȘ Ù
ŰȘۧŰŰ©",
|
||||
"selectShapeTitle": "1. ۧ۟ŰȘ۱ ŰŽÙÙ Ű§Ùۏ۱ÙŰšÙÙŰł",
|
||||
"selectShapeSubtitle": "ۧ۟ŰȘۧ۱ ŰŁÙÙŰ§Ù Ù
۳ۧŰŰ© ÙۧŰčŰŻŰ© ۧÙۏ۱ÙŰšÙÙŰł ŰšŰȘۧŰčŰȘÙ",
|
||||
"selectProductTitle": "2. ۧ۟ŰȘ۱ Ù
ÙŰȘŰŹ ۧÙۏ۱ÙŰšÙÙŰł",
|
||||
"selectProductSubtitle": "ۧ۟ŰȘۧ۱ ۧÙÙ
ÙŰȘŰŹ ۧÙÙ
Ùۧ۳ۚ Ùۏ۱ÙŰšÙÙŰł {{shape}} ŰšŰȘۧŰčÙ",
|
||||
"selectLightingTitle": "3. ۧ۟ŰȘ۱ ۧÙۄ۶ۧۥ۩",
|
||||
"selectLightingTitleShape": "3. ۧ۟ŰȘ۱ ۧÙۄ۶ۧۥ۩ - {{shape}}",
|
||||
"selectLightingSubtitle": "Ù
Ù Ù۶ÙÙ Ű§ŰźŰȘۧ۱ ŰŰŹÙ
ۧÙŰźÙÙ
Ű© ۧÙŰŁÙÙ.",
|
||||
"selectVentilationTitle": "4. ۧ۟ŰȘ۱ ۧÙŰȘÙÙÙŰ©",
|
||||
"selectVentilationTitleShape": "4. ۧ۟ŰȘ۱ ۧÙŰȘÙÙÙŰ© - {{shape}}",
|
||||
"selectVentilationSubtitle": "Ù
Ù Ù۶ÙÙ Ű§ŰźŰȘۧ۱ ŰŰŹÙ
ۧÙŰźÙÙ
Ű© ۧÙŰŁÙÙ.",
|
||||
"selectExtrasTitle": "5. ŰŁŰ¶Ù Ű„Ű¶Ű§ÙۧŰȘ (ۧ۟ŰȘÙۧ۱Ù)",
|
||||
"yourConfiguration": "đŻ Ű§ÙŰȘÙÙÙÙ ŰšŰȘۧŰčÙ",
|
||||
"growboxLabel": "ۏ۱ÙŰšÙÙŰł: {{name}}",
|
||||
"lightingLabel": "ۧÙۄ۶ۧۥ۩: {{name}}",
|
||||
"ventilationLabel": "ۧÙŰȘÙÙÙŰ©: {{name}}",
|
||||
"extraLabel": "ۄ۶ۧÙŰ©: {{name}}",
|
||||
"totalPrice": "ۧÙŰłŰč۱ ۧÙÙÙÙ:",
|
||||
"addToCart": "ŰŁŰ¶Ù Ű„ÙÙ Ű§ÙŰłÙŰ©",
|
||||
"selected": "â ŰȘÙ
ۧÙۧ۟ŰȘÙۧ۱",
|
||||
"notDeliverable": "ŰșÙ۱ Ù
ŰȘÙÙ۱ ÙÙŰȘÙŰ”ÙÙ",
|
||||
"noPrice": "Ùۧ ÙÙŰŹŰŻ ŰłŰč۱",
|
||||
"setName": "Ű·ÙÙ
ۏ۱ÙŰšÙÙŰł - {{shape}}",
|
||||
"description60x60": "Ù
ÙŰŻÙ
ŰŹ - Ù
۫ۧÙÙ ÙÙÙ
۳ۧŰۧŰȘ ۧÙŰ”ŰșÙ۱۩",
|
||||
"description80x80": "Ù
ŰȘÙ۳۷ - ŰȘÙۧŰČÙ Ù
۫ۧÙÙ",
|
||||
"description100x100": "ÙŰšÙ۱ - ÙÙÙ
ŰČۧ۱ŰčÙÙ Ű§ÙÙ
ŰȘÙ
۱۳ÙÙ",
|
||||
"description120x60": "Ù
ŰłŰȘŰ·ÙÙ - ۧ۳ŰȘ۟ۯۧÙ
ŰŁÙŰ”Ù ÙÙÙ
۳ۧŰŰ©",
|
||||
"plants1to2": "1-2 ÙۚۧŰȘۧŰȘ",
|
||||
"plants2to4": "2-4 ÙۚۧŰȘۧŰȘ",
|
||||
"plants4to6": "4-6 ÙۚۧŰȘۧŰȘ",
|
||||
"plants3to6": "3-6 ÙۚۧŰȘۧŰȘ"
|
||||
};
|
||||
@@ -3,7 +3,8 @@ export default {
|
||||
"new": "ÙÙŰŻ ۧÙŰȘÙÙÙ۰",
|
||||
"pending": "ŰŹŰŻÙŰŻ",
|
||||
"processing": "ÙÙŰŻ ۧÙŰȘÙÙÙ۰",
|
||||
"cancelled": "Ù
ÙŰșۧ۩",
|
||||
"paid": "Ù
ŰŻÙÙŰč",
|
||||
"cancelled": "Ù
ÙŰșÙ",
|
||||
"shipped": "ŰȘÙ
ۧÙŰŽŰÙ",
|
||||
"delivered": "ŰȘÙ
ۧÙŰȘÙŰ”ÙÙ",
|
||||
"return": "ۄ۱ۏۧŰč",
|
||||
@@ -24,6 +25,7 @@ export default {
|
||||
"cancelOrder": "Ű„ÙŰșۧۥ ۧÙŰ·ÙŰš"
|
||||
},
|
||||
"noOrders": "ÙÙ
ŰȘÙÙ
ŰšÙ۶Űč ŰŁÙ Ű·ÙۚۧŰȘ ŰšŰčŰŻ.",
|
||||
"trackShipment": "ŰȘŰȘŰšŰč ۧÙŰŽŰÙŰ©",
|
||||
"details": {
|
||||
"title": "ŰȘÙۧ۔ÙÙ Ű§ÙŰ·ÙŰš: {{orderId}}",
|
||||
"deliveryAddress": "ŰčÙÙŰ§Ù Ű§ÙŰȘÙŰ”ÙÙ",
|
||||
@@ -36,14 +38,13 @@ export default {
|
||||
"item": "ۧÙŰčÙ۔۱",
|
||||
"quantity": "ۧÙÙÙ
ÙŰ©",
|
||||
"price": "ۧÙŰłŰč۱",
|
||||
"vat": "۶۱Ùۚ۩ ۧÙÙÙÙ
Ű© ۧÙÙ
۶ۧÙŰ©",
|
||||
"total": "ۧÙۄۏÙ
ۧÙÙ",
|
||||
"cancelOrder": "Ű„ÙŰșۧۥ ۧÙŰ·ÙŰš"
|
||||
},
|
||||
"cancelConfirm": {
|
||||
"title": "Ű„ÙŰșۧۥ ۧÙŰ·ÙŰš",
|
||||
"message": "ÙÙ ŰŁÙŰȘ Ù
ŰȘŰŁÙŰŻ ŰŁÙÙ ŰȘ۱ÙŰŻ Ű„ÙŰșۧۥ Ù۰ۧ ۧÙŰ·ÙŰšŰ",
|
||||
"confirm": "Ű„ÙŰșۧۥ ۧÙŰ·ÙŰš",
|
||||
"confirm": "Ű„ÙŰșۧۥ",
|
||||
"cancelling": "ŰŹŰ§Ű±Ù Ű§ÙŰ„ÙŰșۧۥ..."
|
||||
},
|
||||
"processing": "ÙŰȘÙ
Ű„ÙÙ
Ű§Ù Ű§ÙŰ·ÙŰš..."
|
||||
|
||||
@@ -5,9 +5,10 @@ export default {
|
||||
"notFoundDescription": "ۧÙÙ
ÙŰȘŰŹ ۧÙŰ°Ù ŰȘŰšŰŰ« ŰčÙÙ ŰșÙ۱ Ù
ÙŰŹÙŰŻ ŰŁÙ ŰȘÙ
Ű„ŰČۧÙŰȘÙ.",
|
||||
"backToHome": "ۧÙŰčÙŰŻŰ© Ű„ÙÙ Ű§ÙŰ”ÙŰŰ© ۧÙ۱ۊÙŰłÙŰ©",
|
||||
"error": "۟۷ۣ",
|
||||
"articleNumber": "۱ÙÙ
ۧÙŰ”ÙÙ",
|
||||
"articleNumber": "۱ÙÙ
ۧÙÙ
ÙŰȘŰŹ",
|
||||
"manufacturer": "ۧÙێ۱ÙŰ© ۧÙÙ
Ű”ÙŰčŰ©",
|
||||
"inclVat": "ێۧÙ
Ù {{vat}}% ۶۱Ùۚ۩ ۧÙÙÙÙ
Ű© ۧÙÙ
۶ۧÙŰ©",
|
||||
"inclVatSimple": "ێۧÙ
Ù Ű¶Ű±Ùۚ۩ ۧÙÙÙÙ
Ű© ۧÙÙ
۶ۧÙŰ©",
|
||||
"priceUnit": "{{price}}/{{unit}}",
|
||||
"new": "ŰŹŰŻÙŰŻ",
|
||||
"weeks": "ۣ۳ۧۚÙŰč",
|
||||
@@ -15,7 +16,7 @@ export default {
|
||||
"inclVatFooter": "ێۧÙ
Ù {{vat}}% ۶۱Ùۚ۩ ۧÙÙÙÙ
Ű© ۧÙÙ
۶ۧÙŰ©,*",
|
||||
"availability": "ۧÙŰȘÙÙ۱",
|
||||
"inStock": "Ù
ŰȘÙÙ۱ ÙÙ Ű§ÙÙ
ŰźŰČÙÙ",
|
||||
"comingSoon": "Ù۱ÙŰšÙۧ Ù
ŰȘÙÙ۱",
|
||||
"comingSoon": "Ù۱ÙŰšÙۧ",
|
||||
"deliveryTime": "Ù
ŰŻŰ© ۧÙŰȘÙŰ”ÙÙ",
|
||||
"inclShort": "ێۧÙ
Ù",
|
||||
"vatShort": "۶۱Ùۚ۩ ۧÙÙÙÙ
Ű© ۧÙÙ
۶ۧÙŰ©",
|
||||
@@ -32,10 +33,10 @@ export default {
|
||||
"similarProducts": "Ù
ÙŰȘۏۧŰȘ Ù
ێۧۚÙŰ©",
|
||||
"countDisplay": {
|
||||
"noProducts": "0 Ù
ÙŰȘۏۧŰȘ",
|
||||
"oneProduct": "Ù
ÙŰȘŰŹ ÙۧŰŰŻ",
|
||||
"oneProduct": "1 Ù
ÙŰȘŰŹ",
|
||||
"multipleProducts": "{{count}} Ù
ÙŰȘۏۧŰȘ",
|
||||
"filteredProducts": "{{filtered}} Ù
Ù {{total}} Ù
ÙŰȘۏۧŰȘ",
|
||||
"filteredOneProduct": "{{filtered}} Ù
Ù Ù
ÙŰȘŰŹ ÙۧŰŰŻ",
|
||||
"filteredOneProduct": "{{filtered}} Ù
Ù 1 Ù
ÙŰȘŰŹ",
|
||||
"xOfYProducts": "{{x}} Ù
Ù {{y}} Ù
ÙŰȘۏۧŰȘ"
|
||||
},
|
||||
"removeFiltersToSee": "ÙÙ
ۚۄŰČۧÙŰ© ۧÙÙÙۧŰȘ۱ Ù۱ۀÙŰ© ۧÙÙ
ÙŰȘۏۧŰȘ",
|
||||
|
||||
61
src/i18n/locales/ar/productDialogs.js
Normal file
@@ -0,0 +1,61 @@
|
||||
export default {
|
||||
"questionTitle": "ŰłŰ€Ű§Ù ŰčÙ Ű§ÙÙ
ÙŰȘŰŹ",
|
||||
"questionSubtitle": "ÙÙ ÙŰŻÙÙ ŰłŰ€Ű§Ù ŰčÙ Ù۰ۧ ۧÙÙ
ÙŰȘŰŹŰ ÙŰÙ ŰłŰčۯۧۥ ŰšÙ
۳ۧŰčŰŻŰȘÙ.",
|
||||
"questionSuccess": "ŰŽÙ۱Ùۧ ŰčÙÙ ŰłŰ€Ű§ÙÙ! ŰłÙ۱ۯ ŰčÙÙÙ ÙÙ ŰŁÙ۱ۚ ÙÙŰȘ Ù
Ù
ÙÙ.",
|
||||
"nameLabel": "ۧÙۧ۳Ù
",
|
||||
"namePlaceholder": "ۧ۳Ù
Ù",
|
||||
"emailLabel": "ۧÙۚ۱ÙŰŻ ۧÙŰ„ÙÙŰȘ۱ÙÙÙ",
|
||||
"emailPlaceholder": "your.email@example.com",
|
||||
"questionLabel": "۳ۀۧÙÙ",
|
||||
"questionPlaceholder": "Ű”Ù ŰłŰ€Ű§ÙÙ ŰčÙ Ù۰ۧ ۧÙÙ
ÙŰȘŰŹ...",
|
||||
"photosLabelQuestion": "ۣ۱ÙÙ Ű”Ù۱Ùۧ Ù
Űč ۳ۀۧÙÙ (ۧ۟ŰȘÙۧ۱Ù)",
|
||||
"submitQuestion": "Ű„Ű±ŰłŰ§Ù Ű§Ù۳ۀۧÙ",
|
||||
"sending": "ŰŹŰ§Ű±Ù Ű§Ùۄ۱۳ۧÙ...",
|
||||
|
||||
"ratingTitle": "ÙÙÙ
ۧÙÙ
ÙŰȘŰŹ",
|
||||
"ratingSubtitle": "ŰŽŰ§Ű±Ù ŰȘۏ۱ۚŰȘÙ Ù
Űč Ù۰ۧ ۧÙÙ
ÙŰȘŰŹ Ù۳ۧŰčŰŻ ۧÙŰčÙ
Ùۧۥ ۧÙ۹۟۱ÙÙ ÙÙ Ű§ŰȘ۟ۧ۰ Ù۱ۧ۱ÙÙ
.",
|
||||
"ratingSuccess": "ŰŽÙ۱Ùۧ ŰčÙÙ ŰȘÙÙÙÙ
Ù! ŰłÙŰȘÙ
ÙŰŽŰ±Ù ŰšŰčŰŻ ۧÙÙ
۱ۧۏŰčŰ©.",
|
||||
"emailHelper": "ÙÙ ÙŰȘÙ
Ùێ۱ ۚ۱ÙŰŻÙ Ű§ÙŰ„ÙÙŰȘ۱ÙÙÙ",
|
||||
"ratingLabel": "ۧÙŰȘÙÙÙÙ
*",
|
||||
"pleaseRate": "ÙŰ±ŰŹÙ Ű§ÙŰȘÙÙÙÙ
",
|
||||
"ratingStars": "{{rating}} Ù
Ù 5 ÙŰŹÙÙ
",
|
||||
"reviewLabel": "ŰȘÙÙÙÙ
Ù (ۧ۟ŰȘÙۧ۱Ù)",
|
||||
"reviewPlaceholder": "Ű”Ù ŰȘŰŹŰ§Ű±ŰšÙ Ù
Űč Ù۰ۧ ۧÙÙ
ÙŰȘŰŹ...",
|
||||
"photosLabelRating": "ۣ۱ÙÙ Ű”Ù۱Ùۧ Ù
Űč ŰȘÙÙÙÙ
Ù (ۧ۟ŰȘÙۧ۱Ù)",
|
||||
"submitRating": "Ű„Ű±ŰłŰ§Ù Ű§ÙŰȘÙÙÙÙ
",
|
||||
"errorGeneric": "ŰŰŻŰ« ۟۷ۣ",
|
||||
"errorPhotos": "۟۷ۣ ÙÙ Ù
ŰčۧÙŰŹŰ© ۧÙŰ”Ù۱",
|
||||
|
||||
"availabilityTitle": "Ű·ÙŰš ۧÙŰȘÙÙ۱",
|
||||
"availabilitySubtitle": "Ù۰ۧ ۧÙÙ
ÙŰȘŰŹ ŰșÙ۱ Ù
ŰȘÙÙ۱ ŰۧÙÙÙۧ. ŰłÙÙÙÙ ŰłŰčۯۧۥ ۚۄۚÙۧŰșÙ ŰšÙ
ۏ۱ۯ ŰčÙŰŻŰȘÙ ÙÙÙ
ŰźŰČÙÙ.",
|
||||
"availabilitySuccessEmail": "ŰŽÙ۱Ùۧ ŰčÙÙ Ű·ÙŰšÙ! ŰłÙŰźŰ·Ű±Ù Űčۚ۱ ۧÙۚ۱ÙŰŻ ۧÙŰ„ÙÙŰȘ۱ÙÙÙ ŰšÙ
ۏ۱ۯ ŰȘÙÙ۱ ۧÙÙ
ÙŰȘŰŹ Ù
۱۩ ۣ۟۱Ù.",
|
||||
"availabilitySuccessTelegram": "ŰŽÙ۱Ùۧ ŰčÙÙ Ű·ÙŰšÙ! ŰłÙŰźŰ·Ű±Ù Űčۚ۱ ŰȘÙÙÙۏ۱ۧÙ
ŰšÙ
ۏ۱ۯ ŰȘÙÙ۱ ۧÙÙ
ÙŰȘŰŹ Ù
۱۩ ۣ۟۱Ù.",
|
||||
"notificationMethodLabel": "ÙÙÙ ŰȘÙŰŻ ŰŁÙ ÙŰȘÙ
Ű„ŰčÙۧÙ
ÙŰ",
|
||||
"telegramBotLabel": "ŰšÙŰȘ ŰȘÙÙÙۏ۱ۧÙ
",
|
||||
"telegramIdLabel": "Ù
ŰčŰ±Ù ŰȘÙÙÙۏ۱ۧÙ
",
|
||||
"telegramPlaceholder": "@ۧ۳Ù
ÙŰčÙÙŰȘÙÙÙۏ۱ۧÙ
ŰŁÙ Ù
ŰčŰ±Ù ŰȘÙÙÙۏ۱ۧÙ
",
|
||||
"telegramHelper": "ŰŁŰŻŰźÙ Ű§ŰłÙ
ۧÙÙ
ŰłŰȘ۟ۯÙ
ۧÙ۟ۧ۔ ŰšÙ ŰčÙÙ ŰȘÙÙÙۏ۱ۧÙ
(Ù
Űč @) ŰŁÙ Ù
ŰčŰ±Ù ŰȘÙÙÙۏ۱ۧÙ
",
|
||||
"messageLabel": "۱۳ۧÙŰ© (ۧ۟ŰȘÙۧ۱Ù)",
|
||||
"messagePlaceholder": "Ù
ŰčÙÙÙ
ۧŰȘ ۄ۶ۧÙÙŰ© ŰŁÙ ŰŁŰłŰŠÙŰ©...",
|
||||
"submitAvailability": "Ű·ÙŰš ۧÙŰȘÙÙ۱",
|
||||
|
||||
"photoUploadSelect": "ۧ۟ŰȘ۱ ۧÙŰ”Ù۱",
|
||||
"photoUploadErrorMaxFiles": "ۧÙŰŰŻ ۧÙŰŁÙŰ”Ù {{max}} Ù
ÙÙۧŰȘ Ù
ŰłÙ
ÙŰ ŰšÙۧ",
|
||||
"photoUploadErrorFileType": "Ù
ŰłÙ
ÙŰ ÙÙŰ· ŰšÙ
ÙÙۧŰȘ ۧÙŰ”Ù۱ (JPEG, PNG, GIF, WebP)",
|
||||
"photoUploadErrorFileSize": "ۧÙÙ
ÙÙ ÙŰšÙ۱ ŰŹŰŻÙۧ. ۧÙŰŰŻ ۧÙŰŁÙŰ”Ù: {{maxSize}} Ù
ÙۏۧۚۧÙŰȘ",
|
||||
"photoUploadSelectedFiles": "{{count}} Ù
ÙÙ(Ù
ÙÙۧŰȘ) Ù
ŰźŰȘۧ۱۩",
|
||||
"photoUploadCompressed": "(ŰȘÙ
ۧÙ۶ŰșŰ· ÙÙ۱ÙŰč)",
|
||||
"photoUploadRemove": "Ű„ŰČۧÙŰ© ۧÙŰ”Ù۱۩",
|
||||
"photoUploadLabelDefault": "ۣ۱ÙÙ Ű”Ù۱Ùۧ (ۧ۟ŰȘÙۧ۱Ù)",
|
||||
|
||||
"shareTitle": "Ù
ێۧ۱ÙŰ©",
|
||||
"shareEmbed": "ŰȘ۶Ù
ÙÙ",
|
||||
"shareCopyLink": "Ù۳۟ ۧÙ۱ۧۚ۷",
|
||||
"shareSuccessEmbed": "ŰȘÙ
Ù۳۟ ÙÙŰŻ ۧÙŰȘ۶Ù
ÙÙ Ű„ÙÙ Ű§ÙŰۧÙ۞۩!",
|
||||
"shareErrorEmbed": "ŰŰŻŰ« ۟۷ۣ ŰŁŰ«Ùۧۥ Ù۳۟ ÙÙŰŻ ۧÙŰȘ۶Ù
ÙÙ",
|
||||
"shareSuccessLink": "ŰȘÙ
Ù۳۟ ۧÙ۱ۧۚ۷ Ű„ÙÙ Ű§ÙŰۧÙ۞۩!",
|
||||
"shareWhatsAppText": "ŰŽÙÙ Ű§ÙÙ
ÙŰȘŰŹ ŰŻÙ: {{name}}",
|
||||
"shareTelegramText": "ŰŽÙÙ Ű§ÙÙ
ÙŰȘŰŹ ŰŻÙ: {{name}}",
|
||||
"shareEmailSubject": "ŰȘÙŰ”ÙŰ© ŰšÙ
ÙŰȘŰŹ",
|
||||
"shareEmailBody": "Ù
۱ŰŰšÙۧŰ\n\nŰۧۚۚ ŰŁÙŰ”Ù ÙÙ ŰšŰ§ÙÙ
ÙŰȘŰŹ ŰŻÙ:\n\n{{name}}\n{{url}}\n\nÙ
Űč ŰŁŰ·ÙŰš ۧÙŰȘŰÙۧŰȘ"
|
||||
};
|
||||
@@ -5,14 +5,16 @@ export default {
|
||||
"profile": "ĐŃĐŸŃОл",
|
||||
"email": "ĐĐŒĐ”ĐčĐ»",
|
||||
"password": "ĐаŃĐŸĐ»Đ°",
|
||||
"newPassword": "ĐĐŸĐČа паŃĐŸĐ»Đ°",
|
||||
"confirmPassword": "ĐĐŸŃĐČŃŃĐŽĐ”ŃĐ” паŃĐŸĐ»Đ°Ńа",
|
||||
"forgotPassword": "ĐабŃаĐČĐ”ĐœĐ° паŃĐŸĐ»Đ°?",
|
||||
"loginWithGoogle": "ĐŃ
ĐŸĐŽ Ń Google",
|
||||
"or": "ĐĐĐ",
|
||||
"privacyAccept": "ĐĄ ĐœĐ°ŃĐžŃĐșĐ°ĐœĐ” ĐœĐ° \"ĐŃ
ĐŸĐŽ Ń Google\" ĐżŃĐžĐ”ĐŒĐ°ĐŒ",
|
||||
"privacyAccept": "ĐĄ ĐœĐ°ŃĐžŃĐșĐ°ĐœĐ”ŃĐŸ ĐœĐ° \"ĐŃ
ĐŸĐŽ Ń Google\" ĐżŃĐžĐ”ĐŒĐ°ĐŒ",
|
||||
"privacyPolicy": "ĐĐŸĐ»ĐžŃĐžĐșаŃа за ĐżĐŸĐČĐ”ŃĐžŃĐ”Đ»ĐœĐŸŃŃ",
|
||||
"passwordMinLength": "ĐаŃĐŸĐ»Đ°Ńа ŃŃŃбĐČа Ўа Đ” ĐżĐŸĐœĐ” 8 ŃĐžĐŒĐČĐŸĐ»Đ°",
|
||||
"newPasswordMinLength": "ĐĐŸĐČаŃа паŃĐŸĐ»Đ° ŃŃŃбĐČа Ўа Đ” ĐżĐŸĐœĐ” 8 ŃĐžĐŒĐČĐŸĐ»Đ°",
|
||||
"backToHome": "ĐбŃаŃĐœĐŸ ĐșŃĐŒ ĐœĐ°ŃĐ°Đ»ĐœĐ°Ńа ŃŃŃĐ°ĐœĐžŃа",
|
||||
"menu": {
|
||||
"profile": "ĐŃĐŸŃОл",
|
||||
"myProfile": "ĐĐŸŃŃ ĐżŃĐŸŃОл",
|
||||
@@ -21,5 +23,28 @@ export default {
|
||||
"settings": "ĐаŃŃŃĐŸĐčĐșĐž",
|
||||
"adminDashboard": "ĐĐŽĐŒĐžĐœ ŃĐ°Đ±Đ»ĐŸ",
|
||||
"adminUsers": "ĐĐŽĐŒĐžĐœ ĐżĐŸŃŃДбОŃДлО"
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "ĐŃлОŃĐ°ĐœĐ” ĐœĐ° паŃĐŸĐ»Đ°",
|
||||
"button": "ĐŃлОŃĐ°ĐœĐ” ĐœĐ° паŃĐŸĐ»Đ°",
|
||||
"success": "ĐаŃаŃа паŃĐŸĐ»Đ° бДŃĐ” ŃŃпДŃĐœĐŸ ĐœŃлОŃĐ°ĐœĐ°! ĐĄĐșĐŸŃĐŸ ŃĐ” бŃĐŽĐ”ŃĐ” ĐżŃĐ”ĐœĐ°ŃĐŸŃĐ”ĐœĐž ĐșŃĐŒ ĐČŃ
ĐŸĐŽ...",
|
||||
"invalidToken": "ĐŃĐŒĐ° ĐČĐ°Đ»ĐžĐŽĐ”Đœ ŃĐŸĐșĐ”Đœ. ĐĐŸĐ»Ń, ĐžĐ·ĐżĐŸĐ»Đ·ĐČаĐčŃĐ” Đ»ĐžĐœĐșа ĐŸŃ ĐžĐŒĐ”Đčла ŃĐž.",
|
||||
"error": "ĐŃĐ”ŃĐșа ĐżŃĐž ĐœŃлОŃĐ°ĐœĐ” ĐœĐ° паŃĐŸĐ»Đ°Ńа",
|
||||
"emailSent": "ĐĐžĐœĐș за ĐœŃлОŃĐ°ĐœĐ” ĐœĐ° паŃĐŸĐ»Đ°Ńа бДŃĐ” ОзпŃаŃĐ”Đœ ĐœĐ° ĐČаŃĐžŃ ĐžĐŒĐ”ĐčĐ».",
|
||||
"emailError": "ĐŃĐ”ŃĐșа ĐżŃĐž ОзпŃаŃĐ°ĐœĐ” ĐœĐ° ĐžĐŒĐ”Đčла"
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "ĐĐŸĐ»Ń, ĐżĐŸĐżŃĐ»ĐœĐ”ŃĐ” ĐČŃĐžŃĐșĐž ĐżĐŸĐ»Đ”Ńа",
|
||||
"invalidEmail": "ĐĐŸĐ»Ń, ĐČŃĐČДЎДŃĐ” ĐČĐ°Đ»ĐžĐŽĐ”Đœ ĐžĐŒĐ”ĐčĐ» аЎŃĐ”Ń",
|
||||
"passwordsNotMatch": "ĐаŃĐŸĐ»ĐžŃĐ” ĐœĐ” ŃŃĐČпаЎаŃ",
|
||||
"passwordsNotMatchShort": "ĐаŃĐŸĐ»ĐžŃĐ” ĐœĐ” ŃŃĐČпаЎаŃ",
|
||||
"enterEmail": "ĐĐŸĐ»Ń, ĐČŃĐČДЎДŃĐ” ĐČаŃĐžŃ ĐžĐŒĐ”ĐčĐ» аЎŃĐ”Ń",
|
||||
"loginFailed": "ĐŃ
ĐŸĐŽŃŃ ĐœĐ” бД ŃŃпДŃĐ”Đœ",
|
||||
"registerFailed": "РДгОŃŃŃаŃĐžŃŃа ĐœĐ” бД ŃŃпДŃĐœĐ°",
|
||||
"googleLoginFailed": "ĐŃ
ĐŸĐŽ Ń Google ĐœĐ” бД ŃŃпДŃĐ”Đœ",
|
||||
"emailExists": "ĐĐŸŃŃДбОŃДл Ń ŃĐŸĐ·Đž ĐžĐŒĐ”ĐčĐ» ĐČĐ”ŃĐ” ŃŃŃĐ”ŃŃĐČŃĐČа. ĐĐŸĐ»Ń, ĐžĐ·ĐżĐŸĐ»Đ·ĐČаĐčŃĐ” ĐŽŃŃĐł ĐžĐŒĐ”ĐčĐ» ОлО ĐČлДзŃĐ” ĐČ ŃĐžŃŃĐ”ĐŒĐ°Ńа."
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "РДгОŃŃŃаŃĐžŃŃа бДŃĐ” ŃŃпДŃĐœĐ°. ХДга ĐŒĐŸĐ¶Đ”ŃĐ” Ўа ĐČлДзДŃĐ”."
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
43
src/i18n/locales/bg/kitConfig.js
Normal file
@@ -0,0 +1,43 @@
|
||||
export default {
|
||||
"pageTitle": "đ± ĐĐŸĐœŃОгŃŃаŃĐŸŃ Đ·Đ° Growbox",
|
||||
"pageSubtitle": "ĐĄŃзЎаĐčŃĐ” пДŃŃĐ”ĐșŃĐœĐ°Ńа ŃĐž ĐČŃŃŃĐ”ŃĐœĐ° ŃĐžŃŃĐ”ĐŒĐ° за ĐŸŃĐłĐ»Đ”Đ¶ĐŽĐ°ĐœĐ”",
|
||||
"bundleDiscountTitle": "đŻ ĐĐ·Đ”ĐŒĐ”ŃĐ” ĐŸŃŃŃŃĐżĐșа за ĐșĐŸĐŒĐżĐ»Đ”ĐșŃ!",
|
||||
"loadingProducts": "ĐаŃĐ”Đ¶ĐŽĐ°ĐœĐ” ĐœĐ° ĐżŃĐŸĐŽŃĐșŃĐž за growbox...",
|
||||
"loadingLighting": "ĐаŃĐ”Đ¶ĐŽĐ°ĐœĐ” ĐœĐ° ĐŸŃĐČĐ”ŃĐžŃĐ”Đ»ĐœĐž ĐżŃĐŸĐŽŃĐșŃĐž...",
|
||||
"loadingVentilation": "ĐаŃĐ”Đ¶ĐŽĐ°ĐœĐ” ĐœĐ° ĐČĐ”ĐœŃОлаŃĐžĐŸĐœĐœĐž ĐżŃĐŸĐŽŃĐșŃĐž...",
|
||||
"loadingExtras": "ĐаŃĐ”Đ¶ĐŽĐ°ĐœĐ” ĐœĐ° ĐŽĐŸĐżŃĐ»ĐœĐžŃĐ”Đ»ĐœĐž ĐżŃĐŸĐŽŃĐșŃĐž...",
|
||||
"noProductsAvailable": "ĐŃĐŒĐ° ĐœĐ°Đ»ĐžŃĐœĐž ĐżŃĐŸĐŽŃĐșŃĐž за ŃĐŸĐ·Đž ŃĐ°Đ·ĐŒĐ”Ń",
|
||||
"noLightingAvailable": "ĐŃĐŒĐ° ĐżĐŸĐŽŃ
ĐŸĐŽŃŃĐž Đ»Đ°ĐŒĐżĐž за ŃĐ°Đ·ĐŒĐ”Ń ĐœĐ° палаŃĐșа {{shape}}.",
|
||||
"noVentilationAvailable": "ĐŃĐŒĐ° ĐżĐŸĐŽŃ
ĐŸĐŽŃŃа ĐČĐ”ĐœŃОлаŃĐžŃ Đ·Đ° ŃĐ°Đ·ĐŒĐ”Ń ĐœĐ° палаŃĐșа {{shape}}.",
|
||||
"noExtrasAvailable": "ĐŃĐŒĐ° ĐœĐ°Đ»ĐžŃĐœĐž ĐŽĐŸĐżŃĐ»ĐœĐ”ĐœĐžŃ",
|
||||
"selectShapeTitle": "1. ĐзбДŃĐ”ŃĐ” ŃĐŸŃĐŒĐ° ĐœĐ° growbox",
|
||||
"selectShapeSubtitle": "ĐŃŃĐČĐŸ ОзбДŃĐ”ŃĐ” ĐŸŃĐœĐŸĐČĐœĐ°Ńа ĐżĐ»ĐŸŃ ĐœĐ° ĐČаŃĐžŃ growbox",
|
||||
"selectProductTitle": "2. ĐзбДŃĐ”ŃĐ” ĐżŃĐŸĐŽŃĐșŃ Đ·Đ° growbox",
|
||||
"selectProductSubtitle": "ĐзбДŃĐ”ŃĐ” ĐżĐŸĐŽŃ
ĐŸĐŽŃŃĐžŃ ĐżŃĐŸĐŽŃĐșŃ Đ·Đ° ĐČаŃĐžŃ {{shape}} growbox",
|
||||
"selectLightingTitle": "3. ĐзбДŃĐ”ŃĐ” ĐŸŃĐČĐ”ŃĐ»Đ”ĐœĐžĐ”",
|
||||
"selectLightingTitleShape": "3. ĐзбДŃĐ”ŃĐ” ĐŸŃĐČĐ”ŃĐ»Đ”ĐœĐžĐ” - {{shape}}",
|
||||
"selectLightingSubtitle": "ĐĐŸĐ»Ń, ĐżŃŃĐČĐŸ ОзбДŃĐ”ŃĐ” ŃĐ°Đ·ĐŒĐ”Ń ĐœĐ° палаŃĐșа.",
|
||||
"selectVentilationTitle": "4. ĐзбДŃĐ”ŃĐ” ĐČĐ”ĐœŃОлаŃĐžŃ",
|
||||
"selectVentilationTitleShape": "4. ĐзбДŃĐ”ŃĐ” ĐČĐ”ĐœŃОлаŃĐžŃ - {{shape}}",
|
||||
"selectVentilationSubtitle": "ĐĐŸĐ»Ń, ĐżŃŃĐČĐŸ ОзбДŃĐ”ŃĐ” ŃĐ°Đ·ĐŒĐ”Ń ĐœĐ° палаŃĐșа.",
|
||||
"selectExtrasTitle": "5. ĐĐŸĐ±Đ°ĐČĐ”ŃĐ” ĐŽĐŸĐżŃĐ»ĐœĐ”ĐœĐžŃ (ĐżĐŸ ĐžĐ·Đ±ĐŸŃ)",
|
||||
"yourConfiguration": "đŻ ĐаŃаŃа ĐșĐŸĐœŃОгŃŃаŃĐžŃ",
|
||||
"growboxLabel": "Growbox: {{name}}",
|
||||
"lightingLabel": "ĐŃĐČĐ”ŃĐ»Đ”ĐœĐžĐ”: {{name}}",
|
||||
"ventilationLabel": "ĐĐ”ĐœŃОлаŃĐžŃ: {{name}}",
|
||||
"extraLabel": "ĐĐŸĐżŃĐ»ĐœĐ”ĐœĐžĐ”: {{name}}",
|
||||
"totalPrice": "ĐбŃа ŃĐ”ĐœĐ°:",
|
||||
"addToCart": "ĐĐŸĐ±Đ°ĐČĐž ĐČ ĐșĐŸĐ»ĐžŃĐșаŃа",
|
||||
"selected": "â ĐзбŃĐ°ĐœĐŸ",
|
||||
"notDeliverable": "ĐĐ” Đ” ĐœĐ°Đ»ĐžŃĐœĐŸ за ĐŽĐŸŃŃаĐČĐșа",
|
||||
"noPrice": "ĐŃĐŒĐ° ŃĐ”ĐœĐ°",
|
||||
"setName": "ĐĐŸĐŒĐżĐ»Đ”ĐșŃ Growbox - {{shape}}",
|
||||
"description60x60": "ĐĐŸĐŒĐżĐ°ĐșŃĐ”Đœ - ĐžĐŽĐ”Đ°Đ»Đ”Đœ за ĐŒĐ°Đ»ĐșĐž ĐżŃĐŸŃŃŃĐ°ĐœŃŃĐČа",
|
||||
"description80x80": "ĐĄŃĐ”ĐŽĐ”Đœ - пДŃŃĐ”ĐșŃĐ”Đœ Đ±Đ°Đ»Đ°ĐœŃ",
|
||||
"description100x100": "ĐĐŸĐ»ŃĐŒ - за ĐŸĐżĐžŃĐœĐž ĐŸŃглДжЎаŃĐž",
|
||||
"description120x60": "ĐŃаĐČĐŸŃĐłŃĐ»Đ”Đœ - ĐŒĐ°ĐșŃĐžĐŒĐ°Đ»ĐœĐŸ ĐžĐ·ĐżĐŸĐ»Đ·ĐČĐ°ĐœĐ” ĐœĐ° ĐżŃĐŸŃŃŃĐ°ĐœŃŃĐČĐŸŃĐŸ",
|
||||
"plants1to2": "1-2 ŃаŃŃĐ”ĐœĐžŃ",
|
||||
"plants2to4": "2-4 ŃаŃŃĐ”ĐœĐžŃ",
|
||||
"plants4to6": "4-6 ŃаŃŃĐ”ĐœĐžŃ",
|
||||
"plants3to6": "3-6 ŃаŃŃĐ”ĐœĐžŃ"
|
||||
};
|
||||
@@ -1,14 +1,15 @@
|
||||
export default {
|
||||
"status": {
|
||||
"new": "Đ ĐżŃĐŸŃĐ”Ń",
|
||||
"pending": "ĐĐŸĐČа",
|
||||
"processing": "Đ ĐżŃĐŸŃĐ”Ń",
|
||||
"cancelled": "ĐŃĐŒĐ”ĐœĐ”ĐœĐ°",
|
||||
"shipped": "ĐĐ·ĐżŃаŃĐ”ĐœĐ°",
|
||||
"delivered": "ĐĐŸŃŃаĐČĐ”ĐœĐ°",
|
||||
"new": "ĐČ ĐżŃĐŸŃĐ”Ń",
|
||||
"pending": "ĐĐŸĐČĐŸ",
|
||||
"processing": "ĐČ ĐżŃĐŸŃĐ”Ń",
|
||||
"paid": "ĐлаŃĐ”ĐœĐŸ",
|
||||
"cancelled": "ĐŃĐŒĐ”ĐœĐ”ĐœĐŸ",
|
||||
"shipped": "ĐĐ·ĐżŃаŃĐ”ĐœĐŸ",
|
||||
"delivered": "ĐĐŸŃŃаĐČĐ”ĐœĐŸ",
|
||||
"return": "ĐŃŃŃĐ°ĐœĐ”",
|
||||
"partialReturn": "ЧаŃŃĐžŃĐœĐŸ ĐČŃŃŃĐ°ĐœĐ”",
|
||||
"partialDelivered": "ЧаŃŃĐžŃĐœĐŸ ĐŽĐŸŃŃаĐČĐ”ĐœĐ°"
|
||||
"partialDelivered": "ЧаŃŃĐžŃĐœĐŸ ĐŽĐŸŃŃаĐČĐ”ĐœĐŸ"
|
||||
},
|
||||
"table": {
|
||||
"orderNumber": "ĐĐŸĐŒĐ”Ń ĐœĐ° ĐżĐŸŃŃŃĐșа",
|
||||
@@ -24,6 +25,7 @@ export default {
|
||||
"cancelOrder": "ĐŃĐŒĐ”ĐœĐž ĐżĐŸŃŃŃĐșаŃа"
|
||||
},
|
||||
"noOrders": "ĐŃĐ” ĐŸŃĐ” ĐœĐ” ŃŃĐ” ĐœĐ°ĐżŃаĐČОлО ĐżĐŸŃŃŃĐșĐž.",
|
||||
"trackShipment": "ĐŃĐŸŃлДЎО ĐżŃаŃĐșаŃа",
|
||||
"details": {
|
||||
"title": "ĐĐŸĐŽŃĐŸĐ±ĐœĐŸŃŃĐž за ĐżĐŸŃŃŃĐșа: {{orderId}}",
|
||||
"deliveryAddress": "ĐĐŽŃĐ”Ń Đ·Đ° ĐŽĐŸŃŃаĐČĐșа",
|
||||
@@ -36,15 +38,14 @@ export default {
|
||||
"item": "ĐŃŃĐžĐșŃĐ»",
|
||||
"quantity": "ĐĐŸĐ»ĐžŃĐ”ŃŃĐČĐŸ",
|
||||
"price": "ĐŠĐ”ĐœĐ°",
|
||||
"vat": "ĐĐĐĄ",
|
||||
"total": "ĐбŃĐŸ",
|
||||
"cancelOrder": "ĐŃĐŒĐ”ĐœĐž ĐżĐŸŃŃŃĐșаŃа"
|
||||
},
|
||||
"cancelConfirm": {
|
||||
"title": "ĐŃĐŒŃĐœĐ° ĐœĐ° ĐżĐŸŃŃŃĐșа",
|
||||
"title": "ĐŃĐŒĐ”ĐœĐž ĐżĐŸŃŃŃĐșаŃа",
|
||||
"message": "ХОгŃŃĐœĐž лО ŃŃĐ”, ŃĐ” ĐžŃĐșаŃĐ” Ўа ĐŸŃĐŒĐ”ĐœĐžŃĐ” ŃазО ĐżĐŸŃŃŃĐșа?",
|
||||
"confirm": "ĐŃĐŒĐ”ĐœĐž ĐżĐŸŃŃŃĐșаŃа",
|
||||
"confirm": "ĐŃĐŒĐ”ĐœĐž",
|
||||
"cancelling": "ĐŃĐŒŃĐœĐ°..."
|
||||
},
|
||||
"processing": "ĐĐŸŃŃŃĐșаŃа ŃĐ” ĐŸĐ±ŃĐ°Đ±ĐŸŃĐČа...",
|
||||
"processing": "ĐĐŸŃŃŃĐșаŃа ŃĐ” ĐŸĐ±ŃĐ°Đ±ĐŸŃĐČа..."
|
||||
};
|
||||
|
||||
@@ -8,24 +8,25 @@ export default {
|
||||
"articleNumber": "ĐĐŸĐŒĐ”Ń ĐœĐ° аŃŃĐžĐșŃĐ»",
|
||||
"manufacturer": "ĐŃĐŸĐžĐ·ĐČĐŸĐŽĐžŃДл",
|
||||
"inclVat": "ĐČĐșĐ». {{vat}}% ĐĐĐĄ",
|
||||
"inclVatSimple": "ĐČĐșĐ». ĐĐĐĄ",
|
||||
"priceUnit": "{{price}}/{{unit}}",
|
||||
"new": "ĐĐŸĐČ",
|
||||
"weeks": "ŃĐ”ĐŽĐŒĐžŃĐž",
|
||||
"weeks": "ĐĄĐ”ĐŽĐŒĐžŃĐž",
|
||||
"arriving": "ĐŃĐžŃŃĐžĐłĐ°ĐœĐ”:",
|
||||
"inclVatFooter": "ĐČĐșĐ». {{vat}}% ĐĐĐĄ,*",
|
||||
"availability": "ĐалОŃĐœĐŸŃŃ",
|
||||
"inStock": "ĐœĐ°Đ»ĐžŃĐœĐŸ",
|
||||
"inStock": "ĐœĐ°Đ»ĐžŃĐœĐŸ ĐœĐ° ŃĐșлаЎ",
|
||||
"comingSoon": "ĐŃаĐșĐČа ŃĐ” ŃĐșĐŸŃĐŸ",
|
||||
"deliveryTime": "ĐĄŃĐŸĐș ĐœĐ° ĐŽĐŸŃŃаĐČĐșа",
|
||||
"inclShort": "ĐČĐșĐ».",
|
||||
"vatShort": "ĐĐĐĄ",
|
||||
"weight": "ĐąĐ”ĐłĐ»ĐŸ: {{weight}} ĐșĐł",
|
||||
"youSave": "ХпДŃŃŃĐČаŃĐ”: {{amount}}",
|
||||
"cheaperThanIndividual": "ĐĐŸ-Đ”ĐČŃĐžĐœĐŸ ĐŸŃ ĐžĐœĐŽĐžĐČОЎŃĐ°Đ»ĐœĐ° ĐżĐŸĐșŃĐżĐșа",
|
||||
"cheaperThanIndividual": "ĐĐŸ-Đ”ĐČŃĐžĐœĐŸ ĐŸŃ Đ·Đ°ĐșŃĐżŃĐČĐ°ĐœĐ” ĐżĐŸĐŸŃĐŽĐ”Đ»ĐœĐŸ",
|
||||
"pickupPrice": "ĐŠĐ”ĐœĐ° за ĐČĐ·Đ”ĐŒĐ°ĐœĐ”: 19,90 âŹ ĐœĐ° ŃĐ”Đ·ĐœĐžĐș.",
|
||||
"consistsOf": "ĐĄŃŃŃĐŸĐž ŃĐ” ĐŸŃ:",
|
||||
"loadingComponentDetails": "{{index}}. ĐаŃĐ”Đ¶ĐŽĐ°ĐœĐ” ĐœĐ° ĐŽĐ”ŃаĐčлО за ĐșĐŸĐŒĐżĐŸĐœĐ”ĐœŃа...",
|
||||
"loadingProduct": "ĐŃĐŸĐŽŃĐșŃŃŃ ŃĐ” заŃДжЎа...",
|
||||
"loadingProduct": "ĐаŃĐ”Đ¶ĐŽĐ°ĐœĐ” ĐœĐ° ĐżŃĐŸĐŽŃĐșŃа...",
|
||||
"individualPriceTotal": "ĐбŃа ĐžĐœĐŽĐžĐČОЎŃĐ°Đ»ĐœĐ° ŃĐ”ĐœĐ°:",
|
||||
"setPrice": "ĐŠĐ”ĐœĐ° ĐœĐ° ĐșĐŸĐŒĐżĐ»Đ”ĐșŃа:",
|
||||
"yourSavings": "ĐаŃĐžŃĐ” ŃпДŃŃŃĐČĐ°ĐœĐžŃ:",
|
||||
|
||||
61
src/i18n/locales/bg/productDialogs.js
Normal file
@@ -0,0 +1,61 @@
|
||||
export default {
|
||||
"questionTitle": "ĐŃĐżŃĐŸŃ Đ·Đ° ĐżŃĐŸĐŽŃĐșŃа",
|
||||
"questionSubtitle": "ĐĐŒĐ°ŃĐ” лО ĐČŃĐżŃĐŸŃ Đ·Đ° ŃĐŸĐ·Đž ĐżŃĐŸĐŽŃĐșŃ? ЩД ŃĐ” ŃаЎĐČĐ°ĐŒĐ” Ўа ĐČĐž ĐżĐŸĐŒĐŸĐłĐœĐ”ĐŒ.",
|
||||
"questionSuccess": "ĐĐ»Đ°ĐłĐŸĐŽĐ°ŃĐžĐŒ ĐČĐž за ĐČŃĐżŃĐŸŃа! ЩД ŃĐ” ŃĐČŃŃĐ¶Đ”ĐŒ Ń ĐČĐ°Ń ĐČŃĐ·ĐŒĐŸĐ¶ĐœĐŸ ĐœĐ°Đč-ŃĐșĐŸŃĐŸ.",
|
||||
"nameLabel": "ĐĐŒĐ”",
|
||||
"namePlaceholder": "ĐаŃĐ”ŃĐŸ ĐžĐŒĐ”",
|
||||
"emailLabel": "ĐĐŒĐ”ĐčĐ»",
|
||||
"emailPlaceholder": "your.email@example.com",
|
||||
"questionLabel": "ĐаŃĐžŃŃ ĐČŃĐżŃĐŸŃ",
|
||||
"questionPlaceholder": "ĐпОŃĐ”ŃĐ” ĐČŃĐżŃĐŸŃа ŃĐž за ŃĐŸĐ·Đž ĐżŃĐŸĐŽŃĐșŃ...",
|
||||
"photosLabelQuestion": "ĐŃĐžĐșаŃĐ”ŃĐ” ŃĐœĐžĐŒĐșĐž ĐșŃĐŒ ĐČŃĐżŃĐŸŃа ŃĐž (ĐżĐŸ ĐžĐ·Đ±ĐŸŃ)",
|
||||
"submitQuestion": "ĐĐ·ĐżŃаŃĐž ĐČŃĐżŃĐŸŃа",
|
||||
"sending": "ĐĐ·ĐżŃаŃĐ°ĐœĐ”...",
|
||||
|
||||
"ratingTitle": "ĐŃĐ”ĐœĐ”ŃĐ” ĐżŃĐŸĐŽŃĐșŃа",
|
||||
"ratingSubtitle": "ĐĄĐżĐŸĐŽĐ”Đ»Đ”ŃĐ” ĐŸĐżĐžŃа ŃĐž Ń ŃĐŸĐ·Đž ĐżŃĐŸĐŽŃĐșŃ Đž ĐżĐŸĐŒĐŸĐłĐœĐ”ŃĐ” ĐœĐ° ĐŽŃŃгО ĐșĐ»ĐžĐ”ĐœŃĐž Ўа ĐČĐ·Đ”ĐŒĐ°Ń ŃĐ”ŃĐ”ĐœĐžĐ”.",
|
||||
"ratingSuccess": "ĐĐ»Đ°ĐłĐŸĐŽĐ°ŃĐžĐŒ ĐČĐž за ĐČаŃĐžŃ ĐŸŃĐ·ĐžĐČ! ĐąĐŸĐč ŃĐ” бŃĐŽĐ” ĐżŃблОĐșŃĐČĐ°Đœ ŃлДЎ ĐżŃĐŸĐČĐ”ŃĐșа.",
|
||||
"emailHelper": "ĐаŃĐžŃŃ ĐžĐŒĐ”ĐčĐ» ĐœŃĐŒĐ° Ўа бŃĐŽĐ” ĐżŃблОĐșŃĐČĐ°Đœ",
|
||||
"ratingLabel": "ĐŃĐ”ĐœĐșа *",
|
||||
"pleaseRate": "ĐĐŸĐ»Ń, ĐŸŃĐ”ĐœĐ”ŃĐ”",
|
||||
"ratingStars": "{{rating}} ĐŸŃ 5 Đ·ĐČДзЎО",
|
||||
"reviewLabel": "ĐаŃĐžŃŃ ĐŸŃĐ·ĐžĐČ (ĐżĐŸ ĐžĐ·Đ±ĐŸŃ)",
|
||||
"reviewPlaceholder": "ĐпОŃĐ”ŃĐ” ĐŸĐżĐžŃа ŃĐž Ń ŃĐŸĐ·Đž ĐżŃĐŸĐŽŃĐșŃ...",
|
||||
"photosLabelRating": "ĐŃĐžĐșаŃĐ”ŃĐ” ŃĐœĐžĐŒĐșĐž ĐșŃĐŒ ĐŸŃĐ·ĐžĐČа ŃĐž (ĐżĐŸ ĐžĐ·Đ±ĐŸŃ)",
|
||||
"submitRating": "ĐĐ·ĐżŃаŃĐž ĐŸŃĐ·ĐžĐČа",
|
||||
"errorGeneric": "ĐŃĐ·ĐœĐžĐșĐœĐ° ĐłŃĐ”ŃĐșа",
|
||||
"errorPhotos": "ĐŃĐ”ŃĐșа ĐżŃĐž ĐŸĐ±ŃĐ°Đ±ĐŸŃĐșа ĐœĐ° ŃĐœĐžĐŒĐșĐžŃĐ”",
|
||||
|
||||
"availabilityTitle": "ĐапОŃĐČĐ°ĐœĐ” за ĐœĐ°Đ»ĐžŃĐœĐŸŃŃ",
|
||||
"availabilitySubtitle": "ĐąĐŸĐ·Đž ĐżŃĐŸĐŽŃĐșŃ ĐČ ĐŒĐŸĐŒĐ”ĐœŃа ĐœĐ” Đ” ĐœĐ°Đ»ĐžŃĐ”Đœ. ЩД ŃĐ” ŃаЎĐČĐ°ĐŒĐ” Ўа ĐČĐž ŃĐČĐ”ĐŽĐŸĐŒĐžĐŒ ĐČĐ”ĐŽĐœĐ°ĐłĐ° ŃĐŸĐŒ бŃĐŽĐ” ĐœĐ°Đ»ĐžŃĐ”Đœ ĐŸŃĐœĐŸĐČĐŸ.",
|
||||
"availabilitySuccessEmail": "ĐĐ»Đ°ĐłĐŸĐŽĐ°ŃĐžĐŒ ĐČĐž за запОŃĐČĐ°ĐœĐ”ŃĐŸ! ЩД ĐČĐž ŃĐČĐ”ĐŽĐŸĐŒĐžĐŒ ĐżĐŸ ĐžĐŒĐ”ĐčĐ» ĐČĐ”ĐŽĐœĐ°ĐłĐ° ŃĐŸĐŒ ĐżŃĐŸĐŽŃĐșŃŃŃ ĐŸŃĐœĐŸĐČĐŸ Đ” ĐœĐ°Đ»ĐžŃĐ”Đœ.",
|
||||
"availabilitySuccessTelegram": "ĐĐ»Đ°ĐłĐŸĐŽĐ°ŃĐžĐŒ ĐČĐž за запОŃĐČĐ°ĐœĐ”ŃĐŸ! ЩД ĐČĐž ŃĐČĐ”ĐŽĐŸĐŒĐžĐŒ ŃŃДз Telegram ĐČĐ”ĐŽĐœĐ°ĐłĐ° ŃĐŸĐŒ ĐżŃĐŸĐŽŃĐșŃŃŃ ĐŸŃĐœĐŸĐČĐŸ Đ” ĐœĐ°Đ»ĐžŃĐ”Đœ.",
|
||||
"notificationMethodLabel": "ĐаĐș бОŃ
ŃĐ” ĐžŃĐșалО Ўа бŃĐŽĐ”ŃĐ” ŃĐČĐ”ĐŽĐŸĐŒĐ”ĐœĐž?",
|
||||
"telegramBotLabel": "Telegram Bot",
|
||||
"telegramIdLabel": "Telegram ID",
|
||||
"telegramPlaceholder": "@yourTelegramName or Telegram ID",
|
||||
"telegramHelper": "ĐŃĐČДЎДŃĐ” ĐČаŃĐ”ŃĐŸ ĐżĐŸŃŃДбОŃДлŃĐșĐŸ ĐžĐŒĐ” ĐČ Telegram (Ń @) ОлО Telegram ID",
|
||||
"messageLabel": "ĐĄŃĐŸĐ±ŃĐ”ĐœĐžĐ” (ĐżĐŸ ĐžĐ·Đ±ĐŸŃ)",
|
||||
"messagePlaceholder": "ĐĐŸĐżŃĐ»ĐœĐžŃĐ”Đ»ĐœĐ° ĐžĐœŃĐŸŃĐŒĐ°ŃĐžŃ ĐžĐ»Đž ĐČŃĐżŃĐŸŃĐž...",
|
||||
"submitAvailability": "ĐапОŃĐČĐ°ĐœĐ” за ĐœĐ°Đ»ĐžŃĐœĐŸŃŃ",
|
||||
|
||||
"photoUploadSelect": "ĐзбДŃĐ”ŃĐ” ŃĐœĐžĐŒĐșĐž",
|
||||
"photoUploadErrorMaxFiles": "ĐаĐșŃĐžĐŒŃĐŒ {{max}} ŃаĐčла Ńа ŃазŃĐ”ŃĐ”ĐœĐž",
|
||||
"photoUploadErrorFileType": "РазŃĐ”ŃĐ”ĐœĐž Ńа ŃĐ°ĐŒĐŸ ŃаĐčĐ»ĐŸĐČĐ” Ń ĐžĐ·ĐŸĐ±ŃĐ°Đ¶Đ”ĐœĐžŃ (JPEG, PNG, GIF, WebP)",
|
||||
"photoUploadErrorFileSize": "ЀаĐčĐ»ŃŃ Đ” ŃĐČŃŃĐŽĐ” ĐłĐŸĐ»ŃĐŒ. ĐаĐșŃĐžĐŒŃĐŒ: {{maxSize}}MB",
|
||||
"photoUploadSelectedFiles": "{{count}} ŃаĐčĐ»(ĐŸĐČĐ”) ОзбŃĐ°ĐœĐž",
|
||||
"photoUploadCompressed": "(ĐșĐŸĐŒĐżŃĐ”ŃĐžŃĐ°Đœ за ĐșаŃĐČĐ°ĐœĐ”)",
|
||||
"photoUploadRemove": "ĐŃĐ”ĐŒĐ°Ń
ĐœĐž ĐžĐ·ĐŸĐ±ŃĐ°Đ¶Đ”ĐœĐžĐ”ŃĐŸ",
|
||||
"photoUploadLabelDefault": "ĐŃĐžĐșаŃĐž ŃĐœĐžĐŒĐșĐž (ĐżĐŸ ĐžĐ·Đ±ĐŸŃ)",
|
||||
|
||||
"shareTitle": "ĐĄĐżĐŸĐŽĐ”Đ»Đž",
|
||||
"shareEmbed": "ĐĐłŃĐ°Đ¶ĐŽĐ°ĐœĐ”",
|
||||
"shareCopyLink": "ĐĐŸĐżĐžŃаĐč Đ»ĐžĐœĐșа",
|
||||
"shareSuccessEmbed": "ĐĐŸĐŽŃŃ Đ·Đ° ĐČĐłŃĐ°Đ¶ĐŽĐ°ĐœĐ” Đ” ĐșĐŸĐżĐžŃĐ°Đœ ĐČ ĐșĐ»ĐžĐżĐ±ĐŸŃЎа!",
|
||||
"shareErrorEmbed": "ĐŃĐ”ŃĐșа ĐżŃĐž ĐșĐŸĐżĐžŃĐ°ĐœĐ” ĐœĐ° ĐșĐŸĐŽĐ° за ĐČĐłŃĐ°Đ¶ĐŽĐ°ĐœĐ”",
|
||||
"shareSuccessLink": "ĐĐžĐœĐșŃŃ Đ” ĐșĐŸĐżĐžŃĐ°Đœ ĐČ ĐșĐ»ĐžĐżĐ±ĐŸŃЎа!",
|
||||
"shareWhatsAppText": "ĐОж ŃĐŸĐ·Đž ĐżŃĐŸĐŽŃĐșŃ: {{name}}",
|
||||
"shareTelegramText": "ĐОж ŃĐŸĐ·Đž ĐżŃĐŸĐŽŃĐșŃ: {{name}}",
|
||||
"shareEmailSubject": "ĐŃĐ”ĐżĐŸŃŃĐșа за ĐżŃĐŸĐŽŃĐșŃ",
|
||||
"shareEmailBody": "ĐĐŽŃаĐČĐ”ĐčŃĐ”,\n\nĐŃĐșĐ°ĐŒ Ўа ĐČĐž ĐżŃĐ”ĐżĐŸŃŃŃĐ°ĐŒ ŃĐŸĐ·Đž ĐżŃĐŸĐŽŃĐșŃ:\n\n{{name}}\n{{url}}\n\nĐĐŸĐ·ĐŽŃаĐČĐž"
|
||||
};
|
||||
@@ -5,6 +5,7 @@ export default {
|
||||
"profile": "Profil",
|
||||
"email": "Email",
|
||||
"password": "Heslo",
|
||||
"newPassword": "Nové heslo",
|
||||
"confirmPassword": "Potvrdit heslo",
|
||||
"forgotPassword": "ZapomnÄli jste heslo?",
|
||||
"loginWithGoogle": "PĆihlĂĄsit se pĆes Google",
|
||||
@@ -13,6 +14,7 @@ export default {
|
||||
"privacyPolicy": "ZĂĄsadami ochrany osobnĂch ĂșdajĆŻ",
|
||||
"passwordMinLength": "Heslo musĂ mĂt alespoĆ 8 znakĆŻ",
|
||||
"newPasswordMinLength": "NovĂ© heslo musĂ mĂt alespoĆ 8 znakĆŻ",
|
||||
"backToHome": "ZpÄt na domovskou strĂĄnku",
|
||||
"menu": {
|
||||
"profile": "Profil",
|
||||
"myProfile": "MĆŻj profil",
|
||||
@@ -21,5 +23,28 @@ export default {
|
||||
"settings": "NastavenĂ",
|
||||
"adminDashboard": "Admin Dashboard",
|
||||
"adminUsers": "Admin Users"
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "ObnovenĂ hesla",
|
||||
"button": "Obnovit heslo",
|
||||
"success": "VaĆĄe heslo bylo ĂșspÄĆĄnÄ obnoveno! Brzy budete pĆesmÄrovĂĄni na pĆihlĂĄĆĄenĂ...",
|
||||
"invalidToken": "Nebyl nalezen platnĂœ token. PouĆŸijte prosĂm odkaz z vaĆĄeho e-mailu.",
|
||||
"error": "Chyba pĆi obnovÄ hesla",
|
||||
"emailSent": "Odkaz pro obnovenĂ hesla byl odeslĂĄn na vaĆĄi e-mailovou adresu.",
|
||||
"emailError": "Chyba pĆi odesĂlĂĄnĂ e-mailu"
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "VyplĆte prosĂm vĆĄechna pole",
|
||||
"invalidEmail": "Zadejte platnou e-mailovou adresu",
|
||||
"passwordsNotMatch": "Hesla se neshodujĂ",
|
||||
"passwordsNotMatchShort": "Hesla se neshodujĂ",
|
||||
"enterEmail": "Zadejte prosĂm svou e-mailovou adresu",
|
||||
"loginFailed": "PĆihlĂĄĆĄenĂ selhalo",
|
||||
"registerFailed": "Registrace selhala",
|
||||
"googleLoginFailed": "PĆihlĂĄĆĄenĂ pĆes Google selhalo",
|
||||
"emailExists": "UĆŸivatel s touto e-mailovou adresou jiĆŸ existuje. PouĆŸijte prosĂm jinou e-mailovou adresu nebo se pĆihlaste."
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "Registrace byla ĂșspÄĆĄnĂĄ. NynĂ se mĆŻĆŸete pĆihlĂĄsit."
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
43
src/i18n/locales/cs/kitConfig.js
Normal file
@@ -0,0 +1,43 @@
|
||||
export default {
|
||||
"pageTitle": "đ± KonfigurĂĄtor Growboxu",
|
||||
"pageSubtitle": "Sestavte si svĆŻj dokonalĂœ indoor grow setup",
|
||||
"bundleDiscountTitle": "đŻ ZajistÄte si slevu na balĂÄek!",
|
||||
"loadingProducts": "NaÄĂtĂĄnĂ produktĆŻ growboxu...",
|
||||
"loadingLighting": "NaÄĂtĂĄnĂ osvÄtlenĂ...",
|
||||
"loadingVentilation": "NaÄĂtĂĄnĂ ventilace...",
|
||||
"loadingExtras": "NaÄĂtĂĄnĂ doplĆkĆŻ...",
|
||||
"noProductsAvailable": "Pro tuto velikost nejsou k dispozici ĆŸĂĄdnĂ© produkty",
|
||||
"noLightingAvailable": "Pro velikost stanu {{shape}} nejsou k dispozici ĆŸĂĄdnĂĄ vhodnĂĄ svÄtla.",
|
||||
"noVentilationAvailable": "Pro velikost stanu {{shape}} nenĂ k dispozici vhodnĂĄ ventilace.",
|
||||
"noExtrasAvailable": "ĆœĂĄdnĂ© doplĆky nejsou k dispozici",
|
||||
"selectShapeTitle": "1. Vyberte tvar growboxu",
|
||||
"selectShapeSubtitle": "Nejprve vyberte zĂĄkladnĂ plochu vaĆĄeho growboxu",
|
||||
"selectProductTitle": "2. Vyberte produkt growboxu",
|
||||
"selectProductSubtitle": "Vyberte sprĂĄvnĂœ produkt pro vĂĄĆĄ growbox {{shape}}",
|
||||
"selectLightingTitle": "3. Vyberte osvÄtlenĂ",
|
||||
"selectLightingTitleShape": "3. Vyberte osvÄtlenĂ - {{shape}}",
|
||||
"selectLightingSubtitle": "Nejprve prosĂm vyberte velikost stanu.",
|
||||
"selectVentilationTitle": "4. Vyberte ventilaci",
|
||||
"selectVentilationTitleShape": "4. Vyberte ventilaci - {{shape}}",
|
||||
"selectVentilationSubtitle": "Nejprve prosĂm vyberte velikost stanu.",
|
||||
"selectExtrasTitle": "5. PĆidejte doplĆky (volitelnĂ©)",
|
||||
"yourConfiguration": "đŻ VaĆĄe konfigurace",
|
||||
"growboxLabel": "Growbox: {{name}}",
|
||||
"lightingLabel": "OsvÄtlenĂ: {{name}}",
|
||||
"ventilationLabel": "Ventilace: {{name}}",
|
||||
"extraLabel": "DoplnÄk: {{name}}",
|
||||
"totalPrice": "CelkovĂĄ cena:",
|
||||
"addToCart": "PĆidat do koĆĄĂku",
|
||||
"selected": "â VybrĂĄno",
|
||||
"notDeliverable": "NedodĂĄvĂĄ se",
|
||||
"noPrice": "Bez ceny",
|
||||
"setName": "Sada growboxu - {{shape}}",
|
||||
"description60x60": "Kompaktnà - ideålnà pro malé prostory",
|
||||
"description80x80": "StĆednĂ - perfektnĂ rovnovĂĄha",
|
||||
"description100x100": "VelkĂœ - pro zkuĆĄenĂ© pÄstitele",
|
||||
"description120x60": "ObdĂ©lnĂkovĂœ - maximĂĄlnĂ vyuĆŸitĂ prostoru",
|
||||
"plants1to2": "1-2 rostliny",
|
||||
"plants2to4": "2-4 rostliny",
|
||||
"plants4to6": "4-6 rostlin",
|
||||
"plants3to6": "3-6 rostlin"
|
||||
};
|
||||
@@ -1,8 +1,9 @@
|
||||
export default {
|
||||
"status": {
|
||||
"new": "ProbĂhĂĄ",
|
||||
"pending": "NovĂĄ",
|
||||
"processing": "ProbĂhĂĄ",
|
||||
"new": "probĂhĂĄ",
|
||||
"pending": "Nové",
|
||||
"processing": "probĂhĂĄ",
|
||||
"paid": "Zaplaceno",
|
||||
"cancelled": "ZruĆĄeno",
|
||||
"shipped": "OdeslĂĄno",
|
||||
"delivered": "DoruÄeno",
|
||||
@@ -24,6 +25,7 @@ export default {
|
||||
"cancelOrder": "ZruĆĄit objednĂĄvku"
|
||||
},
|
||||
"noOrders": "JeĆĄtÄ jste neprovedli ĆŸĂĄdnĂ© objednĂĄvky.",
|
||||
"trackShipment": "Sledovat zĂĄsilku",
|
||||
"details": {
|
||||
"title": "Detaily objednĂĄvky: {{orderId}}",
|
||||
"deliveryAddress": "DodacĂ adresa",
|
||||
@@ -36,15 +38,14 @@ export default {
|
||||
"item": "PoloĆŸka",
|
||||
"quantity": "MnoĆŸstvĂ",
|
||||
"price": "Cena",
|
||||
"vat": "DPH",
|
||||
"total": "Celkem",
|
||||
"cancelOrder": "ZruĆĄit objednĂĄvku"
|
||||
},
|
||||
"cancelConfirm": {
|
||||
"title": "ZruĆĄit objednĂĄvku",
|
||||
"message": "Opravdu chcete tuto objednĂĄvku zruĆĄit?",
|
||||
"confirm": "ZruĆĄit objednĂĄvku",
|
||||
"confirm": "ZruĆĄit",
|
||||
"cancelling": "RuĆĄenĂ..."
|
||||
},
|
||||
"processing": "ObjednĂĄvka se dokonÄuje...",
|
||||
"processing": "ObjednĂĄvka se dokonÄuje..."
|
||||
};
|
||||
|
||||
@@ -8,10 +8,11 @@ export default {
|
||||
"articleNumber": "ÄĂslo artiklu",
|
||||
"manufacturer": "VĂœrobce",
|
||||
"inclVat": "vÄetnÄ {{vat}}% DPH",
|
||||
"inclVatSimple": "vÄetnÄ DPH",
|
||||
"priceUnit": "{{price}}/{{unit}}",
|
||||
"new": "Nové",
|
||||
"weeks": "tĂœdny",
|
||||
"arriving": "PĆĂchod:",
|
||||
"weeks": "TĂœdny",
|
||||
"arriving": "PĆĂjezd:",
|
||||
"inclVatFooter": "vÄetnÄ {{vat}}% DPH,*",
|
||||
"availability": "Dostupnost",
|
||||
"inStock": "skladem",
|
||||
@@ -22,10 +23,10 @@ export default {
|
||||
"weight": "Hmotnost: {{weight}} kg",
|
||||
"youSave": "UĆĄetĆĂte: {{amount}}",
|
||||
"cheaperThanIndividual": "LevnÄjĆĄĂ neĆŸ nĂĄkup jednotlivÄ",
|
||||
"pickupPrice": "Cena za vyzvednutĂ: 19,90 ⏠za ĆĂzek.",
|
||||
"pickupPrice": "Cena za odbÄr: 19,90 ⏠za ĆĂzek.",
|
||||
"consistsOf": "SklĂĄdĂĄ se z:",
|
||||
"loadingComponentDetails": "{{index}}. NaÄĂtĂĄnĂ detailĆŻ komponenty...",
|
||||
"loadingProduct": "Produkt se naÄĂtĂĄ...",
|
||||
"loadingProduct": "NaÄĂtĂĄnĂ produktu...",
|
||||
"individualPriceTotal": "CelkovĂĄ cena jednotlivÄ:",
|
||||
"setPrice": "Cena sady:",
|
||||
"yourSavings": "VaĆĄe Ășspory:",
|
||||
|
||||
61
src/i18n/locales/cs/productDialogs.js
Normal file
@@ -0,0 +1,61 @@
|
||||
export default {
|
||||
"questionTitle": "OtĂĄzka ohlednÄ produktu",
|
||||
"questionSubtitle": "MĂĄte otĂĄzku ohlednÄ tohoto produktu? RĂĄdi vĂĄm pomĆŻĆŸeme.",
|
||||
"questionSuccess": "DÄkujeme za vaĆĄi otĂĄzku! Ozveme se vĂĄm co nejdĆĂve.",
|
||||
"nameLabel": "Jméno",
|
||||
"namePlaceholder": "Vaƥe jméno",
|
||||
"emailLabel": "Email",
|
||||
"emailPlaceholder": "vas.email@priklad.cz",
|
||||
"questionLabel": "VaĆĄe otĂĄzka",
|
||||
"questionPlaceholder": "PopiĆĄte svou otĂĄzku ohlednÄ tohoto produktu...",
|
||||
"photosLabelQuestion": "PĆiloĆŸte fotografie k vaĆĄĂ otĂĄzce (volitelnĂ©)",
|
||||
"submitQuestion": "Odeslat otĂĄzku",
|
||||
"sending": "OdesĂlĂĄnĂ...",
|
||||
|
||||
"ratingTitle": "OhodnoƄte produkt",
|
||||
"ratingSubtitle": "PodÄlte se o svĂ© zkuĆĄenosti s tĂmto produktem a pomozte ostatnĂm zĂĄkaznĂkĆŻm s rozhodnutĂm.",
|
||||
"ratingSuccess": "DÄkujeme za vaĆĄi recenzi! Bude zveĆejnÄna po ovÄĆenĂ.",
|
||||
"emailHelper": "VĂĄĆĄ email nebude zveĆejnÄn",
|
||||
"ratingLabel": "HodnocenĂ *",
|
||||
"pleaseRate": "ProsĂm ohodnoĆ„te",
|
||||
"ratingStars": "{{rating}} z 5 hvÄzdiÄek",
|
||||
"reviewLabel": "Vaƥe recenze (volitelné)",
|
||||
"reviewPlaceholder": "PopiĆĄte svĂ© zkuĆĄenosti s tĂmto produktem...",
|
||||
"photosLabelRating": "PĆiloĆŸte fotografie k vaĆĄĂ recenzi (volitelnĂ©)",
|
||||
"submitRating": "Odeslat recenzi",
|
||||
"errorGeneric": "DoĆĄlo k chybÄ",
|
||||
"errorPhotos": "Chyba pĆi zpracovĂĄnĂ fotografiĂ",
|
||||
|
||||
"availabilityTitle": "PoĆŸĂĄdejte o dostupnost",
|
||||
"availabilitySubtitle": "Tento produkt momentĂĄlnÄ nenĂ dostupnĂœ. RĂĄdi vĂĄs informujeme, jakmile bude opÄt skladem.",
|
||||
"availabilitySuccessEmail": "DÄkujeme za vĂĄĆĄ poĆŸadavek! Jakmile bude produkt opÄt dostupnĂœ, budeme vĂĄs informovat e-mailem.",
|
||||
"availabilitySuccessTelegram": "DÄkujeme za vĂĄĆĄ poĆŸadavek! Jakmile bude produkt opÄt dostupnĂœ, budeme vĂĄs informovat pĆes Telegram.",
|
||||
"notificationMethodLabel": "Jak chcete bĂœt informovĂĄni?",
|
||||
"telegramBotLabel": "Telegram Bot",
|
||||
"telegramIdLabel": "Telegram ID",
|
||||
"telegramPlaceholder": "@vaseTelegramJmeno nebo Telegram ID",
|
||||
"telegramHelper": "Zadejte svĂ© uĆŸivatelskĂ© jmĂ©no na Telegramu (s @) nebo Telegram ID",
|
||||
"messageLabel": "Zpråva (volitelné)",
|
||||
"messagePlaceholder": "DalĆĄĂ informace nebo otĂĄzky...",
|
||||
"submitAvailability": "PoĆŸĂĄdat o dostupnost",
|
||||
|
||||
"photoUploadSelect": "Vybrat fotografie",
|
||||
"photoUploadErrorMaxFiles": "MaximĂĄlnÄ {{max}} souborĆŻ povoleno",
|
||||
"photoUploadErrorFileType": "Jsou povoleny pouze obrazové soubory (JPEG, PNG, GIF, WebP)",
|
||||
"photoUploadErrorFileSize": "Soubor je pĆĂliĆĄ velkĂœ. Maximum: {{maxSize}}MB",
|
||||
"photoUploadSelectedFiles": "VybrĂĄno {{count}} souborĆŻ",
|
||||
"photoUploadCompressed": "(komprimovĂĄno pro nahrĂĄnĂ)",
|
||||
"photoUploadRemove": "Odstranit obrĂĄzek",
|
||||
"photoUploadLabelDefault": "PĆiloĆŸit fotografie (volitelnĂ©)",
|
||||
|
||||
"shareTitle": "SdĂlet",
|
||||
"shareEmbed": "VloĆŸit",
|
||||
"shareCopyLink": "KopĂrovat odkaz",
|
||||
"shareSuccessEmbed": "KĂłd pro vloĆŸenĂ zkopĂrovĂĄn do schrĂĄnky!",
|
||||
"shareErrorEmbed": "Chyba pĆi kopĂrovĂĄnĂ kĂłdu pro vloĆŸenĂ",
|
||||
"shareSuccessLink": "Odkaz zkopĂrovĂĄn do schrĂĄnky!",
|
||||
"shareWhatsAppText": "PodĂvejte se na tento produkt: {{name}}",
|
||||
"shareTelegramText": "PodĂvejte se na tento produkt: {{name}}",
|
||||
"shareEmailSubject": "DoporuÄenĂ produktu",
|
||||
"shareEmailBody": "DobrĂœ den,\n\nrĂĄd bych vĂĄm doporuÄil tento produkt:\n\n{{name}}\n{{url}}\n\nS pozdravem"
|
||||
};
|
||||
@@ -5,6 +5,7 @@ export default {
|
||||
"profile": "Profil",
|
||||
"email": "E-Mail",
|
||||
"password": "Passwort",
|
||||
"newPassword": "Neues Passwort",
|
||||
"confirmPassword": "Passwort bestÀtigen",
|
||||
"forgotPassword": "Passwort vergessen?",
|
||||
"loginWithGoogle": "Mit Google anmelden",
|
||||
@@ -13,6 +14,7 @@ export default {
|
||||
"privacyPolicy": "Datenschutzbestimmungen",
|
||||
"passwordMinLength": "Das Passwort muss mindestens 8 Zeichen lang sein",
|
||||
"newPasswordMinLength": "Das neue Passwort muss mindestens 8 Zeichen lang sein",
|
||||
"backToHome": "ZurĂŒck zur Startseite",
|
||||
"menu": {
|
||||
"profile": "Profil",
|
||||
"myProfile": "Mein Profil",
|
||||
@@ -21,5 +23,28 @@ export default {
|
||||
"settings": "Einstellungen",
|
||||
"adminDashboard": "Admin Dashboard",
|
||||
"adminUsers": "Admin Users"
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "Passwort zurĂŒcksetzen",
|
||||
"button": "Passwort zurĂŒcksetzen",
|
||||
"success": "Ihr Passwort wurde erfolgreich zurĂŒckgesetzt! Sie werden in KĂŒrze zur Anmeldung weitergeleitet...",
|
||||
"invalidToken": "Kein gĂŒltiger Token gefunden. Bitte verwenden Sie den Link aus Ihrer E-Mail.",
|
||||
"error": "Fehler beim ZurĂŒcksetzen des Passworts",
|
||||
"emailSent": "Ein Link zum ZurĂŒcksetzen des Passworts wurde an Ihre E-Mail-Adresse gesendet.",
|
||||
"emailError": "Fehler beim Senden der E-Mail"
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "Bitte fĂŒllen Sie alle Felder aus",
|
||||
"invalidEmail": "Bitte geben Sie eine gĂŒltige E-Mail-Adresse ein",
|
||||
"passwordsNotMatch": "Die Passwörter stimmen nicht ĂŒberein",
|
||||
"passwordsNotMatchShort": "Passwörter stimmen nicht ĂŒberein",
|
||||
"enterEmail": "Bitte geben Sie Ihre E-Mail-Adresse ein",
|
||||
"loginFailed": "Anmeldung fehlgeschlagen",
|
||||
"registerFailed": "Registrierung fehlgeschlagen",
|
||||
"googleLoginFailed": "Google-Anmeldung fehlgeschlagen",
|
||||
"emailExists": "Ein Benutzer mit dieser E-Mail-Adresse existiert bereits. Bitte verwenden Sie eine andere E-Mail-Adresse oder melden Sie sich an."
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "Registrierung erfolgreich. Sie können sich jetzt anmelden."
|
||||
}
|
||||
};
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
44
src/i18n/locales/de/kitConfig.js
Normal file
@@ -0,0 +1,44 @@
|
||||
export default {
|
||||
"pageTitle": "đ± Growbox Konfigurator",
|
||||
"pageSubtitle": "Stelle dein perfektes Indoor Grow Setup zusammen",
|
||||
"bundleDiscountTitle": "đŻ Bundle-Rabatt sichern!",
|
||||
"loadingProducts": "Lade Growbox-Produkte...",
|
||||
"loadingLighting": "Lade Beleuchtungs-Produkte...",
|
||||
"loadingVentilation": "Lade BelĂŒftungs-Produkte...",
|
||||
"loadingExtras": "Lade Extras...",
|
||||
"noProductsAvailable": "Keine Produkte fĂŒr diese GröĂe verfĂŒgbar",
|
||||
"noLightingAvailable": "Keine passenden Lampen fĂŒr ZeltgröĂe {{shape}} verfĂŒgbar.",
|
||||
"noVentilationAvailable": "Keine passenden BelĂŒftung fĂŒr ZeltgröĂe {{shape}} verfĂŒgbar.",
|
||||
"noExtrasAvailable": "Keine Extras verfĂŒgbar",
|
||||
"selectShapeTitle": "1. Growbox-Form auswÀhlen",
|
||||
"selectShapeSubtitle": "WÀhle zuerst die GrundflÀche deiner Growbox aus",
|
||||
"selectProductTitle": "2. Growbox Produkt auswÀhlen",
|
||||
"selectProductSubtitle": "WĂ€hle das passende Produkt fĂŒr deine {{shape}} Growbox",
|
||||
"selectLightingTitle": "3. Beleuchtung wÀhlen",
|
||||
"selectLightingTitleShape": "3. Beleuchtung wÀhlen - {{shape}}",
|
||||
"selectLightingSubtitle": "Bitte wĂ€hlen Sie zuerst eine ZeltgröĂe aus.",
|
||||
"selectVentilationTitle": "4. BelĂŒftung auswĂ€hlen",
|
||||
"selectVentilationTitleShape": "4. BelĂŒftung auswĂ€hlen - {{shape}}",
|
||||
"selectVentilationSubtitle": "Bitte wĂ€hlen Sie zuerst eine ZeltgröĂe aus.",
|
||||
"selectExtrasTitle": "5. Extras hinzufĂŒgen (optional)",
|
||||
"yourConfiguration": "đŻ Ihre Konfiguration",
|
||||
"growboxLabel": "Growbox: {{name}}",
|
||||
"lightingLabel": "Beleuchtung: {{name}}",
|
||||
"ventilationLabel": "BelĂŒftung: {{name}}",
|
||||
"extraLabel": "Extra: {{name}}",
|
||||
"totalPrice": "Gesamtpreis:",
|
||||
"addToCart": "In den Warenkorb",
|
||||
"selected": "â AusgewĂ€hlt",
|
||||
"notDeliverable": "Nicht lieferbar",
|
||||
"noPrice": "Kein Preis",
|
||||
"setName": "Growbox Set - {{shape}}",
|
||||
"description60x60": "Kompakt - ideal fĂŒr kleine RĂ€ume",
|
||||
"description80x80": "Mittel - perfekte Balance",
|
||||
"description100x100": "GroĂ - fĂŒr erfahrene Grower",
|
||||
"description120x60": "Rechteckig - maximale Raumnutzung",
|
||||
"plants1to2": "1-2 Pflanzen",
|
||||
"plants2to4": "2-4 Pflanzen",
|
||||
"plants4to6": "4-6 Pflanzen",
|
||||
"plants3to6": "3-6 Pflanzen"
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ export default {
|
||||
"new": "in Bearbeitung",
|
||||
"pending": "Neu",
|
||||
"processing": "in Bearbeitung",
|
||||
"paid": "Bezahlt",
|
||||
"cancelled": "Storniert",
|
||||
"shipped": "Verschickt",
|
||||
"delivered": "Geliefert",
|
||||
@@ -24,6 +25,7 @@ export default {
|
||||
"cancelOrder": "Bestellung stornieren"
|
||||
},
|
||||
"noOrders": "Sie haben noch keine Bestellungen aufgegeben.",
|
||||
"trackShipment": "Sendung verfolgen",
|
||||
"details": {
|
||||
"title": "Bestelldetails: {{orderId}}",
|
||||
"deliveryAddress": "Lieferadresse",
|
||||
|
||||
@@ -8,6 +8,7 @@ export default {
|
||||
"articleNumber": "Artikelnummer",
|
||||
"manufacturer": "Hersteller",
|
||||
"inclVat": "inkl. {{vat}}% MwSt.",
|
||||
"inclVatSimple": "inkl. MwSt.",
|
||||
"priceUnit": "{{price}}/{{unit}}",
|
||||
"new": "Neu",
|
||||
"weeks": "Wochen",
|
||||
|
||||
62
src/i18n/locales/de/productDialogs.js
Normal file
@@ -0,0 +1,62 @@
|
||||
export default {
|
||||
"questionTitle": "Frage zum Artikel",
|
||||
"questionSubtitle": "Haben Sie eine Frage zu diesem Artikel? Wir helfen Ihnen gerne weiter.",
|
||||
"questionSuccess": "Vielen Dank fĂŒr Ihre Frage! Wir werden uns schnellstmöglich bei Ihnen melden.",
|
||||
"nameLabel": "Name",
|
||||
"namePlaceholder": "Ihr Name",
|
||||
"emailLabel": "E-Mail",
|
||||
"emailPlaceholder": "ihre.email@example.com",
|
||||
"questionLabel": "Ihre Frage",
|
||||
"questionPlaceholder": "Beschreiben Sie Ihre Frage zu diesem Artikel...",
|
||||
"photosLabelQuestion": "Fotos zur Frage anhÀngen (optional)",
|
||||
"submitQuestion": "Frage senden",
|
||||
"sending": "Wird gesendet...",
|
||||
|
||||
"ratingTitle": "Artikel Bewerten",
|
||||
"ratingSubtitle": "Teilen Sie Ihre Erfahrungen mit diesem Artikel und helfen Sie anderen Kunden bei der Entscheidung.",
|
||||
"ratingSuccess": "Vielen Dank fĂŒr Ihre Bewertung! Sie wird nach PrĂŒfung veröffentlicht.",
|
||||
"emailHelper": "Ihre E-Mail wird nicht veröffentlicht",
|
||||
"ratingLabel": "Bewertung *",
|
||||
"pleaseRate": "Bitte bewerten",
|
||||
"ratingStars": "{{rating}} von 5 Sternen",
|
||||
"reviewLabel": "Ihre Bewertung (optional)",
|
||||
"reviewPlaceholder": "Beschreiben Sie Ihre Erfahrungen mit diesem Artikel...",
|
||||
"photosLabelRating": "Fotos zur Bewertung anhÀngen (optional)",
|
||||
"submitRating": "Bewertung abgeben",
|
||||
"errorGeneric": "Ein Fehler ist aufgetreten",
|
||||
"errorPhotos": "Fehler beim Verarbeiten der Fotos",
|
||||
|
||||
"availabilityTitle": "VerfĂŒgbarkeit anfragen",
|
||||
"availabilitySubtitle": "Dieser Artikel ist derzeit nicht verfĂŒgbar. Gerne informieren wir Sie, sobald er wieder lieferbar ist.",
|
||||
"availabilitySuccessEmail": "Vielen Dank fĂŒr Ihre Anfrage! Wir werden Sie per E-Mail informieren, sobald der Artikel wieder verfĂŒgbar ist.",
|
||||
"availabilitySuccessTelegram": "Vielen Dank fĂŒr Ihre Anfrage! Wir werden Sie ĂŒber Telegram informieren, sobald der Artikel wieder verfĂŒgbar ist.",
|
||||
"notificationMethodLabel": "Wie möchten Sie benachrichtigt werden?",
|
||||
"telegramBotLabel": "Telegram Bot",
|
||||
"telegramIdLabel": "Telegram ID",
|
||||
"telegramPlaceholder": "@IhrTelegramName oder Telegram ID",
|
||||
"telegramHelper": "Geben Sie Ihren Telegram-Benutzernamen (mit @) oder Ihre Telegram-ID ein",
|
||||
"messageLabel": "Nachricht (optional)",
|
||||
"messagePlaceholder": "ZusÀtzliche Informationen oder Fragen...",
|
||||
"submitAvailability": "VerfĂŒgbarkeit anfragen",
|
||||
|
||||
"photoUploadSelect": "Fotos auswÀhlen",
|
||||
"photoUploadErrorMaxFiles": "Maximal {{max}} Dateien erlaubt",
|
||||
"photoUploadErrorFileType": "Nur Bilddateien (JPEG, PNG, GIF, WebP) sind erlaubt",
|
||||
"photoUploadErrorFileSize": "Datei zu groĂ. Maximum: {{maxSize}}MB",
|
||||
"photoUploadSelectedFiles": "{{count}} Datei(en) ausgewÀhlt",
|
||||
"photoUploadCompressed": "(komprimiert fĂŒr Upload)",
|
||||
"photoUploadRemove": "Bild entfernen",
|
||||
"photoUploadLabelDefault": "Fotos anhÀngen (optional)",
|
||||
|
||||
"shareTitle": "Teilen",
|
||||
"shareEmbed": "Einbetten",
|
||||
"shareCopyLink": "Link kopieren",
|
||||
"shareSuccessEmbed": "Einbettungscode wurde in die Zwischenablage kopiert!",
|
||||
"shareErrorEmbed": "Fehler beim Kopieren des Einbettungscodes",
|
||||
"shareSuccessLink": "Link wurde in die Zwischenablage kopiert!",
|
||||
"shareWhatsAppText": "Schau dir dieses Produkt an: {{name}}",
|
||||
"shareTelegramText": "Schau dir dieses Produkt an: {{name}}",
|
||||
"shareEmailSubject": "Produktempfehlung",
|
||||
"shareEmailBody": "Hallo,\n\nich möchte dir dieses Produkt empfehlen:\n\n{{name}}\n{{url}}\n\nViele GrĂŒĂe"
|
||||
};
|
||||
|
||||
@@ -5,14 +5,16 @@ export default {
|
||||
"profile": "Î ÏÎżÏίλ",
|
||||
"email": "Email",
|
||||
"password": "ÎÏÎŽÎčÎșÏÏ",
|
||||
"newPassword": "ÎÎÎżÏ ÎșÏÎŽÎčÎșÏÏ",
|
||||
"confirmPassword": "ÎÏÎčÎČΔÎČαίÏÏη ÎșÏÎŽÎčÎșÎżÏ",
|
||||
"forgotPassword": "ÎΔÏÎŹÏαÏΔ ÏÎżÎœ ÎșÏÎŽÎčÎșÏ;",
|
||||
"loginWithGoogle": "ÎŁÏΜΎΔÏη ΌΔ Google",
|
||||
"or": "Î",
|
||||
"privacyAccept": "ÎÎŹÎœÎżÎœÏÎ±Ï ÎșλÎčÎș ÏÏÎż \"ÎŁÏΜΎΔÏη ΌΔ Google\" αÏοΎÎÏÎżÎŒÎ±Îč ÏηΜ",
|
||||
"privacyPolicy": "ΠολÎčÏÎčÎșÎź ÎÏÎżÏÏÎźÏÎżÏ
",
|
||||
"privacyPolicy": "ΠολÎčÏÎčÎșÎź αÏÎżÏÏÎźÏÎżÏ
",
|
||||
"passwordMinLength": "Î ÎșÏÎŽÎčÎșÏÏ ÏÏÎÏΔÎč Μα ÎÏΔÎč ÏÎżÏ
λΏÏÎčÏÏÎżÎœ 8 ÏαÏαÎșÏÎźÏΔÏ",
|
||||
"newPasswordMinLength": "ΠΜÎÎżÏ ÎșÏÎŽÎčÎșÏÏ ÏÏÎÏΔÎč Μα ÎÏΔÎč ÏÎżÏ
λΏÏÎčÏÏÎżÎœ 8 ÏαÏαÎșÏÎźÏΔÏ",
|
||||
"backToHome": "ÎÏÎčÏÏÏÎżÏÎź ÏÏηΜ αÏÏÎčÎșÎź ÏΔλίΎα",
|
||||
"menu": {
|
||||
"profile": "Î ÏÎżÏίλ",
|
||||
"myProfile": "΀ο ÏÏÎżÏίλ ÎŒÎżÏ
",
|
||||
@@ -21,5 +23,28 @@ export default {
|
||||
"settings": "ÎĄÏ
ÎžÎŒÎŻÏΔÎčÏ",
|
||||
"adminDashboard": "Î ÎŻÎœÎ±ÎșÎ±Ï ÎŽÎčαÏΔίÏÎčÏηÏ",
|
||||
"adminUsers": "ÎÎčαÏΔÎčÏÎčÏÏÎÏ"
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "ÎÏαΜαÏÎżÏÎŹ ÎșÏÎŽÎčÎșÎżÏ",
|
||||
"button": "ÎÏαΜαÏÎżÏÎŹ ÎșÏÎŽÎčÎșÎżÏ",
|
||||
"success": "Î ÎșÏÎŽÎčÎșÏÏ ÏÎ±Ï Î”ÏαΜαÏÎÏΞηÎșΔ ΌΔ ΔÏÎčÏÏ
Ïία! Îα αΜαÎșαÏΔÏ
ΞÏ
ÎœÎžÎ”ÎŻÏΔ ÏÏη ÏÏΜΎΔÏη ÏÏΜÏÎżÎŒÎ±...",
|
||||
"invalidToken": "ÎΔΜ ÎČÏÎΞηÎșΔ ÎÎłÎșÏ
ÏÎż ÎŽÎčαÎșÏÎčÏÎčÎșÏ. ΠαÏαÎșÎ±Î»Ï ÏÏηÏÎčÎŒÎżÏÎżÎčÎźÏÏΔ ÏÎżÎœ ÏÏΜΎΔÏÎŒÎż αÏÏ ÏÎż email ÏαÏ.",
|
||||
"error": "ÎŁÏÎŹÎ»ÎŒÎ± ÎșαÏÎŹ ÏηΜ ΔÏαΜαÏÎżÏÎŹ ÏÎżÏ
ÎșÏÎŽÎčÎșÎżÏ",
|
||||
"emailSent": "ÎÎœÎ±Ï ÏÏΜΎΔÏÎŒÎżÏ ÎłÎčα ΔÏαΜαÏÎżÏÎŹ ÏÎżÏ
ÎșÏÎŽÎčÎșÎżÏ ÏÎ±Ï ÎÏΔÎč ÏÏαλΔί ÏÏη ÎŽÎčΔÏΞÏ
ΜÏη email ÏαÏ.",
|
||||
"emailError": "ÎŁÏÎŹÎ»ÎŒÎ± ÎșαÏÎŹ ÏηΜ αÏÎżÏÏολΟ ÏÎżÏ
email"
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "ΠαÏαÎșÎ±Î»Ï ÏÏ
ÎŒÏληÏÏÏÏΔ Ïλα Ïα ÏΔΎία",
|
||||
"invalidEmail": "ΠαÏαÎșÎ±Î»Ï Î”ÎčÏΏγΔÏΔ ÎŒÎčα ÎÎłÎșÏ
Ïη ÎŽÎčΔÏΞÏ
ΜÏη email",
|
||||
"passwordsNotMatch": "ÎÎč ÎșÏÎŽÎčÎșοί ΎΔΜ ÏαÎčÏÎčΏζοÏ
Μ",
|
||||
"passwordsNotMatchShort": "ÎÎč ÎșÏÎŽÎčÎșοί ΎΔΜ ÏαÎčÏÎčΏζοÏ
Μ",
|
||||
"enterEmail": "ΠαÏαÎșÎ±Î»Ï Î”ÎčÏΏγΔÏΔ Ïη ÎŽÎčΔÏΞÏ
ΜÏη email ÏαÏ",
|
||||
"loginFailed": "Î ÏÏΜΎΔÏη αÏÎÏÏ
ÏΔ",
|
||||
"registerFailed": "ΠΔγγÏαÏÎź αÏÎÏÏ
ÏΔ",
|
||||
"googleLoginFailed": "Î ÏÏΜΎΔÏη ΌΔ Google αÏÎÏÏ
ÏΔ",
|
||||
"emailExists": "΄ÏÎŹÏÏΔÎč ΟΎη ÏÏÎźÏÏÎ·Ï ÎŒÎ” αÏ
ÏÎź Ïη ÎŽÎčΔÏΞÏ
ΜÏη email. ΠαÏαÎșÎ±Î»Ï ÏÏηÏÎčÎŒÎżÏÎżÎčÎźÏÏΔ Ώλλη ÎŽÎčΔÏΞÏ
ΜÏη Îź ÏÏ
ÎœÎŽÎ”ÎžÎ”ÎŻÏΔ."
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "ΠΔγγÏαÏÎź ολοÎșληÏÏΞηÎșΔ ΌΔ ΔÏÎčÏÏ
Ïία. ÎÏÎżÏΔίÏΔ ÏÏÏα Μα ÏÏ
ÎœÎŽÎ”ÎžÎ”ÎŻÏΔ."
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
43
src/i18n/locales/el/kitConfig.js
Normal file
@@ -0,0 +1,43 @@
|
||||
export default {
|
||||
"pageTitle": "đ± ÎÎčÎ±ÎŒÎżÏÏÏÏÎźÏ Growbox",
|
||||
"pageSubtitle": "ÎŁÏ
ΜΞÎÏÏΔ ÏÎż ÏÎλΔÎčÎż ΔÏÏÏΔÏÎčÎșÏ ÏÏÏÏηΌα ÎșαλλÎčÎÏγΔÎčαÏ",
|
||||
"bundleDiscountTitle": "đŻ ÎΟαÏÏαλίÏÏΔ ÎÎșÏÏÏÏη ÏαÎșÎÏÎżÏ
!",
|
||||
"loadingProducts": "ΊÏÏÏÏÏη ÏÏÎżÏÏΜÏÏΜ growbox...",
|
||||
"loadingLighting": "ΊÏÏÏÏÏη ÏÏÎżÏÏΜÏÏΜ ÏÏÏÎčÏÎŒÎżÏ...",
|
||||
"loadingVentilation": "ΊÏÏÏÏÏη ÏÏÎżÏÏΜÏÏΜ αΔÏÎčÏÎŒÎżÏ...",
|
||||
"loadingExtras": "ΊÏÏÏÏÏη ΔÏÎčÏλÎÎżÎœ...",
|
||||
"noProductsAvailable": "ÎΔΜ Ï
ÏÎŹÏÏÎżÏ
Μ ÎŽÎčαΞÎÏÎčΌα ÏÏÎżÏÏΜÏα ÎłÎčα αÏ
ÏÏ ÏÎż ÎŒÎγΔΞοÏ",
|
||||
"noLightingAvailable": "ÎΔΜ Ï
ÏÎŹÏÏÎżÏ
Μ ÎșαÏΏλληλα ÏÏÏα ÎłÎčα ÏÎż ÎŒÎÎłÎ”ÎžÎżÏ ÏÎșÎ·ÎœÎźÏ {{shape}}.",
|
||||
"noVentilationAvailable": "ÎΔΜ Ï
ÏÎŹÏÏΔÎč ÎșαÏÎŹÎ»Î»Î·Î»ÎżÏ Î±Î”ÏÎčÏÎŒÏÏ ÎłÎčα ÏÎż ÎŒÎÎłÎ”ÎžÎżÏ ÏÎșÎ·ÎœÎźÏ {{shape}}.",
|
||||
"noExtrasAvailable": "ÎΔΜ Ï
ÏÎŹÏÏÎżÏ
Μ ΔÏÎčÏλÎÎżÎœ ÎŽÎčαΞÎÏÎčΌα",
|
||||
"selectShapeTitle": "1. ÎÏÎčλÎΟÏΔ ÏÎż ÏÏÎźÎŒÎ± ÏÎżÏ
growbox",
|
||||
"selectShapeSubtitle": "ÎÏÎčλÎΟÏΔ ÏÏÏÏα ÏηΜ ΔÏÎčÏÎŹÎœÎ”Îčα ÎČÎŹÏÎ·Ï ÏÎżÏ
growbox ÏαÏ",
|
||||
"selectProductTitle": "2. ÎÏÎčλÎΟÏΔ ÏÏÎżÏÏΜ growbox",
|
||||
"selectProductSubtitle": "ÎÏÎčλÎΟÏΔ ÏÎż ÎșαÏΏλληλο ÏÏÎżÏÏΜ ÎłÎčα ÏÎż growbox {{shape}} ÏαÏ",
|
||||
"selectLightingTitle": "3. ÎÏÎčλÎΟÏΔ ÏÏÏÎčÏÎŒÏ",
|
||||
"selectLightingTitleShape": "3. ÎÏÎčλÎΟÏΔ ÏÏÏÎčÏÎŒÏ - {{shape}}",
|
||||
"selectLightingSubtitle": "ΠαÏαÎșÎ±Î»Ï Î”ÏÎčλÎΟÏΔ ÏÏÏÏα ÏÎż ÎŒÎÎłÎ”ÎžÎżÏ ÏÎ·Ï ÏÎșÎ·ÎœÎźÏ.",
|
||||
"selectVentilationTitle": "4. ÎÏÎčλÎΟÏΔ αΔÏÎčÏÎŒÏ",
|
||||
"selectVentilationTitleShape": "4. ÎÏÎčλÎΟÏΔ αΔÏÎčÏÎŒÏ - {{shape}}",
|
||||
"selectVentilationSubtitle": "ΠαÏαÎșÎ±Î»Ï Î”ÏÎčλÎΟÏΔ ÏÏÏÏα ÏÎż ÎŒÎÎłÎ”ÎžÎżÏ ÏÎ·Ï ÏÎșÎ·ÎœÎźÏ.",
|
||||
"selectExtrasTitle": "5. Î ÏÎżÏΞÎÏÏΔ ΔÏÎčÏλÎÎżÎœ (ÏÏοαÎčÏΔÏÎčÎșÎŹ)",
|
||||
"yourConfiguration": "đŻ Î ÎŽÎčαΌÏÏÏÏÏÎź ÏαÏ",
|
||||
"growboxLabel": "Growbox: {{name}}",
|
||||
"lightingLabel": "ΊÏÏÎčÏÎŒÏÏ: {{name}}",
|
||||
"ventilationLabel": "ÎΔÏÎčÏÎŒÏÏ: {{name}}",
|
||||
"extraLabel": "ÎÏÎčÏλÎÎżÎœ: {{name}}",
|
||||
"totalPrice": "ÎŁÏ
ÎœÎżÎ»ÎčÎșÎź ÏÎčÎŒÎź:",
|
||||
"addToCart": "Î ÏÎżÏΞΟÎșη ÏÏÎż ÎșαλΏΞÎč",
|
||||
"selected": "â ÎÏÎčÎ»Î”ÎłÎŒÎÎœÎż",
|
||||
"notDeliverable": "Îη ÎŽÎčαΞÎÏÎčÎŒÎż ÎłÎčα ÏαÏÎŹÎŽÎżÏη",
|
||||
"noPrice": "ΧÏÏÎŻÏ ÏÎčÎŒÎź",
|
||||
"setName": "ÎŁÎ”Ï Growbox - {{shape}}",
|
||||
"description60x60": "ÎŁÏ
ÎŒÏαγÎÏ - ÎčΎαΜÎčÎșÏ ÎłÎčα ÎŒÎčÎșÏÎżÏÏ ÏÏÏÎżÏ
Ï",
|
||||
"description80x80": "ÎΔÏαίο - ÏÎλΔÎčα ÎčÏÎżÏÏÎżÏία",
|
||||
"description100x100": "ÎΔγΏλο - ÎłÎčα ÎÎŒÏΔÎčÏÎżÏ
Ï ÎșαλλÎčΔÏγηÏÎÏ",
|
||||
"description120x60": "ÎÏΞογÏΜÎčÎż - ÎŒÎÎłÎčÏÏη ÏÏÎźÏη ÏÏÏÎżÏ
",
|
||||
"plants1to2": "1-2 ÏÏ
ÏÎŹ",
|
||||
"plants2to4": "2-4 ÏÏ
ÏÎŹ",
|
||||
"plants4to6": "4-6 ÏÏ
ÏÎŹ",
|
||||
"plants3to6": "3-6 ÏÏ
ÏÎŹ"
|
||||
};
|
||||
@@ -1,10 +1,11 @@
|
||||
export default {
|
||||
"status": {
|
||||
"new": "ΣΔ ΔΟÎλÎčΟη",
|
||||
"new": "ÏΔ ΔΟÎλÎčΟη",
|
||||
"pending": "ÎÎÎż",
|
||||
"processing": "ΣΔ ΔΟÎλÎčΟη",
|
||||
"processing": "ÏΔ ΔΟÎλÎčΟη",
|
||||
"paid": "ΠληÏÏÎŒÎÎœÎż",
|
||||
"cancelled": "ÎÎșÏ
ÏÏΞηÎșΔ",
|
||||
"shipped": "ÎÏΔÏÏΏλη",
|
||||
"shipped": "ÎÏΔÏÏαλΌÎÎœÎż",
|
||||
"delivered": "ΠαÏαΎÏΞηÎșΔ",
|
||||
"return": "ÎÏÎčÏÏÏÎżÏÎź",
|
||||
"partialReturn": "ÎΔÏÎčÎșÎź ΔÏÎčÏÏÏÎżÏÎź",
|
||||
@@ -24,10 +25,11 @@ export default {
|
||||
"cancelOrder": "ÎÎșÏÏÏÏη ÏαÏαγγΔλίαÏ"
|
||||
},
|
||||
"noOrders": "ÎΔΜ ÎÏΔÏΔ ÎșÎŹÎœÎ”Îč αÎșÏΌα ÎșÎ±ÎŒÎŻÎ± ÏαÏαγγΔλία.",
|
||||
"trackShipment": "ΠαÏαÎșολοÏΞηÏη αÏÎżÏÏολΟÏ",
|
||||
"details": {
|
||||
"title": "ÎΔÏÏÎżÎŒÎÏΔÎčÎ”Ï ÏαÏαγγΔλίαÏ: {{orderId}}",
|
||||
"deliveryAddress": "ÎÎčΔÏΞÏ
ΜÏη ÏαÏÎŹÎŽÎżÏηÏ",
|
||||
"invoiceAddress": "ÎÎčΔÏΞÏ
ΜÏη ÏÎčÎŒÎżÎ»ÏγηÏηÏ",
|
||||
"invoiceAddress": "ÎÎčΔÏΞÏ
ΜÏη ÏÎčÎŒÎżÎ»ÎżÎłÎŻÎżÏ
",
|
||||
"orderDetails": "ÎΔÏÏÎżÎŒÎÏΔÎčÎ”Ï ÏαÏαγγΔλίαÏ",
|
||||
"deliveryMethod": "΀ÏÏÏÎżÏ ÏαÏÎŹÎŽÎżÏηÏ:",
|
||||
"paymentMethod": "΀ÏÏÏÎżÏ ÏληÏÏÎŒÎźÏ:",
|
||||
@@ -36,15 +38,14 @@ export default {
|
||||
"item": "ÎÎŻÎŽÎżÏ",
|
||||
"quantity": "Î ÎżÏÏÏηÏα",
|
||||
"price": "΀ÎčÎŒÎź",
|
||||
"vat": "ΊΠÎ",
|
||||
"total": "ÎŁÏÎœÎżÎ»Îż",
|
||||
"cancelOrder": "ÎÎșÏÏÏÏη ÏαÏαγγΔλίαÏ"
|
||||
},
|
||||
"cancelConfirm": {
|
||||
"title": "ÎÎșÏÏÏÏη ÏαÏαγγΔλίαÏ",
|
||||
"message": "ÎÎŻÏÏΔ ÏίγοÏ
ÏÎżÎč ÏÏÎč ΞÎλΔÏΔ Μα αÎșÏ
ÏÏÏΔÏΔ αÏ
ÏÎźÎœ ÏηΜ ÏαÏαγγΔλία;",
|
||||
"confirm": "ÎÎșÏÏÏÏη ÏαÏαγγΔλίαÏ",
|
||||
"cancelling": "ÎÎșÏÏÏÏη..."
|
||||
"message": "ÎÎŻÏÏΔ ÏίγοÏ
ÏÎżÎč ÏÏÎč ΞÎλΔÏΔ Μα αÎșÏ
ÏÏÏΔÏΔ αÏ
ÏÎź ÏηΜ ÏαÏαγγΔλία;",
|
||||
"confirm": "ÎÎșÏÏÏÏη",
|
||||
"cancelling": "ÎÎșÏÏÏÏη ÏΔ ΔΟÎλÎčΟη..."
|
||||
},
|
||||
"processing": "Î ÏαÏαγγΔλία ολοÎșληÏÏΜΔÏαÎč..."
|
||||
};
|
||||
|
||||
@@ -8,9 +8,10 @@ export default {
|
||||
"articleNumber": "ÎÏÎčΞΌÏÏ ÎŹÏΞÏÎżÏ
",
|
||||
"manufacturer": "ÎαÏαÏÎșΔÏ
αÏÏÎźÏ",
|
||||
"inclVat": "ÏÏ
ÎŒÏ. {{vat}}% ΊΠÎ",
|
||||
"inclVatSimple": "ÏÏ
ÎŒÏ. ΊΠÎ",
|
||||
"priceUnit": "{{price}}/{{unit}}",
|
||||
"new": "ÎÎÎż",
|
||||
"weeks": "ΔÎČÎŽÎżÎŒÎŹÎŽÎ”Ï",
|
||||
"weeks": "ÎÎČÎŽÎżÎŒÎŹÎŽÎ”Ï",
|
||||
"arriving": "ÎÏÎčΟη:",
|
||||
"inclVatFooter": "ÏÏ
ÎŒÏ. {{vat}}% ΊΠÎ,*",
|
||||
"availability": "ÎÎčαΞΔÏÎčÎŒÏÏηÏα",
|
||||
@@ -28,7 +29,7 @@ export default {
|
||||
"loadingProduct": "ΊÏÏÏÏÏη ÏÏÎżÏÏΜÏÎżÏ...",
|
||||
"individualPriceTotal": "ÎŁÏ
ÎœÎżÎ»ÎčÎșÎź ÏÎčÎŒÎź ÎŒÎ”ÎŒÎżÎœÏÎŒÎΜÏΜ:",
|
||||
"setPrice": "΀ÎčÎŒÎź ÏΔÏ:",
|
||||
"yourSavings": "Î Î”ÎŸÎżÎčÎșÎżÎœÏΌηÏÎź ÏαÏ:",
|
||||
"yourSavings": "ÎÎč Î”ÎŸÎżÎčÎșÎżÎœÎżÎŒÎźÏΔÎčÏ ÏαÏ:",
|
||||
"similarProducts": "ΠαÏÏÎŒÎżÎčα ÏÏÎżÏÏΜÏα",
|
||||
"countDisplay": {
|
||||
"noProducts": "0 ÏÏÎżÏÏΜÏα",
|
||||
|
||||
61
src/i18n/locales/el/productDialogs.js
Normal file
@@ -0,0 +1,61 @@
|
||||
export default {
|
||||
"questionTitle": "ÎÏÏÏηÏη ÏÏΔÏÎčÎșÎŹ ΌΔ ÏÎż ÏÏÎżÏÏΜ",
|
||||
"questionSubtitle": "ÎÏΔÏΔ ÎșÎŹÏÎżÎčα ΔÏÏÏηÏη ÎłÎčα αÏ
ÏÏ ÏÎż ÏÏÎżÏÏΜ; ÎÎŻÎŒÎ±ÏÏΔ Î”ÎŽÏ ÎłÎčα Μα ÏÎ±Ï ÎČοηΞΟÏÎżÏ
ΌΔ.",
|
||||
"questionSuccess": "ÎÏ
ÏαÏÎčÏÏÎżÏΌΔ ÎłÎčα ÏηΜ ΔÏÏÏηÏÎź ÏαÏ! Îα ΔÏÎčÎșÎżÎčΜÏÎœÎźÏÎżÏ
ΌΔ ÎŒÎ±Î¶ÎŻ ÏÎ±Ï ÏÎż ÏÏ
ΜÏÎżÎŒÏÏΔÏÎż ÎŽÏ
ΜαÏÏ.",
|
||||
"nameLabel": "ÎÎœÎżÎŒÎ±",
|
||||
"namePlaceholder": "΀ο ÏÎœÎżÎŒÎŹ ÏαÏ",
|
||||
"emailLabel": "Email",
|
||||
"emailPlaceholder": "your.email@example.com",
|
||||
"questionLabel": "ΠΔÏÏÏηÏÎź ÏαÏ",
|
||||
"questionPlaceholder": "ΠΔÏÎčÎłÏÎŹÏÏΔ ÏηΜ ΔÏÏÏηÏÎź ÏÎ±Ï ÏÏΔÏÎčÎșÎŹ ΌΔ αÏ
ÏÏ ÏÎż ÏÏÎżÏÏΜ...",
|
||||
"photosLabelQuestion": "ÎÏÎčÏÏ
ÎœÎŹÏÏΔ ÏÏÏογÏαÏÎŻÎ”Ï ÏÏηΜ ΔÏÏÏηÏÎź ÏÎ±Ï (ÏÏοαÎčÏΔÏÎčÎșÏ)",
|
||||
"submitQuestion": "ÎÏÎżÏÏολΟ ΔÏÏÏηÏηÏ",
|
||||
"sending": "ÎÏÎżÏÏολΟ...",
|
||||
|
||||
"ratingTitle": "ÎΟÎčολογΟÏÏΔ ÏÎż ÏÏÎżÏÏΜ",
|
||||
"ratingSubtitle": "ÎÎżÎčÏαÏÏΔίÏΔ ÏηΜ ΔΌÏΔÎčÏία ÏÎ±Ï ÎŒÎ” αÏ
ÏÏ ÏÎż ÏÏÎżÏÏΜ ÎșαÎč ÎČοηΞΟÏÏΔ ΏλλοÏ
Ï ÏΔλΏÏÎ”Ï ÎœÎ± ÏÎŹÏÎżÏ
Μ ÏηΜ αÏÏÏαÏÎź ÏÎżÏ
Ï.",
|
||||
"ratingSuccess": "ÎÏ
ÏαÏÎčÏÏÎżÏΌΔ ÎłÎčα ÏηΜ αΟÎčολÏγηÏÎź ÏαÏ! Îα ÎŽÎ·ÎŒÎżÏÎčΔÏ
ÏΔί ΌΔÏÎŹ αÏÏ ÎλΔγÏÎż.",
|
||||
"emailHelper": "΀ο email ÏÎ±Ï ÎŽÎ”Îœ Ξα ÎŽÎ·ÎŒÎżÏÎčΔÏ
ÏΔί",
|
||||
"ratingLabel": "ÎΟÎčολÏγηÏη *",
|
||||
"pleaseRate": "ΠαÏαÎșÎ±Î»Ï Î±ÎŸÎčολογΟÏÏΔ",
|
||||
"ratingStars": "{{rating}} αÏÏ 5 αÏÏÎÏÎčα",
|
||||
"reviewLabel": "Î ÎșÏÎčÏÎčÎșÎź ÏÎ±Ï (ÏÏοαÎčÏΔÏÎčÎșÏ)",
|
||||
"reviewPlaceholder": "ΠΔÏÎčÎłÏÎŹÏÏΔ ÏÎčÏ Î”ÎŒÏΔÎčÏÎŻÎ”Ï ÏÎ±Ï ÎŒÎ” αÏ
ÏÏ ÏÎż ÏÏÎżÏÏΜ...",
|
||||
"photosLabelRating": "ÎÏÎčÏÏ
ÎœÎŹÏÏΔ ÏÏÏογÏαÏÎŻÎ”Ï ÏÏηΜ ÎșÏÎčÏÎčÎșÎź ÏÎ±Ï (ÏÏοαÎčÏΔÏÎčÎșÏ)",
|
||||
"submitRating": "΄ÏÎżÎČολΟ ÎșÏÎčÏÎčÎșÎźÏ",
|
||||
"errorGeneric": "ΠαÏÎżÏ
ÏÎčÎŹÏÏηÎșΔ ÏÏÎŹÎ»ÎŒÎ±",
|
||||
"errorPhotos": "ÎŁÏÎŹÎ»ÎŒÎ± ÎșαÏÎŹ ÏηΜ ΔÏΔΟΔÏγαÏία ÏÏΜ ÏÏÏογÏαÏÎčÏΜ",
|
||||
|
||||
"availabilityTitle": "ÎηÏÎźÏÏΔ ÎŽÎčαΞΔÏÎčÎŒÏÏηÏα",
|
||||
"availabilitySubtitle": "ÎÏ
ÏÏ ÏÎż ÏÏÎżÏÏΜ ΎΔΜ Î”ÎŻÎœÎ±Îč ÎŽÎčαΞÎÏÎčÎŒÎż αÏ
ÏÎź Ïη ÏÏÎčÎłÎŒÎź. Îα ÏαÏÎżÏΌΔ Μα ÏÎ±Ï Î”ÎœÎ·ÎŒÎ”ÏÏÏÎżÏ
ΌΔ ÎŒÏλÎčÏ Î”ÎŻÎœÎ±Îč ÎŸÎ±ÎœÎŹ ÎŽÎčαΞÎÏÎčÎŒÎż.",
|
||||
"availabilitySuccessEmail": "ÎÏ
ÏαÏÎčÏÏÎżÏΌΔ ÎłÎčα ÏÎż αίÏÎ·ÎŒÎŹ ÏαÏ! Îα ÏÎ±Ï Î”ÎœÎ·ÎŒÎ”ÏÏÏÎżÏ
ΌΔ ÎŒÎÏÏ email ÎŒÏλÎčÏ ÏÎż ÏÏÎżÏÏΜ Î”ÎŻÎœÎ±Îč ÎŸÎ±ÎœÎŹ ÎŽÎčαΞÎÏÎčÎŒÎż.",
|
||||
"availabilitySuccessTelegram": "ÎÏ
ÏαÏÎčÏÏÎżÏΌΔ ÎłÎčα ÏÎż αίÏÎ·ÎŒÎŹ ÏαÏ! Îα ÏÎ±Ï Î”ÎœÎ·ÎŒÎ”ÏÏÏÎżÏ
ΌΔ ÎŒÎÏÏ Telegram ÎŒÏλÎčÏ ÏÎż ÏÏÎżÏÏΜ Î”ÎŻÎœÎ±Îč ÎŸÎ±ÎœÎŹ ÎŽÎčαΞÎÏÎčÎŒÎż.",
|
||||
"notificationMethodLabel": "Î ÏÏ ÎžÎλΔÏΔ Μα ΔÎčÎŽÎżÏÎżÎčηΞΔίÏΔ;",
|
||||
"telegramBotLabel": "Telegram Bot",
|
||||
"telegramIdLabel": "Telegram ID",
|
||||
"telegramPlaceholder": "@yourTelegramName or Telegram ID",
|
||||
"telegramHelper": "ÎÎčÏΏγΔÏΔ ÏÎż ÏÎœÎżÎŒÎ± ÏÏÎźÏÏη Telegram (ΌΔ @) Îź ÏÎż Telegram ID ÏαÏ",
|
||||
"messageLabel": "ÎÎźÎœÏ
Όα (ÏÏοαÎčÏΔÏÎčÎșÏ)",
|
||||
"messagePlaceholder": "ÎÏÎčÏλÎÎżÎœ ÏληÏÎżÏÎżÏÎŻÎ”Ï Îź ΔÏÏÏÎźÏΔÎčÏ...",
|
||||
"submitAvailability": "ÎηÏÎźÏÏΔ ÎŽÎčαΞΔÏÎčÎŒÏÏηÏα",
|
||||
|
||||
"photoUploadSelect": "ÎÏÎčλÎΟÏΔ ÏÏÏογÏαÏίΔÏ",
|
||||
"photoUploadErrorMaxFiles": "ÎÏÎčÏÏÎÏÎżÎœÏαÎč ÎÏÏ {{max}} αÏÏΔία",
|
||||
"photoUploadErrorFileType": "ÎÏÎčÏÏÎÏÎżÎœÏαÎč ÎŒÏÎœÎż αÏÏΔία ΔÎčÎșÏÎœÎ±Ï (JPEG, PNG, GIF, WebP)",
|
||||
"photoUploadErrorFileSize": "΀ο αÏÏΔίο Î”ÎŻÎœÎ±Îč ÏÎżÎ»Ï ÎŒÎ”ÎłÎŹÎ»Îż. ÎÎÎłÎčÏÏÎż: {{maxSize}}MB",
|
||||
"photoUploadSelectedFiles": "ÎÏÎčλÎÏΞηÎșαΜ {{count}} αÏÏΔία",
|
||||
"photoUploadCompressed": "(ÏÏ
ÎŒÏÎčΔÏÎŒÎÎœÎż ÎłÎčα αÏÎżÏÏολΟ)",
|
||||
"photoUploadRemove": "ÎÏαίÏΔÏη ΔÎčÎșÏΜαÏ",
|
||||
"photoUploadLabelDefault": "ÎÏÎčÏÏΜαÏη ÏÏÏογÏαÏÎčÏΜ (ÏÏοαÎčÏΔÏÎčÎșÏ)",
|
||||
|
||||
"shareTitle": "ÎÎżÎčÎœÎżÏοίηÏη",
|
||||
"shareEmbed": "ÎΜÏÏÎŒÎŹÏÏÏη",
|
||||
"shareCopyLink": "ÎΜÏÎčÎłÏαÏÎź ÏÏ
ΜΎÎÏÎŒÎżÏ
",
|
||||
"shareSuccessEmbed": "Î ÎșÏÎŽÎčÎșÎ±Ï Î”ÎœÏÏÎŒÎŹÏÏÏÎ·Ï Î±ÎœÏÎčÎłÏÎŹÏηÎșΔ ÏÏÎż ÏÏÏÏΔÎčÏÎż!",
|
||||
"shareErrorEmbed": "ÎŁÏÎŹÎ»ÎŒÎ± ÎșαÏÎŹ ÏηΜ αΜÏÎčÎłÏαÏÎź ÏÎżÏ
ÎșÏÎŽÎčÎșα ΔΜÏÏÎŒÎŹÏÏÏηÏ",
|
||||
"shareSuccessLink": "Î ÏÏΜΎΔÏÎŒÎżÏ Î±ÎœÏÎčÎłÏÎŹÏηÎșΔ ÏÏÎż ÏÏÏÏΔÎčÏÎż!",
|
||||
"shareWhatsAppText": "ÎΔίÏΔ αÏ
ÏÏ ÏÎż ÏÏÎżÏÏΜ: {{name}}",
|
||||
"shareTelegramText": "ÎΔίÏΔ αÏ
ÏÏ ÏÎż ÏÏÎżÏÏΜ: {{name}}",
|
||||
"shareEmailSubject": "ÎŁÏÏÏαÏη ÏÏÎżÏÏΜÏÎżÏ",
|
||||
"shareEmailBody": "ÎΔÎčα ÏαÏ,\n\nÎα ΟΞΔλα Μα ÏÎ±Ï ÏÏÎżÏÎ”ÎŻÎœÏ Î±Ï
ÏÏ ÏÎż ÏÏÎżÏÏΜ:\n\n{{name}}\n{{url}}\n\nÎΔ ΔÎșÏÎŻÎŒÎ·Ïη"
|
||||
};
|
||||
@@ -5,14 +5,16 @@ export default {
|
||||
"profile": "Profile", // Profil
|
||||
"email": "Email", // E-Mail
|
||||
"password": "Password", // Passwort
|
||||
"newPassword": "New password", // Neues Passwort
|
||||
"confirmPassword": "Confirm password", // Passwort bestÀtigen
|
||||
"forgotPassword": "Forgot password?", // Passwort vergessen?
|
||||
"loginWithGoogle": "Sign in with Google", // Mit Google anmelden
|
||||
"or": "OR", // ODER
|
||||
"privacyAccept": "By clicking \"Sign in with Google\" I accept the", // Mit dem Click auf "Mit Google anmelden" akzeptiere ich die
|
||||
"privacyPolicy": "Privacy Policy", // Datenschutzbestimmungen
|
||||
"privacyAccept": "By clicking on \"Sign in with Google\" I accept the", // Mit dem Click auf "Mit Google anmelden" akzeptiere ich die
|
||||
"privacyPolicy": "Privacy policy", // Datenschutzbestimmungen
|
||||
"passwordMinLength": "The password must be at least 8 characters long", // Das Passwort muss mindestens 8 Zeichen lang sein
|
||||
"newPasswordMinLength": "The new password must be at least 8 characters long", // Das neue Passwort muss mindestens 8 Zeichen lang sein
|
||||
"backToHome": "Back to homepage", // ZurĂŒck zur Startseite
|
||||
"menu": {
|
||||
"profile": "Profile", // Profil
|
||||
"myProfile": "My profile", // Mein Profil
|
||||
@@ -21,5 +23,28 @@ export default {
|
||||
"settings": "Settings", // Einstellungen
|
||||
"adminDashboard": "Admin Dashboard", // Admin Dashboard
|
||||
"adminUsers": "Admin Users" // Admin Users
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "Reset password", // Passwort zurĂŒcksetzen
|
||||
"button": "Reset password", // Passwort zurĂŒcksetzen
|
||||
"success": "Your password has been reset successfully! You will be redirected to login shortly...", // Ihr Passwort wurde erfolgreich zurĂŒckgesetzt! Sie werden in KĂŒrze zur Anmeldung weitergeleitet...
|
||||
"invalidToken": "No valid token found. Please use the link from your email.", // Kein gĂŒltiger Token gefunden. Bitte verwenden Sie den Link aus Ihrer E-Mail.
|
||||
"error": "Error resetting password", // Fehler beim ZurĂŒcksetzen des Passworts
|
||||
"emailSent": "A link to reset your password has been sent to your email address.", // Ein Link zum ZurĂŒcksetzen des Passworts wurde an Ihre E-Mail-Adresse gesendet.
|
||||
"emailError": "Error sending email" // Fehler beim Senden der E-Mail
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "Please fill in all fields", // Bitte fĂŒllen Sie alle Felder aus
|
||||
"invalidEmail": "Please enter a valid email address", // Bitte geben Sie eine gĂŒltige E-Mail-Adresse ein
|
||||
"passwordsNotMatch": "The passwords do not match", // Die Passwörter stimmen nicht ĂŒberein
|
||||
"passwordsNotMatchShort": "Passwords do not match", // Passwörter stimmen nicht ĂŒberein
|
||||
"enterEmail": "Please enter your email address", // Bitte geben Sie Ihre E-Mail-Adresse ein
|
||||
"loginFailed": "Login failed", // Anmeldung fehlgeschlagen
|
||||
"registerFailed": "Registration failed", // Registrierung fehlgeschlagen
|
||||
"googleLoginFailed": "Google login failed", // Google-Anmeldung fehlgeschlagen
|
||||
"emailExists": "A user with this email address already exists. Please use another email address or log in." // Ein Benutzer mit dieser E-Mail-Adresse existiert bereits. Bitte verwenden Sie eine andere E-Mail-Adresse oder melden Sie sich an.
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "Registration successful. You can now log in." // Registrierung erfolgreich. Sie können sich jetzt anmelden.
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
43
src/i18n/locales/en/kitConfig.js
Normal file
@@ -0,0 +1,43 @@
|
||||
export default {
|
||||
"pageTitle": "đ± Growbox Configurator", // đ± Growbox Konfigurator
|
||||
"pageSubtitle": "Put together your perfect indoor grow setup", // Stelle dein perfektes Indoor Grow Setup zusammen
|
||||
"bundleDiscountTitle": "đŻ Secure bundle discount!", // đŻ Bundle-Rabatt sichern!
|
||||
"loadingProducts": "Loading growbox products...", // Lade Growbox-Produkte...
|
||||
"loadingLighting": "Loading lighting products...", // Lade Beleuchtungs-Produkte...
|
||||
"loadingVentilation": "Loading ventilation products...", // Lade BelĂŒftungs-Produkte...
|
||||
"loadingExtras": "Loading extras...", // Lade Extras...
|
||||
"noProductsAvailable": "No products available for this size", // Keine Produkte fĂŒr diese GröĂe verfĂŒgbar
|
||||
"noLightingAvailable": "No suitable lights available for tent size {{shape}}.", // Keine passenden Lampen fĂŒr ZeltgröĂe {{shape}} verfĂŒgbar.
|
||||
"noVentilationAvailable": "No suitable ventilation available for tent size {{shape}}.", // Keine passenden BelĂŒftung fĂŒr ZeltgröĂe {{shape}} verfĂŒgbar.
|
||||
"noExtrasAvailable": "No extras available", // Keine Extras verfĂŒgbar
|
||||
"selectShapeTitle": "1. Select growbox shape", // 1. Growbox-Form auswÀhlen
|
||||
"selectShapeSubtitle": "First select the base area of your growbox", // WÀhle zuerst die GrundflÀche deiner Growbox aus
|
||||
"selectProductTitle": "2. Select growbox product", // 2. Growbox Produkt auswÀhlen
|
||||
"selectProductSubtitle": "Choose the right product for your {{shape}} growbox", // WĂ€hle das passende Produkt fĂŒr deine {{shape}} Growbox
|
||||
"selectLightingTitle": "3. Choose lighting", // 3. Beleuchtung wÀhlen
|
||||
"selectLightingTitleShape": "3. Choose lighting - {{shape}}", // 3. Beleuchtung wÀhlen - {{shape}}
|
||||
"selectLightingSubtitle": "Please select a tent size first.", // Bitte wĂ€hlen Sie zuerst eine ZeltgröĂe aus.
|
||||
"selectVentilationTitle": "4. Select ventilation", // 4. BelĂŒftung auswĂ€hlen
|
||||
"selectVentilationTitleShape": "4. Select ventilation - {{shape}}", // 4. BelĂŒftung auswĂ€hlen - {{shape}}
|
||||
"selectVentilationSubtitle": "Please select a tent size first.", // Bitte wĂ€hlen Sie zuerst eine ZeltgröĂe aus.
|
||||
"selectExtrasTitle": "5. Add extras (optional)", // 5. Extras hinzufĂŒgen (optional)
|
||||
"yourConfiguration": "đŻ Your configuration", // đŻ Ihre Konfiguration
|
||||
"growboxLabel": "Growbox: {{name}}", // Growbox: {{name}}
|
||||
"lightingLabel": "Lighting: {{name}}", // Beleuchtung: {{name}}
|
||||
"ventilationLabel": "Ventilation: {{name}}", // BelĂŒftung: {{name}}
|
||||
"extraLabel": "Extra: {{name}}", // Extra: {{name}}
|
||||
"totalPrice": "Total price:", // Gesamtpreis:
|
||||
"addToCart": "Add to cart", // In den Warenkorb
|
||||
"selected": "â Selected", // â AusgewĂ€hlt
|
||||
"notDeliverable": "Not deliverable", // Nicht lieferbar
|
||||
"noPrice": "No price", // Kein Preis
|
||||
"setName": "Growbox set - {{shape}}", // Growbox Set - {{shape}}
|
||||
"description60x60": "Compact - ideal for small spaces", // Kompakt - ideal fĂŒr kleine RĂ€ume
|
||||
"description80x80": "Medium - perfect balance", // Mittel - perfekte Balance
|
||||
"description100x100": "Large - for experienced growers", // GroĂ - fĂŒr erfahrene Grower
|
||||
"description120x60": "Rectangular - maximum space usage", // Rechteckig - maximale Raumnutzung
|
||||
"plants1to2": "1-2 plants", // 1-2 Pflanzen
|
||||
"plants2to4": "2-4 plants", // 2-4 Pflanzen
|
||||
"plants4to6": "4-6 plants", // 4-6 Pflanzen
|
||||
"plants3to6": "3-6 plants" // 3-6 Pflanzen
|
||||
};
|
||||
@@ -1,8 +1,9 @@
|
||||
export default {
|
||||
"status": {
|
||||
"new": "In progress", // in Bearbeitung
|
||||
"new": "in progress", // in Bearbeitung
|
||||
"pending": "New", // Neu
|
||||
"processing": "In progress", // in Bearbeitung
|
||||
"processing": "in progress", // in Bearbeitung
|
||||
"paid": "Paid", // Bezahlt
|
||||
"cancelled": "Cancelled", // Storniert
|
||||
"shipped": "Shipped", // Verschickt
|
||||
"delivered": "Delivered", // Geliefert
|
||||
@@ -24,6 +25,7 @@ export default {
|
||||
"cancelOrder": "Cancel order" // Bestellung stornieren
|
||||
},
|
||||
"noOrders": "You have not placed any orders yet.", // Sie haben noch keine Bestellungen aufgegeben.
|
||||
"trackShipment": "Track shipment", // Sendung verfolgen
|
||||
"details": {
|
||||
"title": "Order details: {{orderId}}", // Bestelldetails: {{orderId}}
|
||||
"deliveryAddress": "Delivery address", // Lieferadresse
|
||||
@@ -36,15 +38,14 @@ export default {
|
||||
"item": "Item", // Artikel
|
||||
"quantity": "Quantity", // Menge
|
||||
"price": "Price", // Preis
|
||||
"vat": "VAT", // MwSt.
|
||||
"total": "Total", // Gesamt
|
||||
"cancelOrder": "Cancel order" // Bestellung stornieren
|
||||
},
|
||||
"cancelConfirm": {
|
||||
"title": "Cancel Order",
|
||||
"message": "Are you sure you want to cancel this order?",
|
||||
"confirm": "Cancel Order",
|
||||
"cancelling": "Cancelling..."
|
||||
"title": "Cancel order", // Bestellung stornieren
|
||||
"message": "Are you sure you want to cancel this order?", // Sind Sie sicher, dass Sie diese Bestellung stornieren möchten?
|
||||
"confirm": "Cancel", // Stornieren
|
||||
"cancelling": "Cancelling..." // Wird storniert...
|
||||
},
|
||||
"processing": "Order is being completed...", // Bestellung wird abgeschlossen...
|
||||
"processing": "Order is being completed..." // Bestellung wird abgeschlossen...
|
||||
};
|
||||
|
||||
@@ -8,9 +8,10 @@ export default {
|
||||
"articleNumber": "Article number", // Artikelnummer
|
||||
"manufacturer": "Manufacturer", // Hersteller
|
||||
"inclVat": "incl. {{vat}}% VAT", // inkl. {{vat}}% MwSt.
|
||||
"inclVatSimple": "incl. VAT", // inkl. MwSt.
|
||||
"priceUnit": "{{price}}/{{unit}}", // {{price}}/{{unit}}
|
||||
"new": "New", // Neu
|
||||
"weeks": "weeks", // Wochen
|
||||
"weeks": "Weeks", // Wochen
|
||||
"arriving": "Arrival:", // Ankunft:
|
||||
"inclVatFooter": "incl. {{vat}}% VAT,*", // inkl. {{vat}}% MwSt.,*
|
||||
"availability": "Availability", // VerfĂŒgbarkeit
|
||||
@@ -23,13 +24,13 @@ export default {
|
||||
"youSave": "You save: {{amount}}", // Sie sparen: {{amount}}
|
||||
"cheaperThanIndividual": "Cheaper than buying individually", // GĂŒnstiger als Einzelkauf
|
||||
"pickupPrice": "Pickup price: âŹ19.90 per cutting.", // Abholpreis: 19,90 ⏠pro Steckling.
|
||||
"consistsOf": "Consists of:", // Bestehend aus:
|
||||
"consistsOf": "Consisting of:", // Bestehend aus:
|
||||
"loadingComponentDetails": "{{index}}. Loading component details...", // {{index}}. LĂ€dt Komponent-Details...
|
||||
"loadingProduct": "Product is loading...", // Produkt wird geladen...
|
||||
"loadingProduct": "Loading product...", // Produkt wird geladen...
|
||||
"individualPriceTotal": "Total individual price:", // Einzelpreis gesamt:
|
||||
"setPrice": "Set price:", // Set-Preis:
|
||||
"yourSavings": "Your savings:", // Ihre Ersparnis:
|
||||
"similarProducts": "Similar Products", // Ăhnliche Produkte
|
||||
"similarProducts": "Similar products", // Ăhnliche Produkte
|
||||
"countDisplay": {
|
||||
"noProducts": "0 products", // 0 Produkte
|
||||
"oneProduct": "1 product", // 1 Produkt
|
||||
|
||||
61
src/i18n/locales/en/productDialogs.js
Normal file
@@ -0,0 +1,61 @@
|
||||
export default {
|
||||
"questionTitle": "Question about the product", // Frage zum Artikel
|
||||
"questionSubtitle": "Do you have a question about this product? We are happy to help you.", // Haben Sie eine Frage zu diesem Artikel? Wir helfen Ihnen gerne weiter.
|
||||
"questionSuccess": "Thank you for your question! We will get back to you as soon as possible.", // Vielen Dank fĂŒr Ihre Frage! Wir werden uns schnellstmöglich bei Ihnen melden.
|
||||
"nameLabel": "Name", // Name
|
||||
"namePlaceholder": "Your name", // Ihr Name
|
||||
"emailLabel": "Email", // E-Mail
|
||||
"emailPlaceholder": "your.email@example.com", // ihre.email@example.com
|
||||
"questionLabel": "Your question", // Ihre Frage
|
||||
"questionPlaceholder": "Describe your question about this product...", // Beschreiben Sie Ihre Frage zu diesem Artikel...
|
||||
"photosLabelQuestion": "Attach photos to your question (optional)", // Fotos zur Frage anhÀngen (optional)
|
||||
"submitQuestion": "Send question", // Frage senden
|
||||
"sending": "Sending...", // Wird gesendet...
|
||||
|
||||
"ratingTitle": "Rate product", // Artikel Bewerten
|
||||
"ratingSubtitle": "Share your experience with this product and help other customers make their decision.", // Teilen Sie Ihre Erfahrungen mit diesem Artikel und helfen Sie anderen Kunden bei der Entscheidung.
|
||||
"ratingSuccess": "Thank you for your review! It will be published after verification.", // Vielen Dank fĂŒr Ihre Bewertung! Sie wird nach PrĂŒfung veröffentlicht.
|
||||
"emailHelper": "Your email will not be published", // Ihre E-Mail wird nicht veröffentlicht
|
||||
"ratingLabel": "Rating *", // Bewertung *
|
||||
"pleaseRate": "Please rate", // Bitte bewerten
|
||||
"ratingStars": "{{rating}} out of 5 stars", // {{rating}} von 5 Sternen
|
||||
"reviewLabel": "Your review (optional)", // Ihre Bewertung (optional)
|
||||
"reviewPlaceholder": "Describe your experiences with this product...", // Beschreiben Sie Ihre Erfahrungen mit diesem Artikel...
|
||||
"photosLabelRating": "Attach photos to your review (optional)", // Fotos zur Bewertung anhÀngen (optional)
|
||||
"submitRating": "Submit review", // Bewertung abgeben
|
||||
"errorGeneric": "An error occurred", // Ein Fehler ist aufgetreten
|
||||
"errorPhotos": "Error processing photos", // Fehler beim Verarbeiten der Fotos
|
||||
|
||||
"availabilityTitle": "Request availability", // VerfĂŒgbarkeit anfragen
|
||||
"availabilitySubtitle": "This product is currently unavailable. We will be happy to inform you as soon as it is back in stock.", // Dieser Artikel ist derzeit nicht verfĂŒgbar. Gerne informieren wir Sie, sobald er wieder lieferbar ist.
|
||||
"availabilitySuccessEmail": "Thank you for your request! We will notify you by email as soon as the product is available again.", // Vielen Dank fĂŒr Ihre Anfrage! Wir werden Sie per E-Mail informieren, sobald der Artikel wieder verfĂŒgbar ist.
|
||||
"availabilitySuccessTelegram": "Thank you for your request! We will notify you via Telegram as soon as the product is available again.", // Vielen Dank fĂŒr Ihre Anfrage! Wir werden Sie ĂŒber Telegram informieren, sobald der Artikel wieder verfĂŒgbar ist.
|
||||
"notificationMethodLabel": "How would you like to be notified?", // Wie möchten Sie benachrichtigt werden?
|
||||
"telegramBotLabel": "Telegram Bot", // Telegram Bot
|
||||
"telegramIdLabel": "Telegram ID", // Telegram ID
|
||||
"telegramPlaceholder": "@yourTelegramName or Telegram ID", // @IhrTelegramName oder Telegram ID
|
||||
"telegramHelper": "Enter your Telegram username (with @) or Telegram ID", // Geben Sie Ihren Telegram-Benutzernamen (mit @) oder Ihre Telegram-ID ein
|
||||
"messageLabel": "Message (optional)", // Nachricht (optional)
|
||||
"messagePlaceholder": "Additional information or questions...", // ZusÀtzliche Informationen oder Fragen...
|
||||
"submitAvailability": "Request availability", // VerfĂŒgbarkeit anfragen
|
||||
|
||||
"photoUploadSelect": "Select photos", // Fotos auswÀhlen
|
||||
"photoUploadErrorMaxFiles": "Maximum {{max}} files allowed", // Maximal {{max}} Dateien erlaubt
|
||||
"photoUploadErrorFileType": "Only image files (JPEG, PNG, GIF, WebP) are allowed", // Nur Bilddateien (JPEG, PNG, GIF, WebP) sind erlaubt
|
||||
"photoUploadErrorFileSize": "File too large. Maximum: {{maxSize}}MB", // Datei zu groĂ. Maximum: {{maxSize}}MB
|
||||
"photoUploadSelectedFiles": "{{count}} file(s) selected", // {{count}} Datei(en) ausgewÀhlt
|
||||
"photoUploadCompressed": "(compressed for upload)", // (komprimiert fĂŒr Upload)
|
||||
"photoUploadRemove": "Remove image", // Bild entfernen
|
||||
"photoUploadLabelDefault": "Attach photos (optional)", // Fotos anhÀngen (optional)
|
||||
|
||||
"shareTitle": "Share", // Teilen
|
||||
"shareEmbed": "Embed", // Einbetten
|
||||
"shareCopyLink": "Copy link", // Link kopieren
|
||||
"shareSuccessEmbed": "Embed code copied to clipboard!", // Einbettungscode wurde in die Zwischenablage kopiert!
|
||||
"shareErrorEmbed": "Error copying the embed code", // Fehler beim Kopieren des Einbettungscodes
|
||||
"shareSuccessLink": "Link copied to clipboard!", // Link wurde in die Zwischenablage kopiert!
|
||||
"shareWhatsAppText": "Check out this product: {{name}}", // Schau dir dieses Produkt an: {{name}}
|
||||
"shareTelegramText": "Check out this product: {{name}}", // Schau dir dieses Produkt an: {{name}}
|
||||
"shareEmailSubject": "Product recommendation", // Produktempfehlung
|
||||
"shareEmailBody": "Hello,\n\nI'd like to recommend this product to you:\n\n{{name}}\n{{url}}\n\nBest regards", // Hallo,\n\nich möchte dir dieses Produkt empfehlen:\n\n{{name}}\n{{url}}\n\nViele GrĂŒĂe
|
||||
};
|
||||
@@ -5,6 +5,7 @@ export default {
|
||||
"profile": "Perfil",
|
||||
"email": "Correo electrĂłnico",
|
||||
"password": "Contraseña",
|
||||
"newPassword": "Nueva contraseña",
|
||||
"confirmPassword": "Confirmar contraseña",
|
||||
"forgotPassword": "¿Olvidaste tu contraseña?",
|
||||
"loginWithGoogle": "Iniciar sesiĂłn con Google",
|
||||
@@ -13,6 +14,7 @@ export default {
|
||||
"privacyPolicy": "PolĂtica de privacidad",
|
||||
"passwordMinLength": "La contraseña debe tener al menos 8 caracteres",
|
||||
"newPasswordMinLength": "La nueva contraseña debe tener al menos 8 caracteres",
|
||||
"backToHome": "Volver a la pĂĄgina principal",
|
||||
"menu": {
|
||||
"profile": "Perfil",
|
||||
"myProfile": "Mi perfil",
|
||||
@@ -21,5 +23,28 @@ export default {
|
||||
"settings": "ConfiguraciĂłn",
|
||||
"adminDashboard": "Panel de administraciĂłn",
|
||||
"adminUsers": "Usuarios administradores"
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "Restablecer contraseña",
|
||||
"button": "Restablecer contraseña",
|
||||
"success": "¥Tu contraseña ha sido restablecida con éxito! Serås redirigido para iniciar sesión en breve...",
|
||||
"invalidToken": "No se encontrĂł un token vĂĄlido. Por favor, usa el enlace de tu correo electrĂłnico.",
|
||||
"error": "Error al restablecer la contraseña",
|
||||
"emailSent": "Se ha enviado un enlace para restablecer tu contraseña a tu dirección de correo electrónico.",
|
||||
"emailError": "Error al enviar el correo electrĂłnico"
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "Por favor, completa todos los campos",
|
||||
"invalidEmail": "Por favor, introduce una direcciĂłn de correo electrĂłnico vĂĄlida",
|
||||
"passwordsNotMatch": "Las contraseñas no coinciden",
|
||||
"passwordsNotMatchShort": "Las contraseñas no coinciden",
|
||||
"enterEmail": "Por favor, introduce tu direcciĂłn de correo electrĂłnico",
|
||||
"loginFailed": "Error al iniciar sesiĂłn",
|
||||
"registerFailed": "Error al registrarse",
|
||||
"googleLoginFailed": "Error al iniciar sesiĂłn con Google",
|
||||
"emailExists": "Ya existe un usuario con esta direcciĂłn de correo electrĂłnico. Por favor, usa otra direcciĂłn de correo electrĂłnico o inicia sesiĂłn."
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "Registro exitoso. Ahora puedes iniciar sesiĂłn."
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
43
src/i18n/locales/es/kitConfig.js
Normal file
@@ -0,0 +1,43 @@
|
||||
export default {
|
||||
"pageTitle": "đ± Configurador de Growbox",
|
||||
"pageSubtitle": "Arma tu configuraciĂłn perfecta para cultivo en interior",
|
||||
"bundleDiscountTitle": "đŻ ÂĄAsegura el descuento por paquete!",
|
||||
"loadingProducts": "Cargando productos de growbox...",
|
||||
"loadingLighting": "Cargando productos de iluminaciĂłn...",
|
||||
"loadingVentilation": "Cargando productos de ventilaciĂłn...",
|
||||
"loadingExtras": "Cargando extras...",
|
||||
"noProductsAvailable": "No hay productos disponibles para este tamaño",
|
||||
"noLightingAvailable": "No hay luces adecuadas disponibles para el tamaño de tienda {{shape}}.",
|
||||
"noVentilationAvailable": "No hay ventilación adecuada disponible para el tamaño de tienda {{shape}}.",
|
||||
"noExtrasAvailable": "No hay extras disponibles",
|
||||
"selectShapeTitle": "1. Selecciona la forma de la growbox",
|
||||
"selectShapeSubtitle": "Primero selecciona el ĂĄrea base de tu growbox",
|
||||
"selectProductTitle": "2. Selecciona el producto de growbox",
|
||||
"selectProductSubtitle": "Elige el producto adecuado para tu growbox {{shape}}",
|
||||
"selectLightingTitle": "3. Elige la iluminaciĂłn",
|
||||
"selectLightingTitleShape": "3. Elige la iluminaciĂłn - {{shape}}",
|
||||
"selectLightingSubtitle": "Por favor selecciona primero un tamaño de tienda.",
|
||||
"selectVentilationTitle": "4. Selecciona la ventilaciĂłn",
|
||||
"selectVentilationTitleShape": "4. Selecciona la ventilaciĂłn - {{shape}}",
|
||||
"selectVentilationSubtitle": "Por favor selecciona primero un tamaño de tienda.",
|
||||
"selectExtrasTitle": "5. Añade extras (opcional)",
|
||||
"yourConfiguration": "đŻ Tu configuraciĂłn",
|
||||
"growboxLabel": "Growbox: {{name}}",
|
||||
"lightingLabel": "IluminaciĂłn: {{name}}",
|
||||
"ventilationLabel": "VentilaciĂłn: {{name}}",
|
||||
"extraLabel": "Extra: {{name}}",
|
||||
"totalPrice": "Precio total:",
|
||||
"addToCart": "Añadir al carrito",
|
||||
"selected": "â Seleccionado",
|
||||
"notDeliverable": "No entregable",
|
||||
"noPrice": "Sin precio",
|
||||
"setName": "Set de growbox - {{shape}}",
|
||||
"description60x60": "Compacto - ideal para espacios pequeños",
|
||||
"description80x80": "Mediano - equilibrio perfecto",
|
||||
"description100x100": "Grande - para cultivadores experimentados",
|
||||
"description120x60": "Rectangular - uso mĂĄximo del espacio",
|
||||
"plants1to2": "1-2 plantas",
|
||||
"plants2to4": "2-4 plantas",
|
||||
"plants4to6": "4-6 plantas",
|
||||
"plants3to6": "3-6 plantas"
|
||||
};
|
||||
@@ -1,8 +1,9 @@
|
||||
export default {
|
||||
"status": {
|
||||
"new": "En progreso",
|
||||
"new": "en progreso",
|
||||
"pending": "Nuevo",
|
||||
"processing": "En progreso",
|
||||
"processing": "en progreso",
|
||||
"paid": "Pagado",
|
||||
"cancelled": "Cancelado",
|
||||
"shipped": "Enviado",
|
||||
"delivered": "Entregado",
|
||||
@@ -24,6 +25,7 @@ export default {
|
||||
"cancelOrder": "Cancelar pedido"
|
||||
},
|
||||
"noOrders": "AĂșn no has realizado ningĂșn pedido.",
|
||||
"trackShipment": "Rastrear envĂo",
|
||||
"details": {
|
||||
"title": "Detalles del pedido: {{orderId}}",
|
||||
"deliveryAddress": "DirecciĂłn de entrega",
|
||||
@@ -36,15 +38,14 @@ export default {
|
||||
"item": "ArtĂculo",
|
||||
"quantity": "Cantidad",
|
||||
"price": "Precio",
|
||||
"vat": "IVA",
|
||||
"total": "Total",
|
||||
"cancelOrder": "Cancelar pedido"
|
||||
},
|
||||
"cancelConfirm": {
|
||||
"title": "Cancelar pedido",
|
||||
"message": "ÂżEstĂĄs seguro de que deseas cancelar este pedido?",
|
||||
"confirm": "Cancelar pedido",
|
||||
"message": "ÂżEstĂĄ seguro de que desea cancelar este pedido?",
|
||||
"confirm": "Cancelar",
|
||||
"cancelling": "Cancelando..."
|
||||
},
|
||||
"processing": "El pedido se estĂĄ completando...",
|
||||
"processing": "El pedido se estĂĄ completando..."
|
||||
};
|
||||
|
||||
@@ -8,9 +8,10 @@ export default {
|
||||
"articleNumber": "NĂșmero de artĂculo",
|
||||
"manufacturer": "Fabricante",
|
||||
"inclVat": "incl. {{vat}}% IVA",
|
||||
"inclVatSimple": "incl. IVA",
|
||||
"priceUnit": "{{price}}/{{unit}}",
|
||||
"new": "Nuevo",
|
||||
"weeks": "semanas",
|
||||
"weeks": "Semanas",
|
||||
"arriving": "Llegada:",
|
||||
"inclVatFooter": "incl. {{vat}}% IVA,*",
|
||||
"availability": "Disponibilidad",
|
||||
@@ -25,7 +26,7 @@ export default {
|
||||
"pickupPrice": "Precio de recogida: 19,90 ⏠por esqueje.",
|
||||
"consistsOf": "Consiste en:",
|
||||
"loadingComponentDetails": "{{index}}. Cargando detalles del componente...",
|
||||
"loadingProduct": "Producto cargando...",
|
||||
"loadingProduct": "Cargando producto...",
|
||||
"individualPriceTotal": "Precio individual total:",
|
||||
"setPrice": "Precio del set:",
|
||||
"yourSavings": "Tus ahorros:",
|
||||
|
||||
61
src/i18n/locales/es/productDialogs.js
Normal file
@@ -0,0 +1,61 @@
|
||||
export default {
|
||||
"questionTitle": "Pregunta sobre el producto",
|
||||
"questionSubtitle": "ÂżTiene alguna pregunta sobre este producto? Estamos encantados de ayudarle.",
|
||||
"questionSuccess": "ÂĄGracias por su pregunta! Nos pondremos en contacto con usted lo antes posible.",
|
||||
"nameLabel": "Nombre",
|
||||
"namePlaceholder": "Su nombre",
|
||||
"emailLabel": "Correo electrĂłnico",
|
||||
"emailPlaceholder": "su.email@ejemplo.com",
|
||||
"questionLabel": "Su pregunta",
|
||||
"questionPlaceholder": "Describa su pregunta sobre este producto...",
|
||||
"photosLabelQuestion": "Adjunte fotos a su pregunta (opcional)",
|
||||
"submitQuestion": "Enviar pregunta",
|
||||
"sending": "Enviando...",
|
||||
|
||||
"ratingTitle": "Calificar producto",
|
||||
"ratingSubtitle": "Comparta su experiencia con este producto y ayude a otros clientes a tomar su decisiĂłn.",
|
||||
"ratingSuccess": "¥Gracias por su reseña! Se publicarå después de la verificación.",
|
||||
"emailHelper": "Su correo electrĂłnico no serĂĄ publicado",
|
||||
"ratingLabel": "CalificaciĂłn *",
|
||||
"pleaseRate": "Por favor califique",
|
||||
"ratingStars": "{{rating}} de 5 estrellas",
|
||||
"reviewLabel": "Su reseña (opcional)",
|
||||
"reviewPlaceholder": "Describa sus experiencias con este producto...",
|
||||
"photosLabelRating": "Adjunte fotos a su reseña (opcional)",
|
||||
"submitRating": "Enviar reseña",
|
||||
"errorGeneric": "OcurriĂł un error",
|
||||
"errorPhotos": "Error al procesar las fotos",
|
||||
|
||||
"availabilityTitle": "Solicitar disponibilidad",
|
||||
"availabilitySubtitle": "Este producto no estĂĄ disponible actualmente. Le informaremos tan pronto como vuelva a estar en stock.",
|
||||
"availabilitySuccessEmail": "¥Gracias por su solicitud! Le notificaremos por correo electrónico tan pronto como el producto esté disponible nuevamente.",
|
||||
"availabilitySuccessTelegram": "ÂĄGracias por su solicitud! Le notificaremos vĂa Telegram tan pronto como el producto estĂ© disponible nuevamente.",
|
||||
"notificationMethodLabel": "ÂżCĂłmo desea ser notificado?",
|
||||
"telegramBotLabel": "Bot de Telegram",
|
||||
"telegramIdLabel": "ID de Telegram",
|
||||
"telegramPlaceholder": "@suNombreTelegram o ID de Telegram",
|
||||
"telegramHelper": "Ingrese su nombre de usuario de Telegram (con @) o ID de Telegram",
|
||||
"messageLabel": "Mensaje (opcional)",
|
||||
"messagePlaceholder": "InformaciĂłn adicional o preguntas...",
|
||||
"submitAvailability": "Solicitar disponibilidad",
|
||||
|
||||
"photoUploadSelect": "Seleccionar fotos",
|
||||
"photoUploadErrorMaxFiles": "MĂĄximo {{max}} archivos permitidos",
|
||||
"photoUploadErrorFileType": "Solo se permiten archivos de imagen (JPEG, PNG, GIF, WebP)",
|
||||
"photoUploadErrorFileSize": "Archivo demasiado grande. MĂĄximo: {{maxSize}}MB",
|
||||
"photoUploadSelectedFiles": "{{count}} archivo(s) seleccionado(s)",
|
||||
"photoUploadCompressed": "(comprimido para subir)",
|
||||
"photoUploadRemove": "Eliminar imagen",
|
||||
"photoUploadLabelDefault": "Adjuntar fotos (opcional)",
|
||||
|
||||
"shareTitle": "Compartir",
|
||||
"shareEmbed": "Insertar",
|
||||
"shareCopyLink": "Copiar enlace",
|
||||
"shareSuccessEmbed": "ÂĄCĂłdigo de inserciĂłn copiado al portapapeles!",
|
||||
"shareErrorEmbed": "Error al copiar el cĂłdigo de inserciĂłn",
|
||||
"shareSuccessLink": "ÂĄEnlace copiado al portapapeles!",
|
||||
"shareWhatsAppText": "Mira este producto: {{name}}",
|
||||
"shareTelegramText": "Mira este producto: {{name}}",
|
||||
"shareEmailSubject": "RecomendaciĂłn de producto",
|
||||
"shareEmailBody": "Hola,\n\nQuisiera recomendarte este producto:\n\n{{name}}\n{{url}}\n\nSaludos cordiales"
|
||||
};
|
||||
@@ -1,10 +1,11 @@
|
||||
export default {
|
||||
"login": "Connexion",
|
||||
"register": "S'inscrire",
|
||||
"register": "Inscription",
|
||||
"logout": "Déconnexion",
|
||||
"profile": "Profil",
|
||||
"email": "Email",
|
||||
"password": "Mot de passe",
|
||||
"newPassword": "Nouveau mot de passe",
|
||||
"confirmPassword": "Confirmer le mot de passe",
|
||||
"forgotPassword": "Mot de passe oublié ?",
|
||||
"loginWithGoogle": "Se connecter avec Google",
|
||||
@@ -13,6 +14,7 @@ export default {
|
||||
"privacyPolicy": "Politique de confidentialité",
|
||||
"passwordMinLength": "Le mot de passe doit contenir au moins 8 caractĂšres",
|
||||
"newPasswordMinLength": "Le nouveau mot de passe doit contenir au moins 8 caractĂšres",
|
||||
"backToHome": "Retour Ă la page d'accueil",
|
||||
"menu": {
|
||||
"profile": "Profil",
|
||||
"myProfile": "Mon profil",
|
||||
@@ -21,5 +23,28 @@ export default {
|
||||
"settings": "ParamĂštres",
|
||||
"adminDashboard": "Tableau de bord Admin",
|
||||
"adminUsers": "Utilisateurs Admin"
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "Réinitialiser le mot de passe",
|
||||
"button": "Réinitialiser le mot de passe",
|
||||
"success": "Votre mot de passe a été réinitialisé avec succÚs ! Vous serez redirigé vers la connexion sous peu...",
|
||||
"invalidToken": "Aucun jeton valide trouvé. Veuillez utiliser le lien de votre email.",
|
||||
"error": "Erreur lors de la réinitialisation du mot de passe",
|
||||
"emailSent": "Un lien pour réinitialiser votre mot de passe a été envoyé à votre adresse email.",
|
||||
"emailError": "Erreur lors de l'envoi de l'email"
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "Veuillez remplir tous les champs",
|
||||
"invalidEmail": "Veuillez entrer une adresse email valide",
|
||||
"passwordsNotMatch": "Les mots de passe ne correspondent pas",
|
||||
"passwordsNotMatchShort": "Les mots de passe ne correspondent pas",
|
||||
"enterEmail": "Veuillez entrer votre adresse email",
|
||||
"loginFailed": "Ăchec de la connexion",
|
||||
"registerFailed": "Ăchec de l'inscription",
|
||||
"googleLoginFailed": "Ăchec de la connexion Google",
|
||||
"emailExists": "Un utilisateur avec cette adresse email existe déjà . Veuillez utiliser une autre adresse email ou vous connecter."
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "Inscription réussie. Vous pouvez maintenant vous connecter."
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
43
src/i18n/locales/fr/kitConfig.js
Normal file
@@ -0,0 +1,43 @@
|
||||
export default {
|
||||
"pageTitle": "đ± Configurateur Growbox",
|
||||
"pageSubtitle": "Assemblez votre installation de culture d'intérieur parfaite",
|
||||
"bundleDiscountTitle": "đŻ Profitez d'une remise sur le pack !",
|
||||
"loadingProducts": "Chargement des produits growbox...",
|
||||
"loadingLighting": "Chargement des produits d'éclairage...",
|
||||
"loadingVentilation": "Chargement des produits de ventilation...",
|
||||
"loadingExtras": "Chargement des extras...",
|
||||
"noProductsAvailable": "Aucun produit disponible pour cette taille",
|
||||
"noLightingAvailable": "Aucun éclairage adapté disponible pour la taille de tente {{shape}}.",
|
||||
"noVentilationAvailable": "Aucune ventilation adaptée disponible pour la taille de tente {{shape}}.",
|
||||
"noExtrasAvailable": "Aucun extra disponible",
|
||||
"selectShapeTitle": "1. Sélectionnez la forme de la growbox",
|
||||
"selectShapeSubtitle": "Sélectionnez d'abord la surface de base de votre growbox",
|
||||
"selectProductTitle": "2. Sélectionnez le produit growbox",
|
||||
"selectProductSubtitle": "Choisissez le produit adapté pour votre growbox {{shape}}",
|
||||
"selectLightingTitle": "3. Choisissez l'éclairage",
|
||||
"selectLightingTitleShape": "3. Choisissez l'éclairage - {{shape}}",
|
||||
"selectLightingSubtitle": "Veuillez d'abord sélectionner une taille de tente.",
|
||||
"selectVentilationTitle": "4. Sélectionnez la ventilation",
|
||||
"selectVentilationTitleShape": "4. Sélectionnez la ventilation - {{shape}}",
|
||||
"selectVentilationSubtitle": "Veuillez d'abord sélectionner une taille de tente.",
|
||||
"selectExtrasTitle": "5. Ajoutez des extras (optionnel)",
|
||||
"yourConfiguration": "đŻ Votre configuration",
|
||||
"growboxLabel": "Growbox : {{name}}",
|
||||
"lightingLabel": "Ăclairage : {{name}}",
|
||||
"ventilationLabel": "Ventilation : {{name}}",
|
||||
"extraLabel": "Extra : {{name}}",
|
||||
"totalPrice": "Prix total :",
|
||||
"addToCart": "Ajouter au panier",
|
||||
"selected": "â SĂ©lectionnĂ©",
|
||||
"notDeliverable": "Non livrable",
|
||||
"noPrice": "Pas de prix",
|
||||
"setName": "Set Growbox - {{shape}}",
|
||||
"description60x60": "Compact - idéal pour les petits espaces",
|
||||
"description80x80": "Moyen - équilibre parfait",
|
||||
"description100x100": "Grand - pour cultivateurs expérimentés",
|
||||
"description120x60": "Rectangulaire - utilisation maximale de l'espace",
|
||||
"plants1to2": "1-2 plantes",
|
||||
"plants2to4": "2-4 plantes",
|
||||
"plants4to6": "4-6 plantes",
|
||||
"plants3to6": "3-6 plantes"
|
||||
};
|
||||
@@ -1,8 +1,9 @@
|
||||
export default {
|
||||
"status": {
|
||||
"new": "En cours",
|
||||
"new": "en cours",
|
||||
"pending": "Nouveau",
|
||||
"processing": "En cours",
|
||||
"processing": "en cours",
|
||||
"paid": "Payé",
|
||||
"cancelled": "Annulé",
|
||||
"shipped": "Expédié",
|
||||
"delivered": "Livré",
|
||||
@@ -24,6 +25,7 @@ export default {
|
||||
"cancelOrder": "Annuler la commande"
|
||||
},
|
||||
"noOrders": "Vous n'avez pas encore passé de commandes.",
|
||||
"trackShipment": "Suivre l'envoi",
|
||||
"details": {
|
||||
"title": "Détails de la commande : {{orderId}}",
|
||||
"deliveryAddress": "Adresse de livraison",
|
||||
@@ -36,14 +38,13 @@ export default {
|
||||
"item": "Article",
|
||||
"quantity": "Quantité",
|
||||
"price": "Prix",
|
||||
"vat": "TVA",
|
||||
"total": "Total",
|
||||
"cancelOrder": "Annuler la commande"
|
||||
},
|
||||
"cancelConfirm": {
|
||||
"title": "Annuler la commande",
|
||||
"message": "Ătes-vous sĂ»r de vouloir annuler cette commande ?",
|
||||
"confirm": "Annuler la commande",
|
||||
"confirm": "Annuler",
|
||||
"cancelling": "Annulation en cours..."
|
||||
},
|
||||
"processing": "La commande est en cours de traitement..."
|
||||
|
||||
@@ -8,9 +8,10 @@ export default {
|
||||
"articleNumber": "Numéro d'article",
|
||||
"manufacturer": "Fabricant",
|
||||
"inclVat": "TTC {{vat}}%",
|
||||
"inclVatSimple": "TTC",
|
||||
"priceUnit": "{{price}}/{{unit}}",
|
||||
"new": "Nouveau",
|
||||
"weeks": "semaines",
|
||||
"weeks": "Semaines",
|
||||
"arriving": "Arrivée :",
|
||||
"inclVatFooter": "TTC {{vat}}%,*",
|
||||
"availability": "Disponibilité",
|
||||
@@ -25,7 +26,7 @@ export default {
|
||||
"pickupPrice": "Prix de retrait : 19,90 ⏠par bouture.",
|
||||
"consistsOf": "Composé de :",
|
||||
"loadingComponentDetails": "{{index}}. Chargement des détails du composant...",
|
||||
"loadingProduct": "Le produit est en cours de chargement...",
|
||||
"loadingProduct": "Chargement du produit...",
|
||||
"individualPriceTotal": "Prix individuel total :",
|
||||
"setPrice": "Prix du lot :",
|
||||
"yourSavings": "Vos économies :",
|
||||
|
||||
61
src/i18n/locales/fr/productDialogs.js
Normal file
@@ -0,0 +1,61 @@
|
||||
export default {
|
||||
"questionTitle": "Question sur le produit",
|
||||
"questionSubtitle": "Vous avez une question sur ce produit ? Nous sommes heureux de vous aider.",
|
||||
"questionSuccess": "Merci pour votre question ! Nous vous répondrons dÚs que possible.",
|
||||
"nameLabel": "Nom",
|
||||
"namePlaceholder": "Votre nom",
|
||||
"emailLabel": "Email",
|
||||
"emailPlaceholder": "votre.email@exemple.com",
|
||||
"questionLabel": "Votre question",
|
||||
"questionPlaceholder": "Décrivez votre question à propos de ce produit...",
|
||||
"photosLabelQuestion": "Joindre des photos Ă votre question (optionnel)",
|
||||
"submitQuestion": "Envoyer la question",
|
||||
"sending": "Envoi en cours...",
|
||||
|
||||
"ratingTitle": "Noter le produit",
|
||||
"ratingSubtitle": "Partagez votre expérience avec ce produit et aidez les autres clients à prendre leur décision.",
|
||||
"ratingSuccess": "Merci pour votre avis ! Il sera publié aprÚs vérification.",
|
||||
"emailHelper": "Votre email ne sera pas publié",
|
||||
"ratingLabel": "Note *",
|
||||
"pleaseRate": "Veuillez noter",
|
||||
"ratingStars": "{{rating}} sur 5 étoiles",
|
||||
"reviewLabel": "Votre avis (optionnel)",
|
||||
"reviewPlaceholder": "Décrivez vos expériences avec ce produit...",
|
||||
"photosLabelRating": "Joindre des photos Ă votre avis (optionnel)",
|
||||
"submitRating": "Soumettre l'avis",
|
||||
"errorGeneric": "Une erreur est survenue",
|
||||
"errorPhotos": "Erreur lors du traitement des photos",
|
||||
|
||||
"availabilityTitle": "Demander la disponibilité",
|
||||
"availabilitySubtitle": "Ce produit est actuellement indisponible. Nous serons heureux de vous informer dĂšs qu'il sera de nouveau en stock.",
|
||||
"availabilitySuccessEmail": "Merci pour votre demande ! Nous vous informerons par email dĂšs que le produit sera Ă nouveau disponible.",
|
||||
"availabilitySuccessTelegram": "Merci pour votre demande ! Nous vous informerons via Telegram dĂšs que le produit sera Ă nouveau disponible.",
|
||||
"notificationMethodLabel": "Comment souhaitez-vous ĂȘtre informĂ© ?",
|
||||
"telegramBotLabel": "Bot Telegram",
|
||||
"telegramIdLabel": "ID Telegram",
|
||||
"telegramPlaceholder": "@votreNomTelegram ou ID Telegram",
|
||||
"telegramHelper": "Entrez votre nom d'utilisateur Telegram (avec @) ou votre ID Telegram",
|
||||
"messageLabel": "Message (optionnel)",
|
||||
"messagePlaceholder": "Informations supplémentaires ou questions...",
|
||||
"submitAvailability": "Demander la disponibilité",
|
||||
|
||||
"photoUploadSelect": "Sélectionner des photos",
|
||||
"photoUploadErrorMaxFiles": "Maximum {{max}} fichiers autorisés",
|
||||
"photoUploadErrorFileType": "Seuls les fichiers image (JPEG, PNG, GIF, WebP) sont autorisés",
|
||||
"photoUploadErrorFileSize": "Fichier trop volumineux. Maximum : {{maxSize}}Mo",
|
||||
"photoUploadSelectedFiles": "{{count}} fichier(s) sélectionné(s)",
|
||||
"photoUploadCompressed": "(compressé pour l'envoi)",
|
||||
"photoUploadRemove": "Supprimer l'image",
|
||||
"photoUploadLabelDefault": "Joindre des photos (optionnel)",
|
||||
|
||||
"shareTitle": "Partager",
|
||||
"shareEmbed": "Intégrer",
|
||||
"shareCopyLink": "Copier le lien",
|
||||
"shareSuccessEmbed": "Code d'intégration copié dans le presse-papiers !",
|
||||
"shareErrorEmbed": "Erreur lors de la copie du code d'intégration",
|
||||
"shareSuccessLink": "Lien copié dans le presse-papiers !",
|
||||
"shareWhatsAppText": "Découvrez ce produit : {{name}}",
|
||||
"shareTelegramText": "Découvrez ce produit : {{name}}",
|
||||
"shareEmailSubject": "Recommandation de produit",
|
||||
"shareEmailBody": "Bonjour,\n\nJe souhaite vous recommander ce produit :\n\n{{name}}\n{{url}}\n\nCordialement"
|
||||
};
|
||||
@@ -5,6 +5,7 @@ export default {
|
||||
"profile": "Profil",
|
||||
"email": "Email",
|
||||
"password": "Lozinka",
|
||||
"newPassword": "Nova lozinka",
|
||||
"confirmPassword": "Potvrdi lozinku",
|
||||
"forgotPassword": "Zaboravili ste lozinku?",
|
||||
"loginWithGoogle": "Prijavite se putem Googlea",
|
||||
@@ -13,6 +14,7 @@ export default {
|
||||
"privacyPolicy": "Pravila privatnosti",
|
||||
"passwordMinLength": "Lozinka mora imati najmanje 8 znakova",
|
||||
"newPasswordMinLength": "Nova lozinka mora imati najmanje 8 znakova",
|
||||
"backToHome": "Natrag na poÄetnu stranicu",
|
||||
"menu": {
|
||||
"profile": "Profil",
|
||||
"myProfile": "Moj profil",
|
||||
@@ -21,5 +23,28 @@ export default {
|
||||
"settings": "Postavke",
|
||||
"adminDashboard": "Admin nadzorna ploÄa",
|
||||
"adminUsers": "Admin korisnici"
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "Resetiraj lozinku",
|
||||
"button": "Resetiraj lozinku",
|
||||
"success": "VaĆĄa lozinka je uspjeĆĄno resetirana! Uskoro Äete biti preusmjereni na prijavu...",
|
||||
"invalidToken": "Nije pronaÄen valjani token. Molimo koristite link iz vaĆĄe e-poĆĄte.",
|
||||
"error": "PogreĆĄka pri resetiranju lozinke",
|
||||
"emailSent": "Link za resetiranje lozinke poslan je na vaĆĄu e-mail adresu.",
|
||||
"emailError": "PogreĆĄka pri slanju e-poĆĄte"
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "Molimo ispunite sva polja",
|
||||
"invalidEmail": "Molimo unesite valjanu e-mail adresu",
|
||||
"passwordsNotMatch": "Lozinke se ne podudaraju",
|
||||
"passwordsNotMatchShort": "Lozinke se ne podudaraju",
|
||||
"enterEmail": "Molimo unesite vaĆĄu e-mail adresu",
|
||||
"loginFailed": "Prijava nije uspjela",
|
||||
"registerFailed": "Registracija nije uspjela",
|
||||
"googleLoginFailed": "Prijava putem Googlea nije uspjela",
|
||||
"emailExists": "Korisnik s ovom e-mail adresom veÄ postoji. Molimo koristite drugu e-mail adresu ili se prijavite."
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "Registracija uspjeĆĄna. Sada se moĆŸete prijaviti."
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
43
src/i18n/locales/hr/kitConfig.js
Normal file
@@ -0,0 +1,43 @@
|
||||
export default {
|
||||
"pageTitle": "đ± Konfigurator Growboxa",
|
||||
"pageSubtitle": "Sastavite svoju savrĆĄenu unutarnju grow postavu",
|
||||
"bundleDiscountTitle": "đŻ Osigurajte popust na paket!",
|
||||
"loadingProducts": "UÄitavanje growbox proizvoda...",
|
||||
"loadingLighting": "UÄitavanje proizvoda za osvjetljenje...",
|
||||
"loadingVentilation": "UÄitavanje proizvoda za ventilaciju...",
|
||||
"loadingExtras": "UÄitavanje dodataka...",
|
||||
"noProductsAvailable": "Nema dostupnih proizvoda za ovu veliÄinu",
|
||||
"noLightingAvailable": "Nema prikladnih svjetala za veliÄinu ĆĄatora {{shape}}.",
|
||||
"noVentilationAvailable": "Nema prikladne ventilacije za veliÄinu ĆĄatora {{shape}}.",
|
||||
"noExtrasAvailable": "Nema dodataka",
|
||||
"selectShapeTitle": "1. Odaberite oblik growboxa",
|
||||
"selectShapeSubtitle": "Prvo odaberite osnovnu povrĆĄinu vaĆĄeg growboxa",
|
||||
"selectProductTitle": "2. Odaberite growbox proizvod",
|
||||
"selectProductSubtitle": "Odaberite pravi proizvod za vaĆĄ {{shape}} growbox",
|
||||
"selectLightingTitle": "3. Odaberite osvjetljenje",
|
||||
"selectLightingTitleShape": "3. Odaberite osvjetljenje - {{shape}}",
|
||||
"selectLightingSubtitle": "Molimo prvo odaberite veliÄinu ĆĄatora.",
|
||||
"selectVentilationTitle": "4. Odaberite ventilaciju",
|
||||
"selectVentilationTitleShape": "4. Odaberite ventilaciju - {{shape}}",
|
||||
"selectVentilationSubtitle": "Molimo prvo odaberite veliÄinu ĆĄatora.",
|
||||
"selectExtrasTitle": "5. Dodajte dodatke (opcionalno)",
|
||||
"yourConfiguration": "đŻ VaĆĄa konfiguracija",
|
||||
"growboxLabel": "Growbox: {{name}}",
|
||||
"lightingLabel": "Osvjetljenje: {{name}}",
|
||||
"ventilationLabel": "Ventilacija: {{name}}",
|
||||
"extraLabel": "Dodatak: {{name}}",
|
||||
"totalPrice": "Ukupna cijena:",
|
||||
"addToCart": "Dodaj u koĆĄaricu",
|
||||
"selected": "â Odabrano",
|
||||
"notDeliverable": "Nije dostupno za dostavu",
|
||||
"noPrice": "Nema cijene",
|
||||
"setName": "Growbox set - {{shape}}",
|
||||
"description60x60": "Kompaktan - idealan za male prostore",
|
||||
"description80x80": "Srednji - savrĆĄen balans",
|
||||
"description100x100": "Veliki - za iskusne uzgajivaÄe",
|
||||
"description120x60": "Pravokutni - maksimalno iskoriĆĄtavanje prostora",
|
||||
"plants1to2": "1-2 biljke",
|
||||
"plants2to4": "2-4 biljke",
|
||||
"plants4to6": "4-6 biljaka",
|
||||
"plants3to6": "3-6 biljaka"
|
||||
};
|
||||
@@ -1,8 +1,9 @@
|
||||
export default {
|
||||
"status": {
|
||||
"new": "U tijeku",
|
||||
"new": "u tijeku",
|
||||
"pending": "Novo",
|
||||
"processing": "U tijeku",
|
||||
"processing": "u tijeku",
|
||||
"paid": "PlaÄeno",
|
||||
"cancelled": "Otkazano",
|
||||
"shipped": "Poslano",
|
||||
"delivered": "IsporuÄeno",
|
||||
@@ -23,7 +24,8 @@ export default {
|
||||
"viewDetails": "Pogledaj detalje",
|
||||
"cancelOrder": "OtkaĆŸi narudĆŸbu"
|
||||
},
|
||||
"noOrders": "JoĆĄ niste napravili nijednu narudĆŸbu.",
|
||||
"noOrders": "JoĆĄ niste izvrĆĄili nijednu narudĆŸbu.",
|
||||
"trackShipment": "Prati poĆĄiljku",
|
||||
"details": {
|
||||
"title": "Detalji narudĆŸbe: {{orderId}}",
|
||||
"deliveryAddress": "Adresa dostave",
|
||||
@@ -36,15 +38,14 @@ export default {
|
||||
"item": "Artikl",
|
||||
"quantity": "KoliÄina",
|
||||
"price": "Cijena",
|
||||
"vat": "PDV",
|
||||
"total": "Ukupno",
|
||||
"cancelOrder": "OtkaĆŸi narudĆŸbu"
|
||||
},
|
||||
"cancelConfirm": {
|
||||
"title": "OtkaĆŸi narudĆŸbu",
|
||||
"message": "Jeste li sigurni da ĆŸelite otkazati ovu narudĆŸbu?",
|
||||
"confirm": "OtkaĆŸi narudĆŸbu",
|
||||
"confirm": "OtkaĆŸi",
|
||||
"cancelling": "Otkazivanje..."
|
||||
},
|
||||
"processing": "NarudĆŸba se dovrĆĄava...",
|
||||
"processing": "NarudĆŸba se obraÄuje..."
|
||||
};
|
||||
|
||||
@@ -3,14 +3,15 @@ export default {
|
||||
"loadingDescription": "UÄitavanje opisa proizvoda...",
|
||||
"notFound": "Proizvod nije pronaÄen",
|
||||
"notFoundDescription": "Proizvod koji traĆŸite ne postoji ili je uklonjen.",
|
||||
"backToHome": "Povratak na poÄetnu stranicu",
|
||||
"backToHome": "Natrag na poÄetnu stranicu",
|
||||
"error": "GreĆĄka",
|
||||
"articleNumber": "Broj artikla",
|
||||
"manufacturer": "ProizvoÄaÄ",
|
||||
"inclVat": "ukljuÄujuÄi {{vat}}% PDV-a",
|
||||
"inclVatSimple": "ukljuÄujuÄi PDV",
|
||||
"priceUnit": "{{price}}/{{unit}}",
|
||||
"new": "Novo",
|
||||
"weeks": "tjedana",
|
||||
"weeks": "Tjedni",
|
||||
"arriving": "Dolazak:",
|
||||
"inclVatFooter": "ukljuÄujuÄi {{vat}}% PDV-a,*",
|
||||
"availability": "Dostupnost",
|
||||
@@ -25,7 +26,7 @@ export default {
|
||||
"pickupPrice": "Cijena preuzimanja: 19,90 ⏠po reznici.",
|
||||
"consistsOf": "Sastoji se od:",
|
||||
"loadingComponentDetails": "{{index}}. UÄitavanje detalja komponente...",
|
||||
"loadingProduct": "Proizvod se uÄitava...",
|
||||
"loadingProduct": "UÄitavanje proizvoda...",
|
||||
"individualPriceTotal": "Ukupna pojedinaÄna cijena:",
|
||||
"setPrice": "Cijena seta:",
|
||||
"yourSavings": "VaĆĄa uĆĄteda:",
|
||||
@@ -38,7 +39,7 @@ export default {
|
||||
"filteredOneProduct": "{{filtered}} od 1 proizvoda",
|
||||
"xOfYProducts": "{{x}} od {{y}} proizvoda"
|
||||
},
|
||||
"removeFiltersToSee": "Uklonite filtere da vidite proizvode",
|
||||
"removeFiltersToSee": "Uklonite filtre da vidite proizvode",
|
||||
"outOfStock": "Nema na skladiĆĄtu",
|
||||
"fromXProducts": "od {{count}} proizvoda",
|
||||
"discount": {
|
||||
|
||||
61
src/i18n/locales/hr/productDialogs.js
Normal file
@@ -0,0 +1,61 @@
|
||||
export default {
|
||||
"questionTitle": "Pitanje o proizvodu",
|
||||
"questionSubtitle": "Imate li pitanje o ovom proizvodu? Rado Äemo vam pomoÄi.",
|
||||
"questionSuccess": "Hvala na vaĆĄem pitanju! Javili smo vam se ĆĄto je prije moguÄe.",
|
||||
"nameLabel": "Ime",
|
||||
"namePlaceholder": "VaĆĄe ime",
|
||||
"emailLabel": "Email",
|
||||
"emailPlaceholder": "your.email@example.com",
|
||||
"questionLabel": "VaĆĄe pitanje",
|
||||
"questionPlaceholder": "OpiĆĄite svoje pitanje o ovom proizvodu...",
|
||||
"photosLabelQuestion": "PriloĆŸite fotografije uz svoje pitanje (opcionalno)",
|
||||
"submitQuestion": "PoĆĄalji pitanje",
|
||||
"sending": "Ć alje se...",
|
||||
|
||||
"ratingTitle": "Ocijenite proizvod",
|
||||
"ratingSubtitle": "Podijelite svoje iskustvo s ovim proizvodom i pomozite drugim kupcima u odluci.",
|
||||
"ratingSuccess": "Hvala na vaĆĄoj recenziji! Bit Äe objavljena nakon provjere.",
|
||||
"emailHelper": "VaĆĄ email neÄe biti objavljen",
|
||||
"ratingLabel": "Ocjena *",
|
||||
"pleaseRate": "Molimo ocijenite",
|
||||
"ratingStars": "{{rating}} od 5 zvjezdica",
|
||||
"reviewLabel": "VaĆĄa recenzija (opcionalno)",
|
||||
"reviewPlaceholder": "OpiĆĄite svoja iskustva s ovim proizvodom...",
|
||||
"photosLabelRating": "PriloĆŸite fotografije uz svoju recenziju (opcionalno)",
|
||||
"submitRating": "PoĆĄalji recenziju",
|
||||
"errorGeneric": "DoĆĄlo je do pogreĆĄke",
|
||||
"errorPhotos": "PogreĆĄka pri obradi fotografija",
|
||||
|
||||
"availabilityTitle": "ZatraĆŸite dostupnost",
|
||||
"availabilitySubtitle": "Ovaj proizvod trenutno nije dostupan. Obavijestit Äemo vas Äim ponovno bude na skladiĆĄtu.",
|
||||
"availabilitySuccessEmail": "Hvala na vaĆĄem zahtjevu! Obavijestit Äemo vas putem emaila Äim proizvod ponovno bude dostupan.",
|
||||
"availabilitySuccessTelegram": "Hvala na vaĆĄem zahtjevu! Obavijestit Äemo vas putem Telegrama Äim proizvod ponovno bude dostupan.",
|
||||
"notificationMethodLabel": "Kako ĆŸelite biti obavijeĆĄteni?",
|
||||
"telegramBotLabel": "Telegram Bot",
|
||||
"telegramIdLabel": "Telegram ID",
|
||||
"telegramPlaceholder": "@yourTelegramName or Telegram ID",
|
||||
"telegramHelper": "Unesite svoje Telegram korisniÄko ime (s @) ili Telegram ID",
|
||||
"messageLabel": "Poruka (opcionalno)",
|
||||
"messagePlaceholder": "Dodatne informacije ili pitanja...",
|
||||
"submitAvailability": "ZatraĆŸite dostupnost",
|
||||
|
||||
"photoUploadSelect": "Odaberite fotografije",
|
||||
"photoUploadErrorMaxFiles": "Dozvoljeno maksimalno {{max}} datoteka",
|
||||
"photoUploadErrorFileType": "Dozvoljene su samo slikovne datoteke (JPEG, PNG, GIF, WebP)",
|
||||
"photoUploadErrorFileSize": "Datoteka je prevelika. Maksimum: {{maxSize}}MB",
|
||||
"photoUploadSelectedFiles": "{{count}} datoteka je odabrano",
|
||||
"photoUploadCompressed": "(komprimirano za prijenos)",
|
||||
"photoUploadRemove": "Ukloni sliku",
|
||||
"photoUploadLabelDefault": "PriloĆŸite fotografije (opcionalno)",
|
||||
|
||||
"shareTitle": "Podijeli",
|
||||
"shareEmbed": "Ugradi",
|
||||
"shareCopyLink": "Kopiraj link",
|
||||
"shareSuccessEmbed": "Kod za ugradnju kopiran u meÄuspremnik!",
|
||||
"shareErrorEmbed": "PogreĆĄka pri kopiranju koda za ugradnju",
|
||||
"shareSuccessLink": "Link kopiran u meÄuspremnik!",
|
||||
"shareWhatsAppText": "Pogledajte ovaj proizvod: {{name}}",
|
||||
"shareTelegramText": "Pogledajte ovaj proizvod: {{name}}",
|
||||
"shareEmailSubject": "Preporuka proizvoda",
|
||||
"shareEmailBody": "Pozdrav,\n\nĆœelio/la bih vam preporuÄiti ovaj proizvod:\n\n{{name}}\n{{url}}\n\nSrdaÄan pozdrav"
|
||||
};
|
||||
@@ -5,6 +5,7 @@ export default {
|
||||
"profile": "Profil",
|
||||
"email": "Email",
|
||||
"password": "JelszĂł",
|
||||
"newPassword": "Ăj jelszĂł",
|
||||
"confirmPassword": "JelszĂł megerĆsĂtĂ©se",
|
||||
"forgotPassword": "Elfelejtett jelszĂł?",
|
||||
"loginWithGoogle": "Bejelentkezés Google-lal",
|
||||
@@ -13,13 +14,37 @@ export default {
|
||||
"privacyPolicy": "Adatvédelmi szabålyzatot",
|
||||
"passwordMinLength": "A jelszĂłnak legalĂĄbb 8 karakter hosszĂșnak kell lennie",
|
||||
"newPasswordMinLength": "Az Ășj jelszĂłnak legalĂĄbb 8 karakter hosszĂșnak kell lennie",
|
||||
"backToHome": "Vissza a kezdĆlapra",
|
||||
"menu": {
|
||||
"profile": "Profil",
|
||||
"myProfile": "SajĂĄt profilom",
|
||||
"myProfile": "SajĂĄt profil",
|
||||
"checkout": "Pénztår",
|
||||
"orders": "Rendelések",
|
||||
"settings": "BeĂĄllĂtĂĄsok",
|
||||
"adminDashboard": "Admin VezĂ©rlĆpult",
|
||||
"adminUsers": "Admin FelhasznĂĄlĂłk"
|
||||
},
|
||||
"resetPassword": {
|
||||
"title": "JelszĂł visszaĂĄllĂtĂĄsa",
|
||||
"button": "JelszĂł visszaĂĄllĂtĂĄsa",
|
||||
"success": "A jelszavad sikeresen visszaĂĄllĂtva! Hamarosan ĂĄtirĂĄnyĂtunk a bejelentkezĂ©shez...",
|
||||
"invalidToken": "ĂrvĂ©nyes token nem talĂĄlhatĂł. KĂ©rjĂŒk, hasznĂĄld az emailedben talĂĄlhatĂł linket.",
|
||||
"error": "Hiba törtĂ©nt a jelszĂł visszaĂĄllĂtĂĄsa sorĂĄn",
|
||||
"emailSent": "Egy link a jelszĂł visszaĂĄllĂtĂĄsĂĄhoz elkĂŒldĂ©sre kerĂŒlt az email cĂmedre.",
|
||||
"emailError": "Hiba törtĂ©nt az email kĂŒldĂ©se sorĂĄn"
|
||||
},
|
||||
"errors": {
|
||||
"fillAllFields": "KĂ©rjĂŒk, tölts ki minden mezĆt",
|
||||
"invalidEmail": "KĂ©rjĂŒk, adj meg egy Ă©rvĂ©nyes email cĂmet",
|
||||
"passwordsNotMatch": "A jelszavak nem egyeznek",
|
||||
"passwordsNotMatchShort": "A jelszavak nem egyeznek",
|
||||
"enterEmail": "KĂ©rjĂŒk, add meg az email cĂmed",
|
||||
"loginFailed": "Bejelentkezés sikertelen",
|
||||
"registerFailed": "RegisztrĂĄciĂł sikertelen",
|
||||
"googleLoginFailed": "Google bejelentkezés sikertelen",
|
||||
"emailExists": "MĂĄr lĂ©tezik felhasznĂĄlĂł ezzel az email cĂmmel. KĂ©rjĂŒk, hasznĂĄlj mĂĄsik email cĂmet vagy jelentkezz be."
|
||||
},
|
||||
"success": {
|
||||
"registerComplete": "Sikeres regisztrĂĄciĂł. Most mĂĄr bejelentkezhetsz."
|
||||
}
|
||||
};
|
||||
|
||||
@@ -3,6 +3,7 @@ import navigation from './navigation.js';
|
||||
import auth from './auth.js';
|
||||
import cart from './cart.js';
|
||||
import product from './product.js';
|
||||
import productDialogs from './productDialogs.js';
|
||||
import search from './search.js';
|
||||
import sorting from './sorting.js';
|
||||
import chat from './chat.js';
|
||||
@@ -18,6 +19,7 @@ import pages from './pages.js';
|
||||
import orders from './orders.js';
|
||||
import settings from './settings.js';
|
||||
import common from './common.js';
|
||||
import kitConfig from './kitConfig.js';
|
||||
import legalDatenschutzBasic from './legal-datenschutz-basic.js';
|
||||
import legalDatenschutzCustomer from './legal-datenschutz-customer.js';
|
||||
import legalDatenschutzGoogleOrders from './legal-datenschutz-google-orders.js';
|
||||
@@ -35,6 +37,7 @@ export default {
|
||||
"auth": auth,
|
||||
"cart": cart,
|
||||
"product": product,
|
||||
"productDialogs": productDialogs,
|
||||
"search": search,
|
||||
"sorting": sorting,
|
||||
"chat": chat,
|
||||
@@ -50,6 +53,7 @@ export default {
|
||||
"orders": orders,
|
||||
"settings": settings,
|
||||
"common": common,
|
||||
"kitConfig": kitConfig,
|
||||
"legalDatenschutzBasic": legalDatenschutzBasic,
|
||||
"legalDatenschutzCustomer": legalDatenschutzCustomer,
|
||||
"legalDatenschutzGoogleOrders": legalDatenschutzGoogleOrders,
|
||||
|
||||
43
src/i18n/locales/hu/kitConfig.js
Normal file
@@ -0,0 +1,43 @@
|
||||
export default {
|
||||
"pageTitle": "đ± Growbox KonfigurĂĄtor",
|
||||
"pageSubtitle": "ĂllĂtsd össze a tökĂ©letes beltĂ©ri növĂ©nytermesztĆ rendszeredet",
|
||||
"bundleDiscountTitle": "đŻ Szerezd meg a csomagkedvezmĂ©nyt!",
|
||||
"loadingProducts": "Growbox termékek betöltése...",
|
||||
"loadingLighting": "VilĂĄgĂtĂĄsi termĂ©kek betöltĂ©se...",
|
||||
"loadingVentilation": "SzellĆztetĆ termĂ©kek betöltĂ©se...",
|
||||
"loadingExtras": "KiegĂ©szĂtĆk betöltĂ©se...",
|
||||
"noProductsAvailable": "Nincs elĂ©rhetĆ termĂ©k ehhez a mĂ©rethez",
|
||||
"noLightingAvailable": "Nincs megfelelĆ vilĂĄgĂtĂĄs a(z) {{shape}} sĂĄtormĂ©rethez.",
|
||||
"noVentilationAvailable": "Nincs megfelelĆ szellĆztetĂ©s a(z) {{shape}} sĂĄtormĂ©rethez.",
|
||||
"noExtrasAvailable": "Nincsenek elĂ©rhetĆ kiegĂ©szĂtĆk",
|
||||
"selectShapeTitle": "1. VĂĄlaszd ki a growbox formĂĄjĂĄt",
|
||||
"selectShapeSubtitle": "ElĆször vĂĄlaszd ki a growbox alapterĂŒletĂ©t",
|
||||
"selectProductTitle": "2. Vålaszd ki a growbox terméket",
|
||||
"selectProductSubtitle": "VĂĄlaszd ki a megfelelĆ termĂ©ket a(z) {{shape}} growboxodhoz",
|
||||
"selectLightingTitle": "3. VĂĄlassz vilĂĄgĂtĂĄst",
|
||||
"selectLightingTitleShape": "3. VĂĄlassz vilĂĄgĂtĂĄst - {{shape}}",
|
||||
"selectLightingSubtitle": "KĂ©rjĂŒk, elĆször vĂĄlassz sĂĄtormĂ©retet.",
|
||||
"selectVentilationTitle": "4. VĂĄlaszd ki a szellĆztetĂ©st",
|
||||
"selectVentilationTitleShape": "4. VĂĄlaszd ki a szellĆztetĂ©st - {{shape}}",
|
||||
"selectVentilationSubtitle": "KĂ©rjĂŒk, elĆször vĂĄlassz sĂĄtormĂ©retet.",
|
||||
"selectExtrasTitle": "5. Adj hozzĂĄ kiegĂ©szĂtĆket (opcionĂĄlis)",
|
||||
"yourConfiguration": "đŻ A te konfigurĂĄciĂłd",
|
||||
"growboxLabel": "Growbox: {{name}}",
|
||||
"lightingLabel": "VilĂĄgĂtĂĄs: {{name}}",
|
||||
"ventilationLabel": "SzellĆztetĂ©s: {{name}}",
|
||||
"extraLabel": "KiegĂ©szĂtĆ: {{name}}",
|
||||
"totalPrice": "Teljes ĂĄr:",
|
||||
"addToCart": "KosĂĄrba tesz",
|
||||
"selected": "â KivĂĄlasztva",
|
||||
"notDeliverable": "Nem szĂĄllĂthatĂł",
|
||||
"noPrice": "Nincs ĂĄr",
|
||||
"setName": "Growbox szett - {{shape}}",
|
||||
"description60x60": "Kompakt - ideĂĄlis kis helyekre",
|
||||
"description80x80": "Közepes - tökĂ©letes egyensĂșly",
|
||||
"description100x100": "Nagy - tapasztalt termesztĆknek",
|
||||
"description120x60": "TĂ©glalap alakĂș - maximĂĄlis helykihasznĂĄlĂĄs",
|
||||
"plants1to2": "1-2 növény",
|
||||
"plants2to4": "2-4 növény",
|
||||
"plants4to6": "4-6 növény",
|
||||
"plants3to6": "3-6 növény"
|
||||
};
|
||||