chore: upload public images to Cloudinary and update dictionaries

This commit is contained in:
mstfyldz
2026-06-04 20:00:47 +03:00
parent 7059a1f3a4
commit ae5adfd2e8
16 changed files with 93 additions and 22 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
# Moy Group
Modern, şık ve çift dilli (TR/EN) kurumsal web sitesi projesi. Moy Group çatısı altında yer alan Moy Beach, Kite Beach Hotel ve Volkswagen Kite (Surfing) mekanlarının tanıtımı, hizmet detayları, galeri ve iletişim/rezervasyon bilgilerini içerir.
Modern, şık ve çift dilli (TR/EN) kurumsal web sitesi projesi. Moy Group çatısı altında yer alan Moy Beach, Kite Beach Hotel ve Kite Beach (Surfing) mekanlarının tanıtımı, hizmet detayları, galeri ve iletişim/rezervasyon bilgilerini içerir.
## Teknolojiler
+2 -2
View File
@@ -111,7 +111,7 @@ const fadeUp: Variants = {
export default function HomeClient({ lang, dict }: { lang: string; dict: any }) {
const [activeMap, setActiveMap] = useState(0);
const VENUES: { id: string; title: string; tag: string; desc: string; img: string; color: string }[] = dict.venuesList;
const VENUES: { id: string; title: string; tag: string; desc: string; img: string; color: string; link: string }[] = dict.venuesList;
const LOCATIONS_MAP: { place: string; addr: string; embed: string }[] = dict.locationsMap;
return (
@@ -321,7 +321,7 @@ export default function HomeClient({ lang, dict }: { lang: string; dict: any })
<span className="moy-gold-line mb-6 block" />
<p className="text-gray-500 mb-8 text-base leading-relaxed">{venue.desc}</p>
<Link
href={`/${lang}/mekanlar/${venue.id}`}
href={`${venue.link}`}
className="inline-flex items-center gap-2 text-[11px] uppercase tracking-[0.18em] font-semibold text-[var(--color-moy-dark)] border-b border-[var(--color-moy-gold)] pb-1 hover:text-[var(--color-moy-gold-dark)] transition-colors group"
>
{dict.cta.exploreBtn}
+3 -3
View File
@@ -23,7 +23,7 @@ const LOCATIONS = [
variant: "blue" as const,
},
{
name: "Volkswagen Kite (Surfing)",
name: "Kite Beach (Surfing)",
tag: "Kite Surf",
address: "Akçapınar kite sahili, Ula, Turkey 48640",
phones: ["+90 537 882 31 37", "+90 505 204 98 56"],
@@ -183,10 +183,10 @@ export default async function IletisimPage({
<h3 className="font-serif text-xl text-[var(--color-moy-dark)] mb-4">{t.social}</h3>
<div className="flex gap-4">
<a href="#" aria-label="Instagram" className="w-10 h-10 border border-gray-200 flex items-center justify-center hover:border-[var(--color-moy-gold)] hover:text-[var(--color-moy-gold)] text-gray-400 transition-all duration-200">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><rect width="20" height="20" x="2" y="2" rx="5" ry="5"/><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z"/><line x1="17.5" x2="17.51" y1="6.5" y2="6.5"/></svg>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><rect width="20" height="20" x="2" y="2" rx="5" ry="5" /><path d="M16 11.37A4 4 0 1 1 12.63 8 4 4 0 0 1 16 11.37z" /><line x1="17.5" x2="17.51" y1="6.5" y2="6.5" /></svg>
</a>
<a href="#" aria-label="Facebook" className="w-10 h-10 border border-gray-200 flex items-center justify-center hover:border-[var(--color-moy-gold)] hover:text-[var(--color-moy-gold)] text-gray-400 transition-all duration-200">
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z"/></svg>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round"><path d="M18 2h-3a5 5 0 0 0-5 5v3H7v4h3v8h4v-8h3l1-4h-4V7a1 1 0 0 1 1-1h3z" /></svg>
</a>
</div>
</div>
+11 -8
View File
@@ -42,24 +42,27 @@
"title": "Moy Beach",
"tag": "Beach & Bar",
"desc": "An exclusive beach and gastronomy experience amidst the unique nature and azure waters of Akyaka. The point where local aromas meet international flavors.",
"img": "/moy-beach.jpg",
"color": "from-amber-900/60"
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592404/moygrup/moy-beach.jpg",
"color": "from-amber-900/60",
"link": "http://moybeachakyaka.com"
},
{
"id": "kite-beach-hotel",
"title": "Kite Beach Hotel",
"tag": "Hotel",
"desc": "A boutique hotel right on the clear waters of Akyaka, offering the perfect balance of both sports and relaxation. Swim in the sea in the mornings, enjoy the restaurant in the evenings.",
"img": "/kite-beach-hotel.jpg",
"color": "from-blue-900/60"
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592402/moygrup/kite-beach-hotel.jpg",
"color": "from-blue-900/60",
"link": "http://moybeachakyaka.com"
},
{
"id": "volkswagen-kite",
"title": "Volkswagen Kite (Surfing)",
"title": "Kite Beach (Surfing)",
"tag": "Kite & Surf",
"desc": "Professional training and equipment rental at Akçapınar Kite Beach, Turkey's best kitesurf spot. Discover freedom in the diamond waters of the Gulf of Gökova.",
"img": "/volkswagen-kite.png",
"color": "from-green-900/60"
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592405/moygrup/volkswagen-kite.png",
"color": "from-green-900/60",
"link": "/"
}
],
"locationsMap": [
@@ -74,7 +77,7 @@
"embed": "https://maps.google.com/maps?q=Kite+Beach+Hotel+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
},
{
"place": "Volkswagen Kite (Surfing)",
"place": "Kite Beach (Surfing)",
"addr": "Akçapınar Kite Sahili, Ula/Muğla",
"embed": "https://maps.google.com/maps?q=Volkswagen+Kite+Surfing+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
}
+11 -8
View File
@@ -42,24 +42,27 @@
"title": "Moy Beach",
"tag": "Beach & Bar",
"desc": "Akyaka'nın eşsiz doğası ve masmavi suları arasında, seçkin bir plaj ve gastronomi deneyimi. Yerel aromalar ile uluslararası lezzetlerin buluştuğu nokta.",
"img": "/moy-beach.jpg",
"color": "from-amber-900/60"
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592404/moygrup/moy-beach.jpg",
"color": "from-amber-900/60",
"link": "http://moybeachakyaka.com"
},
{
"id": "kite-beach-hotel",
"title": "Kite Beach Hotel",
"tag": "Hotel",
"desc": "Akyaka'nın berrak sularına sıfır, hem sporun hem de dinlenmenin mükemmel dengesini sunan butik otel. Sabahları denizde yüzün, akşamları restoranda keyif yapın.",
"img": "/kite-beach-hotel.jpg",
"color": "from-blue-900/60"
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592402/moygrup/kite-beach-hotel.jpg",
"color": "from-blue-900/60",
"link": "http://moybeachakyaka.com"
},
{
"id": "volkswagen-kite",
"title": "Volkswagen Kite (Surfing)",
"title": "Kite Beach (Surfing)",
"tag": "Kite & Surf",
"desc": "Akçapınar Kite Sahili'nde, Türkiye'nin en iyi kitesurf noktasında profesyonel eğitim ve ekipman kiralama. Gökova Körfezi'nin pırlanta sularında özgürlüğü keşfedin.",
"img": "/volkswagen-kite.png",
"color": "from-green-900/60"
"img": "https://res.cloudinary.com/du7xohbct/image/upload/v1780592405/moygrup/volkswagen-kite.png",
"color": "from-green-900/60",
"link": "/"
}
],
"locationsMap": [
@@ -74,7 +77,7 @@
"embed": "https://maps.google.com/maps?q=Kite+Beach+Hotel+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
},
{
"place": "Volkswagen Kite (Surfing)",
"place": "Kite Beach (Surfing)",
"addr": "Akçapınar Kite Sahili, Ula/Muğla",
"embed": "https://maps.google.com/maps?q=Volkswagen+Kite+Surfing+Muğla&t=&z=15&ie=UTF8&iwloc=&output=embed"
}
+4
View File
@@ -4,6 +4,10 @@ const nextConfig: NextConfig = {
output: "standalone",
images: {
remotePatterns: [
{
protocol: "https",
hostname: "res.cloudinary.com",
},
{
protocol: "https",
hostname: "images.unsplash.com",
+21
View File
@@ -19,6 +19,7 @@
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"cloudinary": "^2.10.0",
"eslint": "^9",
"eslint-config-next": "16.2.7",
"tailwindcss": "^4",
@@ -2773,6 +2774,19 @@
"integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==",
"license": "MIT"
},
"node_modules/cloudinary": {
"version": "2.10.0",
"resolved": "https://registry.npmjs.org/cloudinary/-/cloudinary-2.10.0.tgz",
"integrity": "sha512-sY09kYg7wprkndAOjZBAYqFZqwL+SxnEGcAvksOvFA+5upnFn949UjkEkHKNSwkBtW/xRDd0p6NgbSXZcxkI3w==",
"dev": true,
"license": "MIT",
"dependencies": {
"lodash": "^4.17.23"
},
"engines": {
"node": ">=9"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -5031,6 +5045,13 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/lodash": {
"version": "4.18.1",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
"integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
"dev": true,
"license": "MIT"
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+1
View File
@@ -20,6 +20,7 @@
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"cloudinary": "^2.10.0",
"eslint": "^9",
"eslint-config-next": "16.2.7",
"tailwindcss": "^4",
Binary file not shown.

After

Width:  |  Height:  |  Size: 715 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 940 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 919 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 837 KiB

+39
View File
@@ -0,0 +1,39 @@
const cloudinary = require('cloudinary').v2;
const fs = require('fs');
const path = require('path');
cloudinary.config({
cloud_name: 'du7xohbct',
api_key: '525922573613433',
api_secret: 'cJ0NDcaoQhSTAxBMv6jNMFupt3k'
});
const uploadImages = async () => {
const publicDir = path.join(__dirname, '..', 'public');
const files = fs.readdirSync(publicDir);
const images = files.filter(file => file.endsWith('.jpg') || file.endsWith('.png'));
const results = {};
for (const file of images) {
console.log(`Uploading ${file}...`);
try {
const filePath = path.join(publicDir, file);
const result = await cloudinary.uploader.upload(filePath, {
folder: 'moygrup',
use_filename: true,
unique_filename: false
});
console.log(`Uploaded ${file} -> ${result.secure_url}`);
results[file] = result.secure_url;
} catch (error) {
console.error(`Error uploading ${file}:`, error);
}
}
console.log('\n--- Upload Results ---');
console.log(JSON.stringify(results, null, 2));
};
uploadImages();