Table of Contents
Δημιουργία ενός συστήματος υποστήριξης πολλών γλωσσών στην Αντιδραστική Native Apps
Η δημιουργία εφαρμογών για κινητά που υποστηρίζουν πολλαπλές γλώσσες δεν είναι πλέον προαιρετική ⁇ είναι απαίτηση για οποιαδήποτε εφαρμογή που στοχεύει στην παγκόσμια υιοθέτηση. Η React Native, με τις δυνατότητες της cross-platform, προσφέρει αρκετές ισχυρές προσεγγίσεις για την εφαρμογή διεθνοποίησης (i18n) και εντοπισμού (l10n). Το άρθρο αυτό παρέχει έναν σε βάθος οδηγό για την αρχιτεκτονική ενός πολυγλωσσικού συστήματος υποστήριξης στην Αντιδραστική Ιθαγενή, που καλύπτει βιβλιοθήκες, διαμόρφωση, δυναμική αλλαγή, χειρισμός σύνθετων κανόνων πλουραλισμού, δεξιο-αριστερά (RTL) ρυθμίσεις διάταξης, και τις βέλτιστες πρακτικές απόδοσης.
Βασικές έννοιες της τοπικοποίησης
Η τοπικοποίηση υπερβαίνει την απλή μετάφραση κειμένου. Περιλαμβάνει τη μορφοποίηση αριθμών, ημερομηνιών, νομισμάτων, τη διαχείριση κατεύθυνσης κειμένου (LTR vs. RTL), τον πλουραλισμό, τις μορφές φύλου, και ακόμη και τη ρύθμιση των διατάξεων UI για να ταιριάζει μεταφρασμένες συμβολοσειρές. Ένα καλά σχεδιασμένο σύστημα i18n διαχωρίζει το μεταφραζόμενο περιεχόμενο από την βάση κώδικα σας, χρησιμοποιεί αναφορές με βάση το κλειδί, και υποστηρίζει τη μετάβαση γλώσσας σε ώρα εκτέλεσης χωρίς να απαιτείται επανεκκίνηση εφαρμογής.
Βασικές προκλήσεις στην Αντιμετώπιση των Ιθαγενών
- Μητρικές ενότητες για ανίχνευση τοποθεσιών συσκευών (διαφορές μεταξύ iOS και Android).
- Αποτελεσματικά φόρτωση και χάραξη μεταφραστικών αρχείων.
- Διαχείριση κατάστασης για την ενεργό γλώσσα σε ολόκληρη την εφαρμογή (συμπεριλαμβανομένης της πλοήγησης και των συνεχιζόμενων προτιμήσεων).
- Χειρισμός διατάξεων RTL ⁇ React Native supports ] αλλά απαιτεί προσεκτική ευθυγράμμιση.
- Δοκιμή και επαλήθευση όλων των μεταφρασμένων συμβολοσειρών στο πλαίσιο.
Επιλογή της Δεξιάς Βιβλιοθήκης i18n
Ενώ υπάρχουν αρκετές βιβλιοθήκες, react-i18next[[LFT:1]]] είναι η πιο δημοφιλής και ολοκληρωμένη επιλογή για React Native. Χτισμένο πάνω από i18next[], παρέχει άγκιστρα, HOCs, και συστατικά για απρόσκοπτη ολοκλήρωση. Οι εναλλακτικές λύσεις περιλαμβάνουν [i18n-js] (απλό, αλλά λιγότερο ισχυρό) και ]react-native-localize[LFT:7]] (για τοπική ανίχνευση, όχι μετάφραση).Για εφαρμογές επιχειρήσεων, αντιδράστε-i18next με πρόσθετα plugins (π.χ., i18next-browser-language recanitableed for React Incental) συνιστάται.
Εγκατάσταση των κεντρικών βιβλιοθηκών
Ξεκινήστε με την εγκατάσταση των απαιτούμενων πακέτων:
npm install react-i18next i18next i18next-http-backend react-native-localize
Προαιρετικά προσθέστε i18next-browser-languageditor για αυτόματη ανίχνευση γλώσσας με βάση τις προτιμήσεις της συσκευής. Σημειώστε ότι μπορεί να χρειαστεί να συνδέσετε τις αυτόχθονες ενότητες για να αντιδράσετε-εντοπίστε-εντοπίστε (αυτόματη σύνδεση στο RN 0,60+).
⁇ της 18ης Ιουνίου 1997
Δημιουργία αρχείου ρύθμισης, π.χ., :
import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import * as RNLocalize from 'react-native-localize';
import en from './translations/en.json';
import es from './translations/es.json';
import fr from './translations/fr.json';
const resources = { en: { translation: en }, es: { translation: es }, fr: { translation: fr } };
const detectionOptions = {
order: ['localStorage', 'navigator'],
caches: ['localStorage'],
};
i18n
.use(initReactI18next)
.use(require('i18next-browser-languagedetector').default) // for RN, you may replace with custom detector
.init({
resources,
fallbackLng: 'en',
interpolation: { escapeValue: false },
detection: {
// For RN, we'll override detection manually (see below)
},
});
// Detect device language at startup
const detectLanguage = () => {
const locales = RNLocalize.getLocales();
if (locales && locales.length > 0) {
const langCode = locales[0].languageCode;
const supportedLanguages = Object.keys(resources);
const lang = supportedLanguages.includes(langCode) ? langCode : i18n.options.fallbackLng[0];
i18n.changeLanguage(lang);
}
};
detectLanguage();
// Listen to app focus for locale changes
export default i18n;
Χρησιμοποιώντας react-native-localize[ εξασφαλίζει την εφαρμογή σας σέβεται τις περιφερειακές ρυθμίσεις της συσκευής. Η λειτουργία τρέχει μία φορά και ορίζει την αρχική γλώσσα. Για συνεχείς ενημερώσεις (αν ο χρήστης αλλάξει τη γλώσσα της συσκευής του ενώ η εφαρμογή είναι ανοικτή), μπορείτε να εγγραφείτε στις αλλαγές .
Δομή αρχείων μεταφράσεων
Οργανώστε τις μεταφράσεις σας σε φωλιασμένο αρχεία JSON ανά γλώσσα και χώρους ονομάτων. Παράδειγμα για :
{
"common": {
"welcome": "Welcome",
"greeting": "Hello, {{name}}!"
},
"home": {
"title": "Home Screen",
"description": "This is a multi-language React Native app."
},
"errors": {
"network": "Network error. Please try again."
}
}
Χρησιμοποιώντας χώρους ονομάτων (π.χ., ], ]]) βοηθά στη διαχείριση μεγάλων εφαρμογών και επιτρέπει τεμπέλικη φόρτωση κομματιών μεταφράσεων.
Χρήση μεταφράσεων σε συστατικά
Η χρήσηTranslation γάντζο
Σε κάθε λειτουργικό συστατικό:
import { useTranslation } from 'react-i18next';
const MyComponent = () => {
const { t, i18n } = useTranslation('common');
return (
{t('welcome')}
{t('greeting', { name: 'John' })}
i18n.changeLanguage('es')}>
Switch to Spanish
);
};
Η t[[LFT:1]] λειτουργία παρεμβάλλει μεταβλητές και χειρίζεται πληθυντικούς. Για να αλλάξει γλώσσα, καλεί [[LFT:11] ⁇ αυτό ενεργοποιεί την εκ νέου μεταβίβαση όλων των στοιχείων που έχουν εγγραφεί.
Χρήση του συστατικού Trans
Για σύνθετες χορδές με ενσωματωμένα στοιχεία σήμανσης ή αναπαράστασης:
import { Trans } from 'react-i18next';
// In translations: "welcome_html": "Welcome, {user} !"
Welcome, {user} !
Χειρισμός Πληθωρικών, Φύλων και Πλαίσιο
i18next υποστηρίζει προηγμένους κανόνες πληθυντικού έξω από το πλαίσιο. Καθορίστε τα πλήκτρα με [[LFT:13]] επίθημα ή χρήση [[LFT:14]] πλαίσιο. Παράδειγμα:
{
"item": "{{count}} item",
"item_plural": "{{count}} items",
"item_other": "{{count}} items"
}
Χρήση: επιλέγει αυτόματα τη σωστή φόρμα με βάση την τοπική τοποθεσία. Το φύλο και άλλα πλαίσια μπορούν να αντιμετωπιστούν μέσω της επιλογής .
Δυναμική αλλαγή γλώσσας και επιμονή
Για να επιμείνουμε στην προτίμηση της γλώσσας του χρήστη, αποθηκεύστε την επιλεγμένη γλώσσα σε AsyncStorage (ή [[LFT:2]]react-native-mmkv[[LFT:3]]]]) και φορτώστε την στην εκκίνηση της εφαρμογής. Τροποποίηση της διαμόρφωσης i18n:
import AsyncStorage from '@react-native-async-storage/async-storage';
const languageDetector = {
type: 'languageDetector',
async: true,
detect: async (callback) => {
const storedLang = await AsyncStorage.getItem('user-language');
callback(storedLang || 'en');
},
init: () => {},
cacheUserLanguage: async (lng) => {
await AsyncStorage.setItem('user-language', lng);
},
};
i18n.use(initReactI18next).use(languageDetector).init({
fallbackLng: 'en',
resources,
interpolation: { escapeValue: false },
});
Τώρα όταν ο χρήστης αλλάζει γλώσσα, η προτίμηση αποθηκεύεται και αυτόματα αποκαθίσταται στην επόμενη έναρξη.
Υποστήριξη δεξιά προς αριστερά (RTL)
Αντιδρήστε Native υποστηρίζει RTL μέσω της ενότητα. Όταν η γλώσσα είναι αραβικά, εβραϊκά, ή περσικά, δύναμη RTL:
import { I18nManager } from 'react-native';
const changeLanguage = async (lng) => {
await i18n.changeLanguage(lng);
const isRTL = i18n.dir(lng) === 'rtl';
I18nManager.forceRTL(isRTL);
// On Android, you may need to restart the app for full RTL effect
};
Για μια ολοκληρωμένη εμπειρία RTL, χρησιμοποιήστε ] και προσεκτικά. Σκεφτείτε τη χρήση μιας βιβλιοθήκης όπως react-native-restyle για θεματική κατεύθυνση.
Φόρτωση μεταφράσεων από έναν εξυπηρετητή (Over-the-Air)
Για εφαρμογές που πρέπει να προσθέσετε γλώσσες χωρίς ενημερώσεις καταστημάτων εφαρμογών, να φέρετε μετάφραση JSONs από ένα σύστημα υποστήριξης. Χρησιμοποιήστε [[LPT:0]]i18next-http-backend[[LFT:1]] με ένα προσαρμοσμένο σύστημα υποστήριξης για React Native:
import HttpBackend from 'i18next-http-backend';
i18n.use(HttpBackend).init({
backend: {
loadPath: 'https://your-api.com/locales/{{lng}}/{{ns}}.json',
},
fallbackLng: 'en',
ns: ['common', 'home'],
defaultNS: 'common',
});
Συνδυάστε με έναν μηχανισμό έκδοσης για να κατεβάσετε μόνο ενημερωμένα αρχεία.
Επιδόσεις
- Χρήση χωριστού χώρου ονομάτων: Μόνο μεταφράσεις φόρτωσης για την τρέχουσα οθόνη. Η βραδεία φόρτωση μειώνει το αρχικό μέγεθος του πακέτου.
- Αποφύγετε τους επανεντασσόμενους : Το γάντζο βελτιστοποιεί ήδη με την εγγραφή μόνο στις γλωσσικές αλλαγές. Τυλίξτε ακριβά εξαρτήματα με ].
- Προ-compile αρχεία μετάφρασης: Κατά τη διάρκεια της κατασκευής, μετατρέψτε JSON σε minified μορφή.
- Για μεγάλες εφαρμογές, εξετάστε τη χρήση i18next-scanner για να εξαγάγετε αυτόματα τα κλειδιά μεταφράσεων από τη βάση κώδικα σας.
Δοκιμή πολυγλωσσικής λειτουργικότητας
Γράψτε μονάδες δοκιμών για τα αρχεία μεταφράσεών σας: βεβαιωθείτε ότι δεν λείπουν κλειδιά, όλοι οι κάτοχοι του χώρου παρέχονται, και πληθυντικός λειτουργεί σωστά. Χρησιμοποιήστε [[LFT:26]]] με ένα mock i18n παράδειγμα. Για δοκιμές ενσωμάτωσης, προσομοίωση γλωσσικών διακοπτών και ελέγξτε ότι τα συστατικά εμφανίζουν σωστό κείμενο. Επίσης, ελέγξτε RTL απόδοση διάταξης και στις δύο πλατφόρμες.
Οι Βέλτιστες Πρακτικές Ανακεφαλαιώνουν
- Πάντα χρησιμοποιούν τα κλειδιά μεταφράσεων ⁇ ποτέ οι χορδές που έχουν σχέση με τον σκληρό κώδικα.
- Διατηρήστε τις μεταφράσεις οργανωμένες[ από χαρακτηριστικό ή οθόνη (ονοματεπώνυμοι χώροι).
- Χρησιμοποιήστε τις εφεδρικές γλώσσες για να αποτρέψετε την διακοπή των ατελών μεταφράσεων.
- Δοκιμάστε σε πραγματικές συσκευές με διαφορετικές ρυθμίσεις εντοπισμού.
- Σχετικά με τις πολιτισμικές διαφορές πέρα από τη γλώσσα: μορφές ημερομηνίας, έγχρωμες σημασίες, εικόνες.
- Εγχειρίδιο i18n ροή εργασίας σας για μεταφραστές και προγραμματιστές.
Με βιβλιοθήκες όπως [[LFT:0]] react-i18next[[LPT:1]] και [[LFT:4]react-national-localize[[LFT:3]]], μπορείτε να οικοδομήσετε ένα ισχυρό σύστημα που κλιμακώνεται με τη βάση των χρηστών σας. Για περαιτέρω ανάγνωση, ανατρέξτε στην επίσημη [[[LFT:4]] react-i18next τεκμηρίωση[[LPT:5]]], τον [[LFT:6]]]18next κεντρικό οδηγό[[[LFT:7]] και το [[LFT:8] react-native-localize repository[[LT:9]]. Ξεκινήστε το μικρό, το topate, και την εφαρμογή σας θα μιλήσει τη γλώσσα του χρήστη ⁇ λογοτεχνολογικά.