Skip to main content

Ο πλήρης οδηγός τοπικής προσαρμογής εφαρμογών iOS

Από το Localizable.strings έως τα μεταδεδομένα του App Store: προσαρμόστε την εφαρμογή iOS με Xcode, SwiftUI, Fastlane και αυτοματοποιημένη μετάφραση AI.

1

Ενεργοποιήστε την τοπική προσαρμογή στο Xcode

Ανοίξτε τις ρυθμίσεις του έργου σας στο Xcode, μεταβείτε στο Info > Localizations και προσθέστε τις γλώσσες που θέλετε να υποστηρίζετε. Το Xcode δημιουργεί αυτόματα καταλόγους .lproj για κάθε γλώσσα.

Xcode Project Settings
// In Xcode:
// 1. Select your project in the navigator
// 2. Go to Info tab > Localizations
// 3. Click + to add languages (e.g., German, Japanese)
// 4. Select which files to localize
//
// Xcode creates .lproj directories automatically:
// en.lproj/Localizable.strings
// de.lproj/Localizable.strings
// ja.lproj/Localizable.strings
Η βασική τοπική προσαρμογή διαχωρίζει το UI από τα κείμενά του. Όταν προσθέτετε μια γλώσσα, το Xcode προτείνει τη δημιουργία τοπικοποιημένων εκδόσεων των storyboard, XIB και αρχείων κειμένων σας.
2

Δημιουργήστε το Localizable.strings

Το τυπικό αρχείο τοπικής προσαρμογής iOS χρησιμοποιεί ζεύγη κλειδιού-τιμής που χωρίζονται με σύμβολα ισότητας, ενώ κάθε γραμμή τελειώνει με τον χαρακτήρα «;». Τοποθετήστε το στον φάκελο Base.lproj για τη γλώσσα προέλευσης.

Base.lproj/Localizable.strings
// Base.lproj/Localizable.strings

"welcome_title" = "Welcome to MyApp";
"login_button" = "Sign In";
"settings_label" = "Settings";
"greeting" = "Hello, %@!";    // %@ = string placeholder
"item_count" = "%d items";     // %d = integer placeholder
Η απουσία του χαρακτήρα «;» προκαλεί σιωπηρές αστοχίες — το αρχείο φορτώνεται χωρίς σφάλμα, αλλά οι μεταφράσεις είναι κενές. Βεβαιωθείτε επίσης ότι το αρχείο έχει προστεθεί στη φάση build Copy Bundle Resources του target σας, διαφορετικά δεν θα συμπεριληφθεί στο bundle της εφαρμογής.
Common .strings Mistakes
// ❌ Common mistakes in .strings files:

// Missing semicolon — file loads but translations are empty
"welcome_title" = "Welcome"

// Unescaped quotes — causes parse error
"message" = "Click "here" to continue";

// ✅ Correct versions:
"welcome_title" = "Welcome";
"message" = "Click \"here\" to continue";
3

Μεταβείτε σε String Catalogs (Xcode 15+)

Τα String Catalogs (.xcstrings) αποτελούν τη σύγχρονη αντικατάσταση των αρχείων .strings από την Apple. Προσφέρουν οπτικό πρόγραμμα επεξεργασίας στο Xcode, αυτόματη εξαγωγή κειμένων από τα views του SwiftUI και ενσωματωμένη υποστήριξη πληθυντικού.

Localizable.xcstrings
// Xcode 15+ String Catalog (Localizable.xcstrings)
// Xcode automatically extracts strings from your code
// and manages translations in a visual editor.

// In SwiftUI, strings are automatically localizable:
Text("Welcome to MyApp")
Text("Hello, \(userName)!")

// Mark strings explicitly:
let title = String(localized: "welcome_title")
Τα String Catalogs αποθηκεύουν ΟΛΕΣ τις γλώσσες σε ένα αρχείο JSON .xcstrings. Για τις ομάδες, αυτό σημαίνει συχνές διενέξεις συγχώνευσης στο Git, όταν πολλά άτομα προσθέτουν κείμενα. Για μεγάλα έργα, εξετάστε το ενδεχόμενο χρήσης ενός catalog ανά module.
4

