Locale — τι είναι, κλάση Foundation και εντοπισμός

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

Το Locale — είναι μια κλάση Foundation σε iOS και macOS που ενσωματώνει τις γλωσσικές και πολιτισμικές συμβάσεις του χρήστη: μορφή ημερομηνιών, αριθμών, νομισμάτων και μονάδων μέτρησης. Σύμφωνα με το Apple Developer Documentation, 2024, το Locale καθορίζει πώς το DateFormatter εμφανίζει τον μήνα (Ιανουάριος ή January), το δεκαδικό διαχωριστικό σε έναν αριθμό (κόμμα ή τελεία) και το σύμβολο νομίσματος (ευρώ, δολάριο ή λίρα). Κάθε στιγμιότυπο Locale είναι συνδεδεμένο με ένα αναγνωριστικό τύπου ru_RU ή en_US, όπου το πρώτο μέρος είναι ο κωδικός γλώσσας (ISO 639-1) και το δεύτερο είναι ο κωδικός περιοχής (ISO 3166-1). Σε αντίθεση με το TimeZone, το Locale δεν επηρεάζει την απόλυτη τιμή του χρόνου, μόνο την αναπαράστασή του ως συμβολοσειρά.

Κύρια σημεία

  • Locale — κλάση Foundation για πολιτισμικές και γλωσσικές ρυθμίσεις μορφοποίησης σε iOS και macOS
  • Αναγνωριστικό ru_RU — συνδυασμός κωδικού γλώσσας (ISO 639-1) και κωδικού περιοχής (ISO 3166-1)
  • DateFormatter και NumberFormatter χρησιμοποιούν αυτόματα το Locale για τον εντοπισμό της εξόδου
  • Locale.current — το τοπικό σύστημα του χρήστη, μπορεί να παρακαμφθεί για μεμονωμένες λειτουργίες
  • Σταθερό vs αυτόματη ενημέρωση — το Locale(identifier:) δημιουργεί σταθερό locale, το Locale.current παρακολουθεί τις αλλαγές ρυθμίσεων

Τι είναι το Locale στο Foundation;

Locale — είναι ένα value-type στο Swift (NSLocale στο Objective-C) που αντιπροσωπεύει ένα σύνολο κανόνων μορφοποίησης χαρακτηριστικών για μια συγκεκριμένη γλώσσα και περιοχή. Σε αντίθεση με το TimeZone, το οποίο καθορίζει την απόλυτη μετατόπιση χρόνου, το Locale καθορίζει πώς ο χρόνος, οι αριθμοί και το νόμισμα εμφανίζονται στην αναπαράσταση συμβολοσειράς. Η ίδια ημερομηνία 2024-07-21 θα εμφανιστεί ως «21 Ιουλίου 2024» για ru_RU και «July 21, 2024» για en_US.

Κάθε στιγμιότυπο Locale αποτελείται από δύο συστατικά: Language (γλώσσα — καθορίζει τα ονόματα μηνών, ημερών της εβδομάδας, σειρά λέξεων) και Region (περιοχή — καθορίζει τη μορφή αριθμών, νόμισμα, ημερολόγιο). Ο συνδυασμός αυτών των συστατικών κωδικοποιείται στο αναγνωριστικό σύμφωνα με το πρότυπο BCP 47: ru_RU (ρωσική γλώσσα, Ρωσία), en_US (αγγλική, ΗΠΑ), de_DE (γερμανική, Γερμανία).

Σύμφωνα με το Unicode CLDR (2024), η λίστα των υποστηριζόμενων τοπικών ρυθμίσεων στο iOS ξεπερνά τους 700 συνδυασμούς γλώσσας-περιοχής. Το Foundation χρησιμοποιεί δεδομένα από το CLDR (Common Locale Data Repository) — το πληρέστερο αποθετήριο δεδομένων εντοπισμού, που υποστηρίζεται από το Unicode Consortium. Αυτό εγγυάται την ομοιομορφία μορφοποίησης σε όλες τις συσκευές Apple.

