what’s new in internationalization...let weight = 20.0 // store weight in metric units let...

182
© 2015 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple. #WWDC15 App Frameworks What’s New in Internationalization Session 227 Nat Hillard Frameworks, Internationalization

Upload: others

Post on 17-Mar-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

© 2015 Apple Inc. All rights reserved. Redistribution or public display not permitted without written permission from Apple.

#WWDC15App Frameworks

What’s New in InternationalizationSession 227

Nat Hillard Frameworks, Internationalization

Page 2: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

OverviewOverview

Page 3: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 4: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

69%of Apple revenue is international

Page 5: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Other 69%

US 31%

Worldwide App Store Sales

Page 6: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Others 28%

China 16% Japan

25%

US 31%

Worldwide App Store Sales

Page 7: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Outline

LocalizationFormattingHandling TextLayout

Page 8: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationFormattingHandling TextLayout

Page 9: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationFormattingHandling TextLayout

Page 10: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationMaking your app speak your customer’s language

Page 11: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationLanguage and region settings

Specify primary languageSpecify ordeing of preferred languagesSpecify region independently

Page 12: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationLanguage and region settings

Page 13: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationLanguage and region settings

Page 14: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationLanguage and region settings

Advanced Topics in Internationalization WWDC14

Page 15: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationNumber Systems

Page 16: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 17: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 18: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 19: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 20: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationKeyboards

Indic Keyboards

• Hindi (Latin),a.k.a. “Hinglish”

• Hindi (Transliteration)• Punjabi• Telugu• Gujarati

Predictive Typing for

• Korean• Mexican Spanish• Russian• Turkish

Page 21: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationKeyboards

Indic Keyboards

• Hindi (Latin),a.k.a. “Hinglish”

• Hindi (Transliteration)• Punjabi• Telugu• Gujarati

Predictive Typing for

• Korean• Mexican Spanish• Russian• Turkish

Page 22: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationKeyboards

Indic Keyboards

• Hindi (Latin),a.k.a. “Hinglish”

• Hindi (Transliteration)• Punjabi• Telugu• Gujarati

Predictive Typing for

• Korean• Mexican Spanish• Russian• Turkish

Page 23: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

Page 24: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

/* Wristwatch */ "watch" = "Uhr";

de.lproj/Localizable.strings:

Page 25: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

/* Wristwatch */ "watch" = "Uhr";

de.lproj/Localizable.strings:

Stored in lproj subdirectories of your bundle:./Contents/Resources/

en.lproj/Localizable.strings

de.lproj/

Localizable.strings

Localizing With Xcode 6 WWDC14

Page 26: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

Page 27: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

To get simple localized string:func NSLocalizedString( key : String tableName: String? = "Localizable", bundle: NSBundle = NSBundle.mainBundle(), value: String = "", comment: String) -> String

Page 28: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

To get simple localized string:func NSLocalizedString( key : String tableName: String? = "Localizable", bundle: NSBundle = NSBundle.mainBundle(), value: String = "", comment: String) -> String

To get localized formatted string:String.localizedStringWithFormat(format: NSString, args: CVarArgType…)

Page 29: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

To get simple localized string:func NSLocalizedString( key : String tableName: String? = "Localizable", bundle: NSBundle = NSBundle.mainBundle(), value: String = "", comment: String) -> String

Together:String.localizedStringWithFormat(NSLocalizedString("%@ %d", comment:…), …)

To get localized formatted string:String.localizedStringWithFormat(format: NSString, args: CVarArgType…)

Page 30: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

Page 31: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

var str = String.localizedStringWithFormat( NSLocalizedString("Location: %@", comment: "User’s Location"),

location)

Page 32: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

var str = String.localizedStringWithFormat( NSLocalizedString("Location: %@", comment: "User’s Location"),

location)

en.lproj/Localizable.strings: "Location: %@" = "Location: %@";

ja.lproj/Localizable.strings: "Location: %@" = "場所:%@";

Page 33: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

Location: San FranciscoEnglish

var str = String.localizedStringWithFormat( NSLocalizedString("Location: %@", comment: "User’s Location"),

location)

en.lproj/Localizable.strings: "Location: %@" = "Location: %@";

ja.lproj/Localizable.strings: "Location: %@" = "場所:%@";

Page 34: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationString Translation

Location: San FranciscoEnglish

場所:サンフランシスコJapanese

