tvOSのAVPlayerViewControllerのInfoパネルを日本語で表示する


# 前置き
tvOSのAVPlayerViewControllerは勝手にシークバーのサムネイルを出してくれたりして地味に優秀なので使っているアプリが多い印象ですが、下にスワイプするとでてくるここをローカライズしているアプリは滅多に見ません。しかし前職のアプリは特に意識しなくても対応できてたなーと思い。解決したので共有します。

# プロジェクトに日本語の言語設定を追加
これで無事日本語で表示されました🎉
![avplayer-infopanel-001.png](https://qiita-image-store.s3.amazonaws.com/0/35008/edd70acd-d316-6656-6887-efedfb4460e2.png "avplayer-infopanel-001.png")


Xcode上では例えばこういう感じに設定します。
![xcode-localization.png](https://qiita-image-store.s3.amazonaws.com/0/35008/58fa06cf-2e3b-1ade-604f-1df469710cbc.png "xcode-localization.png")


# `AVPlayerItem.externalMetadata`を追加して「情報」タブを出す場合
`extendedLanguageTag`が日本語にマッチしない場合はその情報が表示されないので注意しましょう。

例えば以下のような場合、`"und"`と`"ja"`は日本語にマッチしますが、`"fr"`は日本語にマッチしません。

```swift
extension AVPlayerItem {
    func addExternalMetaData() {
        // title
        let titleItem = AVMutableMetadataItem()
        titleItem.identifier = AVMetadataIdentifier.commonIdentifierTitle
        titleItem.value = "日本語タイトル" as NSString
        titleItem.extendedLanguageTag = "und"

        // description
        let descriptionItem = AVMutableMetadataItem()
        descriptionItem.identifier = AVMetadataIdentifier.commonIdentifierDescription
        descriptionItem.value = "デスクリプチョン" as NSString
        descriptionItem.extendedLanguageTag = "fr"
        externalMetadata.append(titleItem)
        externalMetadata.append(descriptionItem)

        // genre
        let genreItem = AVMutableMetadataItem()
        genreItem.identifier = AVMetadataIdentifier.quickTimeMetadataGenre
        genreItem.value = "Comedy" as NSString
        genreItem.extendedLanguageTag = "ja"

        externalMetadata.append(titleItem)
        externalMetadata.append(descriptionItem)
        externalMetadata.append(genreItem)
    }
}
```
この場合端末の言語設定が日本語の場合にdescriptionが表示されません。

![avplayer-infopanel-002.png](https://qiita-image-store.s3.amazonaws.com/0/35008/318f7b8c-e178-0920-b361-e305246ab648.png "avplayer-infopanel-002.png")


全て `"und"` もしくは `"ja"` にすると、descriptionも表示されました。
![avplayer-infopanel-003.png](https://qiita-image-store.s3.amazonaws.com/0/35008/4f7948a3-c4ee-5a5c-ab41-86b55252f3e6.png "avplayer-infopanel-003.png")

## `"und"`? `"ja"`?
複数言語に対応する場合でメタデータも言語ごとに設定できるのであれば、`ja`とか`fr`とかそれぞれ設定したほうが良さそうですね。そうでなくて1つの言語しかない(ローカライズ対応しない)のであれば、`und`にしておけば良さそうです。というかローカライズ対応しないのであれば`und`にしとけってAppleのドキュメントにも書いてあったような。

## `"ja"`? `"jpn"`?
ちなみに以下のドキュメントでISO 639-2の言語タグについて言及されていたりして混乱したのですが、一応試したら`"ja"`でも`"jpn"`でもどちらでも日本語が表示されました。
[Language and Locale IDs](https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/LanguageandLocaleIDs/LanguageandLocaleIDs.html)

## その他tips
genreだけだと「情報」タブ自体表示されなかったりしました。
シミュレータで確認する場合はxcschemeの言語設定をJapaneseにするのをお忘れなく。

# まとめ
`extendedLanguageTag`の設定だけではダメなのかと思ったら、そもそも言語設定がLocalizationとして追加されていないとダメなようでした。OS標準のUIコンポーネントを使っている場合、同じようなことが起きそうなのでプロジェクトの言語設定は一度見直してみてもいいかもしれません。

そういえばこのInfoパネルはtvOS11でカスタムタブを追加できるようになったので、使ってみたいですね。
![tvos-custom-infopanel.png](https://qiita-image-store.s3.amazonaws.com/0/35008/8eb493f2-df9d-c839-6bfd-52b69ca9ef24.png "tvos-custom-infopanel.png")


# 参考
- [AVKit on tvOS - WWDC 2016](https://developer.apple.com/videos/play/wwdc2016/506/)
- [What's New in tvOS - WWDC 2017](https://developer.apple.com/videos/play/wwdc2017/209/)
- [extendedLanguageTag - AVMutableMetadataItem | Apple Developer Documentation](https://developer.apple.com/documentation/avfoundation/avmutablemetadataitem/1386664-extendedlanguagetag?language=objc)
- [Internationalizing the User Interface](https://developer.apple.com/library/content/documentation/MacOSX/Conceptual/BPInternational/InternationalizingYourUserInterface/InternationalizingYourUserInterface.html)