Dunfey · Hotel WWDC as data, est. 1983
Front desk everything
Years
Topics

2021 Accessibility & InclusionDeveloper ToolsSwiftUI & UI Frameworks

WWDC21 · 18 min · Accessibility & Inclusion / Developer Tools / SwiftUI & UI Frameworks

Localize your SwiftUI app

Learn how to localize your SwiftUI app and make it available to a global audience. Explore how you can localize strings in SwiftUI, including those with styles and formatting. We’ll demonstrate how you can save time by having SwiftUI automatically handle tasks such as layout and keyboard shortcuts, and take you through the localization workflow in Xcode 13. To get the most out of this session and learn more about the Markdown language and AttributedString, check out "What’s new in Foundation" from WWDC21.

Watch at developer.apple.com ↗

Transcript all transcripts

Code shown on screen · 10 snippets

Text() with a string literal swift · at 1:34 ↗
Button(action: done) {
   Text("Done", comment: "Button title to dismiss rewards sheet")
}
Text() with a string literal and interpolation swift · at 1:58 ↗
// RewardsCard.swift

Text("You are \(10 - totalStamps) points away from a free smoothie!")
Text() with tableName swift · at 2:06 ↗
// RecipeView.swift
Text("Ingredients.recipe", tableName: "Ingredients", comment: "Ingredients in a recipe. For languages that have different words for \"Ingredient\" based on semantic context.")
Text("Ingredients.menu", tableName: "Ingredients", comment: "Ingredients in a smoothie. For languages that have different words for \"Ingredient\" based on semantic context.")
Declare localizable attributes in a custom view swift · at 2:52 ↗
struct Card: View {
    var title: LocalizedStringKey
    var subtitle: LocalizedStringKey
    
    var body: some View {
        Circle()
            .fill(BackgroundStyle())
            .overlay(
                VStack(spacing: 16) {
                    Text(title)
                    Text(subtitle)
                }
            )
    }
}

Card(
    title: "Thank you for your order!",
    subtitle: "We will notify you when your order is ready."
 )
Text() with multiline string literal swift · at 3:47 ↗
Text("""
        A delicious blend of tropical fruits and blueberries will
        have you sambaing around like you never knew you could!
        """,
        comment: "Tropical Blue smoothie description")
Customize attributes swift · at 4:39 ↗
VStack(alignment: .leading) {
    Text(smoothie.title)
        .font(.headline)
    Text(ingredients)
}
Using Markdown swift · at 5:13 ↗
// Smoothie.swift

Text("A refreshing blend that's a *real kick*!", comment: "Lemonberry smoothie description")
Create a measurement formatter (prior to iOS 15) swift · at 6:04 ↗
let calories = Measurement<UnitEnergy>(
    value: nutritionFact.kilocalories, unit: .kilocalories)

static let measurementFormatter: MeasurementFormatter = {
    let formatter = MeasurementFormatter()
    formatter.unitStyle = .long
    formatter.unitOptions = .providedUnit
    return formatter
}()

Text(Self.measurementFormatter.string(from: calories))

Text("Energy: \(calories, formatter: Self.measurementFormatter)")
Specify the format in a declarative manner (iOS 15) swift · at 6:22 ↗
let calories = Measurement<UnitEnergy>(
    value: nutritionFact.kilocalories, unit: .kilocalories)

Text(calories.formatted(.measurement(width: .wide, usage: .food)))

Text("Energy: \(calories, format: .measurement(width: .wide, usage: .food))")
Specify a keyboard shortcut swift · at 6:53 ↗
struct SmoothieCommands: Commands {

    var body: some Commands {
        CommandMenu(Text("Smoothie", comment: "Menu title for smoothie-related actions")) {
            SmoothieFavoriteButton(smoothie)
                .keyboardShortcut("+")
        }
    }
}

Resources