Skip to main content

Täydellinen opas iOS-sovellusten lokalisointiin

Localizable.strings-tiedostoista App Store:n metatietoihin: lokalisoi iOS-sovelluksesi Xcode:illa, SwiftUI:lla, Fastlane:lla ja automaattisella tekoälykäännöksellä.

1

Ota lokalisointi käyttöön Xcode:issa

Avaa Xcode-projektisi asetukset, siirry kohtaan Info > Localizations ja lisää tukemasi kielet. Xcode luo .lproj-hakemistot automaattisesti jokaiselle kielelle.

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-lokalisointi erottaa käyttöliittymän sen merkkijonoista. Kun lisäät kielen, Xcode tarjoaa storyboards-näkymien, XIB-tiedostojen ja merkkijonotiedostojen lokalisoitujen versioiden luomista.
2

Luo Localizable.strings

iOS:n vakiomuotoinen lokalisointitiedosto käyttää yhtäläisyysmerkillä erotettuja avain-arvopareja, ja jokainen rivi päättyy puolipisteeseen. Sijoita se lähdekielen Base.lproj-kansioon.

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
Puuttuvat puolipisteet aiheuttavat huomaamattoman virheen — tiedosto latautuu virheittä, mutta käännökset ovat tyhjiä. Varmista myös, että tiedosto on lisätty kohteen Copy Bundle Resources -koontivaiheeseen, tai sitä ei sisällytetä sovelluspakettiin.
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

Siirry String Catalog -luetteloihin (Xcode 15+)

String Catalog -luettelot (.xcstrings) ovat Apple:in nykyaikainen korvaaja .strings-tiedostoille. Niissä on Xcode:in visuaalinen editori, automaattinen merkkijonojen poiminta SwiftUI-näkymistä ja sisäänrakennettu monikkomuotojen tuki.

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 Catalog -luettelot tallentavat KAIKKI kielet yhteen .xcstrings-JSON-tiedostoon. Tiimeissä tämä aiheuttaa usein Git-yhdistämisristiriitoja, kun useat ihmiset lisäävät merkkijonoja. Harkitse suurissa projekteissa yhtä luetteloa moduulia kohden.
4

Käytä lokalisoituja merkkijonoja SwiftUI:ssa ja UIKit:issä

SwiftUI:n Text-näkymä lokalisoi merkkijonoliteraalit automaattisesti. UIKit käyttää NSLocalizedStringiä. iOS 16:ssa ja uudemmissa moderni String(localized:comment:)-rajapinta tarjoaa selkeämmän syntaksin ja sisäänrakennetun kääntäjätuen.

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)") ei lokalisoidu huomaamatta, kun name on tavallinen String-muuttuja. SwiftUI:n merkkijonointerpolointi luo LocalizedStringKeyn, mutta vain tietyt tyypit (Int, Double ja muut) interpoloidaan oikein. Luo lokalisoitu merkkijono String-muuttujille ensin String(localized:)-metodilla.
5

Käsittele monikkomuodot

iOS käyttää monikkosääntöihin .stringsdict-tiedostoja, jotka tukevat kaikkia CLDR-monikkoluokkia: zero, one, two, few, many, other. String Catalog -luettelot käsittelevät monikkomuodot Xcode:in visuaalisella editorilla — paljon helpommin kuin kirjoittamalla stringsdict-XML:ää käsin.

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)
Arabian kaltaisissa kielissä on kuusi monikkomuotoa, venäjässä kolme ja japanissa yksi. Määritä aina kaikki kohdekielten tarvitsemat CLDR-luokat. String Catalog -luetteloiden visuaalinen monikkomuotoeditori helpottaa tätä.
6

Lokalisoi App Store:n metatiedot Fastlane:lla

Pidä App Store:n metatiedot — sovelluksen nimi, alaotsikko, kuvaus, avainsanat ja julkaisutiedot — Fastlane:n deliver-työkalulla tietovarastossasi versiohallittuina tekstitiedostoina, jotka on järjestetty kieliversioittain.

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
Ristiinlokalisointi: Yhdysvaltain App Store indeksoi sekä englannin- että espanjankieliset avainsanat. Metatietojen lokalisointi espanjaksi tavoittaa Yhdysvaltain latinalaisamerikkalaisten käyttäjien haut ilman erilliseen markkinaan kohdistamista.
7

