Takip et

Next.js ve Fabric.js ile Filigransız ‘City Boy’ Meme Oluşturucu Geliştirme: Kapsamlı Rehber

Next.

Next.js ve Fabric.js ile Filigransız ‘City Boy’ Meme Oluşturucu Geliştirme: Kapsamlı Rehber

Günümüz dijital çağında, mizahın en yaygın ifade biçimlerinden biri olan memeler, internet kültürünün vazgeçilmez bir parçası haline geldi. Özellikle son dönemde popülerleşen “City Boy” memesi gibi akımlar, kişiselleştirilmiş içerik oluşturma isteğini artırıyor. Ancak çoğu çevrimiçi meme oluşturucu, filigranlar, sınırlı özelleştirme seçenekleri veya gizlilik endişeleri gibi sorunlar barındırır. İşte tam da bu noktada, kendi filigransız meme oluşturucunuzu geliştirmenin önemi ortaya çıkıyor. Bu makalede, modern web geliştirme çerçevesi Next.js ve güçlü tuval manipülasyon kütüphanesi Fabric.js’i kullanarak, tamamen size ait, filigransız bir “City Boy” meme oluşturucuyu adım adım nasıl inşa edeceğinizi keşfedeceğiz.

Giriş: Neden Kendi Meme Oluşturucunuzu Yapmalısınız?

İnternet dünyasında hızla yayılan ve popülerliğini koruyan memeler, dijital iletişimin önemli bir parçasıdır. “City Boy” gibi akımlar, belirli bir estetik veya yaşam tarzını mizahi bir dille ele alarak geniş kitlelere ulaşır. Ancak bu tür içerikleri oluştururken karşılaşılan en büyük sorunlardan biri, çoğu ücretsiz aracın eklediği can sıkıcı filigranlar ve özelleştirme kısıtlamalarıdır. Kendi meme oluşturucunuzu geliştirmek, size tam kontrol, sınırsız yaratıcılık ve en önemlisi, filigransız çıktılar sunar.

City Boy Meme’inin Yükselişi

“City Boy” memesi, genellikle belirli bir giyim tarzı, yaşam biçimi ve estetikle ilişkilendirilen görseller üzerine esprili metinler eklenerek oluşturulur. Bu memeler, sosyal medyada hızla yayılarak belirli bir kültürü temsil etme ve yorumlama aracı haline gelmiştir. Kendi oluşturucunuzla, bu trendi kendi yorumlarınızla zenginleştirebilirsiniz.

Mevcut Araçların Sınırlamaları ve Filigran Sorunu

Piyasada birçok ücretsiz meme oluşturma aracı bulunsa da, bunların çoğu ya çıktılara kendi markalarının filigranını ekler ya da çok kısıtlı font, renk ve düzenleme seçenekleri sunar. Bu durum, özellikle profesyonel veya kişisel markanız için içerik üretirken büyük bir dezavantaj oluşturur. Kendi aracınızla bu sınırlamaları tamamen ortadan kaldırabilirsiniz.

Next.js ve Fabric.js’in Gücü

Bu projede, modern web uygulamaları geliştirmek için React tabanlı bir çerçeve olan Next.js’i ve HTML5 öğesi üzerinde etkileşimli grafikler oluşturmak için kullanılan Fabric.js kütüphanesini bir araya getireceğiz. Next.js, sunucu tarafı renderlama (SSR) ve statik site oluşturma (SSG) gibi özellikleriyle performans ve SEO avantajları sunarken, Fabric.js ise tuval üzerindeki metinleri, görselleri ve şekilleri kolayca manipüle etmemizi sağlayacak temel aracı olacaktır. Bu ikilinin birleşimi, hem güçlü bir altyapı hem de zengin bir kullanıcı deneyimi vaat ediyor.

Teknolojileri Tanıyalım: Next.js ve Fabric.js

Projemizin temelini oluşturan Next.js ve Fabric.js, modern web geliştirme dünyasında kendilerine sağlam bir yer edinmiş iki güçlü teknolojidir. Bu bölümde, her birinin ne olduğunu, ne işe yaradığını ve neden bu projede tercih edildiğini daha yakından inceleyeceğiz.