Πώς επηρεάζει το Locale τη μορφοποίηση ημερομηνιών και αριθμών;

DateFormatter χρησιμοποιεί το Locale για την επιλογή των σωστών ονομάτων μηνών και ημερών της εβδομάδας, τον καθορισμό της σειράς των συστατικών ημερομηνίας (ημέρα/μήνας/έτος ή μήνας/ημέρα/έτος) και των διαχωριστικών. Χωρίς ρητό καθορισμό του Locale, το DateFormatter χρησιμοποιεί τις τοπικές ρυθμίσεις της συσκευής — αυτό είναι σωστό για το UI, αλλά επικίνδυνο για δεδομένα διακομιστή όπου η μορφή πρέπει να είναι σταθερή.

Συστατικόru_RUen_USde_DE
Ημερομηνία (medium)21 Ιουλίου 2024Jul 21, 202421.07.2024
Αριθμός (1000.5)1 000,51,000.51.000,5
Νόμισμα (100)100,00 ₽$100.00100,00 €
ΗμερολόγιοΓρηγοριανόΓρηγοριανόΓρηγοριανό
Διαχωριστικό λίστας;,;

NumberFormatter χρησιμοποιεί το Locale για τον καθορισμό του δεκαδικού διαχωριστικού (κόμμα ή τελεία), του διαχωριστικού ομαδοποίησης (κενό, κόμμα, τελεία) και του συμβόλου νομίσματος. Η αγνόηση του Locale κατά την ανάλυση αριθμών είναι μία από τις συχνές αιτίες σφαλμάτων σε διεθνείς εφαρμογές: ο αριθμός «1,5» σημαίνει «ενάμισι» για ru_RU, αλλά για en_US ο αναλυτής αριθμών θα τον διαβάσει ως «πέντε» μετά το κόμμα.

Σημαντικό: Το Calendar που δημιουργείται μέσω του Calendar.current κληρονομεί τις τοπικές ρυθμίσεις της συσκευής. Το Calendar(identifier: .gregorian) με ρητά καθορισμένο locale — ο συνιστώμενος τρόπος για προβλέψιμη μορφοποίηση. Κατά την εργασία με ημερομηνίες ISO 8601, χρησιμοποιείτε πάντα το Locale(identifier: "en_US_POSIX") — μια ειδική τοπική ρύθμιση για τεχνική μορφοποίηση που δεν επηρεάζεται από περιφερειακές ρυθμίσεις.

Αναγνωριστικά Locale: βασικές μορφές

Το αναγνωριστικό Locale αποτελείται από κωδικό γλώσσας (ISO 639-1, δύο χαρακτήρες) και κωδικό περιοχής (ISO 3166-1, δύο χαρακτήρες), που χωρίζονται με υπογράμμιση. Παραδείγματα: ru_RU, en_US, fr_FR, zh_Hans_CN (κινεζικά, απλοποιημένη γραφή, Κίνα). Το Foundation υποστηρίζει επίσης αναγνωριστικά σε μορφή BCP 47: ru-RU, en-US, που χρησιμοποιούνται σε πρότυπα ιστού.

Εκτός από τα πλήρη αναγνωριστικά, το Locale μπορεί να δημιουργηθεί μόνο με βάση τη γλώσσα: το Locale(identifier: "ru") επιστρέφει μια τοπική ρύθμιση με ρωσική γλώσσα και προεπιλεγμένη περιοχή για αυτήν τη γλώσσα (συνήθως Ρωσία). Παρόμοια για τα αγγλικά: το Locale(identifier: "en") χρησιμοποιεί την περιοχή των ΗΠΑ. Αυτή η προσέγγιση είναι χρήσιμη για τον ορισμό της γλώσσας μορφοποίησης χωρίς δέσμευση σε συγκεκριμένη περιοχή.