var str = String.localizedStringWithFormat( NSLocalizedString("Location: %@", comment: "User’s Location"),

location)

en.lproj/Localizable.strings: "Location: %@" = "Location: %@";

ja.lproj/Localizable.strings: "Location: %@" = "場所:%@";

Page 35: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationReordering

Page 36: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationReordering

let str = String.localizedStringWithFormat( NSLocalizedString("copy %@’s %@", comment: "copying item from user"),

"hairForce1", "photos")

Page 37: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationReordering

let str = String.localizedStringWithFormat( NSLocalizedString("copy %@’s %@", comment: "copying item from user"),

"hairForce1", "photos")en.lproj

"Copy %@’s %@" = "Copying %@’s %@"; de.lproj

"Copy %@’s %@" = "%@ von %@ kopieren";

Page 38: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationReordering

let str = String.localizedStringWithFormat( NSLocalizedString("copy %@’s %@", comment: "copying item from user"),

"hairForce1", "photos")en.lproj

"Copy %@’s %@" = "Copying %@’s %@"; de.lproj

"Copy %@’s %@" = "%@ von %@ kopieren";

English Copying hairForce1’s photos

Page 39: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationReordering

German hairForce1 von photos kopieren (Copy HairForce1 from photos)

let str = String.localizedStringWithFormat( NSLocalizedString("copy %@’s %@", comment: "copying item from user"),

"hairForce1", "photos")en.lproj

"Copy %@’s %@" = "Copying %@’s %@"; de.lproj

"Copy %@’s %@" = "%@ von %@ kopieren";

English Copying hairForce1’s photos

Page 40: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationReordering

German photos von hairForce1 kopieren

en.lproj "Copy %@’s %@" = "Copying %@’s %@";

de.lproj "Copy %@’s %@" = "%$2@ von %$1@ kopieren";

let str = String.localizedStringWithFormat( NSLocalizedString("copy %@’s %@", comment: "copying item from user"),

"hairForce1", "photos")

English Copying hairForce1’s photos

Page 41: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationDon’t access the directories yourself

Page 42: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationDon’t access the directories yourself

let lang = NSLocale.preferredLanguages().firstObject! let lprojPath = lang.stringByAppendingPathExtension("lproj") let filePath = NSBundle.mainBundle().pathForResource("stopSign", ofType: "png", inDirectory: lprojPath)

Page 43: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationDon’t access the directories yourself

let lang = NSLocale.preferredLanguages().firstObject! let lprojPath = lang.stringByAppendingPathExtension("lproj") let filePath = NSBundle.mainBundle().pathForResource("stopSign", ofType: "png", inDirectory: lprojPath)

Bundle only has es.lproj

Page 44: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationDon’t access the directories yourself

let lang = NSLocale.preferredLanguages().firstObject! let lprojPath = lang.stringByAppendingPathExtension("lproj") let filePath = NSBundle.mainBundle().pathForResource("stopSign", ofType: "png", inDirectory: lprojPath)

Bundle only has es.lproj

Nothing Here!es-MX (Mexican Spanish)

Page 45: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationDon’t access the directories yourself

NSBundle.mainBundle().imageForResource("stopSign") NSBundle.mainBundle().pathForSoundResource("greeting") NSBundle.mainBundle().URLForResource("help", withExtension: "pdf")

es-MX (Mexican Spanish)

Bundle only has es.lproj