Next.js: Modern Web Uygulamaları İçin Çerçeve

Next.js, React tabanlı bir açık kaynak web geliştirme çerçevesidir. Geliştiricilere sunucu tarafı renderlama (SSR), statik site oluşturma (SSG), API rotaları, otomatik kod bölme ve daha birçok özellik sunarak yüksek performanslı ve SEO dostu uygulamalar geliştirmeyi kolaylaştırır. Özellikle büyük ölçekli ve dinamik uygulamalar için idealdir. Bizim meme oluşturucumuzda, hızlı yükleme süreleri ve kolay geliştirme ortamı sağlaması açısından kritik bir rol oynayacaktır.

Fabric.js: Etkileşimli Tuval Manipülasyonunun Kalbi

Fabric.js, HTML5 öğesi üzerinde çalışarak, metin, görsel, şekil gibi nesneleri kolayca oluşturmanıza, düzenlemenize ve manipüle etmenize olanak tanıyan bir JavaScript kütüphanesidir. Sürükle-bırak, yeniden boyutlandırma, döndürme, renk değiştirme gibi birçok etkileşimli özelliği kutudan çıktığı gibi sunar. Meme oluşturucumuzun görsel düzenleme kısmı tamamen Fabric.js tarafından yönetilecektir. Kullanıcıların metinleri ve görselleri tuval üzerinde serbestçe hareket ettirmesi, boyutlandırması ve özelleştirmesi Fabric.js sayesinde mümkün olacak.

Neden Bu İkiliyi Seçtik?

Next.js ve Fabric.js’in kombinasyonu, projemiz için birçok avantaj sunar:

  • Performans: Next.js’in optimizasyon yetenekleri sayesinde hızlı yüklenen bir uygulama.
  • Geliştirici Deneyimi: React ekosisteminin tanıdık yapısı ve Fabric.js’in basit API’si ile kolay geliştirme.
  • Esneklik: Hem frontend hem de (gerektiğinde) backend ihtiyaçları için tek bir çerçeve.
  • Güçlü Görsel Düzenleme: Fabric.js’in sağladığı zengin tuval manipülasyonu özellikleri.
  • Filigransız Çıktı: Tamamen kontrolümüz altında olduğu için herhangi bir kısıtlama veya filigran olmadan görsel çıktılar alabiliriz.

Proje Kurulumu ve Temel Yapılandırma

Herhangi bir web projesine başlarken ilk adım, geliştirme ortamını kurmak ve gerekli bağımlılıkları yüklemektir. Bu bölümde, Next.js projemizi nasıl başlatacağımızı, Fabric.js’i nasıl entegre edeceğimizi ve projemizin temel yapılandırmasını nasıl yapacağımızı ele alacağız.

Next.js Projesi Başlatma

Yeni bir Next.js projesi oluşturmak oldukça basittir. Terminalinizde aşağıdaki komutu çalıştırarak başlayabilirsiniz:

npx create-next-app@latest city-boy-meme-generator --typescript --eslint
cd city-boy-meme-generator

Bu komut, city-boy-meme-generator adında yeni bir Next.js projesi oluşturacak, TypeScript ve ESLint desteğini de ekleyecektir. Proje klasörüne girdikten sonra, geliştirme sunucusunu başlatmak için npm run dev komutunu kullanabilirsiniz.

Fabric.js Entegrasyonu

Fabric.js'i projemize entegre etmek için öncelikle paketi yüklememiz gerekiyor:

npm install fabric

Daha sonra, Fabric.js'i kullanacağımız bileşenlerde import edebiliriz. Genellikle, tuvalimizi oluşturacağımız ana sayfa veya bileşen içinde bu işlemi yaparız.

// pages/index.tsx veya components/MemeCanvas.tsx
import React, { useEffect, useRef } from 'react';
import { fabric } from 'fabric';

const MemeGenerator: React.FC = () => {
  const canvasRef = useRef(null);
  const fabricCanvasRef = useRef(null);

  useEffect(() => {
    if (canvasRef.current && !fabricCanvasRef.current) {
      fabricCanvasRef.current = new fabric.Canvas(canvasRef.current, {
        width: 800,
        height: 600,
        backgroundColor: '#f0f0f0',
      });
    }

    return () => {
      if (fabricCanvasRef.current) {
        fabricCanvasRef.current.dispose(); // Tuvali temizle
      }
    };
  }, []);

  return (
    
); }; export default MemeGenerator;

