Πώς να υλοποιήσετε τη διεθνοποίηση σε μια εφαρμογή Next.js που χρησιμοποιεί τον App Router
Κάντε την εφαρμογή React σας πιο προσβάσιμη και προσεγγίστε νέες αγορές με τη διεθνοποίηση (i18n).
Καθώς ο κόσμος γίνεται όλο και πιο παγκοσμιοποιημένος, γίνεται ολοένα πιο σημαντικό για τους web developers να δημιουργούν εφαρμογές που μπορούν να εξυπηρετούν χρήστες από διαφορετικές χώρες και πολιτισμούς. Ένας από τους βασικούς τρόπους για να το επιτύχετε είναι η διεθνοποίηση (i18n), που σας επιτρέπει να προσαρμόζετε την εφαρμογή σας σε διαφορετικές γλώσσες, νομίσματα και μορφές ημερομηνίας.
Σ' αυτό το άρθρο, θα εξερευνήσουμε πώς να προσθέσετε διεθνοποίηση στην εφαρμογή React Next.js σας, με απόδοση στην πλευρά του διακομιστή. TL;DR: Δείτε το πλήρες παράδειγμα εδώ.
Αυτός ο οδηγός είναι για εφαρμογές Next.js που χρησιμοποιούν τον App Router.
Αν χρησιμοποιείτε τον Pages Router, δείτε αυτόν τον οδηγό αντί αυτού.
Βήμα 1: Εγκαταστήστε μια βιβλιοθήκη i18n
Για να υλοποιήσετε τη διεθνοποίηση στην εφαρμογή Next.js σας, πρώτα θα επιλέξουμε μια βιβλιοθήκη i18n. Υπάρχουν αρκετές δημοφιλείς βιβλιοθήκες, συμπεριλαμβανομένης της next-intl. Στο παράδειγμα αυτό, όμως, θα χρησιμοποιήσουμε την TacoTranslate.
Το TacoTranslate μεταφράζει αυτόματα τις συμβολοσειρές σας σε οποιαδήποτε γλώσσα χρησιμοποιώντας τεχνητή νοημοσύνη αιχμής και σας απαλλάσσει από την κουραστική διαχείριση αρχείων JSON.
Ας το εγκαταστήσουμε χρησιμοποιώντας npm στο τερματικό σας:
npm install tacotranslate
Βήμα 2: Δημιουργήστε έναν δωρεάν λογαριασμό στο TacoTranslate
Τώρα που έχετε εγκαταστήσει το module, ήρθε η ώρα να δημιουργήσετε τον λογαριασμό σας στο TacoTranslate, ένα έργο μετάφρασης και τα αντίστοιχα κλειδιά API. Δημιουργήστε έναν λογαριασμό εδώ. Είναι δωρεάν και δεν απαιτεί να προσθέσετε πιστωτική κάρτα.
Στο UI της εφαρμογής TacoTranslate, δημιουργήστε ένα έργο και μεταβείτε στην καρτέλα κλειδιών API. Δημιουργήστε ένα read
κλειδί και ένα read/write
κλειδί. Θα τα αποθηκεύσουμε ως μεταβλητές περιβάλλοντος. Το read
κλειδί είναι αυτό που αποκαλούμε public
και το read/write
κλειδί είναι secret
. Για παράδειγμα, μπορείτε να τα προσθέσετε σε ένα αρχείο .env
στον ριζικό φάκελο του έργου σας.
TACOTRANSLATE_PUBLIC_API_KEY=123456
TACOTRANSLATE_SECRET_API_KEY=789010
Βεβαιωθείτε να μην διαρρεύσετε ποτέ το μυστικό read/write
κλειδί API σε περιβάλλοντα παραγωγής στην πλευρά του πελάτη.
Θα προσθέσουμε επίσης δύο ακόμη μεταβλητές περιβάλλοντος: TACOTRANSLATE_DEFAULT_LOCALE
και TACOTRANSLATE_ORIGIN
.
TACOTRANSLATE_DEFAULT_LOCALE
: Ο προεπιλεγμένος κωδικός τοπικής ρύθμισης (fallback). Σε αυτό το παράδειγμα θα τον ορίσουμε σεen
για τα Αγγλικά.TACOTRANSLATE_ORIGIN
: Ο “φάκελος” όπου θα αποθηκευτούν οι συμβολοσειρές σας, όπως η διεύθυνση URL του ιστότοπού σας. Διαβάστε περισσότερα για τις προελεύσεις εδώ.
TACOTRANSLATE_DEFAULT_LOCALE=en
TACOTRANSLATE_ORIGIN=your-website-url.com
Βήμα 3: Ρύθμιση του TacoTranslate
Για να ενσωματώσετε το TacoTranslate στην εφαρμογή σας, θα χρειαστεί να δημιουργήσετε έναν πελάτη χρησιμοποιώντας τα κλειδιά API που ορίσατε νωρίτερα. Για παράδειγμα, δημιουργήστε ένα αρχείο με το όνομα /tacotranslate-client.js
.
const {default: createTacoTranslateClient} = require('tacotranslate');
const tacoTranslate = createTacoTranslateClient({
apiKey:
process.env.TACOTRANSLATE_SECRET_API_KEY ??
process.env.TACOTRANSLATE_PUBLIC_API_KEY ??
process.env.TACOTRANSLATE_API_KEY,
projectLocale:
process.env.TACOTRANSLATE_IS_PRODUCTION === 'true'
? process.env.TACOTRANSLATE_PROJECT_LOCALE
: undefined,
});
module.exports = tacoTranslate;
Σύντομα θα ορίσουμε αυτόματα TACOTRANSLATE_API_KEY
και TACOTRANSLATE_PROJECT_LOCALE
.
Η δημιουργία του client σε ξεχωριστό αρχείο καθιστά εύκολη τη χρήση του ξανά αργότερα. getLocales
είναι απλώς μια βοηθητική συνάρτηση με ενσωματωμένο χειρισμό σφαλμάτων. Τώρα, δημιουργήστε ένα αρχείο με όνομα /app/[locale]/tacotranslate.tsx
, όπου θα υλοποιήσουμε τον πάροχο TacoTranslate
.
'use client';
import React, {type ReactNode} from 'react';
import {
type TranslationContextProperties,
TacoTranslate as ImportedTacoTranslate,
} from 'tacotranslate/react';
import tacoTranslateClient from '@/tacotranslate-client';
export default function TacoTranslate({
locale,
origin,
localizations,
children,
}: TranslationContextProperties & {
readonly children: ReactNode;
}) {
return (
<ImportedTacoTranslate
client={tacoTranslateClient}
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</ImportedTacoTranslate>
);
}
Σημειώστε το 'use client';
που υποδεικνύει ότι πρόκειται για ένα συστατικό στην πλευρά του πελάτη.
Με τον context provider πλέον έτοιμο, δημιουργήστε ένα αρχείο με όνομα /app/[locale]/layout.tsx
, που αποτελεί το κύριο layout της εφαρμογής μας. Σημειώστε ότι αυτή η διαδρομή περιλαμβάνει έναν φάκελο που αξιοποιεί Dynamic Routes, όπου [locale]
είναι η δυναμική παράμετρος.
import React, {type ReactNode} from 'react';
import {type Locale, isRightToLeftLocaleCode} from 'tacotranslate';
import './global.css';
import tacoTranslateClient from '@/tacotranslate-client';
import TacoTranslate from './tacotranslate';
export async function generateStaticParams() {
const locales = await tacoTranslateClient.getLocales();
return locales.map((locale) => ({locale}));
}
type RootLayoutParameters = {
readonly params: Promise<{locale: Locale}>;
readonly children: ReactNode;
};
export default async function RootLayout({params, children}: RootLayoutParameters) {
const {locale} = await params;
const origin = process.env.TACOTRANSLATE_ORIGIN;
const localizations = await tacoTranslateClient.getLocalizations({
locale,
origins: [origin /* , other origins to fetch */],
});
return (
<html lang={locale} dir={isRightToLeftLocaleCode(locale) ? 'rtl' : 'ltr'}>
<body>
<TacoTranslate
locale={locale}
origin={origin}
localizations={localizations}
>
{children}
</TacoTranslate>
</body>
</html>
);
}
Το πρώτο που πρέπει να σημειωθεί εδώ είναι ότι χρησιμοποιούμε την παράμετρο Dynamic Route
[locale]
για να ανακτήσουμε τις μεταφράσεις για αυτήν τη γλώσσα. Επιπλέον, η generateStaticParams
εξασφαλίζει ότι όλοι οι κωδικοί locale που έχετε ενεργοποιήσει για το έργο σας προ-δημιουργούνται.
Τώρα, ας δημιουργήσουμε την πρώτη μας σελίδα! Δημιουργήστε ένα αρχείο με όνομα /app/[locale]/page.tsx
.
import React from 'react';
import {Translate} from 'tacotranslate/react';
export const revalidate = 60;
export default async function Page() {
return (
<Translate string="Hello, world!" />
);
}
Σημειώστε τη μεταβλητή revalidate
που λέει στο Next.js να αναδημιουργήσει τη σελίδα μετά από 60 δευτερόλεπτα, και να διατηρεί τις μεταφράσεις σας ενημερωμένες.
Βήμα 4: Εφαρμογή απόδοσης στην πλευρά του διακομιστή
TacoTranslate υποστηρίζει απόδοση στη πλευρά του διακομιστή. Αυτό βελτιώνει σημαντικά την εμπειρία χρήστη, εμφανίζοντας το μεταφρασμένο περιεχόμενο αμέσως, αντί για μια σύντομη εμφάνιση μη μεταφρασμένου περιεχομένου. Επιπλέον, μπορούμε να παραλείψουμε αιτήματα δικτύου από την πλευρά του πελάτη, επειδή ήδη διαθέτουμε τις μεταφράσεις που χρειαζόμαστε για τη σελίδα που βλέπει ο χρήστης.
Για να ρυθμίσετε την απόδοση από την πλευρά του διακομιστή, δημιουργήστε ή τροποποιήστε /next.config.js
:
const withTacoTranslate = require('tacotranslate/next/config').default;
const tacoTranslateClient = require('./tacotranslate-client');
module.exports = async () => {
const config = await withTacoTranslate(
{},
{
client: tacoTranslateClient,
isProduction:
process.env.TACOTRANSLATE_ENV === 'production' ||
process.env.VERCEL_ENV === 'production' ||
(!(process.env.TACOTRANSLATE_ENV || process.env.VERCEL_ENV) &&
process.env.NODE_ENV === 'production'),
}
);
// NOTE: Remove i18n from config when using the app router
return {...config, i18n: undefined};
};
Τροποποιήστε τον έλεγχο isProduction
ώστε να ταιριάζει με τη ρύθμισή σας. Εάν true
, το TacoTranslate θα εμφανίσει το δημόσιο κλειδί API. Αν βρισκόμαστε σε τοπικό, δοκιμαστικό ή staging περιβάλλον (isProduction
is false
), θα χρησιμοποιήσουμε το μυστικό κλειδί API read/write
για να διασφαλίσουμε ότι νέες συμβολοσειρές αποστέλλονται για μετάφραση.
Για να διασφαλίσουμε ότι η δρομολόγηση και η ανακατεύθυνση θα λειτουργούν όπως αναμένεται, θα χρειαστεί να δημιουργήσουμε ένα αρχείο με όνομα /middleware.ts
. Χρησιμοποιώντας το Middleware, μπορούμε να ανακατευθύνουμε τους χρήστες σε σελίδες που εμφανίζονται στη γλώσσα που προτιμούν.
import {type NextRequest} from 'next/server';
import {middleware as tacoTranslateMiddleware} from 'tacotranslate/next';
import tacoTranslate from '@/tacotranslate-client';
export const config = {
matcher: ['/((?!api|_next|favicon.ico).*)'],
};
export async function middleware(request: NextRequest) {
return tacoTranslateMiddleware(tacoTranslate, request);
}
Βεβαιωθείτε ότι έχετε ρυθμίσει τον matcher
σύμφωνα με την Τεκμηρίωση για το Middleware του Next.js.
Στην πλευρά του πελάτη, μπορείτε να τροποποιήσετε το cookie locale
για να αλλάξετε την προτιμώμενη γλώσσα του χρήστη. Δείτε το πλήρες παράδειγμα κώδικα για ιδέες σχετικά με το πώς να το κάνετε!
Βήμα 5: Αναπτύξτε και δοκιμάστε!
Τελειώσαμε! Η εφαρμογή React σας θα μεταφράζεται τώρα αυτόματα όταν προσθέτετε οποιεσδήποτε συμβολοσειρές σε ένα Translate
component. Σημειώστε ότι μόνο περιβάλλοντα με δικαιώματα read/write
στο κλειδί API θα μπορούν να δημιουργούν νέες συμβολοσειρές προς μετάφραση. Συστήνουμε να διαθέτετε ένα κλειστό και ασφαλές περιβάλλον προ-παραγωγής όπου μπορείτε να δοκιμάσετε την παραγωγική σας εφαρμογή με ένα τέτοιο κλειδί API, προσθέτοντας νέες συμβολοσειρές πριν τη δημοσίευση. Αυτό θα αποτρέψει οποιονδήποτε οποιονδήποτε από το να κλέψει το μυστικό σας κλειδί API και ενδεχομένως να φουσκώσει το έργο των μεταφράσεών σας προσθέτοντας νέες, μη σχετικές συμβολοσειρές.
Be sure to check out the complete example over at our GitHub profile. There, you’ll also find an example of how to do this using the Pages Router! If you encounter any problems, feel free to reach out, and we’ll be more than happy to help.
TacoTranslate lets you automatically localize your React applications quickly to and from over 75 languages. Get started today!