Παγκοσμιοποίηση: τι είναι, i18n και πολυγλωσσία σε εφαρμογές

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-02-26 Χρόνος ανάγνωσης: 8 λεπ

Παγκοσμιοποίηση (παγκοσμιοποίηση, επίσης διεθνοποίηση, i18n) — η διαδικασία προετοιμασίας μιας εφαρμογής κινητού για εργασία με πολλές γλώσσες και περιφερειακές μορφές χωρίς αλλαγή του πηγαίου κώδικα. Περιλαμβάνει εξαγωγή πόρων κειμένου από τον κώδικα, υποστήριξη διαφορετικών μορφών ημερομηνιών, αριθμών και νομισμάτων, λήψη υπόψη της κατεύθυνσης κειμένου (LTR/RTL) και προσαρμογή διάταξης για διαφορετικές γλώσσες. Στο iOS χρησιμοποιούνται NSLocalizedString και Localizable.strings, στο Android — strings.xml σε καταλόγους values-{lang}. Περισσότερα στο τεκμηρίωση της Apple για τη διεθνοποίηση.

Κύρια

  • Παγκοσμιοποίηση (i18n) — προετοιμασία κώδικα εφαρμογής για πολλές γλώσσες και περιοχές
  • NSLocalizedString — μακροεντολή Swift για εξαγωγή μεταφρασμένων συμβολοσειρών από Localizable.strings
  • strings.xml — αρχείο XML Android όπου αποθηκεύονται πόροι συμβολοσειρών για κάθε γλώσσα
  • RTL — υποστήριξη για γλώσσες με γραφή από δεξιά προς τα αριστερά (αραβικά, εβραϊκά, ουρντού)
  • Μορφές — ημερομηνίες, αριθμοί και νομίσματα πρέπει να μορφοποιούνται μέσω API εξαρτώμενων από Locale

Τι είναι η Παγκοσμιοποίηση (i18n) και γιατί χρειάζεται;

Παγκοσμιοποίηση (συντομογραφία i18n — 18 γράμματα μεταξύ «i» και «n») — αρχιτεκτονική προετοιμασία της εφαρμογής για εργασία με οποιαδήποτε γλώσσα και περιοχή. Ο βασικός κανόνας του i18n: καμία συμβολοσειρά κειμένου δεν πρέπει να είναι σκληρά κωδικοποιημένη (hardcoded) στον πηγαίο κώδικα. Αντ' αυτού, οι συμβολοσειρές εξάγονται σε αρχεία πόρων και ο κώδικας έχει πρόσβαση σε αυτές μέσω κλειδιών. Κατά την προσθήκη μιας νέας γλώσσας, αρκεί η προσθήκη ενός αρχείου μετάφρασης — ο κώδικας παραμένει αμετάβλητος. Αυτό διακρίνει το i18n από την τοπικοποίηση (l10n), όπου μεταφράζονται οι ίδιες οι συμβολοσειρές.

Επιχειρηματικό επιχείρημα — η παγκοσμιοποίηση αυξάνει την αγορά. Σύμφωνα με την Common Sense Advisory (2023), άνω του 70% των χρηστών προτιμούν να αγοράζουν σε εφαρμογές στη μητρική τους γλώσσα. Η τοπικοποίηση σε 10 γλώσσες αυξάνει το δυνητικό κοινό κατά 80%. Χωρίς i18n, κάθε επέκταση σε νέα γλώσσα απαιτεί τροποποίηση κώδικα, γεγονός που επιβραδύνει την είσοδο στην αγορά και αυξάνει το κόστος 5–10 φορές. Η σωστή αρχιτεκτονική i18n επιτρέπει την υποστήριξη 40+ γλωσσών με ελάχιστο κόστος.