Ειδικές τοπικές ρυθμίσεις περιλαμβάνουν το en_US_POSIX — μια τεχνική τοπική ρύθμιση για μηχανική μορφοποίηση ημερομηνιών και αριθμών, που εγγυάται σταθερή μορφή ανεξάρτητα από τις ρυθμίσεις χρήστη. Αυτή η τοπική ρύθμιση είναι υποχρεωτική για την ανάλυση ημερομηνιών από API διακομιστή, ειδικά για τη μορφή ISO 8601. Χρησιμοποιεί Γρηγοριανό ημερολόγιο, 24ωρη μορφή ώρας και τελεία ως δεκαδικό διαχωριστικό.

swift
import Foundation

// Διαθέσιμα αναγνωριστικά τοπικών ρυθμίσεων
let available: [String] = Locale.availableIdentifiers
print("Σύνολο τοπικών ρυθμίσεων: \(available.count)")

// Φιλτράρισμα ρωσικών τοπικών ρυθμίσεων
let russianLocales = available.filter { $0.hasPrefix("ru") }
print("Ρωσικές τοπικές ρυθμίσεις: \(russianLocales)")

// Συστατικά τοπικής ρύθμισης
let locale = Locale(identifier: "de_DE")
print("Γλώσσα: \(locale.languageCode ?? "nil")")
print("Περιοχή: \(locale.regionCode ?? "nil")")
print("Νόμισμα: \(locale.currencyCode ?? "nil")")
print("Ημερολόγιο: \(locale.calendar.identifier)")

Έλεγχος διαθέσιμων τοπικών ρυθμίσεων μέσω του Locale.availableIdentifiers επιστρέφει έναν πίνακα όλων των αναγνωριστικών που υποστηρίζονται από την τρέχουσα έκδοση iOS. Για φιλτράρισμα ανά περιοχή, χρησιμοποιήστε το Locale.availableIdentifiers.filter με έλεγχο regionCode. Αυτό είναι χρήσιμο για τη δημιουργία UI επιλογής περιοχής χωρίς σταθερή κωδικοποιημένη λίστα.

Προσδιορισμός τρέχοντος locale χρήστη στο Swift

Locale.current — ο κύριος τρόπος λήψης των τρεχουσών τοπικών ρυθμίσεων της συσκευής, που ορίζονται από τον χρήστη στις ρυθμίσεις iOS (Settings > General > Language & Region). Αυτή η ιδιότητα ενημερώνεται αυτόματα κατά την αλλαγή γλώσσας ή περιοχής στις ρυθμίσεις χωρίς επανεκκίνηση της εφαρμογής. Ωστόσο, μπορεί να μην συμπίπτει με την προτιμώμενη τοπική ρύθμιση για εμφάνιση περιεχομένου: ο χρήστης μπορεί να ορίσει τη γλώσσα διεπαφής στα αγγλικά αλλά να βλέπει ημερομηνίες σε ρωσική μορφή.

Για ακριβέστερο προσδιορισμό των προτιμήσεων χρήστη, χρησιμοποιήστε το Locale.preferredLanguages — έναν πίνακα γλωσσών ταξινομημένων κατά προτεραιότητα χρήστη. Το πρώτο στοιχείο είναι η κύρια γλώσσα διεπαφής. Αυτή η λίστα αντιστοιχεί στις ρυθμίσεις στο Language & Region, συμπεριλαμβανομένης της μεταφοράς γλωσσών κατά σειρά προτίμησης. Οι εφαρμογές επικοινωνίας (messengers, email clients) πρέπει να λαμβάνουν υπόψη αυτήν τη σειρά κατά την επιλογή γλώσσας εμφάνισης περιεχομένου.

swift
import Foundation

// Τρέχουσα τοπική ρύθμιση συστήματος
let current = Locale.current
print("Τρέχουσα τοπική ρύθμιση: \(current.identifier)")
print("Γλώσσα: \(current.language?.disjointName ?? "nil")")