Χρησιμοποιήστε τοπικοποιημένα κείμενα σε SwiftUI και UIKit

Το view Text του SwiftUI προσαρμόζει αυτόματα τα string literal. Το UIKit χρησιμοποιεί NSLocalizedString. Για iOS 16+, το σύγχρονο API String(localized:comment:) προσφέρει καθαρότερη σύνταξη και ενσωματωμένη υποστήριξη από τον compiler.

ContentView.swift
import SwiftUI

struct ContentView: View {
    let userName: String

    var body: some View {
        VStack {
            // ✅ SwiftUI auto-localizes string literals
            Text("welcome_title")

            // ⚠️ This does NOT localize (String interpolation)
            // Text("Hello, \(userName)")

            // ✅ Use String(localized:) for dynamic strings
            Text(String(localized: "greeting \(userName)"))

            // ✅ UIKit style (works everywhere)
            let title = NSLocalizedString(
                "settings_label",
                comment: "Settings screen title"
            )

            // ✅ Modern API (iOS 16+)
            let modern = String(
                localized: "welcome_title",
                comment: "Main screen title"
            )
        }
    }
}
Το Text("Hello \(name)") δεν τοπικοποιείται, όταν το name είναι απλή μεταβλητή String. Η παρεμβολή κειμένου του SwiftUI δημιουργεί ένα LocalizedStringKey, αλλά μόνο συγκεκριμένοι τύποι (Int, Double κ.λπ.) παρεμβάλλονται σωστά. Για μεταβλητές String, χρησιμοποιήστε String(localized:) ώστε να δημιουργήσετε πρώτα το τοπικοποιημένο κείμενο.
5

Χειριστείτε τους πληθυντικούς

Το iOS χρησιμοποιεί αρχεία .stringsdict για τους κανόνες πληθυντικού και υποστηρίζει όλες τις κατηγορίες πληθυντικού CLDR: zero, one, two, few, many, other. Τα String Catalogs χειρίζονται τους πληθυντικούς μέσω ενός οπτικού προγράμματος επεξεργασίας στο Xcode — πολύ απλούστερα από τη μη αυτόματη σύνταξη XML stringsdict.

Localizable.stringsdict
<!-- Localizable.stringsdict -->
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
    <key>items_count</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@count@</string>
        <key>count</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>d</string>
            <key>zero</key>
            <string>No items</string>
            <key>one</key>
            <string>%d item</string>
            <key>other</key>
            <string>%d items</string>
        </dict>
    </dict>
</dict>
</plist>

// Usage in Swift:
String(format: NSLocalizedString("items_count", comment: ""),
       itemCount)
Γλώσσες όπως τα Αραβικά έχουν 6 μορφές πληθυντικού, τα Ρωσικά 3 και τα Ιαπωνικά 1. Ορίζετε πάντοτε όλες τις κατηγορίες CLDR που χρειάζονται οι γλώσσες-στόχοι σας. Τα String Catalogs το διευκολύνουν μέσω του οπτικού προγράμματος επεξεργασίας πληθυντικού.
6

Προσαρμόστε τα μεταδεδομένα του App Store με το Fastlane

Χρησιμοποιήστε το εργαλείο deliver του Fastlane για να διατηρείτε τα μεταδεδομένα του App Store — όνομα εφαρμογής, υπότιτλο, περιγραφή, λέξεις-κλειδιά και σημειώσεις έκδοσης — υπό έλεγχο εκδόσεων στο αποθετήριό σας, ως αρχεία απλού κειμένου οργανωμένα ανά τοπική ρύθμιση.

Terminal
# Install Fastlane
$ gem install fastlane

# Initialize deliver for App Store metadata
$ fastlane deliver init

