{"id":36561,"date":"2025-12-19T22:40:55","date_gmt":"2025-12-19T19:40:55","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=36561"},"modified":"2025-12-19T22:40:55","modified_gmt":"2025-12-19T19:40:55","slug":"vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/","title":{"rendered":"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu"},"content":{"rendered":"<p><body><\/p>\n<h2>Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu<\/h2>\n<h2>Giri\u015f: Uluslararas\u0131la\u015fma (i18n) Nedir ve Neden \u00d6nemlidir?<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz k\u00fcresel dijital d\u00fcnyas\u0131nda, yaz\u0131l\u0131m uygulamalar\u0131n\u0131n farkl\u0131 dilleri ve k\u00fclt\u00fcrel tercihleri desteklemesi bir l\u00fcks olmaktan \u00e7\u0131k\u0131p temel bir gereksinim haline gelmi\u015ftir. \u0130\u015fte tam bu noktada uluslararas\u0131la\u015fma (internationalization &#8211; i18n) kavram\u0131 devreye girer. i18n, bir yaz\u0131l\u0131m uygulamas\u0131n\u0131n farkl\u0131 dilleri ve b\u00f6lgeleri destekleyecek \u015fekilde tasarlanmas\u0131 ve geli\u015ftirilmesi s\u00fcrecini ifade eder. &#8220;i18n&#8221; k\u0131saltmas\u0131, &#8220;internationalization&#8221; kelimesindeki &#8216;i&#8217; harfi ile &#8216;n&#8217; harfi aras\u0131nda 18 harf bulunmas\u0131ndan gelir. Bu s\u00fcre\u00e7, sadece metinlerin \u00e7evrilmesini de\u011fil, ayn\u0131 zamanda tarih, saat, say\u0131 formatlar\u0131, para birimleri ve hatta sa\u011fdan sola yaz\u0131m gibi k\u00fclt\u00fcrel farkl\u0131l\u0131klar\u0131n da dikkate al\u0131nmas\u0131n\u0131 kapsar.<\/p>\n<p>Uluslararas\u0131la\u015fman\u0131n yak\u0131n bir kuzeni ise yerelle\u015ftirme (localization &#8211; l10n) kavram\u0131d\u0131r. l10n, i18n s\u00fcreciyle haz\u0131rlanm\u0131\u015f bir uygulaman\u0131n belirli bir dil ve k\u00fclt\u00fcrel b\u00f6lgeye (locale) uyarlanmas\u0131 i\u015flemidir. Bu, \u00e7evirileri yapmak, k\u00fclt\u00fcrel olarak uygun g\u00f6rselleri se\u00e7mek ve b\u00f6lgesel standartlara g\u00f6re formatlar\u0131 ayarlamak gibi ad\u0131mlar\u0131 i\u00e7erir. K\u0131sacas\u0131, i18n uygulamay\u0131 k\u00fcresel pazara haz\u0131r hale getirirken, l10n bu haz\u0131rl\u0131\u011f\u0131 belirli pazarlara \u00f6zel hale getirir.<\/p>\n<h3>Neden i18n \u00d6nemlidir?<\/h3>\n<p>Uygulamalar\u0131n\u0131zda i18n kullanman\u0131n bir\u00e7ok \u00f6nemli avantaj\u0131 vard\u0131r:<\/p>\n<p>*   <strong>Geni\u015f Kitlelere Ula\u015f\u0131m:<\/strong> Uygulaman\u0131z\u0131 birden fazla dilde sunarak, dil bariyeri nedeniyle eri\u015femeyece\u011finiz milyonlarca potansiyel kullan\u0131c\u0131ya kap\u0131 aralars\u0131n\u0131z. Bu, pazar pay\u0131n\u0131z\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131rabilir.<br \/>\n*   <strong>Geli\u015fmi\u015f Kullan\u0131c\u0131 Deneyimi:<\/strong> Kullan\u0131c\u0131lar, kendi ana dillerinde bir uygulama kulland\u0131klar\u0131nda kendilerini daha rahat ve g\u00fcvende hissederler. Bu, uygulaman\u0131zla etkile\u015fimlerini art\u0131r\u0131r ve daha olumlu bir deneyim sunar.<br \/>\n*   <strong>Rekabet Avantaj\u0131:<\/strong> \u00d6zellikle ni\u015f pazarlarda, yerelle\u015ftirilmi\u015f bir uygulama sunmak, rakiplerinize kar\u015f\u0131 \u00f6nemli bir avantaj sa\u011flayabilir.<br \/>\n*   <strong>K\u00fclt\u00fcrel Hassasiyet:<\/strong> Farkl\u0131 k\u00fclt\u00fcrlerin normlar\u0131na ve beklentilerine sayg\u0131 g\u00f6stermek, marka itibar\u0131n\u0131z\u0131 g\u00fc\u00e7lendirir ve k\u00fcresel \u00e7apta daha kabul edilebilir bir imaj yarat\u0131r.<br \/>\n*   <strong>S\u00fcrd\u00fcr\u00fclebilirlik ve \u00d6l\u00e7eklenebilirlik:<\/strong> Uygulamay\u0131 ba\u015ftan i18n uyumlu hale getirmek, gelecekte yeni diller eklemeyi \u00e7ok daha kolay ve maliyetsiz hale getirir.<\/p>\n<p>Vue.js, modern ve reaktif kullan\u0131c\u0131 aray\u00fczleri olu\u015fturmak i\u00e7in pop\u00fcler bir JavaScript \u00e7er\u00e7evesidir. Vue ekosistemi, i18n entegrasyonunu kolayla\u015ft\u0131rmak i\u00e7in g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphane olan <code>vue-i18n<\/code>&#8216;i sunar. Bu makalede, <code>vue-i18n<\/code> k\u00fct\u00fcphanesini kullanarak Vue.js uygulamalar\u0131n\u0131za uluslararas\u0131la\u015fma yeteneklerini nas\u0131l entegre edece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h2>vue-i18n K\u00fct\u00fcphanesine Giri\u015f<\/h2>\n<p><code>vue-i18n<\/code>, Vue.js uygulamalar\u0131 i\u00e7in resmi olarak \u00f6nerilen ve en \u00e7ok kullan\u0131lan uluslararas\u0131la\u015fma k\u00fct\u00fcphanesidir. Geli\u015ftiricilere, \u00e7ok dilli uygulamalar olu\u015fturmak i\u00e7in kapsaml\u0131 ve kullan\u0131m\u0131 kolay bir API sunar.<\/p>\n<h3>vue-i18n&#8217;in Temel \u00d6zellikleri<\/h3>\n<p>*   <strong>Basit ve Sezgisel API:<\/strong> Mesaj \u00e7evirileri, parametre ekleme, \u00e7o\u011fulculuk, tarih ve say\u0131 formatlama gibi i\u015flemleri kolayla\u015ft\u0131ran temiz bir API&#8217;ye sahiptir.<br \/>\n*   <strong>Vue Entegrasyonu:<\/strong> Vue bile\u015fenleriyle sorunsuz bir \u015fekilde entegre olur. <code>$t<\/code>, <code>$tc<\/code>, <code>$d<\/code>, <code>$n<\/code> gibi global inject edilen y\u00f6ntemler ve <code><i18n><\/code> bile\u015feni arac\u0131l\u0131\u011f\u0131yla kolayca eri\u015filebilir.<br \/>\n*   <strong>Dinamik Dil De\u011fi\u015fimi:<\/strong> \u00c7al\u0131\u015fma zaman\u0131nda dil de\u011fi\u015ftirme yetene\u011fi sunar, b\u00f6ylece kullan\u0131c\u0131lar istedikleri zaman uygulama dilini de\u011fi\u015ftirebilirler.<br \/>\n*   <strong>\u00c7o\u011fulculuk Kurallar\u0131:<\/strong> Farkl\u0131 dillerin karma\u015f\u0131k \u00e7o\u011fulculuk kurallar\u0131n\u0131 (\u00f6rne\u011fin, \u0130ngilizce&#8217;de tekil\/\u00e7o\u011ful, Arap\u00e7a&#8217;da 6 farkl\u0131 form) destekler.<br \/>\n*   <strong>Tarih ve Say\u0131 Formatlama:<\/strong> Belirli bir dilin k\u00fclt\u00fcrel kurallar\u0131na g\u00f6re tarihleri, saatleri ve say\u0131lar\u0131 formatlama yetene\u011fi sa\u011flar.<br \/>\n*   <strong>Mod\u00fcler Yap\u0131:<\/strong> Dil dosyalar\u0131n\u0131 ayr\u0131 ayr\u0131 y\u00f6netmeye olanak tan\u0131r, bu da b\u00fcy\u00fck uygulamalarda organizasyonu kolayla\u015ft\u0131r\u0131r.<br \/>\n*   <strong>Lazy Loading (Tembel Y\u00fckleme) Deste\u011fi:<\/strong> Performans\u0131 art\u0131rmak i\u00e7in dil dosyalar\u0131n\u0131 yaln\u0131zca ihtiya\u00e7 duyuldu\u011funda y\u00fcklemeye olanak tan\u0131r.<\/p>\n<h3>Kurulum<\/h3>\n<p><code>vue-i18n<\/code>&#8216;i projenize eklemek olduk\u00e7a basittir. npm veya yarn kullanarak y\u00fckleyebilirsiniz:<\/p>\n<pre><code class=\"language-bash\"># npm ile\nnpm install vue-i18n@next\n\n<h2>yarn ile<\/h2>\nyarn add vue-i18n@next<\/code><\/pre>\n<p>Bu makale yaz\u0131ld\u0131\u011f\u0131 s\u0131rada <code>vue-i18n<\/code>&#8216;in 9.x s\u00fcr\u00fcm\u00fc (Vue 3 ile uyumlu) en g\u00fcncel s\u00fcr\u00fcmd\u00fcr. <code>@next<\/code> etiketiyle en son kararl\u0131 s\u00fcr\u00fcm\u00fc al\u0131rs\u0131n\u0131z. Vue 2 kullan\u0131yorsan\u0131z, <code>vue-i18n@8<\/code> s\u00fcr\u00fcm\u00fcn\u00fc kullanman\u0131z gerekir.<\/p>\n<h2>Temel Kullan\u0131m: Mesajlar\u0131 Tan\u0131mlama ve G\u00f6r\u00fcnt\u00fcleme<\/h2>\n<p><code>vue-i18n<\/code>&#8216;i bir Vue.js uygulamas\u0131nda kullanmaya ba\u015flamak i\u00e7in \u00f6ncelikle bir <code>i18n<\/code> \u00f6rne\u011fi olu\u015fturmam\u0131z ve bunu Vue uygulamam\u0131za entegre etmemiz gerekir.<\/p>\n<h3>i18n \u00d6rne\u011fi Olu\u015fturma<\/h3>\n<p>Genellikle, <code>src\/main.js<\/code> veya ayr\u0131 bir <code>i18n.js<\/code> dosyas\u0131nda <code>i18n<\/code> \u00f6rne\u011fini olu\u015ftururuz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/i18n.js\nimport { createI18n } from 'vue-i18n';\n\n\/\/ Dil mesajlar\u0131n\u0131 tan\u0131mlay\u0131n\nconst messages = {\n  en: {\n    message: {\n      hello: 'Hello world',\n      welcome: 'Welcome to our application!',\n      greeting: 'Good morning!',\n      farewell: 'Goodbye!'\n    }\n  },\n  tr: {\n    message: {\n      hello: 'Merhaba d\u00fcnya',\n      welcome: 'Uygulamam\u0131za ho\u015f geldiniz!',\n      greeting: 'G\u00fcnayd\u0131n!',\n      farewell: 'G\u00fcle g\u00fcle!'\n    }\n  }\n};\n\n\/\/ i18n \u00f6rne\u011fini olu\u015fturun\nconst i18n = createI18n({\n  locale: 'en', \/\/ Varsay\u0131lan dil\n  fallbackLocale: 'en', \/\/ Bir \u00e7eviri bulunamazsa kullan\u0131lacak yedek dil\n  messages, \/\/ Dil mesajlar\u0131\n  legacy: false, \/\/ Composition API ile uyumluluk i\u00e7in Vue 3'te gereklidir\n  globalInjection: true \/\/ Global $t, $tc, vb. kullan\u0131m\u0131n\u0131 etkinle\u015ftirir\n});\n\nexport default i18n;<\/code><\/pre>\n<p>Ard\u0131ndan, bu <code>i18n<\/code> \u00f6rne\u011fini Vue uygulamam\u0131za entegre etmeliyiz:<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/main.js\nimport { createApp } from 'vue';\nimport App from '.\/App.vue';\nimport i18n from '.\/i18n'; \/\/ i18n \u00f6rne\u011fini i\u00e7e aktar\u0131n\n\nconst app = createApp(App);\n\napp.use(i18n); \/\/ i18n eklentisini kullan\n\napp.mount('#app');<\/code><\/pre>\n<h3>Vue Bile\u015fenlerinde <code>this.$t()<\/code> Kullan\u0131m\u0131<\/h3>\n<p><code>i18n<\/code> \u00f6rne\u011fini Vue uygulamam\u0131za entegre ettikten sonra, herhangi bir bile\u015fen i\u00e7inde <code>this.$t()<\/code> y\u00f6ntemini kullanarak \u00e7evrilmi\u015f mesajlara eri\u015febiliriz. <code>globalInjection: true<\/code> ayar\u0131 sayesinde <code>$t<\/code> global olarak eri\u015filebilir hale gelir.<\/p>\n<pre><code class=\"language-vue\"><!-- src\/components\/HelloWorld.vue -->\n<template>\n  <div>\n    \n    <p>{{ $t('message.welcome') }}<\/p>\n    <button @click=\"changeLanguage('en')\">English<\/button>\n    <button @click=\"changeLanguage('tr')\">T\u00fcrk\u00e7e<\/button>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  name: 'HelloWorld',\n  methods: {\n    changeLanguage(lang) {\n      this.$i18n.locale = lang;\n    }\n  }\n};\n<\/script><\/code><\/pre>\n<p>Yukar\u0131daki \u00f6rnekte, <code>{{ $t('message.hello') }}<\/code> ifadesi, mevcut <code>locale<\/code>&#8216;e (dil) g\u00f6re <code>messages<\/code> objesindeki <code>message.hello<\/code> anahtar\u0131n\u0131n de\u011ferini d\u00f6nd\u00fcrecektir. E\u011fer mevcut dil &#8216;en&#8217; ise &#8220;Hello world&#8221;, &#8216;tr&#8217; ise &#8220;Merhaba d\u00fcnya&#8221; g\u00f6r\u00fcnt\u00fclenecektir.<\/p>\n<h3>Tek Dosya Bile\u015fenlerinde (<code>.vue<\/code>) <code><i18n><\/code> Blo\u011fu Kullan\u0131m\u0131<\/h3>\n<p>Bazen, belirli bir bile\u015fene \u00f6zg\u00fc \u00e7evirileriniz olabilir ve bunlar\u0131 global <code>messages<\/code> objesine eklemek istemeyebilirsiniz. <code>vue-i18n<\/code>, tek dosya bile\u015fenlerinde <code><i18n><\/code> \u00f6zel blo\u011fu arac\u0131l\u0131\u011f\u0131yla yerel \u00e7evirileri tan\u0131mlaman\u0131za olanak tan\u0131r.<\/p>\n<pre><code class=\"language-vue\"><!-- src\/components\/MyComponent.vue -->\n<template>\n  <div>\n    <h2>{{ $t('component.title') }}<\/h2>\n    <p>{{ $t('component.description') }}<\/p>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  name: 'MyComponent'\n};\n<\/script>\n\n<i18n>\n{\n  \"en\": {\n    \"component\": {\n      \"title\": \"My Local Component\",\n      \"description\": \"This is a description specific to this component.\"\n    }\n  },\n  \"tr\": {\n    \"component\": {\n      \"title\": \"Yerel Bile\u015fenim\",\n      \"description\": \"Bu, bu bile\u015fene \u00f6zg\u00fc bir a\u00e7\u0131klamad\u0131r.\"\n    }\n  }\n}\n<\/i18n><\/code><\/pre>\n<p>Bu y\u00f6ntem, bile\u015fenin \u00e7evirilerini do\u011frudan bile\u015fenin kendisiyle birlikte tutarak mod\u00fclerli\u011fi art\u0131r\u0131r ve b\u00fcy\u00fck uygulamalarda \u00e7eviri y\u00f6netimini kolayla\u015ft\u0131r\u0131r. Yerel \u00e7eviriler, global \u00e7evirileri ge\u00e7ersiz k\u0131labilir.<\/p>\n<h3>Mesaj Dosyas\u0131 Yap\u0131s\u0131<\/h3>\n<p>\u00c7eviri mesajlar\u0131n\u0131 ayr\u0131 JSON dosyalar\u0131nda tutmak, \u00f6zellikle b\u00fcy\u00fck projelerde daha iyi organizasyon sa\u011flar. Her dil i\u00e7in ayr\u0131 bir JSON dosyas\u0131 olu\u015fturmak yayg\u0131n bir yakla\u015f\u0131md\u0131r.<\/p>\n<pre><code class=\"language-\">src\/\n\u251c\u2500\u2500 locales\/\n\u2502   \u251c\u2500\u2500 en.json\n\u2502   \u2514\u2500\u2500 tr.json\n\u251c\u2500\u2500 App.vue\n\u251c\u2500\u2500 main.js\n\u2514\u2500\u2500 ...<\/code><\/pre>\n<p><strong><code>src\/locales\/en.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"message\": {\n    \"hello\": \"Hello world\",\n    \"welcome\": \"Welcome to our application!\",\n    \"greeting\": \"Good morning!\",\n    \"farewell\": \"Goodbye!\"\n  },\n  \"button\": {\n    \"submit\": \"Submit\",\n    \"cancel\": \"Cancel\"\n  }\n}<\/code><\/pre>\n<p><strong><code>src\/locales\/tr.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"message\": {\n    \"hello\": \"Merhaba d\u00fcnya\",\n    \"welcome\": \"Uygulamam\u0131za ho\u015f geldiniz!\",\n    \"greeting\": \"G\u00fcnayd\u0131n!\",\n    \"farewell\": \"G\u00fcle g\u00fcle!\"\n  },\n  \"button\": {\n    \"submit\": \"G\u00f6nder\",\n    \"cancel\": \"\u0130ptal\"\n  }\n}<\/code><\/pre>\n<p><strong><code>src\/i18n.js<\/code> (g\u00fcncellenmi\u015f):<\/strong><\/p>\n<pre><code class=\"language-javascript\">import { createI18n } from 'vue-i18n';\nimport en from '.\/locales\/en.json';\nimport tr from '.\/locales\/tr.json';\n\nconst i18n = createI18n({\n  locale: 'en',\n  fallbackLocale: 'en',\n  messages: {\n    en, \/\/ ES6 k\u0131sayolu: en: en\n    tr  \/\/ ES6 k\u0131sayolu: tr: tr\n  },\n  legacy: false,\n  globalInjection: true\n});\n\nexport default i18n;<\/code><\/pre>\n<p>Bu yap\u0131, \u00e7eviri dosyalar\u0131n\u0131 daha d\u00fczenli hale getirir ve y\u00f6netimi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h2>Dinamik Mesajlar ve Parametreler<\/h2>\n<p>\u00c7o\u011fu zaman, \u00e7eviri mesajlar\u0131n\u0131z\u0131n dinamik de\u011ferler i\u00e7ermesi gerekir. \u00d6rne\u011fin, &#8220;Merhaba, [kullan\u0131c\u0131 ad\u0131]!&#8221; veya &#8220;[\u00fcr\u00fcn say\u0131s\u0131] \u00fcr\u00fcn sepetinizde.&#8221; gibi ifadeler. <code>vue-i18n<\/code>, bu t\u00fcr dinamik de\u011ferleri mesajlara enjekte etmek i\u00e7in yer tutucular (placeholders) kullanman\u0131za olanak tan\u0131r.<\/p>\n<h3>Yer Tutucular<\/h3>\n<p>Mesajlar\u0131n\u0131zda s\u00fcsl\u00fc parantezler <code>{}<\/code> kullanarak yer tutucular tan\u0131mlayabilirsiniz. <code>this.$t()<\/code> y\u00f6ntemine ikinci bir arg\u00fcman olarak bir JavaScript objesi ge\u00e7irerek bu yer tutucular\u0131n de\u011ferlerini sa\u011flayabilirsiniz.<\/p>\n<p><strong><code>en.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"welcome_user\": \"Welcome, {username}!\",\n  \"item_count\": \"You have {count} items in your cart.\"\n}<\/code><\/pre>\n<p><strong><code>tr.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"welcome_user\": \"Ho\u015f geldiniz, {username}!\",\n  \"item_count\": \"Sepetinizde {count} adet \u00fcr\u00fcn var.\"\n}<\/code><\/pre>\n<p><strong>Vue Bile\u015feni:<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>{{ $t('welcome_user', { username: 'Alice' }) }}<\/p>\n    <p>{{ $t('item_count', { count: 5 }) }}<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>Bu, s\u0131ras\u0131yla &#8220;Welcome, Alice!&#8221; ve &#8220;Ho\u015f geldiniz, Alice!&#8221; gibi \u00e7\u0131kt\u0131lar \u00fcretecektir.<\/p>\n<h3>Say\u0131sal Yer Tutucular<\/h3>\n<p>Yer tutucular i\u00e7in say\u0131sal indeksler de kullanabilirsiniz. Bu, \u00f6zellikle s\u0131ral\u0131 parametreleriniz oldu\u011funda kullan\u0131\u015fl\u0131 olabilir.<\/p>\n<p><strong><code>en.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"greeting_full\": \"Hello {0}, your ID is {1}.\"\n}<\/code><\/pre>\n<p><strong><code>tr.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"greeting_full\": \"Merhaba {0}, kimli\u011finiz {1}.\"\n}<\/code><\/pre>\n<p><strong>Vue Bile\u015feni:<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>{{ $t('greeting_full', ['Bob', 12345]) }}<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>Bu, &#8220;Hello Bob, your ID is 12345.&#8221; \u00e7\u0131kt\u0131s\u0131n\u0131 verecektir.<\/p>\n<h3>HTML \u0130\u00e7eri\u011fi ile Mesajlar<\/h3>\n<p>Bazen \u00e7eviri mesajlar\u0131n\u0131z\u0131n i\u00e7inde HTML etiketleri bulunabilir. <code>v-html<\/code> direktifini kullanarak bu HTML i\u00e7eri\u011fini g\u00fcvenli bir \u015fekilde render edebilirsiniz. Ancak, <strong>XSS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 dikkatli olmal\u0131s\u0131n\u0131z<\/strong> ve yaln\u0131zca g\u00fcvendi\u011finiz kaynaklardan gelen HTML&#8217;i kullanmal\u0131s\u0131n\u0131z.<\/p>\n<p><strong><code>en.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"html_message\": \"Please visit our <b>contact page<\/b> for more information.\"\n}<\/code><\/pre>\n<p><strong><code>tr.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"html_message\": \"Daha fazla bilgi i\u00e7in l\u00fctfen <b>ileti\u015fim sayfam\u0131z\u0131<\/b> ziyaret edin.\"\n}<\/code><\/pre>\n<p><strong>Vue Bile\u015feni:<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p v-html=\"$t('html_message')\"><\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>Bu, &#8220;Please visit our <strong>contact page<\/strong> for more information.&#8221; \u015feklinde bir \u00e7\u0131kt\u0131 \u00fcretecektir, &#8220;contact page&#8221; k\u0131sm\u0131 kal\u0131n yaz\u0131l\u0131 olacakt\u0131r.<\/p>\n<h2>\u00c7o\u011fulculuk (Pluralization)<\/h2>\n<p>\u00c7o\u011fulculuk, i18n&#8217;in en karma\u015f\u0131k y\u00f6nlerinden biridir \u00e7\u00fcnk\u00fc diller aras\u0131nda b\u00fcy\u00fck farkl\u0131l\u0131klar g\u00f6sterir. \u0130ngilizce&#8217;de genellikle tekil ve \u00e7o\u011ful olmak \u00fczere iki form varken (0 hari\u00e7), baz\u0131 dillerde (\u00f6rne\u011fin Arap\u00e7a, Leh\u00e7e, Rus\u00e7a) \u00e7ok daha fazla \u00e7o\u011ful form bulunabilir. <code>vue-i18n<\/code>, bu karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netmek i\u00e7in <code>this.$tc()<\/code> (translate plural) y\u00f6ntemini sunar.<\/p>\n<h3>\u00c7o\u011fulculuk Kurallar\u0131<\/h3>\n<p><code>vue-i18n<\/code>, CLDR (Common Locale Data Repository) \u00e7o\u011fulculuk kurallar\u0131n\u0131 takip eder. Bu kurallar, bir say\u0131n\u0131n hangi \u00e7o\u011ful kategoriye (zero, one, two, few, many, other) girdi\u011fini belirler.<\/p>\n<p>Mesajlarda \u00e7o\u011ful formlar\u0131, dikey \u00e7izgi <code>|<\/code> ile ay\u0131rarak tan\u0131mlars\u0131n\u0131z.<\/p>\n<p><strong><code>en.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"apple\": \"no apples | one apple | {count} apples\",\n  \"car\": \"{count} car | {count} cars\"\n}<\/code><\/pre>\n<p><strong><code>tr.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"apple\": \"hi\u00e7 elma yok | bir elma | {count} elma\",\n  \"car\": \"{count} araba\"\n}<\/code><\/pre>\n<p><strong>Vue Bile\u015feni:<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>{{ $tc('apple', 0) }}<\/p> <!-- no apples \/ hi\u00e7 elma yok -->\n    <p>{{ $tc('apple', 1) }}<\/p> <!-- one apple \/ bir elma -->\n    <p>{{ $tc('apple', 5) }}<\/p> <!-- 5 apples \/ 5 elma -->\n    <p>{{ $tc('car', 1) }}<\/p> <!-- 1 car \/ 1 araba -->\n    <p>{{ $tc('car', 3) }}<\/p> <!-- 3 cars \/ 3 araba -->\n  <\/div>\n<\/template><\/code><\/pre>\n<p><code>$tc()<\/code> y\u00f6nteminin ilk arg\u00fcman\u0131 \u00e7eviri anahtar\u0131, ikinci arg\u00fcman\u0131 ise \u00e7o\u011ful formunu belirlemek i\u00e7in kullan\u0131lacak say\u0131d\u0131r. \u00dc\u00e7\u00fcnc\u00fc arg\u00fcman olarak bir parametre objesi de ge\u00e7irebilirsiniz:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>{{ $tc('apple', 5, { count: 5 }) }}<\/p> <!-- 5 apples \/ 5 elma -->\n  <\/div>\n<\/template><\/code><\/pre>\n<p><code>{count}<\/code> parametresi, <code>$tc<\/code>&#8216;ye ge\u00e7irilen say\u0131sal de\u011ferle otomatik olarak doldurulur, ancak a\u00e7\u0131k\u00e7a belirtmek daha okunabilir olabilir.<\/p>\n<p>T\u00fcrk\u00e7e gibi dillerde genellikle sadece tekil ve \u00e7o\u011ful form bulunur (s\u0131f\u0131r i\u00e7in ayr\u0131 bir form olmaks\u0131z\u0131n). Bu durumda, ilk form tekil (1 i\u00e7in), ikinci form ise di\u011fer t\u00fcm say\u0131lar i\u00e7indir.<\/p>\n<h2>Tarih ve Saat Formatlama<\/h2>\n<p><code>vue-i18n<\/code>, <code>this.$d()<\/code> (translate date) y\u00f6ntemi ile tarih ve saat de\u011ferlerini belirli bir dilin k\u00fclt\u00fcrel kurallar\u0131na g\u00f6re formatlaman\u0131za olanak tan\u0131r. Bunun i\u00e7in <code>datetimeFormats<\/code> se\u00e7ene\u011fini <code>createI18n<\/code> \u00f6rne\u011fine eklemeniz gerekir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/i18n.js\nimport { createI18n } from 'vue-i18n';\nimport en from '.\/locales\/en.json';\nimport tr from '.\/locales\/tr.json';\n\nconst datetimeFormats = {\n  en: {\n    short: {\n      year: 'numeric', month: 'short', day: 'numeric'\n    },\n    long: {\n      year: 'numeric', month: 'long', day: 'numeric',\n      hour: 'numeric', minute: 'numeric', second: 'numeric'\n    }\n  },\n  tr: {\n    short: {\n      year: 'numeric', month: 'short', day: 'numeric'\n    },\n    long: {\n      year: 'numeric', month: 'long', day: 'numeric',\n      hour: 'numeric', minute: 'numeric', second: 'numeric',\n      hour12: false \/\/ 24 saat format\u0131 i\u00e7in\n    }\n  }\n};\n\nconst i18n = createI18n({\n  locale: 'en',\n  fallbackLocale: 'en',\n  messages: { en, tr },\n  datetimeFormats, \/\/ Tarih formatlar\u0131n\u0131 ekleyin\n  legacy: false,\n  globalInjection: true\n});\n\nexport default i18n;<\/code><\/pre>\n<p><code>datetimeFormats<\/code> objesi, her dil i\u00e7in farkl\u0131 format \u015fablonlar\u0131 tan\u0131mlaman\u0131za olanak tan\u0131r. Bu \u015fablonlar, <code>Intl.DateTimeFormat<\/code> API&#8217;sinin se\u00e7eneklerini kullan\u0131r.<\/p>\n<p><strong>Vue Bile\u015feni:<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>Short Date (EN): {{ $d(new Date(), 'short', 'en') }}<\/p>\n    <p>Long Date (EN): {{ $d(new Date(), 'long', 'en') }}<\/p>\n    <p>Short Date (TR): {{ $d(new Date(), 'short', 'tr') }}<\/p>\n    <p>Long Date (TR): {{ $d(new Date(), 'long', 'tr') }}<\/p>\n    <p>Current Date (Locale Specific): {{ $d(new Date(), 'long') }}<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p><code>$d()<\/code> y\u00f6nteminin ilk arg\u00fcman\u0131 formatlanacak <code>Date<\/code> objesi veya say\u0131sal zaman damgas\u0131d\u0131r. \u0130kinci arg\u00fcman format \u015fablonunun ad\u0131d\u0131r (\u00f6rne\u011fin &#8216;short&#8217;, &#8216;long&#8217;). \u00dc\u00e7\u00fcnc\u00fc arg\u00fcman ise iste\u011fe ba\u011fl\u0131 olarak kullan\u0131lacak dildir; belirtilmezse mevcut <code>locale<\/code> kullan\u0131l\u0131r.<\/p>\n<h2>Say\u0131 Formatlama<\/h2>\n<p>T\u0131pk\u0131 tarih ve saat gibi, say\u0131lar\u0131 da farkl\u0131 dillerin ve b\u00f6lgelerin kurallar\u0131na g\u00f6re formatlamak \u00f6nemlidir (ondal\u0131k ay\u0131r\u0131c\u0131lar, binlik ay\u0131r\u0131c\u0131lar, para birimi sembolleri vb.). <code>vue-i18n<\/code>, <code>this.$n()<\/code> (translate number) y\u00f6ntemi ve <code>numberFormats<\/code> se\u00e7ene\u011fi ile bu yetene\u011fi sunar.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/i18n.js\nimport { createI18n } from 'vue-i18n';\nimport en from '.\/locales\/en.json';\nimport tr from '.\/locales\/tr.json';\n\nconst numberFormats = {\n  en: {\n    currency: {\n      style: 'currency', currency: 'USD', notation: 'standard'\n    },\n    decimal: {\n      style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2\n    },\n    percent: {\n      style: 'percent', useGrouping: false\n    }\n  },\n  tr: {\n    currency: {\n      style: 'currency', currency: 'TRY', notation: 'standard'\n    },\n    decimal: {\n      style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2\n    },\n    percent: {\n      style: 'percent', useGrouping: false\n    }\n  }\n};\n\nconst i18n = createI18n({\n  locale: 'en',\n  fallbackLocale: 'en',\n  messages: { en, tr },\n  datetimeFormats,\n  numberFormats, \/\/ Say\u0131 formatlar\u0131n\u0131 ekleyin\n  legacy: false,\n  globalInjection: true\n});\n\nexport default i18n;<\/code><\/pre>\n<p><code>numberFormats<\/code> objesi, her dil i\u00e7in farkl\u0131 format \u015fablonlar\u0131 tan\u0131mlaman\u0131za olanak tan\u0131r. Bu \u015fablonlar, <code>Intl.NumberFormat<\/code> API&#8217;sinin se\u00e7eneklerini kullan\u0131r.<\/p>\n<p><strong>Vue Bile\u015feni:<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>Currency (EN): {{ $n(12345.67, 'currency', 'en') }}<\/p> <!-- $12,345.67 -->\n    <p>Decimal (EN): {{ $n(12345.6789, 'decimal', 'en') }}<\/p> <!-- 12,345.68 -->\n    <p>Percent (EN): {{ $n(0.75, 'percent', 'en') }}<\/p> <!-- 75% -->\n\n    <p>Currency (TR): {{ $n(12345.67, 'currency', 'tr') }}<\/p> <!-- \u20ba12.345,67 -->\n    <p>Decimal (TR): {{ $n(12345.6789, 'decimal', 'tr') }}<\/p> <!-- 12.345,68 -->\n    <p>Percent (TR): {{ $n(0.75, 'percent', 'tr') }}<\/p> <!-- %75 -->\n\n    <p>Current Locale Currency: {{ $n(987.65, 'currency') }}<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p><code>$n()<\/code> y\u00f6nteminin ilk arg\u00fcman\u0131 formatlanacak say\u0131d\u0131r. \u0130kinci arg\u00fcman format \u015fablonunun ad\u0131d\u0131r (\u00f6rne\u011fin &#8216;currency&#8217;, &#8216;decimal&#8217;, &#8216;percent&#8217;). \u00dc\u00e7\u00fcnc\u00fc arg\u00fcman ise iste\u011fe ba\u011fl\u0131 olarak kullan\u0131lacak dildir; belirtilmezse mevcut <code>locale<\/code> kullan\u0131l\u0131r.<\/p>\n<h2>Dil De\u011fi\u015ftirme Mekanizmalar\u0131<\/h2>\n<p>Kullan\u0131c\u0131lar\u0131n uygulama dilini kolayca de\u011fi\u015ftirebilmeleri, i18n&#8217;in temel bir par\u00e7as\u0131d\u0131r. <code>vue-i18n<\/code>, <code>i18n.locale<\/code> \u00f6zelli\u011fini g\u00fcncelleyerek bu i\u015flemi son derece basit hale getirir.<\/p>\n<h3>Kullan\u0131c\u0131 Aray\u00fcz\u00fcnden Dil De\u011fi\u015ftirme<\/h3>\n<p>Genellikle, bir dil se\u00e7ici (dropdown men\u00fc) veya bir dizi d\u00fc\u011fme arac\u0131l\u0131\u011f\u0131yla dil de\u011fi\u015ftirme i\u015flevi sunulur.<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>{{ $t('message.greeting') }}<\/p>\n    <select v-model=\"$i18n.locale\">\n      <option value=\"en\">English<\/option>\n      <option value=\"tr\">T\u00fcrk\u00e7e<\/option>\n      <option value=\"es\">Espa\u00f1ol<\/option>\n    <\/select>\n    <!-- Veya d\u00fc\u011fmelerle -->\n    <button @click=\"setLocale('en')\">English<\/button>\n    <button @click=\"setLocale('tr')\">T\u00fcrk\u00e7e<\/button>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  methods: {\n    setLocale(locale) {\n      this.$i18n.locale = locale;\n    }\n  }\n};\n<\/script><\/code><\/pre>\n<p><code>this.$i18n.locale<\/code> \u00f6zelli\u011fini de\u011fi\u015ftirdi\u011finizde, <code>vue-i18n<\/code> otomatik olarak t\u00fcm bile\u015fenlerdeki \u00e7evirileri yeni dile g\u00f6re g\u00fcncelleyecektir.<\/p>\n<h3>Dil Tercihini Saklama<\/h3>\n<p>Kullan\u0131c\u0131n\u0131n se\u00e7ti\u011fi dilin uygulama kapat\u0131ld\u0131\u011f\u0131nda veya sayfa yenilendi\u011finde kaybolmamas\u0131 \u00f6nemlidir. Bu tercihi <code>localStorage<\/code> veya \u00e7erezlerde saklayabilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/i18n.js (g\u00fcncellenmi\u015f)\nimport { createI18n } from 'vue-i18n';\nimport en from '.\/locales\/en.json';\nimport tr from '.\/locales\/tr.json';\n\n\/\/ Kullan\u0131c\u0131n\u0131n tercih etti\u011fi dili localStorage'dan al\u0131n\nconst savedLocale = localStorage.getItem('user-locale') || 'en';\n\nconst i18n = createI18n({\n  locale: savedLocale, \/\/ Varsay\u0131lan dili kay\u0131tl\u0131 dile ayarlay\u0131n\n  fallbackLocale: 'en',\n  messages: { en, tr },\n  datetimeFormats,\n  numberFormats,\n  legacy: false,\n  globalInjection: true\n});\n\nexport default i18n;<\/code><\/pre>\n<p><strong>Vue Bile\u015feni (Dil de\u011fi\u015fimini kaydetmek i\u00e7in):<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>{{ $t('message.greeting') }}<\/p>\n    <select :value=\"$i18n.locale\" @change=\"changeLanguage\">\n      <option value=\"en\">English<\/option>\n      <option value=\"tr\">T\u00fcrk\u00e7e<\/option>\n    <\/select>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  methods: {\n    changeLanguage(event) {\n      const newLocale = event.target.value;\n      this.$i18n.locale = newLocale;\n      localStorage.setItem('user-locale', newLocale); \/\/ Dili localStorage'a kaydedin\n    }\n  }\n};\n<\/script><\/code><\/pre>\n<p>Bu yakla\u015f\u0131m, kullan\u0131c\u0131n\u0131n dil tercihinin oturumlar aras\u0131nda kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>Geli\u015fmi\u015f Konular ve En \u0130yi Uygulamalar<\/h2>\n<p><code>vue-i18n<\/code>&#8216;i temel d\u00fczeyde kullanmay\u0131 \u00f6\u011frendikten sonra, uygulaman\u0131z\u0131n performans\u0131n\u0131 ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rmak i\u00e7in baz\u0131 geli\u015fmi\u015f konular\u0131 ve en iyi uygulamalar\u0131 g\u00f6z \u00f6n\u00fcnde bulundurmak \u00f6nemlidir.<\/p>\n<h3>Lazy Loading (Tembel Y\u00fckleme) ile Dil Dosyalar\u0131n\u0131 Y\u00fckleme<\/h3>\n<p>Uygulaman\u0131z \u00e7ok say\u0131da dili destekliyorsa ve her dilin \u00e7eviri dosyalar\u0131 b\u00fcy\u00fckse, t\u00fcm dil dosyalar\u0131n\u0131 ba\u015flang\u0131\u00e7ta y\u00fcklemek uygulaman\u0131z\u0131n ba\u015flang\u0131\u00e7 s\u00fcresini (initial load time) art\u0131rabilir. Lazy loading, yaln\u0131zca ihtiya\u00e7 duyulan dil dosyas\u0131n\u0131 y\u00fckleyerek bu sorunu \u00e7\u00f6zer. Bu, genellikle Webpack gibi mod\u00fcl paketleyicilerinin dinamik <code>import()<\/code> fonksiyonu ile yap\u0131l\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/i18n.js\nimport { createI18n } from 'vue-i18n';\n\n\/\/ Varsay\u0131lan ve yedek dili belirle\nconst defaultLocale = localStorage.getItem('user-locale') || 'en';\n\nconst i18n = createI18n({\n  locale: defaultLocale,\n  fallbackLocale: 'en',\n  messages: {}, \/\/ Ba\u015flang\u0131\u00e7ta bo\u015f mesajlar\n  legacy: false,\n  globalInjection: true\n});\n\n\/\/ Dinamik olarak dil y\u00fckleme fonksiyonu\nexport async function loadLocaleMessages(locale) {\n  if (!i18n.global.availableLocales.includes(locale)) {\n    const messages = await import(<code>.\/locales\/${locale}.json<\/code>);\n    i18n.global.setLocaleMessage(locale, messages.default);\n  }\n  return Promise.resolve();\n}\n\n\/\/ Uygulama ba\u015flang\u0131c\u0131nda varsay\u0131lan dili y\u00fckle\nloadLocaleMessages(defaultLocale);\n\nexport default i18n;<\/code><\/pre>\n<p><strong><code>main.js<\/code> i\u00e7inde:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/main.js\nimport { createApp } from 'vue';\nimport App from '.\/App.vue';\nimport i18n, { loadLocaleMessages } from '.\/i18n';\n\nconst app = createApp(App);\n\napp.use(i18n);\n\n\/\/ \u0130lk y\u00fcklemede, mevcut dili y\u00fckledi\u011fimizden emin olun\n\/\/ i18n.global.locale.value, Composition API'de reaktif bir ref'tir.\n\/\/ Options API'de this.$i18n.locale kullan\u0131l\u0131r.\nloadLocaleMessages(i18n.global.locale.value).then(() => {\n  app.mount('#app');\n});<\/code><\/pre>\n<p><strong>Vue Bile\u015feni (Dil de\u011fi\u015ftirirken lazy loading):<\/strong><\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <p>{{ $t('message.greeting') }}<\/p>\n    <select :value=\"$i18n.locale\" @change=\"changeLanguage\">\n      <option value=\"en\">English<\/option>\n      <option value=\"tr\">T\u00fcrk\u00e7e<\/option>\n      <option value=\"es\">Espa\u00f1ol<\/option>\n    <\/select>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  methods: {\n    async changeLanguage(event) {\n      const newLocale = event.target.value;\n      await this.$i18n.global.loadLocaleMessages(newLocale); \/\/ Yeni dili y\u00fckle\n      this.$i18n.locale = newLocale;\n      localStorage.setItem('user-locale', newLocale);\n    }\n  }\n};\n<\/script><\/code><\/pre>\n<p>Bu yap\u0131, kullan\u0131c\u0131 bir dil se\u00e7ti\u011finde veya uygulama ilk kez y\u00fcklendi\u011finde yaln\u0131zca ilgili dil dosyas\u0131n\u0131n indirilmesini sa\u011flar, bu da uygulaman\u0131n ba\u015flang\u0131\u00e7 performans\u0131n\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<h3>Global i18n Instance vs. Local i18n Instance<\/h3>\n<p><code>vue-i18n<\/code>&#8216;i genellikle global bir \u00f6rnek olarak (<code>app.use(i18n)<\/code>) kullan\u0131r\u0131z. Bu, <code>$t<\/code>, <code>$tc<\/code> gibi y\u00f6ntemlere uygulaman\u0131n her yerinden eri\u015filebilmesini sa\u011flar. Ancak, baz\u0131 \u00f6zel durumlarda (\u00f6rne\u011fin, izole edilmi\u015f bir widget veya \u00e7ok \u00f6zel \u00e7eviri ihtiya\u00e7lar\u0131 olan bir bile\u015fen i\u00e7in) yerel bir <code>i18n<\/code> \u00f6rne\u011fi olu\u015fturmak isteyebilirsiniz.<\/p>\n<p>Yerel bir <code>i18n<\/code> \u00f6rne\u011fi olu\u015fturmak i\u00e7in, bile\u015fenin <code>i18n<\/code> se\u00e7ene\u011fini kullanabilirsiniz:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <h3>{{ $t('local_message') }}<\/h3>\n  <\/div>\n<\/template>\n\n<script>\nexport default {\n  name: 'LocalI18nComponent',\n  i18n: {\n    messages: {\n      en: {\n        local_message: 'This message is local to this component.'\n      },\n      tr: {\n        local_message: 'Bu mesaj bu bile\u015fene \u00f6zeldir.'\n      }\n    }\n  }\n};\n<\/script><\/code><\/pre>\n<p>Bu y\u00f6ntem, bile\u015fene \u00f6zg\u00fc \u00e7evirileri global kapsam\u0131 kirletmeden y\u00f6netmek i\u00e7in kullan\u0131\u015fl\u0131d\u0131r. Ancak \u00e7o\u011fu durumda global bir <code>i18n<\/code> \u00f6rne\u011fi ve <code><i18n><\/code> bloklar\u0131 yeterlidir.<\/p>\n<h3>Vue Router ile Entegrasyon<\/h3>\n<p>Uygulaman\u0131z\u0131n URL&#8217;sinde dil bilgisini bulundurmak (\u00f6rne\u011fin, <code>\/en\/about<\/code> veya <code>\/tr\/hakkinda<\/code>), SEO i\u00e7in ve kullan\u0131c\u0131lar\u0131n belirli bir dildeki i\u00e7eri\u011fi do\u011frudan payla\u015fabilmesi i\u00e7in faydal\u0131 olabilir. Vue Router ile <code>vue-i18n<\/code>&#8216;i entegre etmek i\u00e7in, rota tan\u0131m\u0131n\u0131za bir dil parametresi ekleyebilirsiniz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/router\/index.js\nimport { createRouter, createWebHistory } from 'vue-router';\nimport i18n from '..\/i18n';\nimport Home from '..\/views\/Home.vue';\nimport About from '..\/views\/About.vue';\n\nconst routes = [\n  {\n    path: '\/:locale', \/\/ Dil parametresi\n    beforeEnter: (to, from, next) => {\n      const locale = to.params.locale;\n      \/\/ Desteklenen diller listesini kontrol et\n      const supportedLocales = i18n.global.availableLocales;\n      if (!supportedLocales.includes(locale)) {\n        \/\/ Desteklenmeyen bir dilse varsay\u0131lan dile y\u00f6nlendir\n        return next(<code>\/${i18n.global.fallbackLocale}<\/code>);\n      }\n      \/\/ Dili ayarla\n      i18n.global.locale.value = locale;\n      return next();\n    },\n    children: [\n      {\n        path: '',\n        name: 'Home',\n        component: Home\n      },\n      {\n        path: 'about',\n        name: 'About',\n        component: About\n      }\n    ]\n  },\n  {\n    \/\/ Varsay\u0131lan olarak dil parametresi olmayan rotalar\u0131 varsay\u0131lan dile y\u00f6nlendir\n    path: '\/:pathMatch(.<em>)<\/em>',\n    redirect: <code>\/${i18n.global.locale.value}<\/code>\n  }\n];\n\nconst router = createRouter({\n  history: createWebHistory(),\n  routes\n});\n\nexport default router;<\/code><\/pre>\n<p>Bu yap\u0131, URL&#8217;deki dil parametresine g\u00f6re uygulaman\u0131n dilini otomatik olarak ayarlar. Ayr\u0131ca, <code><router-link><\/code> kullan\u0131rken dil parametresini de belirtmeniz gerekir:<\/p>\n<pre><code class=\"language-vue\"><template>\n  <div>\n    <router-link :to=\"{ name: 'Home', params: { locale: $i18n.locale } }\">Home<\/router-link> |\n    <router-link :to=\"{ name: 'About', params: { locale: $i18n.locale } }\">About<\/router-link>\n  <\/div>\n<\/template><\/code><\/pre>\n<h3>SEO ve i18n<\/h3>\n<p>\u00c7ok dilli uygulamalar i\u00e7in SEO&#8217;yu optimize etmek, arama motorlar\u0131n\u0131n i\u00e7eri\u011finizin farkl\u0131 dil ve b\u00f6lge s\u00fcr\u00fcmlerini anlamas\u0131na yard\u0131mc\u0131 olmak i\u00e7in kritik \u00f6neme sahiptir. <code>hreflang<\/code> etiketleri bu konuda en yayg\u0131n kullan\u0131lan y\u00f6ntemdir. Bu etiketler, bir sayfan\u0131n alternatif dil s\u00fcr\u00fcmlerini belirtir.<\/p>\n<p>\u00d6rne\u011fin, <code>index.html<\/code> dosyan\u0131z\u0131n <code><head><\/code> b\u00f6l\u00fcm\u00fcne a\u015fa\u011f\u0131daki gibi etiketler ekleyebilirsiniz:<\/p>\n<pre><code class=\"language-html\"><link rel=\"alternate\" hreflang=\"en\" href=\"https:\/\/example.com\/en\/page\" \/>\n<link rel=\"alternate\" hreflang=\"tr\" href=\"https:\/\/example.com\/tr\/page\" \/>\n<link rel=\"alternate\" hreflang=\"es\" href=\"https:\/\/example.com\/es\/page\" \/>\n<link rel=\"alternate\" hreflang=\"x-default\" href=\"https:\/\/example.com\/en\/page\" \/><\/code><\/pre>\n<p>Vue uygulamalar\u0131nda, bu etiketleri dinamik olarak y\u00f6netmek i\u00e7in <code>vue-meta<\/code> veya <code>vue-head<\/code> gibi k\u00fct\u00fcphaneleri kullanabilirsiniz.<\/p>\n<h3>Test Etme<\/h3>\n<p>i18n entegrasyonunu test etmek, \u00e7evirilerin do\u011fru y\u00fcklendi\u011finden, dinamik mesajlar\u0131n do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve dil de\u011fi\u015ftirme i\u015flevinin sorunsuz oldu\u011fundan emin olmak i\u00e7in \u00f6nemlidir. Birim testlerinde, <code>vue-i18n<\/code> \u00f6rne\u011fini mock&#8217;layabilir ve <code>$t<\/code>, <code>$tc<\/code> gibi y\u00f6ntemlerin beklenen \u00e7\u0131kt\u0131lar\u0131 d\u00f6nd\u00fcr\u00fcp d\u00f6nd\u00fcrmedi\u011fini kontrol edebilirsiniz. E2E (u\u00e7tan uca) testlerinde ise, farkl\u0131 dilleri se\u00e7erek ve uygulaman\u0131n t\u00fcm \u00e7evirilerinin do\u011fru g\u00f6r\u00fcnt\u00fclendi\u011fini do\u011frulayarak ger\u00e7ek kullan\u0131c\u0131 senaryolar\u0131n\u0131 test edebilirsiniz.<\/p>\n<h3>Bak\u0131m ve Y\u00f6netim<\/h3>\n<p>\u00c7eviri dosyalar\u0131n\u0131n zamanla b\u00fcy\u00fcyebilece\u011fi ve y\u00f6netilmesi zorla\u015fabilece\u011fi unutulmamal\u0131d\u0131r.<br \/>\n*   <strong>Anahtar \u0130simlendirme:<\/strong> Anlaml\u0131 ve tutarl\u0131 anahtar isimleri kullan\u0131n (\u00f6rne\u011fin, <code>user.profile.name<\/code>, <code>button.submit<\/code>).<br \/>\n*   <strong>\u00c7eviri Ara\u00e7lar\u0131:<\/strong> B\u00fcy\u00fck projeler i\u00e7in, \u00e7eviri y\u00f6netim sistemleri (TMS) veya platformlar\u0131 (Transifex, Lokalise, Crowdin) kullanmay\u0131 d\u00fc\u015f\u00fcn\u00fcn. Bu ara\u00e7lar, \u00e7eviri s\u00fcrecini kolayla\u015ft\u0131r\u0131r, \u00e7evirmenlerle i\u015fbirli\u011fini sa\u011flar ve tutarl\u0131l\u0131\u011f\u0131 art\u0131r\u0131r.<br \/>\n*   <strong>Eksik \u00c7evirileri Y\u00f6netme:<\/strong> <code>fallbackLocale<\/code> ayar\u0131, eksik \u00e7eviriler durumunda yedek bir dil sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir. Ayr\u0131ca, geli\u015ftirme ortam\u0131nda eksik \u00e7evirileri tespit etmek i\u00e7in uyar\u0131lar veya \u00f6zel hata i\u015fleyicileri kullanabilirsiniz.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Vue.js uygulamalar\u0131nda uluslararas\u0131la\u015fma (i18n) entegrasyonu, uygulaman\u0131z\u0131n k\u00fcresel pazarda rekabet\u00e7i olmas\u0131n\u0131 sa\u011flayan ve kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131ran kritik bir ad\u0131md\u0131r. <code>vue-i18n<\/code> k\u00fct\u00fcphanesi, Vue ekosistemindeki en g\u00fc\u00e7l\u00fc ve esnek i18n \u00e7\u00f6z\u00fcmlerinden biridir.<\/p>\n<p>Bu makalede, <code>vue-i18n<\/code>&#8216;i projenize nas\u0131l kuraca\u011f\u0131n\u0131z\u0131, temel mesaj \u00e7evirilerinden dinamik parametrelere, \u00e7o\u011fulculuktan tarih ve say\u0131 formatlamaya kadar \u00e7e\u015fitli kullan\u0131m senaryolar\u0131n\u0131 ele ald\u0131k. Ayr\u0131ca, dil de\u011fi\u015ftirme mekanizmalar\u0131, lazy loading ile performans optimizasyonu, Vue Router ile entegrasyon, SEO ve en iyi bak\u0131m uygulamalar\u0131 gibi geli\u015fmi\u015f konulara da de\u011findik.<\/p>\n<p><code>vue-i18n<\/code>&#8216;in sundu\u011fu kapsaml\u0131 \u00f6zellikler sayesinde, uygulaman\u0131z\u0131 farkl\u0131 dillerde ve k\u00fclt\u00fcrlerde sorunsuz bir \u015fekilde sunabilir, d\u00fcnya \u00e7ap\u0131ndaki kullan\u0131c\u0131 taban\u0131n\u0131za ula\u015farak onlar\u0131n kendi dillerinde bir deneyim ya\u015famas\u0131n\u0131 sa\u011flayabilirsiniz. Bu, sadece teknik bir gereklilik de\u011fil, ayn\u0131 zamanda kullan\u0131c\u0131lar\u0131n\u0131za de\u011fer verdi\u011finizi g\u00f6steren stratejik bir yat\u0131r\u0131md\u0131r. Uygulaman\u0131z\u0131 uluslararas\u0131la\u015ft\u0131rmak i\u00e7in <code>vue-i18n<\/code>&#8216;i kullanmaya ba\u015flamak, k\u00fcresel bir ba\u015far\u0131ya giden yolda ataca\u011f\u0131n\u0131z \u00f6nemli bir ad\u0131md\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu\nGiri\u015f: Uluslararas\u0131la\u015fma (i18n) Nedir ve Neden \u00d6nemlidir?\nG\u00fcn\u00fcm\u00fc","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1402],"tags":[],"class_list":{"0":"post-36561","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-vue","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu\" \/>\n<meta property=\"og:description\" content=\"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu Giri\u015f: Uluslararas\u0131la\u015fma (i18n) Nedir ve Neden \u00d6nemlidir? G\u00fcn\u00fcm\u00fc\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-19T19:40:55+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu\",\"datePublished\":\"2025-12-19T19:40:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/\"},\"wordCount\":2659,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Vue\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/\",\"name\":\"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-19T19:40:55+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/","og_locale":"tr_TR","og_type":"article","og_title":"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu","og_description":"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu Giri\u015f: Uluslararas\u0131la\u015fma (i18n) Nedir ve Neden \u00d6nemlidir? G\u00fcn\u00fcm\u00fc","og_url":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-19T19:40:55+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu","datePublished":"2025-12-19T19:40:55+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/"},"wordCount":2659,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Vue"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/","url":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/","name":"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-19T19:40:55+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/vue-js-uygulamalarinda-vue-i18n-ile-uluslararasilasma-i18n-entegrasyonu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Vue.js Uygulamalar\u0131nda vue-i18n ile Uluslararas\u0131la\u015fma (i18n) Entegrasyonu"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36561","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=36561"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36561\/revisions"}],"predecessor-version":[{"id":36562,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/36561\/revisions\/36562"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=36561"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=36561"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=36561"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}