// Προτιμώμενες γλώσσες χρήστη
let preferred = Locale.preferredLanguages
print("Προτιμώμενες γλώσσες: \(preferred)")

// Λήψη περιοχής από τρέχουσα τοπική ρύθμιση
if let region = current.regionCode {
    let regionLocale = Locale(identifier: "en_\(region)")
    let countryName = regionLocale.localizedString(
        forRegionCode: region
    )
    print("Χώρα: \(countryName ?? region)")
}

// Έλεγχος μορφής 24ωρου
let uses24h = current.uses24hClock(
    for: .dateAndTime
)
print("Χρήση 24ωρου: \(uses24h)")

Εντοπισμός στο UI: για εμφάνιση ονομάτων μηνών και ημερών της εβδομάδας στη γλώσσα διεπαφής, χρησιμοποιήστε το Calendar με καθορισμένο locale. Το Calendar.current.symbols(for: .month) επιστρέφει τα ονόματα μηνών στη γλώσσα της τρέχουσας τοπικής ρύθμισης. Για εμφάνιση ονομάτων χωρών στη γλώσσα χρήστη, χρησιμοποιήστε το Locale.current.localizedString(forRegionCode:).

Locale στο Swift: παραδείγματα χρήσης

Μορφοποίηση ημερομηνίας λαμβάνοντας υπόψη τις τοπικές ρυθμίσεις — βασικό έργο κατά την εμφάνιση ημερομηνιών στον χρήστη. Το DateFormatter με καθορισμένο locale επιλέγει αυτόματα τη σωστή μορφή ημερομηνίας και ώρας για την περιοχή του χρήστη. Για dateStyle και timeStyle με τιμές .short, .medium, .long, .full, η μορφοποίηση χρησιμοποιεί τους κανόνες τοπικής ρύθμισης για τη σύνθεση των συστατικών ημερομηνίας.

swift
import Foundation

let date = Date()

// Μορφοποίηση με διαφορετικές τοπικές ρυθμίσεις
let formatter = DateFormatter()
formatter.dateStyle = .medium

formatter.locale = Locale(identifier: "ru_RU")
print("Ρωσικά: \(formatter.string(from: date))")

formatter.locale = Locale(identifier: "en_US")
print("Αγγλικά: \(formatter.string(from: date))")

formatter.locale = Locale(identifier: "ja_JP")
print("Ιαπωνικά: \(formatter.string(from: date))")

// Μορφοποίηση νομίσματος με τοπική ρύθμιση
let numFormatter = NumberFormatter()
numFormatter.numberStyle = .currency

numFormatter.locale = Locale(identifier: "de_DE")
print("Γερμανικό νόμισμα: \(numFormatter.string(from: 1234.56) ?? "nil")")

numFormatter.locale = Locale(identifier: "en_US")
print("Αμερικανικό νόμισμα: \(numFormatter.string(from: 1234.56) ?? "nil")")

Ανάλυση ημερομηνιών από API διακομιστή πρέπει πάντα να χρησιμοποιεί το Locale(identifier: "en_US_POSIX") για σταθερή μορφή. Οι διακομιστές συνήθως στέλνουν ημερομηνίες σε μορφή ISO 8601 με αγγλικά ονόματα μηνών και η χρήση των τρεχουσών τοπικών ρυθμίσεων της συσκευής μπορεί να οδηγήσει σε σφάλμα ανάλυσης εάν ο χρήστης βρίσκεται σε περιοχή με μη αγγλική γλώσσα. Το en_US_POSIX εγγυάται ότι η ανάλυση δεν εξαρτάται από τις ρυθμίσεις της συσκευής.

swift
import Foundation

