Skip to main content

Ang Kumpletong Gabay sa iOS App Localization

Mula Localizable.strings hanggang App Store metadata: i-localize ang inyong iOS app gamit ang Xcode, SwiftUI, Fastlane, at awtomatikong AI translation.

1

I-enable ang Localization sa Xcode

Buksan ang Xcode project settings ninyo, pumunta sa Info > Localizations, at idagdag ang mga wikang gusto ninyong suportahan. Awtomatikong gumagawa ang Xcode ng mga .lproj directory para sa bawat wika.

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
Ibinubukod ng Base localization ang inyong UI mula sa mga string nito. Kapag nagdagdag kayo ng wika, mag-aalok ang Xcode na gumawa ng mga localized na bersyon ng inyong storyboards, XIBs, at string file.
2

Gumawa ng Localizable.strings

Gumagamit ang standard na iOS localization file ng mga key-value pair na pinaghiwalay ng equals sign, at nagtatapos sa semicolon ang bawat linya. Ilagay ito sa inyong Base.lproj folder para sa source language.

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
Nagdudulot ng silent failure ang nawawalang semicolon — naglo-load ang file nang walang error ngunit walang laman ang mga pagsasalin. Tiyakin ding naidagdag ang file sa Copy Bundle Resources build phase ng inyong target, kung hindi ay hindi ito maisasama sa app 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

Mag-migrate sa String Catalogs (Xcode 15+)

Ang String Catalogs (.xcstrings) ang modernong kapalit ng Apple para sa mga .strings file. Nag-aalok ang mga ito ng visual editor sa Xcode, awtomatikong pag-extract ng string mula sa inyong SwiftUI view, at built-in na suporta sa plural.

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")
Iniimbak ng String Catalogs ang LAHAT ng wika sa iisang .xcstrings JSON file. Sa mga team, nangangahulugan ito ng madalas na Git merge conflict kapag maraming tao ang nagdaragdag ng string. Isaalang-alang ang isang catalog kada module para sa malalaking proyekto.
4

Gamitin ang Mga Localized String sa SwiftUI at UIKit

Awtomatikong naglo-localize ang Text view ng SwiftUI ng mga string literal. Gumagamit ang UIKit ng NSLocalizedString. Para sa iOS 16+, nagbibigay ang modernong String(localized:comment:) API ng mas malinis na syntax na may built-in na compiler support.

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"
            )
        }
    }
}
Tahimik na nabibigong mag-localize ang Text("Hello \(name)") kapag ang name ay isang plain String variable. Lumilikha ang string interpolation ng SwiftUI ng LocalizedStringKey, ngunit ilang uri lang (Int, Double, atbp.) ang na-i-interpolate nang tama. Para sa mga String variable, gamitin ang String(localized:) para buuin muna ang localized string.
5

Pangasiwaan ang Mga Plural

Gumagamit ang iOS ng mga .stringsdict file para sa mga panuntunan sa plural, na sumusuporta sa lahat ng CLDR plural category: zero, one, two, few, many, other. Pinangangasiwaan ng String Catalogs ang mga plural gamit ang visual editor sa Xcode — mas simple kaysa sa pagsulat ng stringsdict XML nang manu-mano.

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)
May 6 na plural form ang mga wikang gaya ng Arabic, may 3 ang Russian, at may 1 lang ang Japanese. Laging i-define ang lahat ng CLDR category na kailangan ng inyong mga target na wika. Pinapadali ito ng String Catalogs gamit ang visual plural editor.
6

I-localize ang App Store Metadata gamit ang Fastlane

Gamitin ang deliver tool ng Fastlane para panatilihing naka-version control sa inyong repository ang App Store metadata — app name, subtitle, description, keywords, release notes — bilang mga plain text file na nakaayos ayon sa locale.

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
Cross-localization: ini-index ng US App Store ang parehong English at Spanish na keyword. Nakukuha ng pag-localize ng inyong metadata sa Spanish ang mga search mula sa mga Hispanic US user nang hindi tina-target ang hiwalay na market.
7

