Skip to main content

SvelteKit i18n: Οδηγός ρύθμισης διεθνοποίησης

Από το μηδέν σε μια πολύγλωσση εφαρμογή: ρυθμίστε το svelte-i18n στην εφαρμογή SvelteKit με μορφή μηνυμάτων ICU, δρομολόγηση βάσει τοπικής ρύθμισης και έξυπνες αλυσίδες εναλλακτικών.

1

Εγκαταστήστε το svelte-i18n

Το svelte-i18n είναι η καθιερωμένη βιβλιοθήκη διεθνοποίησης για το Svelte και το SvelteKit. Παρέχει αντιδραστικά stores, υποστήριξη ICU MessageFormat και οκνηρή φόρτωση τοπικών ρυθμίσεων χωρίς πρόσθετη διαμόρφωση.

Το svelte-i18n χρησιμοποιεί ICU MessageFormat για πληθυντικούς και μεταβλητές — το ίδιο πρότυπο που χρησιμοποιούν τα FormatJS/react-intl. Αν προέρχεστε από το React, η σύνταξη των μηνυμάτων θα σας είναι οικεία.
Terminal
npm install svelte-i18n
2

Ρυθμίστε το svelte-i18n

Δημιουργήστε ένα αρχείο διαμόρφωσης i18n που καταχωρίζει τις τοπικές ρυθμίσεις σας με συναρτήσεις εισαγωγής οκνηρής φόρτωσης. Το svelte-i18n ανακτά τα μηνύματα μιας τοπικής ρύθμισης μόνο όταν αυτή ενεργοποιηθεί.

src/lib/i18n.ts
// src/lib/i18n.ts
import { register, init, getLocaleFromNavigator } from 'svelte-i18n';

// Register locale loaders (lazy-loaded)
register('en', () => import('../locales/en.json'));
register('de', () => import('../locales/de.json'));
register('ja', () => import('../locales/ja.json'));
register('es', () => import('../locales/es.json'));

init({
  fallbackLocale: 'en',
  initialLocale: getLocaleFromNavigator(),  // Auto-detect browser language
});
Πρέπει να εισαγάγετε το αρχείο διαμόρφωσης i18n στο +layout.svelte πριν αποδοθεί οποιοδήποτε στοιχείο. Αν οι μεταφράσεις εμφανίζουν ανεπεξέργαστα κλειδιά όπως 'nav.home', η διαμόρφωση δεν εισήχθη αρκετά έγκαιρα.

Ενσωμάτωση στη διάταξη του SvelteKit

Εισαγάγετε τη διαμόρφωση i18n στη ριζική διάταξη και ελέγξτε την απόδοση με το store $isLoading. Έτσι αποτρέπεται η στιγμιαία εμφάνιση αμετάφραστων κλειδιών ενώ φορτώνονται ασύγχρονα τα δεδομένα της τοπικής ρύθμισης.

src/routes/+layout.svelte
<!-- src/routes/+layout.svelte -->
<script>
  // Import i18n config — must run before any component renders
  import '../lib/i18n';
  import { isLoading } from 'svelte-i18n';
</script>

