Skip to main content

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

Από το strings.xml έως τα μεταδεδομένα του Play Store: τοπικοποιήστε την εφαρμογή σας για Android με Kotlin, Jetpack Compose, Fastlane και αυτοματοποιημένη μετάφραση με AI.

1

Ρυθμίστε το έργο σας Android για τοπικοποίηση

Το Android χρησιμοποιεί μια σύμβαση τοπικοποίησης που βασίζεται σε φακέλους. Οι προεπιλεγμένες συμβολοσειρές σας βρίσκονται στο res/values/strings.xml, ενώ οι μεταφρασμένες συμβολοσειρές τοποθετούνται σε φακέλους συγκεκριμένων τοπικών ρυθμίσεων, όπως res/values-de/, res/values-ja/ κ.λπ.

Android Project Structure
// Android project structure for localization:
// res/
// ├── values/              ← Default (fallback) locale
// │   └── strings.xml
// ├── values-de/           ← German
// │   └── strings.xml
// ├── values-ja/           ← Japanese
// │   └── strings.xml
// └── values-es/           ← Spanish
//     └── strings.xml
//
// Folder naming: values-{language} or values-{language}-r{Region}
// Examples: values-pt-rBR, values-zh-rCN, values-zh-rTW
Ο φάκελος res/values/ αποτελεί την εφεδρική τοπική ρύθμιση. Αν λείπει μια συμβολοσειρά από έναν φάκελο συγκεκριμένης τοπικής ρύθμισης, το Android τη φορτώνει από τον προεπιλεγμένο φάκελο. Αν όμως λείπει από τον προεπιλεγμένο φάκελο, η εφαρμογή σας καταρρέει σε μη υποστηριζόμενες τοπικές ρυθμίσεις.
2

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

Οι πόροι συμβολοσειρών του Android χρησιμοποιούν XML με στοιχεία '<string>' μέσα σε ένα ριζικό στοιχείο '<resources>'. Χρησιμοποιήστε %s για σύμβολα κράτησης θέσης συμβολοσειρών, %d για ακέραιους και %1$s/%2$s για ορίσματα θέσης, ώστε οι μεταφραστές να μπορούν να αλλάζουν τη σειρά τους.

res/values/strings.xml
<!-- res/values/strings.xml -->
<resources>
    <string name="welcome_title">Welcome to MyApp</string>
    <string name="login_button">Sign In</string>
    <string name="settings_label">Settings</string>
    <string name="greeting">Hello, %s!</string>        <!-- %s = string -->
    <string name="item_count">%d items</string>          <!-- %d = integer -->
    <string name="app_name" translatable="false">MyApp</string>
</resources>
Οι απόστροφοι χωρίς χαρακτήρα διαφυγής προκαλούν σιωπηρή κατάρρευση του αναλυτή XML. Χρησιμοποιήστε \' ή περικλείστε την τιμή σε διπλά εισαγωγικά. Επίσης, αν λείπει μια συμβολοσειρά από το προεπιλεγμένο values/strings.xml, προκαλείται πλήρης κατάρρευση και όχι ομαλή μετάπτωση όπως στο iOS.
Common strings.xml Mistakes
<!-- ❌ Common mistakes in strings.xml: -->

<!-- Unescaped apostrophe — crashes XML parser silently -->
<string name="message">It's a great day</string>

<!-- Missing from default values/strings.xml — app crashes -->
<!-- (only exists in values-de/strings.xml) -->

<!-- ✅ Correct versions: -->
<string name="message">It\'s a great day</string>
<!-- Or wrap in double quotes: -->
<string name="message">"It's a great day"</string>
3

Διαχειριστείτε τον πληθυντικό αριθμό

Το Android χρησιμοποιεί στοιχεία '&lt;plurals&gt;' με χαρακτηριστικά quantity: zero, one, two, few, many, other. Κάθε γλώσσα-στόχος ενδέχεται να χρειάζεται διαφορετικές κατηγορίες — τα Αραβικά χρησιμοποιούν και τις 6, τα Ρωσικά χρειάζονται τις few/many, ενώ τα Ιαπωνικά χρησιμοποιούν μόνο την other.

res/values/strings.xml
<!-- res/values/strings.xml -->
<resources>
    <plurals name="items_count">
        <item quantity="zero">No items</item>
        <item quantity="one">%d item</item>
        <item quantity="other">%d items</item>
    </plurals>
</resources>

<!-- Usage in Kotlin: -->
<!-- val text = resources.getQuantityString(
    R.plurals.items_count,
    count,    // selects plural form
    count     // format argument
) -->
Το χαρακτηριστικό quantity επιλέγει τον τύπο του πληθυντικού αριθμού βάσει των κανόνων CLDR για την τοπική ρύθμιση της συσκευής. Να συμπεριλαμβάνετε πάντα την κατηγορία 'other' ως εφεδρική — είναι η μόνη κατηγορία που υπάρχει εγγυημένα σε κάθε γλώσσα.
4

Χρησιμοποιήστε τις μεταφράσεις στον κώδικα: Kotlin και Jetpack Compose

Το παραδοσιακό Android χρησιμοποιεί τις getString(R.string.key) και resources.getQuantityString(). Το Jetpack Compose χρησιμοποιεί τις stringResource(R.string.key) και pluralStringResource(). Και οι δύο επιλέγουν τη σωστή μετάφραση κατά την εκτέλεση, βάσει της τοπικής ρύθμισης της συσκευής.

WelcomeScreen.kt
// Traditional Android (Activity/Fragment)
val title = getString(R.string.welcome_title)
val greeting = getString(R.string.greeting, userName)
val items = resources.getQuantityString(
    R.plurals.items_count, count, count
)

// Jetpack Compose
@Composable
fun WelcomeScreen(userName: String, itemCount: Int) {
    // ✅ stringResource — Compose-aware, triggers recomposition
    Text(text = stringResource(R.string.welcome_title))

    // ✅ With format arguments
    Text(text = stringResource(R.string.greeting, userName))

    // ✅ Plurals — count passed TWICE
    Text(text = pluralStringResource(
        R.plurals.items_count,
        itemCount,    // selects plural form
        itemCount     // format argument
    ))
}
pluralStringResource(R.plurals.items, count, count) — η παράμετρος count μεταβιβάζεται δύο φορές. Η πρώτη επιλέγει τον τύπο του πληθυντικού αριθμού και η δεύτερη αποτελεί το όρισμα μορφοποίησης. Η παράλειψη της δεύτερης count είναι το συχνότερο σφάλμα πληθυντικού αριθμού στο Compose.
5

Πίνακες συμβολοσειρών και μορφοποιημένες συμβολοσειρές

Χρησιμοποιήστε το '&lt;string-array&gt;' για λίστες με καθορισμένη σειρά (π.χ. επιλογές αναπτυσσόμενων μενού και βήματα εισαγωγής). Χρησιμοποιήστε ορίσματα μορφοποίησης θέσης (%1$s, %2$d) στις μορφοποιημένες συμβολοσειρές, ώστε οι μεταφραστές να μπορούν να αλλάζουν τη σειρά των λέξεων χωρίς να αλλοιώνουν τη δομή της πρότασης.

res/values/strings.xml
<!-- res/values/strings.xml -->
<resources>
    <!-- String array for dropdown/list -->
    <string-array name="sort_options">
        <item>Most Recent</item>
        <item>Most Popular</item>
        <item>Price: Low to High</item>
        <item>Price: High to Low</item>
    </string-array>

    <!-- Positional format args for reordering -->
    <string name="welcome_message">
        Hello %1$s, you have %2$d new messages
    </string>
    <!-- Translators can reorder: -->
    <!-- %2$d neue Nachrichten für %1$s -->
</resources>
Τα ορίσματα θέσης όπως το %1$s επιτρέπουν στους μεταφραστές να αλλάζουν ελεύθερα τη σειρά των παραμέτρων. Το 'Hello %1$s, you have %2$d items' μπορεί να γίνει '%2$d items for %1$s' σε γλώσσες με διαφορετική σειρά λέξεων — χωρίς καμία αλλαγή στον κώδικα.
6

Τοπικοποιήστε τα μεταδεδομένα του Google Play με το Fastlane

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

Terminal
# Install Fastlane
$ gem install fastlane

# Initialize supply for Play Store metadata
$ fastlane supply init

# Directory structure created:
# fastlane/metadata/android/
# ├── en-US/
# │   ├── title.txt              # App name (50 chars)
# │   ├── short_description.txt  # Short desc (80 chars)
# │   ├── full_description.txt   # Full desc (4000 chars)
# │   └── changelogs/
# │       └── default.txt        # What's New
# ├── de-DE/
# │   └── ...
# └── ja-JP/
#     └── ...

# Push metadata to Play Store:
$ fastlane supply
Η τοπικοποίηση της σελίδας σας στο Play Store αυξάνει τις λήψεις κατά πάνω από 30% στις μη αγγλόφωνες αγορές. Ο τίτλος, η σύντομη περιγραφή και η πλήρης περιγραφή ευρετηριάζονται για αναζήτηση — η μετάφρασή τους προσφέρει την υψηλότερη απόδοση επένδυσης από κάθε ενέργεια τοπικοποίησης.
Google Play

Αυτοματοποιήστε την τοπικοποίηση της σελίδας σας στο Play Store

Παραλείψτε τη χειροκίνητη αντιγραφή και επικόλληση. Μεταφράστε τον τίτλο, την περιγραφή και τις σημειώσεις έκδοσης στο Play Store σε πάνω από 175 τοπικές ρυθμίσεις, με τήρηση των ορίων χαρακτήρων.

Εξερευνήστε την ενσωμάτωση με το Google Play
7

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

Πραγματοποιήστε δοκιμές αλλάζοντας την τοπική ρύθμιση του εξομοιωτή, χρησιμοποιώντας προεπισκοπήσεις Compose με προσαρμοσμένο LocaleList και ενεργοποιώντας ψευδοτοπικές ρυθμίσεις στις Επιλογές προγραμματιστή. Χρησιμοποιήστε το resConfigs στο Gradle για να αφαιρέσετε ανεπιθύμητους πόρους τοπικών ρυθμίσεων από βιβλιοθήκες τρίτων.

Testing Localization
// 1. Emulator: Settings > System > Language > Add language

// 2. Compose Preview with locale:
@Preview
@Composable
fun WelcomePreview() {
    val config = Configuration(resources.configuration).apply {
        setLocale(Locale("de"))
    }
    val localContext = LocalContext.current
    val localizedContext = localContext.createConfigurationContext(config)
    CompositionLocalProvider(
        LocalContext provides localizedContext
    ) {
        WelcomeScreen()
    }
}

// 3. Restrict library locales in build.gradle.kts:
android {
    defaultConfig {
        // Only include locales you actually translate
        resourceConfigurations += listOf("en", "de", "ja", "es", "fr")
    }
}

// 4. Enable pseudolocales in Developer Options:
// en-XA (accented) — detects hardcoded strings
// ar-XB (RTL) — tests layout mirroring
Πραγματοποιήστε δοκιμές με Γερμανικά (το κείμενο επεκτείνεται κατά περίπου 30%) και Ιαπωνικά (συρρικνώνεται κατά περίπου 50%), ώστε να εντοπίσετε προβλήματα διάταξης. Ενεργοποιήστε τις ψευδοτοπικές ρυθμίσεις (en-XA για τονισμένους χαρακτήρες, ar-XB για RTL) στις Επιλογές προγραμματιστή, ώστε να υποβάλετε τις διατάξεις σε εντατικές δοκιμές χωρίς πραγματικές μεταφράσεις.

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

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

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

Μεταφράστε το strings.xml, τους τύπους πληθυντικού αριθμού, τους πίνακες συμβολοσειρών και τα μεταδεδομένα Fastlane Supply με χρήση AI. Αυτοματοποιήστε τη μετάφραση τόσο των συμβολοσειρών της εφαρμογής όσο και των μεταδεδομένων του Play Store, για πλήρως τοπικοποιημένη παρουσία.

Terminal
# Translate strings.xml files
> Translate res/values/strings.xml
  to Japanese, German, and Spanish

# Translate Play Store metadata too
> Translate fastlane/metadata/android/en-US/
  to de-DE, ja-JP, es-ES

✓ 6 files translated in 3.2s
Το i18n Agent διαχειρίζεται τους χαρακτήρες διαφυγής XML του Android, διατηρεί τους δείκτες translatable="false", τηρεί τις κατηγορίες πληθυντικού αριθμού CLDR ανά γλώσσα-στόχο και διατηρεί ανέπαφα τα ορίσματα μορφοποίησης θέσης.
JetBrains

Διαθέσιμο πρόσθετο για το Android Studio

Μεταφράστε πόρους XML του Android απευθείας από το IDE σας με το πρόσθετο i18n Agent για IntelliJ / Android Studio.

Install
+

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

Η εφεδρική επιλογή πόρων του Android ελέγχεται από το λειτουργικό σύστημα. Όταν λείπουν μεταφράσεις pt-BR, το Android παραλείπει εντελώς την pt-PT και εμφανίζει Αγγλικά. Το LocaleChain παρεμβάλλεται στις αναζητήσεις συμβολοσειρών και διατρέχει μια παραμετροποιήσιμη αλυσίδα εφεδρικών επιλογών — έτσι οι χρήστες κάθε περιοχής βλέπουν την πλησιέστερη διαθέσιμη μετάφραση.

Το LocaleChain για Android είναι μια βιβλιοθήκη Kotlin ανοικτού κώδικα. Προβολή στο GitHub

build.gradle.kts
// build.gradle.kts (app module)
dependencies {
    implementation("com.i18nagent:locale-chain-android:0.1.0")
}
MyApp.kt / BaseActivity.kt
// 1. Application.onCreate() — configure chains once
class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        LocaleChain.configure()
    }
}

// 2. BaseActivity — wrap context per Activity
open class BaseActivity : AppCompatActivity() {
    override fun attachBaseContext(newBase: Context) {
        super.attachBaseContext(LocaleChain.wrap(newBase))
    }
}

// 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 = mapOf("es-MX" to listOf("es-419", "es"))
)

Συνηθισμένες παγίδες

Η απουσία προεπιλεγμένων συμβολοσειρών προκαλεί καταρρεύσεις

Σε αντίθεση με το iOS, το οποίο εμφανίζει το ανεπεξέργαστο κλειδί, το Android καταρρέει με ResourceNotFoundException, αν λείπει μια συμβολοσειρά από το προεπιλεγμένο res/values/strings.xml. Να διασφαλίζετε πάντα ότι κάθε κλειδί υπάρχει στο προεπιλεγμένο αρχείο.

Ο διαχωρισμός ανά γλώσσα στα App Bundles διακόπτει την αλλαγή γλώσσας μέσα στην εφαρμογή

Τα Google Play App Bundles διαχωρίζουν τα APK ανά γλώσσα — οι χρήστες λαμβάνουν μόνο τις συμβολοσειρές της γλώσσας της συσκευής τους. Αν προσφέρετε αλλαγή γλώσσας μέσα στην εφαρμογή, προσθέστε το bundle '{ language { enableSplit = false } }' στο build.gradle.kts.

Προβληματικές διατάξεις RTL

Χρήση left/right αντί για start/end στις διατάξεις ή απουσία του android:supportsRtl="true" από το AndroidManifest.xml. Χρησιμοποιήστε την επιλογή Refactor > Add RTL Support του Android Studio για την αυτόματη μετατροπή των υπαρχουσών διατάξεων.

Επιμόλυνση πόρων από βιβλιοθήκες

Οι βιβλιοθήκες τρίτων περιλαμβάνουν δικά τους αρχεία values-XX/strings.xml, με αποτέλεσμα το Android να θεωρεί ότι η εφαρμογή σας υποστηρίζει γλώσσες που στην πραγματικότητα δεν υποστηρίζει. Χρησιμοποιήστε το resConfigs στο build.gradle.kts για να περιορίσετε τις τοπικές ρυθμίσεις που περιλαμβάνονται μόνο σε όσες μεταφράζετε πραγματικά.

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

Project Structure
MyApp/
├── app/
│   └── src/main/
│       ├── res/
│       │   ├── values/
│       │   │   ├── strings.xml          # Default (source) strings
│       │   │   └── plurals.xml          # Plural rules
│       │   ├── values-de/
│       │   │   └── strings.xml
│       │   ├── values-ja/
│       │   │   └── strings.xml
│       │   └── values-es/
│       │       └── strings.xml
│       ├── java/com/example/myapp/
│       └── AndroidManifest.xml
├── fastlane/
│   └── metadata/android/
│       ├── en-US/
│       │   ├── title.txt
│       │   ├── short_description.txt
│       │   ├── full_description.txt
│       │   └── changelogs/default.txt
│       ├── de-DE/
│       └── ja-JP/
├── build.gradle.kts
└── settings.gradle.kts

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

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

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

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

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

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

Εφεδρικές τοπικές ρυθμίσεις με το locale-chain-android

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

Terminal
implementation("com.i18nagent:locale-chain-android:0.1.0")
Configuration
import com.i18nagent.localechain.LocaleChain

LocaleChain.configure(
    overrides = mapOf(
        "pt-BR" to listOf("pt", "en"),
        "zh-Hant-HK" to listOf("zh-Hant", "zh", "en"),
    )
)

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

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