Συστατικά i18n περιλαμβάνουν: εξαγωγή συμβολοσειρών (String externalization), πληθυντικούς (pluralization για 1/2/5+), μορφοποίηση ημερομηνιών και αριθμών (DateFormatter/SimpleDateFormat), υποστήριξη γλωσσών RTL (Right-to-Left), ταξινόμηση σύμφωνα με κανόνες locale (Collator), περιφερειακά σύμβολα (διαχωριστικά χιλιάδων, δεκαδικά ψηφία). Στην IT Sectr ενσωματώνουμε το i18n στο στάδιο της αρχιτεκτονικής, όχι εκ των υστέρων — αυτό εξοικονομεί έως και 60% χρόνο κατά την επακόλουθη τοπικοποίηση.

Διεθνοποίηση στο iOS: NSLocalizedString και XLIFF

NSLocalizedString — η κύρια μακροεντολή Swift για εργασία με μεταφράσεις. Μορφή: NSLocalizedString(«key», comment: «περιγραφή για μεταφραστή»). Η μακροεντολή αντικαθιστά αυτόματα τη συμβολοσειρά από το Localizable.strings για το τρέχον locale της συσκευής (NSLocale.preferredLanguages). Εάν δεν βρεθεί μετάφραση για το κλειδί, επιστρέφεται το ίδιο το κλειδί ή η τιμή στη γλώσσα ανάπτυξης (συνήθως en). Η Apple συνιστά τη χρήση ουσιαστικών κλειδιών, όχι αγγλικών συμβολοσειρών ως κλειδιά.

swift
// Localizable.strings (en)
// "welcome_title" = "Καλωσήρθατε!";
// Localizable.strings (ru)
// "welcome_title" = "Καλωσήρθατε!";

// Κώδικας Swift — ενιαίος για όλες τις γλώσσες
titleLabel.text = NSLocalizedString(
    "welcome_title",
    comment: "Τίτλος οθόνης υποδοχής"
)

// Πληθυντικοί μέσω Localizable.stringsdict
// 
// <dict>
//     <key>items_count</key>
//     <dict>
//         <key>NSStringLocalizedFormatKey</key>
//         <string>%#@items@</string>
//         <key>items</key>
//         <dict>
//             <key>one</key>
//             <string>%d προϊόν</string>
//             <key>few</key>
//             <string>%d προϊόντα</string>
//             <key>many</key>
//             <string>%d προϊόντα</string>
//         </dict>
//     </dict>
// </dict>

// Χρήση πληθυντικών
let items = 5
let label = String.localizedStringWithFormat(
    NSLocalizedString("items_count", comment: ""), items
)

XLIFF — μορφή ανταλλαγής μεταφράσεων μεταξύ προγραμματιστών και μεταφραστών. Το Xcode εξάγει ένα αρχείο XLIFF (Editor → Export for Localization) που περιέχει όλες τις συμβολοσειρές προς μετάφραση. Ο μεταφραστής εργάζεται με XLIFF σε εργαλεία CAT (Trados, memoQ, Smartcat). Μετά τη μετάφραση, το XLIFF εισάγεται ξανά στο Xcode (Editor → Import Localizations). Το XLIFF ενημερώνει αυτόματα όλους τους καταλόγους .lproj. Αυτή είναι η τυπική ροή εργασίας τοπικοποίησης εφαρμογών iOS στην παραγωγή.

SwiftUI και i18n

SwiftUI λειτουργεί με το NSLocalizedString μέσω του αρχικοποιητή Text. Το κείμενο στο SwiftUI είναι αυτόματα διεθνοποιημένο: το Text(«welcome_title») αναζητά μετάφραση στο Localizable.strings όπως το NSLocalizedString. Για πληθυντικούς χρησιμοποιήστε Text(«%d items», count: items). Το SwiftUI υποστηρίζει μορφοποίηση ημερομηνίας μέσω Text(date, style: .date) — χρησιμοποιεί αυτόματα το Locale.current. Η Apple συνιστά το SwiftUI για νέα έργα, καθώς η διεθνοποίηση σε αυτό είναι πιο διαφανής.

Διεθνοποίηση στο Android: strings.xml και RTL