Testaa lokalisointisi

Testaa lokalisoitu sisältö vaihtamatta laitteesi kieltä. Käytä Xcode-skeeman ohituksia sovelluksen ajamiseen millä tahansa kielellä, SwiftUI-esikatseluja locale-ympäristöllä ja XCUITest:ia käynnistysargumentteineen automaattiseen testaukseen.

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()
Testaa saksalla (merkkijonot pitenevät noin 30 % englantiin verrattuna) ja japanilla (merkkijonot lyhenevät noin 50 %), jotta löydät asetteluongelmat ajoissa. Rasitustestaa asettelut ilman oikeita käännöksiä Xcode:in pseudolokalisoinnilla.

Automatisoi käännöslaatu

Löydä puuttuvat avaimet, rikkoutuneet paikkamerkit ja monikkomuoto-ongelmat i18n-validate:lla ennen julkaisua. Testaa käyttöliittymää pseudokäännöksillä i18n-pseudo:n avulla ennen oikeiden käännösten valmistumista.
8

Automatisoi käännökset

Käännä .strings- ja .xcstrings-tiedostosi sekä Fastlane-metatietotiedostosi tekoälyllä. Automatisoi sekä sovelluksen sisäisten merkkijonojen että App Store:n metatietojen kääntäminen täysin lokalisoitua näkyvyyttä varten.

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
Lokalisoitu näkyvyys App Store:ssa lisää latauksia yli 30 % muunkielisillä markkinoilla. Käännä metatiedot yhdessä sovelluksen merkkijonojen kanssa — se on kannattavin lokalisointityö, jonka voit tehdä.
+

Lisävinkki: älykäs varakieli LocaleChain:illa

Oletusarvoisesti iOS siirtyy kehityskieleen, kun käyttäjän tarkkaa kieliversiota ei ole saatavilla. pt-BR-käyttäjä näkee vain pt-PT-käännösten ollessa saatavilla englannin eikä portugalin. LocaleChain korjaa tämän määritettävillä varakieliketjuilla.

LocaleChain on avoimen lähdekoodin Swift-paketti. Näytä GitHub:issa

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"]]
)

Tavalliset sudenkuopat

.strings-tiedoston syntaksivirheet

Puuttuvat puolipisteet, koodaamattomat lainausmerkit tai virheellinen koodaus aiheuttavat huomaamattomia virheitä. Tiedosto latautuu, mutta käännökset näyttävät tyhjiltä. Validoi .strings-tiedostot aina ennen committia.

SwiftUI:n Text-interpolointi ei lokalisoidu

Text("Hello \(stringVar)") ei lokalisoidu odotetusti. Käytä lasketuille merkkijonoille String(localized:)-metodia tai varmista, että interpoloidut muuttujat ovat oikeaa tyyppiä LocalizedStringKey.StringInterpolationia varten.

Pienoisohjelmat tai laajennukset näyttävät käsittelemättömät avaimet

Sovelluslaajennuksilla on erilliset paketit. Varmista, että .strings- tai .xcstrings-tiedostosi on lisätty laajennuskohteen Copy Bundle Resources -vaiheeseen, ei vain pääsovelluksen kohteeseen.

Puuttuvien käännösten avaimet näkyvät tuotannossa

Kun avaimella ei ole käännöstä käyttäjän kielelle, iOS näyttää itse avaimen. Käytä varakielistrategiaa ja testaa kaikki tuetut kieliversiot ennen julkaisua.

Suositeltu tiedostorakenne

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

Kokeile i18n Agent:ia nyt

Pudota käännöstiedostosi tähän

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

tai valitse napsauttamalla

Kohdekielet

Rekisteröitymistä ei tarvitaVälitön arvio

Varakieliketju ios-localechainilla

Kun alueellisesta kieliversiosta, kuten de-AT:stä, puuttuu käännösavain, iOS siirtyy suoraan kehityskieleen eikä tarkista ensin pääkieliversiota 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"],
])

Katso varakielioppaastamme kaikki tuetut ohjelmistokehykset ja 75 sisäänrakennettua ketjua. Learn more →

Usein kysyttyä iOS-lokalisoinnista