Bu kod parçası, bir canvas elementi oluşturur ve useEffect hook'u içinde Fabric.js tuvalini başlatır. useRef kullanarak DOM elementine ve Fabric.js tuval örneğine erişim sağlıyoruz.

Gerekli Paketlerin Kurulumu (Tailwind CSS, vb. isteğe bağlı)

Kullanıcı arayüzünü daha hızlı ve estetik bir şekilde tasarlamak için Tailwind CSS gibi bir CSS framework'ü entegre etmek faydalı olabilir.

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p

Ardından tailwind.config.js ve globals.css dosyalarını Next.js belgelerine göre yapılandırarak Tailwind CSS'i projenize dahil edebilirsiniz. Bu, arayüz tasarım sürecini önemli ölçüde hızlandıracaktır.

Meme Oluşturucunun Temel Bileşenleri

Meme oluşturucumuzun kalbi, kullanıcıların görsel ve metin öğeleriyle etkileşim kurduğu tuval alanıdır. Bu bölümde, tuval alanını nasıl kuracağımızı, arka plan görsellerini nasıl yükleyeceğimizi ve en önemlisi, metin ve görsel ekleme/düzenleme işlevselliğini nasıl implemente edeceğimizi detaylandıracağız.

Tuval Alanı ve Arka Plan Görseli Yükleme

Tuvalimiz, Fabric.js tarafından yönetilen ana çalışma alanımızdır. Kullanıcıların bir arka plan görseli yüklemesi, meme oluşturma sürecinin ilk adımıdır.

// components/MemeCanvas.tsx içinde devam
// ...
const handleImageUpload = (event: React.ChangeEvent) => {
  const file = event.target.files?.[0];
  if (file) {
    const reader = new FileReader();
    reader.onload = (e) => {
      const imgUrl = e.target?.result as string;
      fabric.Image.fromURL(imgUrl, (img) => {
        if (fabricCanvasRef.current) {
          // Resmi tuvale sığacak şekilde ölçekle
          img.scaleToWidth(fabricCanvasRef.current.getWidth());
          fabricCanvasRef.current.setBackgroundImage(img, fabricCanvasRef.current.renderAll.bind(fabricCanvasRef.current));
        }
      }, { crossOrigin: 'anonymous' }); // CORS sorunlarını önlemek için
    };
    reader.readAsDataURL(file);
  }
};

// JSX içinde:



Bu kod, bir dosya seçici aracılığıyla görsel yüklemeyi ve seçilen görseli Fabric.js tuvaline arka plan olarak ayarlamayı sağlar. crossOrigin: 'anonymous' özellikle dış kaynaklardan yüklenen görseller için önemlidir.

Metin Ekleme ve Düzenleme İşlevselliği

Memelerin olmazsa olmazı metinlerdir. Kullanıcıların tuvale metin eklemesi, fontunu, rengini ve boyutunu değiştirmesi gerekir.

// components/MemeCanvas.tsx içinde devam
// ...
const addText = () => {
  if (fabricCanvasRef.current) {
    const text = new fabric.IText('Meme Metni Buraya', {
      left: 50,
      top: 50,
      fontFamily: 'Arial',
      fill: '#ffffff',
      fontSize: 40,
      stroke: '#000000', // Metin kenarlığı
      strokeWidth: 2,
    });
    fabricCanvasRef.current.add(text);
    fabricCanvasRef.current.setActiveObject(text); // Yeni eklenen metni seçili yap
    fabricCanvasRef.current.renderAll();
  }
};

// JSX içinde:


fabric.IText sınıfı, kullanıcının doğrudan tuval üzerinde metni düzenlemesine olanak tanır. Seçilen metnin font, renk, boyut gibi özelliklerini değiştirmek için bir kontrol paneli oluşturabiliriz.

Görsel Ekleme ve Manipülasyon (İsteğe bağlı: "City Boy" şablonları)