Android i18n βασίζεται στο σύστημα πόρων. Οι συμβολοσειρές εξάγονται στο res/values/strings.xml για την προεπιλεγμένη γλώσσα (συνήθως αγγλικά). Για κάθε γλώσσα δημιουργείται ξεχωριστός κατάλογος: res/values-ru/strings.xml (ρωσικά), res/values-de/strings.xml (γερμανικά), res/values-fr/strings.xml (γαλλικά). Το Android επιλέγει αυτόματα τις συμβολοσειρές με βάση τη γλώσσα συστήματος της συσκευής (Locale.getDefault()). Εάν δεν υπάρχει ακριβές locale, χρησιμοποιείται η βασική έκδοση (values/strings.xml).

kotlin
// res/values/strings.xml (αγγλικά, προεπιλογή)
<resources>
    <string name="welcome_title">Welcome!</string>
    <string name="items_count">%d item(s)</string>
</resources>

// res/values-ru/strings.xml (ρωσικά)
<resources>
    <string name="welcome_title">Καλωσήρθατε!</string>
    <plurals name="items_count">
        <item quantity="one">%d προϊόν</item>
        <item quantity="few">%d προϊόντα</item>
        <item quantity="many">%d προϊόντα</item>
    </plurals>
</resources>

// Κώδικας Kotlin
textView.text = getString(R.string.welcome_title)

// Πληθυντικοί
val items = 5
textView.text = resources.getQuantityString(
    R.plurals.items_count, items, items
)

// Υποστήριξη RTL στον κώδικα
textView.textDirection = View.TEXT_DIRECTION_LOCALE
// Manifest: supportsRtl="true"

RTL (Right-to-Left) — υποστήριξη για γλώσσες όπου το κείμενο διαβάζεται από δεξιά προς τα αριστερά (αραβικά, εβραϊκά, ουρντού, περσικά). Το Android υποστηρίζει RTL μέσω των ιδιοτήτων android:layoutDirection και android:textDirection. Στο manifest ορίστε android:supportsRtl="true" — και το Android καθρεφτίζει αυτόματα τη διάταξη. Το NavDrawer, τα εικονίδια πίσω/μπροστά, η στοίχιση κειμένου πρέπει να λειτουργούν και προς τις δύο κατευθύνσεις. Στον κώδικα χρησιμοποιήστε View.LAYOUT_DIRECTION_LOCALE και Gravity.START/END αντί για LEFT/RIGHT.

Τοπικοποιημένοι πόροι

Android Resource Qualifiers επιτρέπουν την τοπικοποίηση όχι μόνο συμβολοσειρών, αλλά και εικόνων (res/drawable-ru/), διατάξεων (res/layout-ru/), κινούμενων σχεδίων, χρωμάτων. Για τα αραβικά και εβραϊκά χρειάζονται ξεχωριστές διατάξεις με κατοπτρική διάταξη στοιχείων — χρησιμοποιήστε res/layout-ar/ (αραβικά). Το Android υποστηρίζει επίσης περιφερειακές παραλλαγές: values-rUS, values-rGB, values-de-DE. Οι Qualifiers συνδυάζονται: values-ldrtl-ru — ρωσικά για οθόνες RTL.

Περιφερειακές μορφές: ημερομηνίες, αριθμοί, νομίσματα σε iOS και Android

Ημερομηνία και ώρα — μία από τις βασικές πτυχές του i18n. Διαφορετικές περιοχές χρησιμοποιούν διαφορετικές μορφές: Ρωσία — ΗΗ.ΜΜ.ΕΕΕΕ, ΗΠΑ — ΜΜ/ΗΗ/ΕΕΕΕ, Ιαπωνία — ΕΕΕΕ.ΜΜ.ΗΗ. Η χρήση σταθερής μορφής (yyyy-MM-dd) για εμφάνιση στον χρήστη είναι λάθος. Στο iOS χρησιμοποιήστε DateFormatter με Locale(identifier: locale), στο Android — DateFormat.getDateInstance(DateFormat.SHORT, locale). Για φωνητικούς βοηθούς και αναζήτηση AI, οι ημερομηνίες πρέπει να είναι σε ISO 8601 στην εσωτερική αναπαράσταση.