{#if $isLoading}
  <p>Loading translations...</p>
{:else}
  <slot />
{/if}

Δρομολόγηση βάσει τοπικής ρύθμισης στο SvelteKit

Για URL φιλικά προς το SEO, όπως /en/about και /de/about, χρησιμοποιήστε μια παράμετρο διαδρομής [lang]. Ορίστε την τοπική ρύθμιση του svelte-i18n στη συνάρτηση load της διάταξης βάσει της παραμέτρου URL.

SvelteKit locale routing
// src/routes/[lang]/+layout.ts
import { locale } from 'svelte-i18n';

export function load({ params }) {
  // Set the active locale from the URL parameter
  locale.set(params.lang);
  return {};
}

// src/routes/[lang]/+layout.svelte
<script>
  import '../../lib/i18n';
  import { isLoading } from 'svelte-i18n';
</script>

{#if $isLoading}
  <p>Loading...</p>
{:else}
  <slot />
{/if}

Μορφή αρχείων μετάφρασης

Δημιουργήστε ένα αρχείο JSON ανά τοπική ρύθμιση. Το svelte-i18n υποστηρίζει ένθετα κλειδιά και σύνταξη ICU MessageFormat για πληθυντικούς, μεταβλητές και εκφράσεις select.

Translation files
// src/locales/en.json
{
  "nav": {
    "home": "Home",
    "about": "About",
    "settings": "Settings"
  },
  "greeting": "Hello, {name}!",
  "cart": {
    "itemCount": "{count, plural, one {# item} other {# items}}"
  }
}

// src/locales/de.json
{
  "nav": {
    "home": "Startseite",
    "about": "Uber uns",
    "settings": "Einstellungen"
  },
  "greeting": "Hallo, {name}!",
  "cart": {
    "itemCount": "{count, plural, one {# Artikel} other {# Artikel}}"
  }
}
Ονομάστε τα κλειδιά βάσει όσων περιγράφουν και όχι βάσει του σημείου όπου εμφανίζονται: το 'cart.itemCount' είναι προτιμότερο από το 'homepageCartLabel'. Τα κλειδιά πρέπει να παραμένουν κατάλληλα μετά από επανασχεδιασμό του UI.
3

Χρησιμοποιήστε μεταφράσεις στα στοιχεία

Εισαγάγετε το store $_ (ή το $format) από το svelte-i18n και χρησιμοποιήστε το στα πρότυπα Svelte. Το store είναι αντιδραστικό — όταν αλλάζει η τοπική ρύθμιση, όλες οι μεταφρασμένες συμβολοσειρές ενημερώνονται αυτόματα.

Component.svelte
<script>
  import { _ } from 'svelte-i18n';
</script>

<h1>{$_('greeting', { values: { name: 'World' } })}</h1>

<nav>
  <a href="/">{$_('nav.home')}</a>
  <a href="/about">{$_('nav.about')}</a>
</nav>
Formatting helpers
<script>
  import { _, date, number, time } from 'svelte-i18n';
</script>

<!-- Simple string -->
<p>{$_('greeting', { values: { name: userName } })}</p>

<!-- ICU plurals — handled automatically -->
<p>{$_('cart.itemCount', { values: { count: 3 } })}</p>

<!-- Date formatting -->
<p>{$date(new Date(), { format: 'long' })}</p>

<!-- Number formatting -->
<p>{$number(1999.99, { style: 'currency', currency: 'USD' })}</p>
Το $_ είναι store του Svelte — πρέπει να χρησιμοποιείτε το πρόθεμα $ στα πρότυπα. Αν γράψετε _('key') χωρίς το σύμβολο του δολαρίου, επιστρέφεται το αντικείμενο store και όχι η μεταφρασμένη συμβολοσειρά.

Εναλλαγή γλώσσας

Δημιουργήστε έναν επιλογέα γλώσσας που συνδέεται με το store $locale. Όταν αλλάζει η τιμή, το svelte-i18n φορτώνει τα μηνύματα της νέας τοπικής ρύθμισης και ενημερώνει αυτόματα όλες τις μεταφρασμένες συμβολοσειρές.

LanguageSwitcher.svelte
<script>
  import { locale, locales } from 'svelte-i18n';

  const LANGUAGE_NAMES = {
    en: 'English',
    de: 'Deutsch',
    ja: '日本語',
    es: 'Espanol',
  };
</script>

<select bind:value={$locale}>
  {#each $locales as loc}
    <option value={loc}>{LANGUAGE_NAMES[loc] ?? loc}</option>
  {/each}
</select>
4

Διαχειριστείτε πληθυντικούς με ICU MessageFormat

Το svelte-i18n χρησιμοποιεί ICU MessageFormat για τον πληθυντικό — το διεθνές πρότυπο που διαχειρίζεται όλες τις κατηγορίες πληθυντικού CLDR. Τα Αραβικά έχουν 6 μορφές, τα Ρωσικά 4 και τα Ιαπωνικά 1. Ορίστε τις μορφές που χρειάζονται οι γλώσσες-στόχοι και το svelte-i18n επιλέγει αυτόματα τη σωστή.

ICU plural forms by language
// svelte-i18n uses ICU MessageFormat for plurals
// English:
{
  "items": "{count, plural, one {# item} other {# items}}"
}

// Arabic (6 forms):
{
  "items": "{count, plural, zero {no items} one {item} two {two items} few {# items} many {# items} other {# items}}"
}

// Japanese (1 form):
{
  "items": "{count, plural, other {#個のアイテム}}"
}
Μην ενσωματώνετε ποτέ τη λογική ενικού και πληθυντικού στα στοιχεία σας. Γλώσσες όπως τα Γαλλικά θεωρούν το 0 ενικό. Τα Αραβικά, τα Ρωσικά και τα Πολωνικά διαθέτουν μορφές πληθυντικού που δεν υπάρχουν στα Αγγλικά. Αφήστε τη σύνταξη πληθυντικού ICU να τις διαχειριστεί.

Έξυπνες εναλλακτικές τοπικές ρυθμίσεις με το svelte-i18n-locale-chain

Όταν λείπει ένα κλειδί, το svelte-i18n καταφεύγει απευθείας στο fallbackLocale — δεν υπάρχει ενδιάμεση εναλλακτική. Ένας χρήστης pt-BR βλέπει Αγγλικά αντί για τις απολύτως κατάλληλες μεταφράσεις pt-PT. Το svelte-i18n-locale-chain επιλύει το πρόβλημα με έξυπνες αλυσίδες εναλλακτικών που συγχωνεύουν σε βάθος μηνύματα από περιφερειακές παραλλαγές.

Terminal
npm install svelte-i18n-locale-chain svelte-i18n
src/lib/i18n.ts
// src/lib/i18n.ts
import { initLocaleChain, setLocale } from 'svelte-i18n-locale-chain';

// Replace svelte-i18n's init + register with initLocaleChain
await initLocaleChain({
  loadMessages: (locale) =>
    import(`../locales/${locale}.json`).then(m => m.default),
  defaultLocale: 'en',
  initialLocale: 'pt-BR',
});

// Later, to change locale:
await setLocale('fr-CA');
// fr-CA user sees: fr-CA messages -> fr messages -> en messages
// No missing keys — deep-merged automatically
Το svelte-i18n-locale-chain διαχειρίζεται εσωτερικά όλη τη φόρτωση μηνυμάτων. Μη χρησιμοποιείτε παράλληλα τη συνάρτηση register() του svelte-i18n — το initLocaleChain αναλαμβάνει την καταχώριση, τη φόρτωση και τη συγχώνευση σε βάθος.

Αυτοματοποιήστε τις μεταφράσεις

Αφού ολοκληρώσετε τη ρύθμιση i18n, μεταφράστε τα αρχεία γλωσσών με AI. Στο IDE σας, ζητήστε από τον βοηθό AI να μεταφράσει το αρχείο προέλευσης ή χρησιμοποιήστε το i18n Agent CLI στο pipeline CI/CD.

Terminal
# In your IDE, ask your AI assistant:
> Translate src/locales/en.json to German, Japanese, and Spanish

✓ de.json created (1.2s)
✓ ja.json created (1.5s)
✓ es.json created (1.1s)

# Or use the CLI in CI/CD:
npx i18n-agent translate src/locales/en.json --lang de,ja,es
Μεταφράζετε σταδιακά — όταν προσθέτετε νέα κλειδιά στο αρχείο προέλευσης, μεταφράστε μόνο τις διαφορές αντί να δημιουργείτε ξανά όλα τα αρχεία. Έτσι διατηρούνται οι μεταφράσεις που έχουν ελεγχθεί από άνθρωπο.

Αυτοματοποιήστε τον έλεγχο ποιότητας των μεταφράσεων

Εντοπίστε κλειδιά που λείπουν και κατεστραμμένα placeholders πριν φτάσουν στην παραγωγή με το i18n-validate. Δοκιμάστε το UI σας με ψευδομεταφράσεις μέσω του i18n-pseudo πριν είναι διαθέσιμες οι πραγματικές μεταφράσεις.

Συνηθισμένες παγίδες

Διαρροή τοπικής ρύθμισης στο SSR του SvelteKit

Τα stores του svelte-i18n είναι singleton. Στο SSR του SvelteKit, τα ταυτόχρονα αιτήματα μοιράζονται το ίδιο store — η τοπική ρύθμιση ενός χρήστη μπορεί να διαρρεύσει στην απόκριση άλλου. Λύση: καλέστε locale.set() στο hook handle ή στη συνάρτηση load της διάταξης, ώστε κάθε αίτημα να λαμβάνει τη σωστή τοπική ρύθμιση.

Χρήση της register() με το svelte-i18n-locale-chain

Μη χρησιμοποιείτε τη συνάρτηση register() του svelte-i18n αν χρησιμοποιείτε το svelte-i18n-locale-chain. Το initLocaleChain διαχειρίζεται εσωτερικά όλη τη φόρτωση μηνυμάτων. Ο συνδυασμός τους προκαλεί διπλή ή αντικρουόμενη φόρτωση μηνυμάτων.

Τα σφάλματα σύνταξης ICU δεν εμφανίζουν προειδοποίηση

Μια ασύμφωνη αγκύλη ή μια κατηγορία πληθυντικού που λείπει από συμβολοσειρές ICU MessageFormat προκαλεί αποτυχία χωρίς προειδοποίηση — εμφανίζεται η ανεπεξέργαστη συμβολοσειρά μηνύματος αντί για τη μορφοποιημένη έξοδο. Επικυρώστε τη σύνταξη ICU στο pipeline CI.

Στιγμιαία εμφάνιση αμετάφραστου περιεχομένου

Αν αποδώσετε στοιχεία πριν ολοκληρωθεί η φόρτωση των μεταφράσεων, οι χρήστες βλέπουν ανεπεξέργαστα κλειδιά. Ελέγξτε τη διάταξη με {#if $isLoading}...{:else}...{/if}, ώστε να εμφανίζεται κατάσταση φόρτωσης μέχρι να είναι έτοιμα τα μηνύματα.

Συνιστώμενη δομή αρχείων

Project Structure
my-sveltekit-app/
├── src/
│   ├── lib/
│   │   └── i18n.ts              # i18n configuration
│   ├── locales/
│   │   ├── en.json              # Source language
│   │   ├── de.json              # German
│   │   ├── ja.json              # Japanese
│   │   └── es.json              # Spanish
│   └── routes/
│       ├── +layout.svelte       # Import i18n, guard isLoading
│       ├── +page.svelte
│       └── [lang]/              # Optional: locale-based routing
│           ├── +layout.ts       # Set locale from URL param
│           ├── +layout.svelte
│           └── +page.svelte
├── svelte.config.js
└── package.json

Δοκιμάστε τώρα το i18n Agent

Αφήστε εδώ το αρχείο μετάφρασής σας

JSON, YAML, PO, XML, CSV, Markdown, Properties

ή κάντε κλικ για να επιλέξετε αρχείο

Γλώσσες-στόχοι

Δεν απαιτείται εγγραφήΆμεση εκτίμηση

Εναλλακτική τοπική ρύθμιση με το svelte-i18n-locale-chain

Όταν λείπει ένα κλειδί μετάφρασης από μια περιφερειακή τοπική ρύθμιση όπως η pt-BR, το svelte-i18n μεταβαίνει απευθείας στην προεπιλεγμένη τοπική ρύθμιση αντί να ελέγξει πρώτα τη γονική pt.

Terminal
npm install svelte-i18n-locale-chain
Configuration
import { initLocaleChain } from 'svelte-i18n-locale-chain';

initLocaleChain({
  fallbacks: {
    'pt-BR': ['pt', 'en'],
    'zh-Hant-HK': ['zh-Hant', 'zh', 'en'],
  },
  defaultLocale: 'en',
});

Δείτε τον Οδηγό εναλλακτικών τοπικών ρυθμίσεων για τον πλήρη κατάλογο των υποστηριζόμενων framework και των 75 ενσωματωμένων αλυσίδων. Learn more →

Συχνές ερωτήσεις