// Σωστή ανάλυση ημερομηνιών διακομιστή
let isoFormatter = DateFormatter()
isoFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
isoFormatter.locale = Locale(identifier: "en_US_POSIX")
isoFormatter.timeZone = TimeZone(secondsFromGMT: 0)

let serverDate = "2024-07-21T14:30:00+0000"
if let parsed = isoFormatter.date(from: serverDate) {
    print("Ημερομηνία που αναλύθηκε: \(parsed)")
}

// Εντοπισμένο όνομα νομίσματος
let usLocale = Locale(identifier: "en_US")
let currencyName = usLocale.localizedString(
    forCurrencyCode: "RUB"
)
print("Ρωσικό ρούβλι σε αμερικανική τοπική ρύθμιση: \(currencyName ?? "nil")")

Πρόσθετες δυνατότητες: Το Locale παρέχει εντοπισμένες περιγραφές των συστατικών του μέσω των μεθόδων localizedString(forRegionCode:), localizedString(forLanguageCode:), localizedString(forCurrencyCode:) και localizedString(forCalendarIdentifier:). Αυτές οι μέθοδοι επιστρέφουν ονόματα στη γλώσσα της τοπικής ρύθμισης στην οποία κλήθηκαν. Για παράδειγμα, το Locale(identifier: "ru_RU").localizedString(forCountryCode: "DE") θα επιστρέψει «Γερμανία».

Συνήθη λάθη κατά την εργασία με το Locale

Αγνόηση του Locale κατά την ανάλυση αριθμών — κρίσιμο σφάλμα σε διεθνείς εφαρμογές. Το NumberFormatter χωρίς ρητή τοπική ρύθμιση χρησιμοποιεί τις τρέχουσες τοπικές ρυθμίσεις της συσκευής. Εάν ένας χρήστης στη Ρωσία εισάγει «1,5», το NumberFormatter.number(from: "1,5") επιστρέφει σωστά 1.5. Αλλά εάν ο ίδιος κωδικός εκτελείται σε μια συσκευή με τοπική ρύθμιση en_US, η ανάλυση επιστρέφει nil, επειδή για en_US το δεκαδικό διαχωριστικό είναι η τελεία.

Απουσία en_US_POSIX για ημερομηνίες διακομιστή οδηγεί σε δύσκολα ανιχνεύσιμα σφάλματα. Το DateFormatter με dateFormat και locale = Locale.current μπορεί να σπάσει σε χρήστες από περιοχές όπου η μορφή ημερομηνίας διαφέρει από την αμερικανική. Για παράδειγμα, στη Γερμανία το DateFormatter μπορεί να αναμένει «21.07.2024» ενώ ο διακομιστής στέλνει «07/21/2024». Το en_US_POSIX εγγυάται σταθερή μορφή για μηχανική ανάλυση ανεξάρτητα από την περιοχή του χρήστη.

Σύγκριση συμβολοσειρών ημερομηνίας αντί χρήσης Date — ένα άλλο συνηθισμένο λάθος. Οι προγραμματιστές μερικές φορές συγκρίνουν αναπαραστάσεις συμβολοσειράς ημερομηνιών από διαφορετικές τοπικές ρυθμίσεις, λαμβάνοντας λανθασμένα αποτελέσματα. Το Locale αλλάζει μόνο την εμφάνιση, όχι την απόλυτη τιμή της ημερομηνίας. Συγκρίνετε πάντα αντικείμενα Date, όχι τις αναπαραστάσεις συμβολοσειράς τους. Για σύγκριση συστατικών ημερομηνίας, χρησιμοποιήστε το Calendar με ρητά καθορισμένο locale.

Σύμφωνα με το WWDC 2023, περίπου το 30% των προβλημάτων διεθνοποίησης σε εφαρμογές σχετίζονται με εσφαλμένη διαμόρφωση του Locale. Η Apple συνιστά να ορίζετε πάντα ρητά το locale για το DateFormatter και το NumberFormatter κατά την εργασία με δεδομένα διακομιστή και να χρησιμοποιείτε το Locale.current μόνο για εμφάνιση στο UI. Αυτή η απλή πρακτική εξαλείφει τα περισσότερα σφάλματα που σχετίζονται με περιφερειακές ρυθμίσεις.

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

