{"id":31338,"date":"2025-10-08T20:40:54","date_gmt":"2025-10-08T17:40:54","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=31338"},"modified":"2025-10-08T20:40:54","modified_gmt":"2025-10-08T17:40:54","slug":"more-i18n-ile-vue-icinmatting-ve-fallbacks","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/","title":{"rendered":"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks"},"content":{"rendered":"<p><body>You&#8217;re looking to dive deeper into Internationalization (i18n) with Vue! <code>vue-i18n<\/code> is the go-to library, and it offers a lot more than just basic string translation.<\/p>\n<p>Let&#8217;s explore some advanced features and best practices for robust i18n in your Vue applications.<\/p>\n<p>&#8212;<\/p>\n<h3>Vue i18n: Beyond the Basics<\/h3>\n<p>We&#8217;ll assume you have a basic <code>vue-i18n<\/code> setup like this:<\/p>\n<p><strong>1. Installation:<\/strong><\/p>\n<pre><code class=\"language-bash\">npm install vue-i18n@next # For Vue 3\n<h2>or<\/h2>\nyarn add vue-i18n@next<\/code><\/pre>\n<p><strong>2. <code>main.js<\/code> (or <code>main.ts<\/code>) Setup:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js\nimport { createApp } from 'vue'\nimport { createI18n } from 'vue-i18n'\nimport App from '.\/App.vue'\n\n\/\/ 1. Define your messages\nconst messages = {\n  en: {\n    welcome: 'Welcome!',\n    greeting: 'Hello, {name}!',\n    apple: 'no apples | {count} apple | {count} apples',\n    message: {\n      named: 'Hello {name}, you are using version {version}.',\n      list: 'The items are {0} and {1}.'\n    }\n  },\n  es: {\n    welcome: '\u00a1Bienvenido!',\n    greeting: '\u00a1Hola, {name}!',\n    apple: 'sin manzanas | {count} manzana | {count} manzanas',\n    message: {\n      named: 'Hola {name}, est\u00e1s usando la versi\u00f3n {version}.',\n      list: 'Los art\u00edculos son {0} y {1}.'\n    }\n  }\n}\n\n\/\/ 2. Create i18n instance with options\nconst i18n = createI18n({\n  locale: 'en', \/\/ set locale\n  fallbackLocale: 'en', \/\/ set fallback locale\n  messages, \/\/ set locale messages\n  legacy: false, \/\/ Use Composition API mode for Vue 3\n  globalInjection: true, \/\/ Allows using $t, $d, $n globally without explicit import\n})\n\n\/\/ 3. Mount your app\nconst app = createApp(App)\napp.use(i18n)\napp.mount('#app')<\/code><\/pre>\n<p><strong>3. Basic Usage in Components:<\/strong><\/p>\n<pre><code class=\"language-html\"><!-- App.vue -->\n<template>\n  \n  <p>{{ $t('greeting', { name: 'Alice' }) }}<\/p>\n\n  <!-- Using v-t directive -->\n  <p v-t=\"'welcome'\"><\/p>\n\n  <!-- Using i18n-t component for complex HTML -->\n  <i18n-t keypath=\"message.named\" tag=\"p\">\n    <template #name>\n      <strong>Vue<\/strong>\n    <\/template>\n    <template #version>\n      <span>3<\/span>\n    <\/template>\n  <\/i18n-t>\n<\/template><\/code><\/pre>\n<p>&#8212;<\/p>\n<h3>Advanced Features<\/h3>\n<p>### 1. Interpolation (Variables in Translations)<\/p>\n<p>You&#8217;ve seen basic named interpolation (<code>{name}<\/code>). <code>vue-i18n<\/code> supports more:<\/p>\n<p>*   <strong>Named Interpolation:<\/strong> <code>Hello, {name}!<\/code><\/p>\n<pre><code class=\"language-javascript\">\/\/ messages\n    named: 'Hello {name}, you are using version {version}.'\n    \/\/ usage\n    $t('message.named', { name: 'Vue', version: '3' })<\/code><\/pre>\n<p>*   <strong>List Interpolation:<\/strong> <code>The items are {0} and {1}.<\/code><\/p>\n<pre><code class=\"language-javascript\">\/\/ messages\n    list: 'The items are {0} and {1}.'\n    \/\/ usage\n    $t('message.list', ['item1', 'item2'])<\/code><\/pre>\n<p>*   <strong>Custom HTML (with <code>i18n-t<\/code> component):<\/strong> For injecting HTML directly into a translation.<\/p>\n<pre><code class=\"language-html\"><!-- messages.en.js -->\n    \/\/ key: 'link_to_docs': 'Please read our <docsLink>documentation<\/docsLink> for more info.'\n\n    <!-- MyComponent.vue -->\n    <i18n-t keypath=\"link_to_docs\">\n      <template #docsLink>\n        <a href=\"https:\/\/vue-i18n.intlify.dev\/\" target=\"_blank\">documentation<\/a>\n      <\/template>\n    <\/i18n-t><\/code><\/pre>\n<p>### 2. Pluralization<\/p>\n<p><code>vue-i18n<\/code> handles pluralization using ICU MessageFormat syntax.<\/p>\n<pre><code class=\"language-javascript\">\/\/ messages.en.js\napple: 'no apples | {count} apple | {count} apples'\n\/\/ messages.es.js\napple: 'sin manzanas | {count} manzana | {count} manzanas' \/\/ Note: Spanish often uses '1' vs 'other'<\/code><\/pre>\n<p><strong>Usage:<\/strong><\/p>\n<pre><code class=\"language-html\"><p>{{ $t('apple', 0) }}<\/p> <!-- \"no apples\" -->\n<p>{{ $t('apple', 1) }}<\/p> <!-- \"1 apple\" -->\n<p>{{ $t('apple', 5) }}<\/p> <!-- \"5 apples\" -->\n\n<!-- With explicit count parameter -->\n<p>{{ $t('apple', { count: 10 }) }}<\/p> <!-- \"10 apples\" --><\/code><\/pre>\n<p>You can also define custom pluralization rules for specific languages if the default ICU rules aren&#8217;t sufficient.<\/p>\n<p>### 3. Date &#038; Time Formatting<\/p>\n<p>Use the <code>$d<\/code> helper and define <code>datetimeFormats<\/code> in your i18n configuration.<\/p>\n<p><strong>1. Configuration (<code>main.js<\/code>):<\/strong><\/p>\n<pre><code class=\"language-javascript\">const i18n = createI18n({\n  \/\/ ... other options\n  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', hour12: true\n      },\n      full: {\n        year: 'numeric', month: 'long', day: 'numeric',\n        hour: 'numeric', minute: 'numeric', second: 'numeric',\n        weekday: 'long', timeZoneName: 'short'\n      }\n    },\n    es: {\n      short: {\n        year: 'numeric', month: 'numeric', day: 'numeric'\n      },\n      long: {\n        year: 'numeric', month: 'long', day: 'numeric',\n        hour: 'numeric', minute: 'numeric', hour12: false\n      }\n    }\n  }\n})<\/code><\/pre>\n<p><strong>2. Usage in Components:<\/strong><\/p>\n<pre><code class=\"language-html\"><template>\n  <p>Today (short): {{ $d(new Date(), 'short') }}<\/p>\n  <p>Today (long): {{ $d(new Date(), 'long') }}<\/p>\n  <p>Specific Date: {{ $d(new Date('2023-10-26T10:30:00Z'), 'full', 'es') }}<\/p>\n<\/template><\/code><\/pre>\n<p>### 4. Number Formatting<\/p>\n<p>Similar to dates, use the <code>$n<\/code> helper and <code>numberFormats<\/code>.<\/p>\n<p><strong>1. Configuration (<code>main.js<\/code>):<\/strong><\/p>\n<pre><code class=\"language-javascript\">const i18n = createI18n({\n  \/\/ ... other options\n  numberFormats: {\n    en: {\n      currency: {\n        style: 'currency', currency: 'USD', currencyDisplay: 'symbol'\n      },\n      decimal: {\n        style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2\n      },\n      percent: {\n        style: 'percent', useGrouping: false\n      }\n    },\n    es: {\n      currency: {\n        style: 'currency', currency: 'EUR', currencyDisplay: 'symbol'\n      },\n      decimal: {\n        style: 'decimal', minimumFractionDigits: 2, maximumFractionDigits: 2\n      }\n    }\n  }\n})<\/code><\/pre>\n<p><strong>2. Usage in Components:<\/strong><\/p>\n<pre><code class=\"language-html\"><template>\n  <p>Price: {{ $n(12345.67, 'currency') }}<\/p>\n  <p>Discount: {{ $n(0.15, 'percent') }}<\/p>\n  <p>Value (ES): {{ $n(9876.54, 'decimal', 'es') }}<\/p>\n<\/template><\/code><\/pre>\n<p>### 5. Dynamic Locale Switching<\/p>\n<p>You can change the locale at runtime.<\/p>\n<pre><code class=\"language-vue\"><script setup>\nimport { useI18n } from 'vue-i18n'\n\nconst { locale } = useI18n()\n\nfunction switchLocale(newLocale) {\n  locale.value = newLocale\n  \/\/ Optional: update the document's lang attribute for SEO\/accessibility\n  document.documentElement.setAttribute('lang', newLocale)\n  \/\/ You might also want to save this preference to localStorage\n  localStorage.setItem('user-locale', newLocale)\n}\n<\/script>\n\n<template>\n  <div>\n    <button @click=\"switchLocale('en')\">English<\/button>\n    <button @click=\"switchLocale('es')\">Espa\u00f1ol<\/button>\n    <p>{{ $t('welcome') }}<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p><strong>Tip:<\/strong> When initializing your i18n instance, you can check <code>localStorage<\/code> for a user&#8217;s preferred locale:<\/p>\n<pre><code class=\"language-javascript\">const userPreferredLocale = localStorage.getItem('user-locale') || 'en';\n\nconst i18n = createI18n({\n  locale: userPreferredLocale,\n  fallbackLocale: 'en',\n  \/\/ ...\n});<\/code><\/pre>\n<p>### 6. Component-Level i18n<\/p>\n<p>Sometimes, you have messages specific to a single component that you don&#8217;t want to clutter your global message files with.<\/p>\n<pre><code class=\"language-vue\"><!-- MyComponent.vue -->\n<script setup>\nimport { useI18n } from 'vue-i18n'\n\nconst { t } = useI18n({\n  \/\/ Local messages for this component\n  messages: {\n    en: {\n      componentTitle: 'Component Specific Title',\n      componentDescription: 'This message is only available in MyComponent.'\n    },\n    es: {\n      componentTitle: 'T\u00edtulo espec\u00edfico del componente',\n      componentDescription: 'Este mensaje solo est\u00e1 disponible en MyComponent.'\n    }\n  },\n  \/\/ If true, component messages will inherit from global messages\n  \/\/ If false, it will only use its own messages (and fallbacks)\n  inheritLocale: true\n})\n<\/script>\n\n<template>\n  <div>\n    <h2>{{ t('componentTitle') }}<\/h2>\n    <p>{{ t('componentDescription') }}<\/p>\n    <!-- Can still access global messages -->\n    <p>{{ $t('welcome') }}<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>### 7. Fallback Locales &#038; Message Fallbacks<\/p>\n<p>*   <strong><code>fallbackLocale<\/code><\/strong>: If a translation key isn&#8217;t found in the current <code>locale<\/code>, <code>vue-i18n<\/code> will try to find it in the <code>fallbackLocale<\/code>.<\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js\n    const i18n = createI18n({\n      locale: 'fr', \/\/ Current locale\n      fallbackLocale: 'en', \/\/ If a key is missing in 'fr', look in 'en'\n      \/\/ ...\n    })<\/code><\/pre>\n<p><em>   <strong>Message Fallback:<\/strong> If a key isn&#8217;t found in <\/em>any* locale (current or fallback), <code>vue-i18n<\/code> will simply return the key itself (e.g., <code>$t('nonExistentKey')<\/code> returns &#8220;nonExistentKey&#8221;). This is useful for development to spot missing translations.<\/p>\n<p>### 8. Lazy Loading Translations (Code Splitting)<\/p>\n<p>For large applications with many locales, loading all translations upfront can increase bundle size. You can lazy-load them when a user switches locale.<\/p>\n<p><strong>1. Structure your locale files:<\/strong><\/p>\n<pre><code class=\"language-\">src\/\n\u251c\u2500\u2500 locales\/\n\u2502   \u251c\u2500\u2500 en.json\n\u2502   \u251c\u2500\u2500 es.json\n\u2502   \u2514\u2500\u2500 fr.json\n\u2514\u2500\u2500 main.js\n\u2514\u2500\u2500 App.vue<\/code><\/pre>\n<p><strong><code>en.json<\/code>:<\/strong><\/p>\n<pre><code class=\"language-json\">{\n  \"welcome\": \"Welcome!\",\n  \"greeting\": \"Hello, {name}!\"\n}<\/code><\/pre>\n<p><strong>2. Modify <code>main.js<\/code> to initially load only the default locale:<\/strong><\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js\nimport { createApp } from 'vue'\nimport { createI18n } from 'vue-i18n'\nimport App from '.\/App.vue'\n\n\/\/ Only load 'en' initially\nimport enMessages from '.\/locales\/en.json'\n\nconst i18n = createI18n({\n  locale: 'en',\n  fallbackLocale: 'en',\n  messages: {\n    en: enMessages\n  },\n  legacy: false,\n  globalInjection: true,\n})\n\nconst app = createApp(App)\napp.use(i18n)\napp.mount('#app')<\/code><\/pre>\n<p><strong>3. Create a function to load other locales dynamically:<\/strong><\/p>\n<pre><code class=\"language-vue\"><script setup>\nimport { useI18n } from 'vue-i18n'\nimport { nextTick } from 'vue'\n\nconst { locale, availableLocales, setLocaleMessage, setDateTimeFormat, setNumberFormat } = useI18n()\n\nasync function loadLocaleMessages(newLocale) {\n  \/\/ If the messages for this locale are not loaded yet\n  if (!availableLocales.includes(newLocale)) {\n    const messages = await import(<code>.\/locales\/${newLocale}.json<\/code>)\n    setLocaleMessage(newLocale, messages.default)\n    \/\/ If you have datetime or number formats specific to this locale, load them too\n    \/\/ const datetimeFormats = await import(<code>.\/locales\/${newLocale}-datetime.json<\/code>)\n    \/\/ setDateTimeFormat(newLocale, datetimeFormats.default)\n    \/\/ const numberFormats = await import(<code>.\/locales\/${newLocale}-number.json<\/code>)\n    \/\/ setNumberFormat(newLocale, numberFormats.default)\n    availableLocales.push(newLocale) \/\/ Add to available locales\n  }\n  locale.value = newLocale\n  document.documentElement.setAttribute('lang', newLocale)\n  localStorage.setItem('user-locale', newLocale)\n  await nextTick() \/\/ Ensure reactivity updates\n}\n\n\/\/ Example: Load initial locale from localStorage on app start\nconst initialLocale = localStorage.getItem('user-locale') || 'en'\nif (initialLocale !== 'en') { \/\/ If not the default, load it\n  loadLocaleMessages(initialLocale)\n}\n<\/script>\n\n<template>\n  <div>\n    <button @click=\"loadLocaleMessages('en')\">English<\/button>\n    <button @click=\"loadLocaleMessages('es')\">Espa\u00f1ol<\/button>\n    <button @click=\"loadLocaleMessages('fr')\">Fran\u00e7ais<\/button>\n    <p>{{ $t('welcome') }}<\/p>\n  <\/div>\n<\/template><\/code><\/pre>\n<p>### 9. Externalizing Translation Files<\/p>\n<p>Instead of embedding all messages directly in <code>main.js<\/code>, it&#8217;s cleaner to have separate files for each locale. This is implicitly done in the lazy loading example, but you can do it for initial load too.<\/p>\n<pre><code class=\"language-javascript\">\/\/ main.js\nimport { createApp } from 'vue'\nimport { createI18n } from 'vue-i18n'\nimport App from '.\/App.vue'\n\nimport enMessages from '.\/locales\/en.json'\nimport esMessages from '.\/locales\/es.json'\n\nconst i18n = createI18n({\n  locale: 'en',\n  fallbackLocale: 'en',\n  messages: {\n    en: enMessages,\n    es: esMessages\n  },\n  \/\/ ...\n})\n\/\/ ...<\/code><\/pre>\n<p>&#8212;<\/p>\n<h3>Best Practices<\/h3>\n<p>1.  <strong>Key Naming:<\/strong><br \/>\n    *   Use descriptive, hierarchical keys (e.g., <code>user.profile.title<\/code>, <code>button.submit<\/code>, <code>error.network_failed<\/code>).<br \/>\n    *   Avoid using the actual English text as the key, as it makes refactoring harder.<br \/>\n    *   Keep keys consistent across locales.<\/p>\n<p>2.  <strong>Message Structure:<\/strong><br \/>\n    *   Organize your message files logically, either by feature, page, or component.<br \/>\n    *   JSON files are generally preferred for clarity and tooling compatibility.<\/p>\n<p>3.  <strong>Default Locale:<\/strong><br \/>\n    *   Choose a default locale (often English) and ensure all keys are present in it. This acts as your source of truth.<br \/>\n    *   Use <code>fallbackLocale<\/code> to ensure a translation is always available, even if a specific locale is missing a key.<\/p>\n<p>4.  <strong>Handling Missing Translations:<\/strong><br \/>\n    *   During development, the default behavior of <code>vue-i18n<\/code> (returning the key itself if a translation is missing) is helpful.<br \/>\n    *   For production, consider setting <code>missingWarn: false<\/code> to silence console warnings, but ensure you have a robust translation process to prevent missing keys.<br \/>\n    *   You can also provide a <code>missing<\/code> handler function to customize this behavior.<\/p>\n<p>5.  <strong>SEO &#038; Accessibility:<\/strong><br \/>\n    *   Always update the <code>lang<\/code> attribute on your <code><html><\/code> tag when the locale changes (<code>document.documentElement.setAttribute('lang', newLocale)<\/code>). This helps search engines and screen readers.<br \/>\n    *   Ensure your translations are semantically correct and provide good context for accessibility tools.<\/p>\n<p>6.  <strong>Testing:<\/strong><br \/>\n    *   Write tests for your i18n implementation, especially for complex pluralization, date\/number formatting, and dynamic content.<br \/>\n    *   Test locale switching to ensure all UI elements update correctly.<\/p>\n<p>7.  <strong>Tooling &#038; Automation:<\/strong><br \/>\n    *   <strong>Extraction:<\/strong> Use tools (e.g., <code>vue-i18n-extract<\/code> or custom scripts) to automatically extract keys from your templates and scripts into JSON files.<br \/>\n    *   <strong>Linting:<\/strong> Integrate linters to check for missing keys or unused keys.<br \/>\n    *   <strong>Translation Management Systems (TMS):<\/strong> For larger projects, consider integrating with a TMS (e.g., Lokalise, Phrase, Transifex) to manage translations, collaborate with translators, and automate the import\/export of locale files.<\/p>\n<p>&#8212;<\/p>\n<p>By implementing these advanced features and following best practices, you can build a truly internationalized Vue application that is robust, scalable, and user-friendly for a global audience.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"You&#8217;re looking to dive deeper into Internationalization (i18n) with Vue! vue-i18n is the go-to library, and it offers a lot more than just basic strin","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-31338","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>More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks - 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\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks\" \/>\n<meta property=\"og:description\" content=\"You&#039;re looking to dive deeper into Internationalization (i18n) with Vue! vue-i18n is the go-to library, and it offers a lot more than just basic strin\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-08T17:40:54+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=\"6 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks\",\"datePublished\":\"2025-10-08T17:40:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/\"},\"wordCount\":640,\"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\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/\",\"name\":\"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-08T17:40:54+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks\"}]},{\"@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":"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks - 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\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/","og_locale":"tr_TR","og_type":"article","og_title":"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks","og_description":"You're looking to dive deeper into Internationalization (i18n) with Vue! vue-i18n is the go-to library, and it offers a lot more than just basic strin","og_url":"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-08T17:40:54+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"6 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks","datePublished":"2025-10-08T17:40:54+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/"},"wordCount":640,"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\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/","url":"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/","name":"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-08T17:40:54+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/more-i18n-ile-vue-icinmatting-ve-fallbacks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"More I18N Ile Vue: I\u00e7inmatting Ve Fallbacks"}]},{"@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\/31338","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=31338"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31338\/revisions"}],"predecessor-version":[{"id":31339,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31338\/revisions\/31339"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31338"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31338"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}