I-test ang Inyong Localization

I-test ang localized na nilalaman nang hindi binabago ang wika ng device. Gamitin ang Xcode scheme overrides para patakbuhin ang app sa anumang wika, SwiftUI previews na may locale environment, at XCUITest na may launch argument para sa automated testing.

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()
Mag-test gamit ang German (lumalawak ang mga string ng ~30% kumpara sa English) at Japanese (lumiliit ang mga string ng ~50%) para maagang mahuli ang mga isyu sa layout. Gamitin ang pseudolocalization ng Xcode para i-stress-test ang mga layout nang walang totoong pagsasalin.

I-automate ang Kalidad ng Pagsasalin

Matukoy ang mga nawawalang key, sirang placeholder, at mga isyu sa plural bago ma-ship gamit ang i18n-validate. I-test ang inyong UI gamit ang mga pseudo-translation sa pamamagitan ng i18n-pseudo bago dumating ang mga totoong pagsasalin.
8

I-automate ang mga Pagsasalin

Isalin ang inyong mga .strings, .xcstrings, at Fastlane metadata file gamit ang AI. I-automate ang pagsasalin ng parehong in-app string at App Store metadata para sa ganap na localized na presence.

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
Nakakapagpataas ng downloads nang 30%+ sa mga non-English market ang localized na App Store presence. Isalin ang inyong metadata kasabay ng inyong mga app string — ito ang localization na may pinakamataas na ROI na magagawa ninyo.
+

Bonus: Smart Locale Fallback gamit ang LocaleChain

Bilang default, nagfa-fallback ang iOS sa inyong development language kapag hindi available ang eksaktong locale ng user. Ang isang pt-BR user na pt-PT translations lang ang mayroon ay makakakita ng English sa halip na Portuguese. Inaayos ito ng LocaleChain gamit ang mga configurable na fallback chain.

Ang LocaleChain ay isang open-source Swift package. Tingnan sa 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"]]
)

Mga Karaniwang Pitfall

Mga Syntax Error sa .strings File

Nagdudulot ng silent failure ang nawawalang semicolon, mga quote na hindi na-escape, o maling encoding. Naglo-load ang file ngunit mukhang walang laman ang mga pagsasalin. Laging i-validate ang mga .strings file bago mag-commit.

Hindi Naglo-localize ang SwiftUI Text Interpolation

Hindi naglo-localize nang gaya ng inaasahan ang Text("Hello \(stringVar)"). Gamitin ang String(localized:) para sa mga computed string, o tiyaking ang mga interpolated variable ay tamang uri para sa LocalizedStringKey.StringInterpolation.

Nagpapakita ng Raw Key ang Mga Widget/Extension

May magkakahiwalay na bundle ang mga app extension. Tiyaking naidagdag ang inyong mga .strings o .xcstrings file sa Copy Bundle Resources phase ng extension target, hindi lang sa main app target.

Ipinapakita ng Mga Nawawalang Pagsasalin ang Mga Key sa Production

Kapag walang pagsasalin ang isang key para sa wika ng user, ipinapakita ng iOS ang mismong key. Gumamit ng fallback language strategy at i-test ang lahat ng suportadong locale bago mag-release.

Inirerekomendang File Structure

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

Subukan ang i18n Agent Ngayon

I-drop dito ang inyong translation file

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

o i-click para mag-browse

Mga target language

Hindi kailangan ang signupInstant na estimate

Locale Fallback gamit ang ios-localechain

Kapag nawawala ang translation key sa isang regional locale tulad ng de-AT, agad na tumatalon ang iOS diretso sa development language sa halip na i-check muna ang parent locale na 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"],
])

Tingnan ang aming Locale Fallback Guide para sa buong listahan ng mga sinusuportahang framework at 75 built-in chain. Learn more →

FAQ sa iOS Localization