Τι είναι το Locale στο Foundation;

Locale — κλάση Foundation που αντιπροσωπεύει πολιτισμικούς και γλωσσικούς κανόνες μορφοποίησης: μορφή ημερομηνίας, αριθμών, νομίσματος και μονάδων μέτρησης. Χρησιμοποιείται μαζί με τα DateFormatter, NumberFormatter και Calendar για εντοπισμένη εμφάνιση δεδομένων.

Ποια είναι η διαφορά μεταξύ Locale και TimeZone;

Locale καθορίζει τη μορφή εμφάνισης (γλώσσα, περιφερειακές συμβάσεις), ενώ το TimeZone καθορίζει την απόλυτη μετατόπιση χρόνου σε σχέση με το UTC. Το Locale επηρεάζει την αναπαράσταση συμβολοσειράς, το TimeZone — την αριθμητική τιμή του χρόνου. Και τα δύο χρησιμοποιούνται μαζί για πλήρη μορφοποίηση ημερομηνίας.

Τι είναι το en_US_POSIX και σε τι χρησιμεύει;

en_US_POSIX — μια ειδική τοπική ρύθμιση για τεχνική μορφοποίηση που εγγυάται σταθερή μορφή ανεξάρτητα από τις ρυθμίσεις χρήστη. Υποχρεωτική για ανάλυση ημερομηνιών διακομιστή (ISO 8601) και εργασία με API όπου η μορφή πρέπει να είναι προβλέψιμη.

Πώς λαμβάνω λίστα όλων των διαθέσιμων τοπικών ρυθμίσεων;

Locale.availableIdentifiers επιστρέφει έναν πίνακα συμβολοσειρών με αναγνωριστικά όλων των υποστηριζόμενων τοπικών ρυθμίσεων. Για φιλτράρισμα ανά γλώσσα, χρησιμοποιήστε filter με hasPrefix, για λήψη περιοχής — Locale(identifier:).regionCode.

Πώς επηρεάζει το Locale το NumberFormatter;

NumberFormatter χρησιμοποιεί το Locale για τον καθορισμό του δεκαδικού διαχωριστικού (κόμμα ή τελεία), του συμβόλου νομίσματος και του διαχωριστικού ομαδοποίησης. Για σταθερή μορφή, ορίστε το locale σε en_US_POSIX ή καθορίστε ρητά τις ιδιότητες της μορφοποίησης.

Περίληψη

  • Locale — θεμελιώδης κλάση για εντοπισμό μορφοποίησης ημερομηνιών, αριθμών και νομισμάτων σε iOS και macOS
  • Αναγνωριστικό ru_RU κωδικοποιεί γλώσσα (ISO 639-1) και περιοχή (ISO 3166-1) για ακριβή ρύθμιση μορφοποίησης
  • DateFormatter και NumberFormatter χρησιμοποιούν αυτόματα το Locale.current για εντοπισμένη έξοδο
  • en_US_POSIX — υποχρεωτική τοπική ρύθμιση για ανάλυση ημερομηνιών διακομιστή και σταθερή μηχανική μορφοποίηση
  • Locale.current παρακολουθεί αλλαγές ρυθμίσεων, το Locale(identifier:) δημιουργεί σταθερή τοπική ρύθμιση
  • Ανάλυση αριθμών απαιτεί ρητό καθορισμό locale — το δεκαδικό διαχωριστικό εξαρτάται από την περιοχή του χρήστη
  • Calendar.current κληρονομεί τις τοπικές ρυθμίσεις της συσκευής· για προβλέψιμους υπολογισμούς, ορίστε locale ρητά

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

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

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

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