Internationalization Best Practicesまとめ

WWDC2016の[Internationalization Best Practices](https://developer.apple.com/videos/play/wwdc2016/201/)まとめてみました。

といっても、このセッションはタイトルの通り、`What's new in ...`ではないので、目新しいことはそれほど多くはなかったです。

自分にとって有用なことだけピックアップしてまとめましたので、それ以外の部分も確認したい方は動画を確認していただければと思います。

## NSDateFormatter
14:00あたりから。

- 時刻を表示したい場合、`dateFormat`で指定したコードは使うべきではない。
- その代わりに`timeStyle`や`dateStyle`(どちらもiOS2.0から利用可能)を設定すべき

```swift
//NG
let formatter: DateFormatter = DateFormatter()
formatter.dateFormat = "hh:mm a"

//OK
let formatter: DateFormatter = DateFormatter()
formatter.timeStyle = .shortStyle  //for 9:41 AM
formatter.timeStyle = .mediumStyle //for 9:41:19 AM
formatter.timeStyle = .longStyle   //for 9:41:19 AM PDT
formatter.timeStyle = .fullStyle   //for 9:41:19 AM Pacific Daylight Time

formatter.dateStyle = .shortStyle  //for 6/14/16
formatter.dateStyle = .mediumStyle //for Jun 14, 2016
formatter.dateStyle = .longStyle   //for June 14, 2016
formatter.dateStyle = .fullStyle   //for Tuesday, June 14, 2016
```

- 上記した以外のスタイルにカスタマイズしたい場合も、`setLocalizedDateFormatFromTemplate`(iOS8.0から利用可能)を使うべき

```swift
//NG
let formatter: DateFormatter = DateFormatter()
formatter.dateFormat = "dd/MM"

//OK
let formatter: DateFormatter = DateFormatter()
formatter.setLocalizedDateFormatFromTemplate("yMd")   //for 6/14/2016
formatter.setLocalizedDateFormatFromTemplate("dM")    //for 6/14
formatter.setLocalizedDateFormatFromTemplate("dMMM")  //for Jun 14
formatter.setLocalizedDateFormatFromTemplate("EdMMM") //for Tus, Jun 14
```

## NSDateComponentsFormatter
15:00あたりから。

- ローカライズされた範囲のある日時や時間を定義する場合は以下のクラスを使うべき
  - NSDateComponent(既存クラス)
  - NSDateComponentsFormatter(既存クラス)
  - NSDateInterval(新規クラス)
  - NSDateIntervalFormatter(新規クラス)
- 使い方は以下の通り

```swift
var components = DateComponents()
components.hour   = 4
components.minute = 25
var formatter = NSDateComponentsFormatter()
let str = formatter.string(from: components) // 4hr 25min

var components = DateInterval(start: date, duration: 3600)
var formatter = NSDateIntervalFormatter()
formatter.dateStyle = .none
formatter.timeStyle = .short
let str = formatter.string(from: components) // 9:00 - 9:40 AM
```

このあたりは便利そうなので、使っていきたいですね。

## PersonNameComponentsFormatter
16:00あたりから。

- 名前を扱うためのクラスが追加されたクラス、使い方は以下の通り。
  - PersonNAmeComponents
  - PersonNameComponentsFormatter

```
var components = PersonNAmeComponents()
components.givenName  = "John"
components.middleName = "Adam"
components.familyName = "Appleseed"

let formatter = PersonNameComponentsFormatter()
formatter.style = .long        //John Adam Appleseed
formatter.style = .medium      //John Appleseed
formatter.style = .short       //John
formatter.style = .abbreviated //JA
```

PersonNameComponentsFormatterは素晴らしくて、以下のように姓名の順序を逆に渡しても、適切なpropertyにassignしてくれるとのこと。

```swift
let formatter = PersonNameComponentsFormatter()
if let components = formatter.personNameComponents(from: "John Appleseed") {
    print(components.givenName)  //John
    print(components.familyName) //Appleseed
}
if let components = formatter.personNameComponents(from: "Appleseed John") {
    print(components.givenName)  //John
    print(components.familyName) //Appleseed
}
```

主だった内容は以上です。

## AutoLayout
18:00あたりから。
国際化対応とAutoLayoutについては、金曜日のセッション、
`What's new in Auto Layout`を見てね、くらい。

## Iconography
24:30あたりから。

言っていることは正しいですが、Facebookとかみたいにユーザーが数千万人以上、全世界にいるレベルのプロダクトでないと、あまり必要ないのでは？とも感じました。

- アイコン上に文字や数字を表示するのを避けよう
- アラビア語などのように、右から左に文字を書く文化に提供するアイコンでは、必要に応じて左右を反転させよう(アイコン上の閉じるボタンの位置など)。

## 参考
- [Internationalization Best Practices](https://developer.apple.com/videos/play/wwdc2016/201/)
- [NSDateFormatter Class Reference](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateFormatter_Class/)
- [NSDateComponents Class Reference](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSDateComponents_Class/)
- [NSDateComponentsFormatter Class Reference](https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSDateComponentsFormatter_class/)
- [NSDateInterval Class Reference](https://developer.apple.com/reference/foundation/nsdateinterval)
- [DateIntervalFormatter Class Reference](https://developer.apple.com/reference/foundation/nsdateintervalformatter)
- [PersonNameComponentsFormatter Class Reference](https://developer.apple.com/reference/foundation/nspersonnamecomponentsformatter)
- [Internationalizing the User Interface](https://developer.apple.com/library/prerelease/content/documentation/MacOSX/Conceptual/BPInternational/InternationalizingYourUserInterface/InternationalizingYourUserInterface.html#//apple_ref/doc/uid/10000171i-CH3-SW3)
- [Testing Your Internationalized App](https://developer.apple.com/library/prerelease/content/documentation/MacOSX/Conceptual/BPInternational/TestingYourInternationalApp/TestingYourInternationalApp.html#//apple_ref/doc/uid/10000171i-CH7-SW1)