what’s new in internationalization...let weight = 20.0 // store weight in metric units let...
TRANSCRIPT
© 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
OverviewOverview
69%of Apple revenue is international
Other 69%
US 31%
Worldwide App Store Sales
Others 28%
China 16% Japan
25%
US 31%
Worldwide App Store Sales
Outline
LocalizationFormattingHandling TextLayout
LocalizationFormattingHandling TextLayout
LocalizationFormattingHandling TextLayout
LocalizationMaking your app speak your customer’s language
LocalizationLanguage and region settings
Specify primary languageSpecify ordeing of preferred languagesSpecify region independently
LocalizationLanguage and region settings
LocalizationLanguage and region settings
LocalizationLanguage and region settings
Advanced Topics in Internationalization WWDC14
LocalizationNumber Systems
LocalizationKeyboards
Indic Keyboards
• Hindi (Latin),a.k.a. “Hinglish”
• Hindi (Transliteration)• Punjabi• Telugu• Gujarati
Predictive Typing for
• Korean• Mexican Spanish• Russian• Turkish
LocalizationKeyboards
Indic Keyboards
• Hindi (Latin),a.k.a. “Hinglish”
• Hindi (Transliteration)• Punjabi• Telugu• Gujarati
Predictive Typing for
• Korean• Mexican Spanish• Russian• Turkish
LocalizationKeyboards
Indic Keyboards
• Hindi (Latin),a.k.a. “Hinglish”
• Hindi (Transliteration)• Punjabi• Telugu• Gujarati
Predictive Typing for
• Korean• Mexican Spanish• Russian• Turkish
LocalizationString Translation
LocalizationString Translation
/* Wristwatch */ "watch" = "Uhr";
de.lproj/Localizable.strings:
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
LocalizationString Translation
LocalizationString Translation
To get simple localized string:func NSLocalizedString( key : String tableName: String? = "Localizable", bundle: NSBundle = NSBundle.mainBundle(), value: String = "", comment: String) -> String
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…)
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…)
LocalizationString Translation
LocalizationString Translation
var str = String.localizedStringWithFormat( NSLocalizedString("Location: %@", comment: "User’s Location"),
location)
LocalizationString Translation
var str = String.localizedStringWithFormat( NSLocalizedString("Location: %@", comment: "User’s Location"),
location)
en.lproj/Localizable.strings: "Location: %@" = "Location: %@";
ja.lproj/Localizable.strings: "Location: %@" = "場所:%@";
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: %@" = "場所:%@";
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: %@" = "場所:%@";
LocalizationReordering
LocalizationReordering
let str = String.localizedStringWithFormat( NSLocalizedString("copy %@’s %@", comment: "copying item from user"),
"hairForce1", "photos")
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";
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
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
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
LocalizationDon’t access the directories yourself
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)
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
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)
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
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) }
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
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
Localizationstringsdict
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>
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>
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
LocalizationPluralization
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) }
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
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
LocalizationVariableWidth
LocalizationVariableWidth
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
LocalizationVariableWidth
LocalizationVariableWidth
self.label = NSLocalizedString("Welcome", comment: "Welcomes the user")
LocalizationVariableWidth
self.label = NSLocalizedString("Welcome", comment: "Welcomes the user")
LocalizationVariableWidth
self.label = NSLocalizedString("Welcome", comment: "Welcomes the user")
LocalizationVariableWidth
self.label = NSLocalizedString("Welcome", comment: "Welcomes the user")
LocalizationVariableWidth
LocalizationVariableWidth
let widthFormattedString = formatted.variantFittingPresentationWidth(20)
let formatted = NSLocalizedString("Welcome", comment: "Welcomes the user")
LocalizationVariableWidth
Hi
let widthFormattedString = formatted.variantFittingPresentationWidth(20)
let formatted = NSLocalizedString("Welcome", comment: "Welcomes the user")
LocalizationVariableWidth
Welcome
let widthFormattedString = formatted.variantFittingPresentationWidth(25)
let formatted = NSLocalizedString("Welcome", comment: "Welcomes the user")
LocalizationVariableWidth
Welcome to the store!
let widthFormattedString = formatted.variantFittingPresentationWidth(50)
let formatted = NSLocalizedString("Welcome", comment: "Welcomes the user");
LocalizationFormattingHandling TextLayout
LocalizationFormattingHandling TextLayout
FormattingNumbers, Dates, Times, and Names
FormattingNumbers
FormattingNumbers
let pi = String(format: "%.3f", M_PI)
FormattingNumbers
let pi = String(format: "%.3f", M_PI)
English
3.142
FormattingNumbers
German
3.142
let pi = String(format: "%.3f", M_PI)
English
3.142
FormattingNumbers
German
3.142
let pi = String(format: "%.3f", M_PI)
"Three Thousand One Hundred Forty Two"
English
3.142
FormattingNumbers
let pi = String.localizedStringWithFormat("%.3f", M_PI)
3.142
English German
3,142
FormattingNumbers
let pi = String.localizedStringWithFormat("%.3f", M_PI)
3.142
English German
3,142
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)!
FormattingDates
FormattingDates
let date = String(format: "%d/%d/%d, %d:%d%d", 6, 12, 2015, 9, 0, 0)
FormattingDates
let date = String(format: "%d/%d/%d, %d:%d%d", 6, 12, 2015, 9, 0, 0)
English (US)
6/12/2015, 9:00
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
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
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()))
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()))
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()))
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()))
FormattingUnits
FormattingUnits
let weight = String.localizedStringWithFormat( NSLocalizedString("%d pounds", comment: "Weight"), 6)
FormattingUnits
let weight = String.localizedStringWithFormat( NSLocalizedString("%d pounds", comment: "Weight"), 6)
it.lproj/Localizable.strings"%d pounds" = "%d chilogrammi"
FormattingUnits
let weight = String.localizedStringWithFormat( NSLocalizedString("%d pounds", comment: "Weight"), 6)
it.lproj/Localizable.strings"%d pounds" = "%d chilogrammi"
English (US)
6 pounds
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
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
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
FormattingNames
FormattingNames
Grace
FormattingNames
Grace Murray
FormattingNames
Grace Murray Hopper
FormattingNames
Grace Murray Hopper
⺩王
FormattingNames
Grace Murray Hopper
⺩王冬
FormattingNames
Grace Murray Hopper
龄⺩王冬
FormattingNames
Grace Murray Hopper
first middle last
龄⺩王冬
FormattingNames
龄⺩王 冬
first middle last
Grace Murray Hopper
FormattingNames
龄⺩王 冬
first middle last
Grace Murray Hopper
FormattingNames
龄⺩王 冬
"last"
first middle last
Grace Murray Hopper
FormattingNames
龄⺩王 冬
"last"
first middle last
Grace Murray Hopper
FormattingNames
龄⺩王 冬
"last" "middle"
first middle last
Grace Murray Hopper
FormattingNames
龄⺩王 冬
"last" "middle"
first middle last
Grace Murray Hopper
FormattingNames
龄⺩王 冬
"last" "middle" "first"
first middle last
Grace Murray Hopper
FormattingNames
FormattingNames
NSPersonNameComponents
FormattingNames
NSPersonNameComponentsFormatter
NSPersonNameComponents
FormattingNames
FormattingNames
English:let components = NSPersonNameComponents() components.givenName = "Grace" components.middleName = "Murray" components.familyName = "Hopper"
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"
FormattingNames
let formatter = NSPersonNameComponentsFormatter() formatter.style = .Short formatter.stringFromPersonNameComponents(components)
FormattingNames
English Name Russian Name
.Default Grace Hopper Фёдор Достоевский
.Long Grace Murray Hopper Фёдор Михайлович Достоевский
.Medium Grace Hopper Фёдор Достоевский
.Short Grace Ф Достоевский
.Abbreviated GMH Ф Достоевский
FormattingNames
LocalizationFormattingHandling TextLayout
LocalizationFormattingHandling TextLayout
Handling TextCharacters, Case Changes, Searching, and Transforms
Handling TextWhat is a character?
How many characters is ! ?
Handling TextWhat is a character?
How many characters is ! ?
Handling TextWhat is a character?
How many characters is ! ?U+1F468 (MAN) 👨 +
Handling TextWhat is a character?
How many characters is ! ?U+1F468 (MAN) 👨 +
U+200D (ZERO WIDTH JOINER) +
Handling TextWhat is a character?
How many characters is ! ?U+1F468 (MAN) 👨 +
U+200D (ZERO WIDTH JOINER) + U+2764 (HEAVY BLACK HEART) ❤ +
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) +
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) +
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)💋 +
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) +
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) 👨
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) 👨
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?
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?
Handling TextEnumeration: Incorrect
Handling TextEnumeration: Incorrect
NSString *str = @"test !"; for(int i = 0; i < str.length; i++) {
NSLog(@"%C",[str characterAtIndex:i]); }
Handling TextEnumeration: Incorrect
NSString *str = @"test !"; for(int i = 0; i < str.length; i++) {
NSLog(@"%C",[str characterAtIndex:i]); }
t e s t ? ? ? ? ❤ ? ? ?
Handling TextEnumeration: Swift
test !
let str = "test !" str.enumerateSubstringsInRange(str.startIndex ..< str.endIndex, options: .ByComposedCharacterSequences) { (substring, substringRange, enclosingRange, stop) -> () in print("\(substring)") }
Handling TextEnumeration: Swift
test !
let str = "test !" str.enumerateSubstringsInRange(str.startIndex ..< str.endIndex, options: .ByComposedCharacterSequences) { (substring, substringRange, enclosingRange, stop) -> () in print("\(substring)") }
Handling TextCase changes
Handling TextCase changes
let str = "istanbul" print(str.capitalizedString)
Handling TextCase changes
let str = "istanbul" print(str.capitalizedString)
Istanbul
Handling TextCase changes
let str = "istanbul" print(str.localizedCapitalizedString)
İstanbul
Handling TextCase changes
let str = "istanbul" print(str.localizedCapitalizedString)
İstanbul
Handling TextCase changes
Handling TextCase changes
let str = "istanbul" print(str.localizedUppercaseString) print(str.localizedLowercaseString) print(str.localizedCapitalizedString)
Handling TextCase changes
let str = "istanbul" print(str.localizedUppercaseString) print(str.localizedLowercaseString) print(str.localizedCapitalizedString)
İSTANBUListanbulİstanbul
Handling TextSearching
Handling TextSearching
let str = "Über" print(str.rangeOfString("uber"))
Handling TextSearching
let str = "Über" print(str.rangeOfString("uber"))
nil
Handling TextSearching
true0..<4
let str = "Über" print(str.localizedStandardRangeOfString("uber")) print(str.localizedStandardContainsString("uber"))
Handling TextSearching
true0..<4
let str = "Über" print(str.localizedStandardRangeOfString("uber")) print(str.localizedStandardContainsString("uber"))
Handling TextString APIs: Transforms
Transforms:• Uppercase/lowercase• Unicode normalization • Script to Script conversion / transliteration
Formerly only CF-level
Handling TextString APIs: Transliteration
Handling TextString APIs: Transliteration
let transliterated = "👍".stringByApplyingTransform(NSStringTransformToXMLHex, reverse: false) print(transliterated)
Handling TextString APIs: Transliteration
let transliterated = "👍".stringByApplyingTransform(NSStringTransformToXMLHex, reverse: false) print(transliterated)
👍
LocalizationFormattingHandling TextLayout
LocalizationFormattingHandling TextLayout
LayoutDisplaying International UI
LayoutAuto Layout
LayoutAuto Layout
LayoutAuto Layout
LayoutAuto Layout
LayoutAuto Layout
ειδc
LayoutAuto Layout
LayoutAuto Layout
ειδοποιήσεων
LayoutAuto Layout
Mysteries of Auto Layout, Part 1 Presidio Thursday 11:00 AM
Mysteries of Auto Layout, Part 2 Presidio Thursday 1:30 PM
LayoutDynamic Type
LayoutRight-to-Left
LayoutRight-to-Left
New UIKit Support for International User Interfaces Nob Hill Thursday 2:30 PM
Summary
Pay attention to • Localization• Formatting• Handling Text• Layout
Use “localized” variants and standard viewsInternationalization opens the world to your application
More Information
DocumentationInternationalization and Localization Guidehttp://developer.apple.com/libraryTechnical SupportApple Developer Forumshttp://developer.apple.com/forumsGeneral InquiriesPaul Marcos, App Frameworks [email protected]
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