# Directory structure created:
# fastlane/metadata/
# ├── en-US/
# │   ├── name.txt            # App name (30 chars)
# │   ├── subtitle.txt        # Subtitle (30 chars)
# │   ├── description.txt     # Full description
# │   ├── keywords.txt        # Search keywords (100 chars)
# │   ├── release_notes.txt   # What's New
# │   └── promotional_text.txt
# ├── de-DE/
# │   └── ...
# └── ja/
#     └── ...

# Push metadata to App Store Connect:
$ fastlane deliver
Διασταυρούμενη τοπική προσαρμογή: το App Store των ΗΠΑ ευρετηριάζει τόσο αγγλικές όσο και ισπανικές λέξεις-κλειδιά. Η προσαρμογή των μεταδεδομένων σας στα Ισπανικά σάς επιτρέπει να εμφανίζεστε στις αναζητήσεις ισπανόφωνων χρηστών στις ΗΠΑ χωρίς να στοχεύετε σε ξεχωριστή αγορά.
7

Δοκιμάστε την τοπική προσαρμογή σας

Δοκιμάστε το τοπικοποιημένο περιεχόμενο χωρίς να αλλάξετε τη γλώσσα της συσκευής σας. Χρησιμοποιήστε τις παρακάμψεις scheme του Xcode για να εκτελέσετε την εφαρμογή σε οποιαδήποτε γλώσσα, προεπισκοπήσεις SwiftUI με περιβάλλον locale και XCUITest με ορίσματα εκκίνησης για αυτοματοποιημένες δοκιμές.

Testing Localization
// 1. Xcode Scheme Override:
// Edit Scheme > Run > Options > App Language > Choose language

// 2. SwiftUI Preview with locale:
struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
            .environment(\.locale, Locale(identifier: "de"))

        ContentView()
            .environment(\.locale, Locale(identifier: "ja"))

        ContentView()
            .environment(\.locale, Locale(identifier: "ar"))
    }
}

// 3. XCUITest with language override:
let app = XCUIApplication()
app.launchArguments += ["-AppleLanguages", "(de)"]
app.launchArguments += ["-AppleLocale", "de_DE"]
app.launch()
Δοκιμάστε με Γερμανικά (τα κείμενα μεγαλώνουν κατά περίπου 30% σε σύγκριση με τα Αγγλικά) και Ιαπωνικά (τα κείμενα μικραίνουν κατά περίπου 50%), ώστε να εντοπίσετε νωρίς προβλήματα διάταξης. Χρησιμοποιήστε την ψευδοτοπική προσαρμογή του Xcode για εντατικές δοκιμές των διατάξεων χωρίς πραγματικές μεταφράσεις.

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

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

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

Μεταφράστε τα αρχεία .strings, .xcstrings και μεταδεδομένων Fastlane με AI. Αυτοματοποιήστε τη μετάφραση τόσο των κειμένων εντός εφαρμογής όσο και των μεταδεδομένων του App Store, για μια πλήρως τοπικοποιημένη παρουσία.

Terminal
# Translate .strings files
> Translate Base.lproj/Localizable.strings
  to Japanese, German, and Spanish

# Translate App Store metadata too
> Translate fastlane/metadata/en-US/
  to de-DE, ja, es-MX

✓ 6 files translated in 3.2s
Η τοπικοποιημένη παρουσία στο App Store αυξάνει τις λήψεις κατά πάνω από 30% στις μη αγγλόφωνες αγορές. Μεταφράστε τα μεταδεδομένα μαζί με τα κείμενα της εφαρμογής σας — είναι η ενέργεια τοπικής προσαρμογής με την υψηλότερη απόδοση επένδυσης.
+

Επιπλέον: έξυπνη εναλλακτική τοπική ρύθμιση με LocaleChain

Από προεπιλογή, το iOS μεταβαίνει στη γλώσσα ανάπτυξης, όταν δεν είναι διαθέσιμη η ακριβής τοπική ρύθμιση ενός χρήστη. Ένας χρήστης με pt-BR που έχει διαθέσιμες μόνο μεταφράσεις pt-PT βλέπει Αγγλικά αντί για Πορτογαλικά. Το LocaleChain το διορθώνει με παραμετροποιήσιμες αλυσίδες εναλλακτικών επιλογών.

Το LocaleChain είναι πακέτο Swift ανοιχτού κώδικα. Προβολή στο GitHub

Package Dependencies
// Swift Package Manager
// File > Add Package Dependencies >
// https://github.com/i18n-agent/ios-localechain.git
MyApp.swift
import LocaleChain

// In your App init or AppDelegate:
LocaleChain.configure()  // Activates all default chains

// pt-BR user with only pt-PT translations?
// → Shows Portuguese instead of falling back to English

// Custom overrides for your specific locales:
LocaleChain.configure(
    overrides: ["es-MX": ["es-419", "es"]]
)

Συνήθεις παγίδες

Σφάλματα σύνταξης αρχείων .strings

Η απουσία του χαρακτήρα «;», τα εισαγωγικά χωρίς διαφυγή ή η λανθασμένη κωδικοποίηση προκαλούν σιωπηρές αστοχίες. Το αρχείο φορτώνεται, αλλά οι μεταφράσεις εμφανίζονται κενές. Επικυρώνετε πάντοτε τα αρχεία .strings πριν από κάθε commit.

Η παρεμβολή Text του SwiftUI δεν προσαρμόζεται

Το Text("Hello \(stringVar)") δεν προσαρμόζεται όπως αναμένεται. Χρησιμοποιήστε String(localized:) για υπολογιζόμενα κείμενα ή βεβαιωθείτε ότι οι παρεμβαλλόμενες μεταβλητές έχουν τον σωστό τύπο για LocalizedStringKey.StringInterpolation.

Τα widget/extension εμφανίζουν ανεπεξέργαστα κλειδιά

Τα extension εφαρμογών έχουν ξεχωριστά bundle. Βεβαιωθείτε ότι τα αρχεία .strings ή .xcstrings έχουν προστεθεί στη φάση Copy Bundle Resources του target του extension και όχι μόνο στο κύριο target της εφαρμογής.

Οι μεταφράσεις που λείπουν εμφανίζουν κλειδιά στην παραγωγή

Όταν ένα κλειδί δεν έχει μετάφραση για τη γλώσσα του χρήστη, το iOS εμφανίζει το ίδιο το κλειδί. Χρησιμοποιήστε μια στρατηγική εναλλακτικής γλώσσας και δοκιμάστε όλες τις υποστηριζόμενες τοπικές ρυθμίσεις πριν από την κυκλοφορία.

Προτεινόμενη δομή αρχείων

Project Structure
MyApp/
├── MyApp.xcodeproj
├── MyApp/
│   ├── Base.lproj/
│   │   ├── Localizable.strings       # Source strings
│   │   └── Localizable.stringsdict   # Plural rules
│   ├── en.lproj/
│   │   └── Localizable.strings
│   ├── de.lproj/
│   │   └── Localizable.strings
│   ├── ja.lproj/
│   │   └── Localizable.strings
│   ├── Localizable.xcstrings          # OR String Catalog
│   └── Info.plist
├── MyAppTests/
├── fastlane/
│   ├── Fastfile
│   └── metadata/
│       ├── en-US/
│       │   ├── name.txt
│       │   ├── description.txt
│       │   └── keywords.txt
│       ├── de-DE/
│       └── ja/
└── Package.swift

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

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

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

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

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

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

Εναλλακτική τοπική ρύθμιση με ios-localechain

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

Terminal
// Swift Package Manager
// https://github.com/i18n-agent/ios-localechain
Configuration
import LocaleChain

LocaleChain.configure(overrides: [
    "de": ["en-GB", "en"],
    "pt-BR": ["pt", "en"],
    "zh-Hant-HK": ["zh-Hant", "zh", "en"],
])

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

Συχνές ερωτήσεις για την τοπική προσαρμογή iOS