Skip to main content

iOS ऐप स्थानीयकरण की संपूर्ण गाइड

Localizable.strings से App Store मेटाडेटा तक: Xcode, SwiftUI, Fastlane और स्वचालित AI अनुवाद से अपने iOS ऐप का स्थानीयकरण करें।

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
Base स्थानीयकरण आपके UI को उसकी स्ट्रिंग्स से अलग करता है। जब आप कोई भाषा जोड़ते हैं, तो Xcode आपके स्टोरीबोर्ड, XIB और स्ट्रिंग फ़ाइलों के स्थानीयकृत वर्ज़न बनाने का विकल्प देता है।
2

Localizable.strings बनाएँ

मानक iOS स्थानीयकरण फ़ाइल में बराबर चिह्नों से अलग किए गए key-value पेयर होते हैं और हर पंक्ति सेमीकोलन पर समाप्त होती है। स्रोत भाषा के लिए इसे अपने 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
सेमीकोलन अनुपलब्ध होने पर बिना किसी स्पष्ट त्रुटि के विफलता होती है—फ़ाइल बिना त्रुटि के लोड होती है, लेकिन अनुवाद खाली रहते हैं। यह भी सुनिश्चित करें कि फ़ाइल आपके टार्गेट के Copy Bundle Resources बिल्ड फ़ेज़ में जोड़ी गई है, अन्यथा वह ऐप बंडल में शामिल नहीं होगी।
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 का विज़ुअल एडिटर, आपके 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 सभी भाषाओं को एक ही .xcstrings JSON फ़ाइल में रखते हैं। टीमों में इसका अर्थ है कि कई लोगों के स्ट्रिंग्स जोड़ने पर बार-बार Git मर्ज कॉन्फ़्लिक्ट हो सकते हैं। बड़े प्रोजेक्ट में प्रत्येक मॉड्यूल के लिए अलग कैटलॉग रखने पर विचार करें।
4

SwiftUI और UIKit में स्थानीयकृत स्ट्रिंग्स का उपयोग करें

SwiftUI का Text व्यू स्ट्रिंग लिटरल का अपने-आप स्थानीयकरण करता है। UIKit, NSLocalizedString का उपयोग करता है। iOS 16+ के लिए आधुनिक String(localized:comment:) API बिल्ट-इन कंपाइलर सपोर्ट के साथ अधिक सरल सिंटैक्स प्रदान करता है।

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"
            )
        }
    }
}
जब name एक सामान्य String वेरिएबल हो, तो Text("Hello \(name)") बिना कोई त्रुटि दिखाए स्थानीयकरण करने में विफल रहता है। SwiftUI का स्ट्रिंग इंटरपोलेशन LocalizedStringKey बनाता है, लेकिन केवल कुछ निश्चित टाइप (Int, Double आदि) ही सही ढंग से इंटरपोलेट होते हैं। String वेरिएबल के लिए पहले स्थानीयकृत स्ट्रिंग बनाने हेतु String(localized:) का उपयोग करें।
5

बहुवचन संभालें

iOS बहुवचन नियमों के लिए .stringsdict फ़ाइलों का उपयोग करता है और सभी CLDR बहुवचन श्रेणियों को सपोर्ट करता है: zero, one, two, few, many, other। String Catalogs, Xcode के विज़ुअल एडिटर से बहुवचन संभालते हैं—यह stringsdict XML को हाथ से लिखने की तुलना में बहुत आसान है।

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

Fastlane से App Store मेटाडेटा का स्थानीयकरण करें

App Store मेटाडेटा—ऐप का नाम, उपशीर्षक, विवरण, कीवर्ड और रिलीज़ नोट—को लोकेल के अनुसार व्यवस्थित सामान्य टेक्स्ट फ़ाइलों के रूप में अपने रिपॉज़िटरी में वर्ज़न-कंट्रोल के अंतर्गत रखने के लिए Fastlane के deliver टूल का उपयोग करें।

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

अपने स्थानीयकरण की जाँच करें

डिवाइस की भाषा बदले बिना स्थानीयकृत सामग्री की जाँच करें। ऐप को किसी भी भाषा में चलाने के लिए Xcode scheme overrides, locale environment वाले SwiftUI previews और स्वचालित जाँच के लिए launch arguments के साथ 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 के pseudolocalization का उपयोग करें।

अनुवाद की गुणवत्ता स्वचालित रूप से जाँचें

i18n-validate की मदद से रिलीज़ से पहले अनुपलब्ध कुंजियाँ, खराब प्लेसहोल्डर और बहुवचन संबंधी समस्याएँ पकड़ें। वास्तविक अनुवाद आने से पहले i18n-pseudo से छद्म-अनुवादों का उपयोग करके अपने UI की जाँच करें।
8

अनुवाद स्वचालित करें

AI से अपनी .strings, .xcstrings और Fastlane मेटाडेटा फ़ाइलों का अनुवाद करें। पूरी तरह स्थानीयकृत उपस्थिति के लिए ऐप के भीतर की स्ट्रिंग्स और 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%+ बढ़ते हैं। ऐप स्ट्रिंग्स के साथ अपने मेटाडेटा का भी अनुवाद करें—स्थानीयकरण में इससे सबसे अधिक ROI मिल सकता है।
+

बोनस: LocaleChain के साथ स्मार्ट लोकेल फ़ॉलबैक

डिफ़ॉल्ट रूप से, जब यूज़र का सटीक लोकेल उपलब्ध नहीं होता, तो iOS आपकी डेवलपमेंट भाषा पर फ़ॉलबैक करता है। केवल pt-PT अनुवाद उपलब्ध होने पर pt-BR यूज़र को पुर्तगाली के बजाय अंग्रेज़ी दिखाई देती है। 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 फ़ाइलों को वैलिडेट करें।

SwiftUI Text इंटरपोलेशन का स्थानीयकरण न होना

Text("Hello \(stringVar)") अपेक्षा के अनुसार स्थानीयकृत नहीं होता। गणना से बनी स्ट्रिंग्स के लिए String(localized:) का उपयोग करें या सुनिश्चित करें कि इंटरपोलेटेड वेरिएबल LocalizedStringKey.StringInterpolation के लिए सही टाइप के हैं।

Widgets/Extensions में मूल कुंजियाँ दिखाई देना

ऐप एक्सटेंशन के अलग बंडल होते हैं। सुनिश्चित करें कि आपकी .strings या .xcstrings फ़ाइलें केवल मुख्य ऐप टार्गेट में नहीं, बल्कि एक्सटेंशन टार्गेट के Copy Bundle Resources फ़ेज़ में भी जोड़ी गई हैं।

प्रोडक्शन में अनुपलब्ध अनुवादों की जगह कुंजियाँ दिखाई देना

जब यूज़र की भाषा के लिए किसी कुंजी का अनुवाद उपलब्ध नहीं होता, तो 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"],
])

समर्थित फ़्रेमवर्क की पूरी सूची और 75 बिल्ट-इन शृंखलाओं के लिए हमारी लोकेल फ़ॉलबैक गाइड देखें। Learn more →

iOS स्थानीयकरण से जुड़े अक्सर पूछे जाने वाले प्रश्न