Bazı memeler, arka plan görselinin yanı sıra ek görseller de içerebilir. Örneğin, "City Boy" memesinde kullanılan belirli ikonlar veya küçük resimler.

// components/MemeCanvas.tsx içinde devam
// ...
const addOverlayImage = (imageUrl: string) => {
  if (fabricCanvasRef.current) {
    fabric.Image.fromURL(imageUrl, (img) => {
      img.set({
        left: 100,
        top: 100,
        scaleX: 0.5,
        scaleY: 0.5,
      });
      fabricCanvasRef.current?.add(img);
      fabricCanvasRef.current?.setActiveObject(img);
      fabricCanvasRef.current?.renderAll();
    }, { crossOrigin: 'anonymous' });
  }
};

// JSX içinde:


Bu işlevsellik, önceden tanımlanmış "City Boy" temalı görselleri veya kullanıcı tarafından yüklenen diğer görselleri tuvale eklemek için kullanılabilir. Kullanıcılar, Fabric.js'in sunduğu özelliklerle bu görselleri sürükleyebilir, boyutlandırabilir ve döndürebilir.

Kullanıcı Deneyimi ve Arayüz Tasarımı

Bir meme oluşturucunun başarısı, sadece teknik yetenekleriyle değil, aynı zamanda kullanıcı dostu arayüzü ve akıcı deneyimiyle de ölçülür. Bu bölümde, oluşturucumuz için sezgisel bir arayüz tasarlamaya odaklanacak, kullanıcılara metin ve görsel üzerinde tam kontrol sağlayacak seçenekleri nasıl sunacağımızı inceleyeceğiz.

Basit ve Anlaşılır Arayüz (Örnek: Kontrol Paneli)

Kullanıcıların kafasını karıştırmayacak, kolay anlaşılır bir arayüz tasarlamak önemlidir. Genellikle, tuvalin yanında veya altında bir kontrol paneli bulunur. Bu panelde, metin ekleme, görsel yükleme, font seçimi, renk paleti gibi temel işlemler için düğmeler ve ayarlar yer alır.

Özellik Açıklama Kullanıcı Etkileşimi
Arka Plan Yükle Meme için ana görseli seçer. Dosya yükleme düğmesi
Metin Ekle Tuvale yeni bir metin kutusu ekler. Buton
Font/Boyut/Renk Seçili metnin özelliklerini değiştirir. Dropdown'lar, renk seçici, slider'lar
Görsel Ekle Tuvale ek küçük görseller ekler. Buton, dosya yükleme veya önceden tanımlı ikonlar
Kaydet/İndir Oluşturulan memeyi PNG/JPEG olarak kaydeder. Buton

Renk, Boyut, Font Seçenekleri

Kullanıcıların metinlerini ve görsellerini tam olarak istedikleri gibi özelleştirebilmeleri için zengin seçenekler sunmak önemlidir.

  • Renk Seçici: Metin ve şekil renkleri için bir renk paleti veya HEX kodu girişi.
  • Font Seçici: Google Fonts gibi kaynaklardan alınan popüler fontların bir listesi.
  • Boyut Ayarı: Metin boyutunu ayarlamak için bir slider veya sayı girişi.
  • Katman Yönetimi: Nesnelerin z-indeksini (öncelik sırasını) değiştirmek için basit yukarı/aşağı düğmeleri.

Kaydetme ve İndirme İşlevselliği (Filigransız Çıktı)

Oluşturucumuzun en kritik özelliklerinden biri, kullanıcının yarattığı memeyi filigransız bir şekilde indirebilmesidir. Fabric.js, tuval içeriğini doğrudan bir görsel dosyasına dönüştürme yeteneğine sahiptir.

// components/MemeCanvas.tsx içinde devam
// ...
const downloadMeme = () => {
  if (fabricCanvasRef.current) {
    const dataURL = fabricCanvasRef.current.toDataURL({
      format: 'png',
      quality: 1,
      multiplier: 2, // Yüksek çözünürlük için
    });

    const link = document.createElement('a');
    link.href = dataURL;
    link.download = 'city-boy-meme.png';
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
  }
};

// JSX içinde:


toDataURL metodu, tuvalin mevcut durumunu bir veri URL'sine dönüştürür. multiplier seçeneği ile daha yüksek çözünürlüklü çıktılar alabiliriz. Bu veri URL'sini kullanarak, bir etiketi oluşturup download özelliğini ayarlayarak kullanıcıya doğrudan görseli indirme imkanı sunarız. Bu işlem tamamen istemci tarafında gerçekleştiği için herhangi bir filigran eklenmesi söz konusu değildir.

Gelişmiş Özellikler ve Optimizasyonlar

Temel bir meme oluşturucu işlevselliğini sağladıktan sonra, kullanıcı deneyimini zenginleştirmek ve uygulamanın performansını artırmak için bazı gelişmiş özellikler ve optimizasyonlar ekleyebiliriz. Bu, uygulamanızı diğerlerinden ayıracak ve kullanıcı memnuniyetini artıracaktır.

Katman Yönetimi (Z-indeks)

Fabric.js'te her nesne bir katman olarak düşünülür. Kullanıcıların metin ve görsellerin üst üste binme sırasını kontrol edebilmesi, daha karmaşık ve estetik memeler oluşturmaları için önemlidir.

  • bringForward(): Seçili nesneyi bir katman öne getirir.
  • sendBackwards(): Seçili nesneyi bir katman arkaya gönderir.
  • bringToFront(): Seçili nesneyi en üste taşır.
  • sendToBack(): Seçili nesneyi en alta taşır.

Bu metotları kullanarak, kontrol panelinize "Öne Getir" ve "Arkaya Gönder" gibi düğmeler ekleyebilirsiniz.

Klavye Kısayolları ve Geri Alma/Yineleme

Profesyonel tasarım araçlarında olduğu gibi, klavye kısayolları ve geri alma/yineleme (Undo/Redo) işlevselliği, kullanıcı verimliliğini önemli ölçüde artırır.

  • Klavye Kısayolları: Seçili nesneleri silmek için Delete tuşu, yön tuşlarıyla hassas hareket gibi özellikler eklenebilir.
  • Geri Alma/Yineleme: Bu özellik biraz daha karmaşıktır ve tuvalin her önemli durum değişikliğini bir geçmiş dizisinde saklamayı gerektirir. Kullanıcı bir değişiklik yaptığında (metin ekleme, görsel taşıma vb.), tuvalin JSON temsilini geçmişe kaydedebiliriz. Geri alma işlemi, geçmişteki bir önceki durumu yüklerken, yineleme işlemi bir sonraki durumu yükler.

Performans İpuçları

Tuval üzerinde çok sayıda nesne olduğunda veya yüksek çözünürlüklü görseller kullanıldığında performans sorunları yaşanabilir.

  1. Görsel Optimizasyonu: Yüklenen arka plan görsellerini, tuval boyutlarına uygun olacak şekilde otomatik olarak yeniden boyutlandırmak veya sıkıştırmak.
  2. Nesne Önbellekleme: Fabric.js, nesneleri önbelleğe alma özelliğine sahiptir. Özellikle karmaşık veya sık manipüle edilen nesneler için bu özelliği etkinleştirmek performansı artırabilir.
  3. Gereksiz Yeniden Çizimleri Azaltma: Yalnızca değişiklik olduğunda tuvali yeniden çizmek (canvas.renderAll() yerine canvas.requestRenderAll() kullanmak) performansı artırabilir.

Sonuç: Kendi Meme İmparatorluğunuzu Kurun!

Bu makalede, Next.js ve Fabric.js'i kullanarak nasıl filigransız bir "City Boy" meme oluşturucu geliştirebileceğimizi detaylı bir şekilde inceledik. Proje kurulumundan temel görsel ve metin manipülasyonuna, kullanıcı deneyimi iyileştirmelerinden gelişmiş özelliklere kadar birçok konuya değindik. Artık kendi yaratıcılığınızı serbest bırakabileceğiniz ve internetin en popüler memelerinden birini kendi yorumunuzla şekillendirebileceğiniz bir araca sahipsiniz.

