web-dev-qa-db-ja.com

Locale.currentがデバイスで間違った言語を報告する

IOSアプリで通貨値をフォーマットしようとしています。デバイスの現在のロケール設定を使用して、適切な通貨フォーマットを使用しています。

シミュレーターでは、すべてが正常に実行されているようです。currencyFormatter.locale = Locale.currentを使用すると、適切なロケール設定が使用され、適切な通貨形式で数値が出力されます。

しかし、私のiPhoneでは、フランス語の地域設定でフランス語で構成されているため、別の形式が使用されることを期待しています(例:1 234,56€)。しかし、それは機能せず、英語のフォーマットスタイルを使用しているようです(例:€1 234,56)。

実際、デバイスのアプリから現在のロケールを印刷すると、期待どおりにfr_FRが返されません。

NSLog(Locale.current.identifier)
>>> en_FR

地域は良いですが、言語はそうではありませんが、そのデバイスのiOSは明らかにフランス語です。

誰かこれについてのアイデアはありますか?

ありがとう!

10
Romain

@Romainの回答に基づいて、first!をフォールバックとして使用することにより、Locale.current.identifierの強制アンラップを回避できます。

func getPreferredLocale() -> Locale {
    guard let preferredIdentifier = Locale.preferredLanguages.first else {
        return Locale.current
    }
    return Locale(identifier: preferredIdentifier)
}
11
florieger

拡張子の形での@floriegerの回答:

import Foundation

extension Locale {
    static func preferredLocale() -> Locale {
        guard let preferredIdentifier = Locale.preferredLanguages.first else {
            return Locale.current
        }
        return Locale(identifier: preferredIdentifier)
    }
}

次に、次のように使用します。

dateFormatter.locale = Locale.preferredLocale()
datePicker.locale = Locale.preferredLocale()
4
wzbozon

@MartinRのヒントに続いて、currencyFormatter.locale = Locale(identifier: Locale.preferredLanguages.first!)を使用しています。これは、デバイスの現在の言語と地域の設定に正確に対応しています。

このコードが完全に防弾であるかどうかは完全にはわかりません(first!、特に)他の提案がある場合は、お気軽にどうぞ。

1
Romain

@Romainここでの問題は、アプリをフランス語にローカライズしておらず、英語のみにローカライズしていることです。

アプリの名前が付いた左上の青いファイルに移動し、[プロジェクト]> [情報]を選択すると、ローカリゼーションエリアに「英語-開発言語」が表示されます。 +を押してフランス語(fr)を選択します。

それでおしまい。これでLocale.currentを使用でき、デバイス(またはシミュレーター)の最初の言語がフランス語の場合、アプリはフランス語の通貨形式を表示します。

1