web-dev-qa-db-ja.com

NSDateFormatterとiOS11の現在の言語

NSDateFormatterのデフォルトの動作はiOS11で変更されたようです。このコードは、現在選択されているiOS11より前のiPhone/iPad言語に従って、日付フォーマッターを機能させ、生成していました。

 _dateFormatterInstance = [[NSDateFormatter alloc] init];
 _dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];

IOS11では、ロケールプロパティを明示的に指定する必要があります。

 _dateFormatterInstance = [[NSDateFormatter alloc] init];
 _dateFormatterInstance.timeZone = [NSTimeZone systemTimeZone];
 _dateFormatterInstance.locale = [NSLocale localeWithLocaleIdentifier:[[NSLocale preferredLanguages] firstObject]];

誰かが私の調査結果を確認できますか?

24
sha

これは、実際にはiOS 11の動作の意図的な変更よりもバグのようです。言語セットが1つしかない場合、Locale.currentは常に正しい言語と地域を返すため、この動作は存在しませんアプリがその言語にローカライズされていない場合でも

ただし、フランス語と英語など、複数の言語がある場合、iOS 11はLocale.currentを使用するときに常に英語またはアプリでサポートされている最も近い言語を優先するようです。

Locale.preferredLanguagesは正しい言語地域情報を返すように見えるため、代わりにそれを使用できる場合があります。

以下は、Locale.currentおよびLocale.preferredLanguagesからの出力を示す例で、不整合を示しています。

これは、英語のみをサポートするアプリから生成されました。デバイスでは、フランス語が第一言語と地域の両方として設定され、最初の例では第二言語として英語(オーストラリア)が設定されています。

(間違っています)Locale.current複数の言語で-フランス語がどのようにフランス語である必要があるか、したがってfr_FRであることに注意してください

  - identifier : "en_FR"
  - kind : "current"

(正しい)Locale.preferredLanguages複数言語

  - 0 : "fr-FR"
  - 1 : "en-AU"

(正しい)Locale.current(フランス語のみを使用)

  - 0 : "fr-FR"

(正しい)Locale.preferredLanguages(フランス語のみを使用)

  - identifier : "fr_FR"
  - kind : "current"
10
Brenton