Kendi meme oluşturucunuzu geliştirmek, sadece teknik becerilerinizi geliştirmekle kalmaz, aynı zamanda dijital içerik üretimi konusunda size tam bağımsızlık sunar. Filigranlara elveda deyin, sınırsız özelleştirme seçenekleriyle kendi meme imparatorluğunuzu kurun! Bu proje, Next.js ve Fabric.js'in gücünü gösteren harika bir örnek olup, gelecekteki web tabanlı tasarım araçları projeleriniz için sağlam bir temel oluşturacaktır.

Özet ve Öğrenilenler

Bu rehber boyunca şunları öğrendik:

  • Next.js ile modern bir web uygulaması altyapısı kurma.
  • Fabric.js ile HTML5 tuval üzerinde etkileşimli metin ve görsel manipülasyonu yapma.
  • Kullanıcı dostu bir arayüz tasarlamanın önemi ve temel bileşenleri.
  • Filigransız görsel çıktıları nasıl alacağımız.
  • Uygulamayı daha güçlü ve verimli hale getirecek gelişmiş özellikler ve optimizasyon teknikleri.

Gelecek Geliştirmeler İçin Fikirler

Meme oluşturucunuzu daha da geliştirmek için bazı fikirler:

  • Şablon Kütüphanesi: Kullanıcıların hızla başlaması için önceden tanımlanmış "City Boy" veya diğer meme şablonları sunma.
  • Görsel Filtreler: Memelere retro, sepya gibi görsel filtreler uygulama.
  • Bulut Depolama: Kullanıcıların oluşturdukları memeleri kaydetmeleri ve daha sonra düzenlemeleri için bir backend entegrasyonu (örneğin Firebase veya kendi API'niz).
  • Sosyal Medya Paylaşımı: Oluşturulan memeyi doğrudan sosyal medya platformlarında paylaşma düğmeleri.
  • Mobil Uyumluluk: Duyarlı tasarım ile mobil cihazlarda da sorunsuz bir deneyim sunma.

Sıkça Sorulan Sorular (SSS)

Bu bölümde, meme oluşturucu geliştirme sürecinde sıkça karşılaşılabilecek sorulara yanıtlar bulacaksınız.

Neden Next.js yerine sadece React kullanmadık?

Next.js, React üzerine inşa edilmiş bir çerçevedir ve sunucu tarafı renderlama (SSR) veya statik site oluşturma (SSG) gibi özellikler sunar. Bu, uygulamanızın daha hızlı yüklenmesini sağlar, SEO performansını artırır ve daha iyi bir geliştirici deneyimi sunar. Sadece React kullanmak da mümkün olsa da, Next.js'in getirdiği ek avantajlar bu tür bir proje için daha uygun bir seçim olmasını sağlar.

Fabric.js'e alternatif var mı?

Evet, Fabric.js'e alternatif olarak Konva.js, Paper.js veya Pixi.js gibi kütüphaneler bulunmaktadır. Her birinin kendine özgü avantajları ve kullanım alanları vardır. Fabric.js, özellikle etkileşimli nesne manipülasyonu ve basit API'si nedeniyle bu tür bir "tasarım aracı" projesi için popüler ve uygun bir seçenektir.

Meme'leri sunucuda mı oluşturmalıyım?

Bu rehberde gösterilen yaklaşım, memeleri tamamen istemci tarafında (tarayıcıda) oluşturur ve indirir. Bu, sunucu maliyetlerini ortadan kaldırır ve gizlilik açısından avantajlıdır. Ancak, çok karmaşık görsel işlemler gerekiyorsa veya kullanıcıların memeleri sunucuda kaydetmesi gerekiyorsa, Next.js API rotaları veya bir Node.js backend kullanarak sunucu tarafında görsel işleme yapmak da bir seçenek olabilir.

Mobil uyumluluk nasıl sağlanır?

Mobil uyumluluk için duyarlı tasarım prensiplerini uygulamanız gerekir. CSS framework'leri (örneğin Tailwind CSS) veya kendi medya sorgularınızı kullanarak arayüz elemanlarının farklı ekran boyutlarına uyum sağlamasını sağlayabilirsiniz. Tuval boyutunu da dinamik olarak cihaz genişliğine göre ayarlamak önemlidir. Fabric.js'in kendisi mobil dokunmatik olayları destekler, bu da etkileşimlerin mobil cihazlarda da sorunsuz çalışmasına yardımcı olur.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık