
Ο πλήρης οδηγός τοπικοποίησης εφαρμογών Android
Από το strings.xml έως τα μεταδεδομένα του Play Store: τοπικοποιήστε την εφαρμογή σας για Android με Kotlin, Jetpack Compose, Fastlane και αυτοματοποιημένη μετάφραση με AI.
Ρυθμίστε το έργο σας Android για τοπικοποίηση
Το Android χρησιμοποιεί μια σύμβαση τοπικοποίησης που βασίζεται σε φακέλους. Οι προεπιλεγμένες συμβολοσειρές σας βρίσκονται στο res/values/strings.xml, ενώ οι μεταφρασμένες συμβολοσειρές τοποθετούνται σε φακέλους συγκεκριμένων τοπικών ρυθμίσεων, όπως res/values-de/, res/values-ja/ κ.λπ.
// 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Δημιουργήστε το strings.xml
Οι πόροι συμβολοσειρών του Android χρησιμοποιούν XML με στοιχεία '<string>' μέσα σε ένα ριζικό στοιχείο '<resources>'. Χρησιμοποιήστε %s για σύμβολα κράτησης θέσης συμβολοσειρών, %d για ακέραιους και %1$s/%2$s για ορίσματα θέσης, ώστε οι μεταφραστές να μπορούν να αλλάζουν τη σειρά τους.
<!-- 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><!-- ❌ 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>Διαχειριστείτε τον πληθυντικό αριθμό
Το Android χρησιμοποιεί στοιχεία '<plurals>' με χαρακτηριστικά quantity: zero, one, two, few, many, other. Κάθε γλώσσα-στόχος ενδέχεται να χρειάζεται διαφορετικές κατηγορίες — τα Αραβικά χρησιμοποιούν και τις 6, τα Ρωσικά χρειάζονται τις few/many, ενώ τα Ιαπωνικά χρησιμοποιούν μόνο την other.
<!-- 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
) -->Χρησιμοποιήστε τις μεταφράσεις στον κώδικα: Kotlin και Jetpack Compose
Το παραδοσιακό Android χρησιμοποιεί τις getString(R.string.key) και resources.getQuantityString(). Το Jetpack Compose χρησιμοποιεί τις stringResource(R.string.key) και pluralStringResource(). Και οι δύο επιλέγουν τη σωστή μετάφραση κατά την εκτέλεση, βάσει της τοπικής ρύθμισης της συσκευής.
// 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
))
}Πίνακες συμβολοσειρών και μορφοποιημένες συμβολοσειρές
Χρησιμοποιήστε το '<string-array>' για λίστες με καθορισμένη σειρά (π.χ. επιλογές αναπτυσσόμενων μενού και βήματα εισαγωγής). Χρησιμοποιήστε ορίσματα μορφοποίησης θέσης (%1$s, %2$d) στις μορφοποιημένες συμβολοσειρές, ώστε οι μεταφραστές να μπορούν να αλλάζουν τη σειρά των λέξεων χωρίς να αλλοιώνουν τη δομή της πρότασης.
<!-- 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>Τοπικοποιήστε τα μεταδεδομένα του Google Play με το Fastlane
Χρησιμοποιήστε την εντολή supply του Fastlane για να διαχειριστείτε τα μεταδεδομένα του Play Store — τίτλο, σύντομη περιγραφή, πλήρη περιγραφή και αρχεία καταγραφής αλλαγών — ως αρχεία απλού κειμένου οργανωμένα ανά τοπική ρύθμιση στο αποθετήριό σας.
# 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
Παραλείψτε τη χειροκίνητη αντιγραφή και επικόλληση. Μεταφράστε τον τίτλο, την περιγραφή και τις σημειώσεις έκδοσης στο Play Store σε πάνω από 175 τοπικές ρυθμίσεις, με τήρηση των ορίων χαρακτήρων.
Εξερευνήστε την ενσωμάτωση με το Google PlayΔοκιμάστε την τοπικοποίησή σας
Πραγματοποιήστε δοκιμές αλλάζοντας την τοπική ρύθμιση του εξομοιωτή, χρησιμοποιώντας προεπισκοπήσεις Compose με προσαρμοσμένο LocaleList και ενεργοποιώντας ψευδοτοπικές ρυθμίσεις στις Επιλογές προγραμματιστή. Χρησιμοποιήστε το resConfigs στο Gradle για να αφαιρέσετε ανεπιθύμητους πόρους τοπικών ρυθμίσεων από βιβλιοθήκες τρίτων.
// 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Αυτοματοποιήστε τον έλεγχο ποιότητας των μεταφράσεων
Αυτοματοποιήστε τις μεταφράσεις
Μεταφράστε το strings.xml, τους τύπους πληθυντικού αριθμού, τους πίνακες συμβολοσειρών και τα μεταδεδομένα Fastlane Supply με χρήση AI. Αυτοματοποιήστε τη μετάφραση τόσο των συμβολοσειρών της εφαρμογής όσο και των μεταδεδομένων του Play Store, για πλήρως τοπικοποιημένη παρουσία.
# 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Διαθέσιμο πρόσθετο για το Android Studio
Μεταφράστε πόρους XML του Android απευθείας από το IDE σας με το πρόσθετο i18n Agent για IntelliJ / Android Studio.
Επιπλέον δυνατότητα: έξυπνη εφεδρική τοπική ρύθμιση με το LocaleChain
Η εφεδρική επιλογή πόρων του Android ελέγχεται από το λειτουργικό σύστημα. Όταν λείπουν μεταφράσεις pt-BR, το Android παραλείπει εντελώς την pt-PT και εμφανίζει Αγγλικά. Το LocaleChain παρεμβάλλεται στις αναζητήσεις συμβολοσειρών και διατρέχει μια παραμετροποιήσιμη αλυσίδα εφεδρικών επιλογών — έτσι οι χρήστες κάθε περιοχής βλέπουν την πλησιέστερη διαθέσιμη μετάφραση.
Το LocaleChain για Android είναι μια βιβλιοθήκη Kotlin ανοικτού κώδικα. Προβολή στο GitHub
// build.gradle.kts (app module)
dependencies {
implementation("com.i18nagent:locale-chain-android:0.1.0")
}// 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"))
)Συνηθισμένες παγίδες
Η απουσία προεπιλεγμένων συμβολοσειρών προκαλεί καταρρεύσεις
Ο διαχωρισμός ανά γλώσσα στα App Bundles διακόπτει την αλλαγή γλώσσας μέσα στην εφαρμογή
Προβληματικές διατάξεις RTL
Επιμόλυνση πόρων από βιβλιοθήκες
Προτεινόμενη δομή αρχείων
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.
implementation("com.i18nagent:locale-chain-android:0.1.0")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 →