Αριθμοί και νομίσματα — διαφορετικές περιοχές έχουν διαφορετικούς διαχωριστές: 1,234.56 (ΗΠΑ) vs 1.234,56 (Ρωσία), 1 234,56 (Γαλλία). iOS: NumberFormatter με .locale = locale. Android: DecimalFormat με DecimalFormatSymbols(locale). Για νομίσματα: μορφή ¥1,234 (Ιαπωνία) vs $1,234.56 (ΗΠΑ) vs 1 234,56 ₽ (Ρωσία). Μην συνενώνετε ποτέ χειροκίνητα το νόμισμα και τον αριθμό — χρησιμοποιήστε NumberFormatter.currencyCode και .currencySymbol.

ΠεριοχήΗμερομηνίαΑριθμόςΝόμισμα
Ρωσία31.12.20241 234,561 234,56 ₽
ΗΠΑ12/31/20241,234.56$1,234.56
Γερμανία31.12.20241.234,561.234,56 €
Ιαπωνία2024/12/311,234¥1,234
Σαουδική Αραβία31/12/20241,234.561,234.56 SAR

Ταξινόμηση (Collation) — η αλφαβητική ταξινόμηση διαφέρει σε διαφορετικές γλώσσες. Στα ισπανικά το «ch» έρχεται μετά το «c». Στα σουηδικά το «ä» βρίσκεται στο τέλος του αλφαβήτου. Στα γερμανικά το «ß» ταξινομείται ως «ss». iOS: LocalizedComparison (String.localizedCompare). Android: Collator.getInstance(locale). Μην χρησιμοποιείτε ποτέ το compareTo() για συμβολοσειρές που εμφανίζονται στον χρήστη — χρησιμοποιεί Unicode Code Point order, το οποίο δεν λαμβάνει υπόψη περιφερειακούς κανόνες.

Βέλτιστες πρακτικές διεθνοποίησης εφαρμογών κινητού

Αρχιτεκτονικές αρχές — ξεκινήστε το i18n από το πρώτο commit. Κάθε συμβολοσειρά στον κώδικα πρέπει να περνά από μια συνάρτηση περιτυλίγματος (tr("key")), η οποία δεν υπάρχει μέχρι τη ρύθμιση του i18n — αυτό θα αναγκάσει τον προγραμματιστή να εξάγει αμέσως τις συμβολοσειρές. Μην χρησιμοποιείτε αγγλικές συμβολοσειρές ως κλειδιά — όταν αλλάξει η διατύπωση στα αγγλικά, θα πρέπει να ενημερώσετε όλες τις μεταφράσεις. Χρησιμοποιήστε ουσιαστικά κλειδιά: «profile.title», «settings.language.label».

Ψευδοτοπικοποίηση — τεχνική δοκιμής i18n πριν από την πραγματική μετάφραση. Αντικαταστήστε κάθε λατινικό γράμμα με σύμβολα με διακριτικά (á, é, ñ, ü) για έλεγχο κωδικοποίησης, προσθέστε πρόθεμα [XXX] για έλεγχο περικοπής συμβολοσειρών. Xcode: σχήματα εκκίνησης — ψευδογλώσσα «Double-Length Pseudolanguage». Android: Developer Options — Force RTL layout direction, System font scale έως 200%. Η ψευδοτοπικοποίηση εντοπίζει το 80% των προβλημάτων i18n χωρίς τη συμμετοχή μεταφραστή.

Λίστα ελέγχου IT Sectr i18n — πριν από την κυκλοφορία ελέγχουμε: (1) δεν υπάρχουν hardcoded συμβολοσειρές στον κώδικα (εξαίρεση: αρχεία καταγραφής), (2) οι πληθυντικοί λειτουργούν σωστά για όλες τις γλώσσες, (3) οι ημερομηνίες/αριθμοί μορφοποιούνται μέσω Locale API, (4) η διάταξη εμφανίζεται σωστά σε γλώσσες RTL, (5) οι συμβολοσειρές δεν περικόπτονται στη μέγιστη κλίμακα, (6) η ψευδοτοπικοποίηση δεν εντόπισε σφάλματα, (7) όλες οι γλώσσες που δηλώνονται στα καταστήματα έχουν πλήρες σύνολο μεταφράσεων.

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