Page 46: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationPluralizationif numDays == 1 { daysString = String.localizedStringWithFormat( NSLocalizedString("%d day remaining", comment: "Single day remaining" numDays) } else { daysString = String.localizedStringWithFormat( NSLocalizedString("%d days remaining", comment: "number of days remaining"), numDays) }

Page 47: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationPluralizationif numDays == 1 { daysString = String.localizedStringWithFormat( NSLocalizedString("%d day remaining", comment: "Single day remaining" numDays) } else { daysString = String.localizedStringWithFormat( NSLocalizedString("%d days remaining", comment: "number of days remaining"), numDays) }

1 day remaining 5 days remaining

English

Page 48: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationPluralizationif numDays == 1 { daysString = String.localizedStringWithFormat( NSLocalizedString("%d day remaining", comment: "Single day remaining" numDays) } else { daysString = String.localizedStringWithFormat( NSLocalizedString("%d days remaining", comment: "number of days remaining"), numDays) }

остается 1 день остается 5 дня

Russian1 day remaining 5 days remaining

English

Page 49: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Localizationstringsdict

Page 50: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Localizationstringsdict

<key>%d day(s) remaining</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@days@</string> <key>days</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>%d day remaining</string> <key>other</key> <string>%d days remaining</string> </dict> </dict>

Page 51: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Localizationstringsdict <key>%d day(s) remaining</key>

<dict> <key>NSStringLocalizedFormatKey</key> <string>%#@days@</string> <key>days</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>остается %d день</string> <key>few</key> <string>остается %d дня</string>

<key>many</key> <string>остается %d дней</string>

<key>other</key> <string>остается %d дня</string> </dict> </dict>

<key>%d day(s) remaining</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@days@</string> <key>days</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>%d day remaining</string> <key>other</key> <string>%d days remaining</string> </dict> </dict>

Page 52: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Localizationstringsdict <key>%d day(s) remaining</key>

<dict> <key>NSStringLocalizedFormatKey</key> <string>%#@days@</string> <key>days</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>остается %d день</string> <key>few</key> <string>остается %d дня</string>

<key>many</key> <string>остается %d дней</string>

<key>other</key> <string>остается %d дня</string> </dict> </dict>

<key>%d day(s) remaining</key> <dict> <key>NSStringLocalizedFormatKey</key> <string>%#@days@</string> <key>days</key> <dict> <key>NSStringFormatSpecTypeKey</key> <string>NSStringPluralRuleType</string> <key>NSStringFormatValueTypeKey</key> <string>d</string> <key>one</key> <string>%d day remaining</string> <key>other</key> <string>%d days remaining</string> </dict> </dict>

Internationalization and Localization Guide Appendix C Stringsdict File Format

Page 53: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationPluralization

Page 54: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationPluralization

for x in [1,2,5] { let formatted = String.localizedStringWithFormat(

NSLocalizedString("%d day(s) remaining", comment: "number of days remaining until watch release"), x) }

Page 55: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationPluralization

for x in [1,2,5] { let formatted = String.localizedStringWithFormat(

NSLocalizedString("%d day(s) remaining", comment: "number of days remaining until watch release"), x) }

1 day remaining 2 days remaining 5 days remaining

English

Page 56: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationPluralization

for x in [1,2,5] { let formatted = String.localizedStringWithFormat(

NSLocalizedString("%d day(s) remaining", comment: "number of days remaining until watch release"), x) }

остается 1 день остается 2 дня остается 5 дней

Russian1 day remaining 2 days remaining 5 days remaining

English

Page 57: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

Page 58: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

Page 59: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 60: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 61: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 62: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Localization

<key>Welcome</key> <dict> <key>NSStringVariableWidthRuleType</key> <dict> <key>20</key> <string>Hi</string> <key>25</key> <string>Welcome</string> <key>50</key> <string>Welcome to the store!</string> </dict> </dict>

VariableWidth

Page 63: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

Page 64: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

self.label = NSLocalizedString("Welcome", comment: "Welcomes the user")

Page 65: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

self.label = NSLocalizedString("Welcome", comment: "Welcomes the user")

Page 66: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

self.label = NSLocalizedString("Welcome", comment: "Welcomes the user")

Page 67: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

self.label = NSLocalizedString("Welcome", comment: "Welcomes the user")

Page 68: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

Page 69: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

let widthFormattedString = formatted.variantFittingPresentationWidth(20)

let formatted = NSLocalizedString("Welcome", comment: "Welcomes the user")

Page 70: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

Hi

let widthFormattedString = formatted.variantFittingPresentationWidth(20)

let formatted = NSLocalizedString("Welcome", comment: "Welcomes the user")

Page 71: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

Welcome

let widthFormattedString = formatted.variantFittingPresentationWidth(25)

let formatted = NSLocalizedString("Welcome", comment: "Welcomes the user")

Page 72: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationVariableWidth

Welcome to the store!

let widthFormattedString = formatted.variantFittingPresentationWidth(50)

let formatted = NSLocalizedString("Welcome", comment: "Welcomes the user");

Page 73: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationFormattingHandling TextLayout

Page 74: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationFormattingHandling TextLayout

Page 75: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNumbers, Dates, Times, and Names

Page 76: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNumbers

Page 77: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNumbers

let pi = String(format: "%.3f", M_PI)

Page 78: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNumbers

let pi = String(format: "%.3f", M_PI)

English

3.142

Page 79: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNumbers

German

3.142

let pi = String(format: "%.3f", M_PI)

English

3.142

Page 80: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNumbers

German

3.142

let pi = String(format: "%.3f", M_PI)

"Three Thousand One Hundred Forty Two"

English

3.142

Page 81: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNumbers

let pi = String.localizedStringWithFormat("%.3f", M_PI)

3.142

English German

3,142

Page 82: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNumbers

let pi = String.localizedStringWithFormat("%.3f", M_PI)

3.142

English German

3,142

Page 83: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNumbers

Input Style Output

-42 .CurrencyStyle -$42.00

-42 .CurrencyISOCodeStyle -USD42.00

-42 .CurrencyPluralStyle -42.00 US dollars

-42 .CurrencyAccountingStyle ($42.00)

42 .OrdinalStyle 42nd

formatter.stringFromNumber(x)!

Page 84: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingDates

Page 85: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingDates

let date = String(format: "%d/%d/%d, %d:%d%d", 6, 12, 2015, 9, 0, 0)

Page 86: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingDates

let date = String(format: "%d/%d/%d, %d:%d%d", 6, 12, 2015, 9, 0, 0)

English (US)

6/12/2015, 9:00

Page 87: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingDates

let date = String(format: "%d/%d/%d, %d:%d%d", 6, 12, 2015, 9, 0, 0)

English (US)

6/12/2015, 9:00

Italian (Italy)

6/12/2015, 9:00

Page 88: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingDates

let df = NSDateFormatter() df.dateFormat = "MM/dd/yyyy, h:mm a" print(df.stringFromDate(NSDate()))

English (US)

06/12/2015, 9:00 AM

Italian (Italy)

06/12/2015, 9:00 AM

Page 89: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingDates

English (US)

06/12/2015, 9:00 AM

Italian (Italy)

12/06/2015, 09:00

let df = NSDateFormatter() df.dateStyle = .ShortStyle df.timeStyle = .ShortStyle print(df.stringFromDate(NSDate()))

Page 90: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingDates

English (US)

06/12/2015, 9:00 AM

Italian (Italy)

12/06/2015, 09:00

let df = NSDateFormatter() df.dateStyle = .ShortStyle df.timeStyle = .ShortStyle print(df.stringFromDate(NSDate()))

Page 91: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingDates

English (US)

06/12/2015, 9:00:00 AM

Italian (Italy)

12/06/2015, 09:00:00

let df = NSDateFormatter() df.setLocalizedDateFormatFromTemplate("yyyyMMddjjmmss") print(df.stringFromDate(NSDate()))

Page 92: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingDates

English (US)

06/12/2015, 9:00:00 AM

Italian (Italy)

12/06/2015, 09:00:00

let df = NSDateFormatter() df.setLocalizedDateFormatFromTemplate("yyyyMMddjjmmss") print(df.stringFromDate(NSDate()))

Page 93: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingUnits

Page 94: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingUnits

let weight = String.localizedStringWithFormat( NSLocalizedString("%d pounds", comment: "Weight"), 6)

Page 95: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingUnits

let weight = String.localizedStringWithFormat( NSLocalizedString("%d pounds", comment: "Weight"), 6)

it.lproj/Localizable.strings"%d pounds" = "%d chilogrammi"

Page 96: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingUnits

let weight = String.localizedStringWithFormat( NSLocalizedString("%d pounds", comment: "Weight"), 6)

it.lproj/Localizable.strings"%d pounds" = "%d chilogrammi"

English (US)

6 pounds

Page 97: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingUnits

let weight = String.localizedStringWithFormat( NSLocalizedString("%d pounds", comment: "Weight"), 6)

it.lproj/Localizable.strings"%d pounds" = "%d chilogrammi"

Italian (Italy)

6 chilogrammi

English (US)

6 pounds

Page 98: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingUnits

let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Italian (Italy)

20 chilogrammi

English (US)

44.092 pounds

Page 99: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingUnits

let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Italian (Italy)

20 chilogrammi

English (US)

44.092 pounds

Page 100: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Page 101: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Grace

Page 102: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Grace Murray

Page 103: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Grace Murray Hopper

Page 104: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Grace Murray Hopper

⺩王

Page 105: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Grace Murray Hopper

⺩王冬

Page 106: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Grace Murray Hopper

龄⺩王冬

Page 107: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Grace Murray Hopper

first middle last

龄⺩王冬

Page 108: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

龄⺩王 冬

first middle last

Grace Murray Hopper

Page 109: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

龄⺩王 冬

first middle last

Grace Murray Hopper

Page 110: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

龄⺩王 冬

"last"

first middle last

Grace Murray Hopper

Page 111: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

龄⺩王 冬

"last"

first middle last

Grace Murray Hopper

Page 112: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

龄⺩王 冬

"last" "middle"

first middle last

Grace Murray Hopper

Page 113: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

龄⺩王 冬

"last" "middle"

first middle last

Grace Murray Hopper

Page 114: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

龄⺩王 冬

"last" "middle" "first"

first middle last

Grace Murray Hopper

Page 115: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Page 116: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

NSPersonNameComponents

Page 117: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

NSPersonNameComponentsFormatter

NSPersonNameComponents

Page 118: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Page 119: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

English:let components = NSPersonNameComponents() components.givenName = "Grace" components.middleName = "Murray" components.familyName = "Hopper"

Page 120: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

let components = NSPersonNameComponents() components.givenName = "Фёдор" // Fyodor components.middleName = "Михайлович" // Mikhailovich components.familyName = "Достоевский" // Dostoyevsky

Russian:

English:let components = NSPersonNameComponents() components.givenName = "Grace" components.middleName = "Murray" components.familyName = "Hopper"

Page 121: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

FormattingNames

Page 122: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

let formatter = NSPersonNameComponentsFormatter() formatter.style = .Short formatter.stringFromPersonNameComponents(components)

FormattingNames

Page 123: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

English Name Russian Name

.Default Grace Hopper Фёдор Достоевский

.Long Grace Murray Hopper Фёдор Михайлович Достоевский

.Medium Grace Hopper Фёдор Достоевский

.Short Grace Ф Достоевский

.Abbreviated GMH Ф Достоевский

FormattingNames

Page 124: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationFormattingHandling TextLayout

Page 125: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationFormattingHandling TextLayout

Page 126: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextCharacters, Case Changes, Searching, and Transforms

Page 127: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?

Page 128: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?

Page 129: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

Page 130: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) +

Page 131: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +

Page 132: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +U+FE0F (VARIATION SELECTOR-16) +

Page 133: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +U+FE0F (VARIATION SELECTOR-16) +U+200D (ZERO WIDTH JOINER) +

Page 134: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +U+FE0F (VARIATION SELECTOR-16) +U+200D (ZERO WIDTH JOINER) +

U+1F48B (KISS MARK)💋 +

Page 135: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +U+FE0F (VARIATION SELECTOR-16) +U+200D (ZERO WIDTH JOINER) +

U+1F48B (KISS MARK)💋 +

U+200D (ZERO WIDTH JOINER) +

Page 136: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +U+FE0F (VARIATION SELECTOR-16) +U+200D (ZERO WIDTH JOINER) +

U+1F48B (KISS MARK)💋 +

U+200D (ZERO WIDTH JOINER) +

U+1F468 (MAN) 👨

Page 137: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +U+FE0F (VARIATION SELECTOR-16) +U+200D (ZERO WIDTH JOINER) +

U+1F48B (KISS MARK)💋 +

U+200D (ZERO WIDTH JOINER) +

U+1F468 (MAN) 👨

Page 138: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +U+FE0F (VARIATION SELECTOR-16) +U+200D (ZERO WIDTH JOINER) +

U+1F48B (KISS MARK)💋 +

U+200D (ZERO WIDTH JOINER) +

U+1F468 (MAN) 👨8?

Page 139: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextWhat is a character?

How many characters is  ! ?U+1F468 (MAN) 👨 +

U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +U+FE0F (VARIATION SELECTOR-16) +U+200D (ZERO WIDTH JOINER) +

U+1F48B (KISS MARK)💋 +

U+200D (ZERO WIDTH JOINER) +

U+1F468 (MAN) 👨8?

Page 140: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextEnumeration: Incorrect

Page 141: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextEnumeration: Incorrect

NSString *str = @"test !"; for(int i = 0; i < str.length; i++) {

NSLog(@"%C",[str characterAtIndex:i]); }

Page 142: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextEnumeration: Incorrect

NSString *str = @"test !"; for(int i = 0; i < str.length; i++) {

NSLog(@"%C",[str characterAtIndex:i]); }

t e s t ? ? ? ? ❤ ? ? ?

Page 143: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextEnumeration: Swift

test !

let str = "test !" str.enumerateSubstringsInRange(str.startIndex ..< str.endIndex, options: .ByComposedCharacterSequences) { (substring, substringRange, enclosingRange, stop) -> () in print("\(substring)") }

Page 144: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextEnumeration: Swift

test !

let str = "test !" str.enumerateSubstringsInRange(str.startIndex ..< str.endIndex, options: .ByComposedCharacterSequences) { (substring, substringRange, enclosingRange, stop) -> () in print("\(substring)") }

Page 145: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextCase changes

Page 146: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextCase changes

let str = "istanbul" print(str.capitalizedString)

Page 147: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextCase changes

let str = "istanbul" print(str.capitalizedString)

Istanbul

Page 148: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextCase changes

let str = "istanbul" print(str.localizedCapitalizedString)

İstanbul

Page 149: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextCase changes

let str = "istanbul" print(str.localizedCapitalizedString)

İstanbul

Page 150: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextCase changes

Page 151: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextCase changes

let str = "istanbul" print(str.localizedUppercaseString) print(str.localizedLowercaseString) print(str.localizedCapitalizedString)

Page 152: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextCase changes

let str = "istanbul" print(str.localizedUppercaseString) print(str.localizedLowercaseString) print(str.localizedCapitalizedString)

İSTANBUListanbulİstanbul

Page 153: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextSearching

Page 154: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextSearching

let str = "Über" print(str.rangeOfString("uber"))

Page 155: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextSearching

let str = "Über" print(str.rangeOfString("uber"))

nil

Page 156: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextSearching

true0..<4

let str = "Über" print(str.localizedStandardRangeOfString("uber")) print(str.localizedStandardContainsString("uber"))

Page 157: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextSearching

true0..<4

let str = "Über" print(str.localizedStandardRangeOfString("uber")) print(str.localizedStandardContainsString("uber"))

Page 158: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextString APIs: Transforms

Transforms:• Uppercase/lowercase• Unicode normalization • Script to Script conversion / transliteration

Formerly only CF-level

Page 159: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextString APIs: Transliteration

Page 160: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextString APIs: Transliteration

let transliterated = "👍".stringByApplyingTransform(NSStringTransformToXMLHex, reverse: false) print(transliterated)

Page 161: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Handling TextString APIs: Transliteration

let transliterated = "👍".stringByApplyingTransform(NSStringTransformToXMLHex, reverse: false) print(transliterated)

&#x1F44D;

Page 162: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationFormattingHandling TextLayout

Page 163: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LocalizationFormattingHandling TextLayout

Page 164: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutDisplaying International UI

Page 165: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutAuto Layout

Page 166: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutAuto Layout

Page 167: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutAuto Layout

Page 168: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutAuto Layout

Page 169: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutAuto Layout

ειδc

Page 170: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutAuto Layout

Page 171: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutAuto Layout

ειδοποιήσεων

Page 172: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutAuto Layout

Mysteries of Auto Layout, Part 1 Presidio Thursday 11:00 AM

Mysteries of Auto Layout, Part 2 Presidio Thursday 1:30 PM

Page 173: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutDynamic Type

Page 174: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 175: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 176: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutRight-to-Left

Page 177: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)
Page 178: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

LayoutRight-to-Left

New UIKit Support for International User Interfaces Nob Hill Thursday 2:30 PM

Page 179: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Summary

Pay attention to • Localization• Formatting• Handling Text• Layout

Use “localized” variants and standard viewsInternationalization opens the world to your application

Page 180: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

More Information

DocumentationInternationalization and Localization Guidehttp://developer.apple.com/libraryTechnical SupportApple Developer Forumshttp://developer.apple.com/forumsGeneral InquiriesPaul Marcos, App Frameworks [email protected]

Page 181: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)

Related Sessions and Lab

What’s New in Cocoa Presidio Tuesday 1:30 PM

New UIKit Support for International User Interfaces Nob Hill Thursday 2:30 PM

Mysteries of Auto Layout, Part 1 Presidio Thursday 11:00 AM

Mysteries of Auto Layout, Part 2 Presidio Thursday 1:30 PM

Internationalization Lab Frameworks Lab A Friday 11:00 AM

Page 182: What’s New in Internationalization...let weight = 20.0 // Store weight in metric units let massFormatter = NSMassFormatter() massFormatter.unitStyle = .Long let formatted = massFormatter.stringFromKilograms(weight)