Σε τι διαφέρει το i18n από το l10n;

i18n (διεθνοποίηση) — προετοιμασία κώδικα: εξαγωγή συμβολοσειρών, υποστήριξη RTL, μορφοποίηση. Γίνεται από τον προγραμματιστή μία φορά. l10n (τοπικοποίηση) — μετάφραση συμβολοσειρών σε συγκεκριμένη γλώσσα. Γίνεται από τον μεταφραστή πολλές φορές για κάθε τοπικοποίηση. i18n — αρχιτεκτονική, l10n — περιεχόμενο. Χωρίς i18n, η τοπικοποίηση είναι κατ' αρχήν αδύνατη.

Πώς λειτουργεί το NSLocalizedString στο Swift;

NSLocalizedString — μια μακροεντολή που αναζητά την τιμή με βάση το κλειδί στο Localizable.strings για το τρέχον locale της συσκευής. Εάν βρεθεί μετάφραση — την επιστρέφει. Εάν όχι — επιστρέφει το κλειδί. Μορφή: NSLocalizedString(«key», comment: «περιγραφή»). Για μορφοποίηση με παραμέτρους χρησιμοποιήστε String.localizedStringWithFormat().

Πώς είναι οργανωμένα τα strings.xml στο Android;

strings.xml — αρχείο με μεταφράσεις στον κατάλογο res/values/{lang}/. Βασική έκδοση στο values/strings.xml, μεταφράσεις — στο values-ru/strings.xml. Ο κώδικας έχει πρόσβαση μέσω getString(R.string.key). Το Android επιλέγει μόνο του το απαραίτητο αρχείο βάσει γλώσσας συστήματος. Για πληθυντικούς χρησιμοποιείται ο πόρος <plurals> με προσδιοριστικά zero/one/few/many/other.

Τι είναι το RTL στο πλαίσιο του i18n;

RTL (Right-to-Left) — κατεύθυνση γραφής για αραβικά, εβραϊκά, ουρντού, περσικά. Android: supportsRtl="true" στο manifest, android:layoutDirection, Gravity.START/END. iOS: UISemanticContentAttribute.forceLeftToRight για υποχρεωτικό RTL. Η διάταξη πρέπει να καθρεφτίζεται: μενού στα δεξιά, κείμενο — από δεξιά προς τα αριστερά, εικονίδια πλοήγησης — ανεστραμμένα.

Ποιες γλώσσες είναι υποχρεωτικές για δημοσίευση;

Για παγκόσμια δημοσίευση ελάχιστο σύνολο: αγγλικά, ισπανικά, γαλλικά, γερμανικά, ιαπωνικά, κινέζικα, κορεατικά, πορτογαλικά, ρωσικά, ιταλικά. Το App Store απαιτεί τουλάχιστον αγγλική τοπικοποίηση. Κάθε πρόσθετη τοπικοποίηση αυξάνει το δυνητικό κοινό. Για την τοπική αγορά αρκούν 1–2 γλώσσες.

Σύνοψη

  • Παγκοσμιοποίηση (i18n) — αρχιτεκτονική προετοιμασία της εφαρμογής για πολλές γλώσσες και περιοχές
  • NSLocalizedString — μακροεντολή Swift για μετάφραση συμβολοσειρών μέσω Localizable.strings + εξαγωγή XLIFF
  • strings.xml — πόρος Android με μεταφράσεις σε καταλόγους values-{lang}
  • RTL — υποχρεωτική υποστήριξη για αραβικά, εβραϊκά, ουρντού και περσικά
  • Μορφές — ημερομηνίες και αριθμοί μορφοποιούνται αυστηρά μέσω Locale API, όχι χειροκίνητα
  • Πληθυντικοί — iOS: stringsdict, Android: <plurals> με έξι ποσοτικές μορφές
  • Ψευδοτοπικοποίηση — τεχνική δοκιμής i18n πριν από τη μετάφραση (εντοπίζει 80% προβλημάτων)

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης