web-dev-qa-db-ja.com

iOSアプリの英語以外のデフォルト言語?

ヨーロッパのクライアント向けのアプリを開発しています。私は米国で英語を話します。私たちのアプリはいくつかの言語をサポートしますが、英語はサポートしません。私はアプリのすべての文字列を翻訳されたLocalized.stringsファイルに入れており、さまざまな言語に正しく設定されています。デバイスが正しい言語に設定されていると、すべて正常に機能します(デバイスの言語はドイツ語です=アプリはドイツ語に正しくローカライズされています)。 。

デバイスが、サポートされている言語のいずれかに設定されていない場合(たとえば、電話が英語に設定されている場合)に問題があります。このような場合、電話をドイツ語にフォールバックしたいのですが、実際にはそうではありません。現在表示されているのは、Settings.appの[International]セクションの[Language]リストに表示される最も高い言語が電話で使用されていることです。私の携帯電話では、リストで最も高い英語以外の言語はフランス語なので、アプリを実行すると、フランス語にローカライズされます。電話をドイツ語に変更してから英語に戻すと(言語リストの順序が変更されます)、アプリはドイツ語にローカライズされます。

サポートされていない言語のアプリのデフォルトをドイツ語にするにはどうすればよいですか?私は このチュートリアル を使用してプロジェクトのロケールを設定しました。これには、最初にファイルをローカライズしたときに作成されるデフォルトの「英語」ロケールの削除が含まれます。プロジェクトファイルに、次を追加しました。

developmentRegion = de;

また、Info.plistには、

<key>CFBundleDevelopmentRegion</key>
<string>de</string>

成功しませんでした。

任意のアイデアをいただければ幸いです!

37
James J

特定の言語にデフォルト設定することは、あなたが努力すべきことではありません。フランスに住み、フランス語を流暢に話す日本人ユーザーが、電話を日本語に設定しているとします。フランス語の翻訳があっても、アプリのデフォルトはドイツ語になります。それはあなたが望んでいることではなく、ユーザーが望んでいることでもありません。

このため、ユーザーが設定した言語の優先順位を尊重することをお勧めします。

あなたは英語をサポートしたくないが、英語でアプリを開発したので、あなたができる最も簡単なことは、コンパイル直後にen.lprojを取り除くことです。これにより、サポートする予定の言語のみがアプリに残り、iPhoneのデフォルトで設定されているように、iPhoneはユーザーに最適な言語を選択します。


特定のローカリゼーションを削除するへのかなり簡単な解決策があります

現在のすべてのローカリゼーションを使用してXcodeでアプリをビルドし、コード署名が開始される直前にen.lprojフォルダーを削除して、その言語のすべてのローカライズファイルを削除します。これを行うには、次の1行のコード(Bashスクリプト)を含むスクリプト実行ビルドフェーズをターゲットに追加します。

rm -r "${TARGET_BUILD_DIR}/${PRODUCT_NAME}.app/en.lproj"

コード署名は、すべてのビルドフェーズが完了した後に常に開始されるため、そのビルドフェーズを現在のフェーズの最後に置くだけです。

これにより、Xcodeがすべての英語ファイルを再作成するため、ビルドにかかる時間が長くなるため、テスト中はこの手順を無効にすることをお勧めします。

それがあなたにとって実行可能な解決策であることを願っています。


について「適切なローカリゼーションが存在しない場合、アプリはドイツ語にフォールバックする必要があります」

問題は、適切なローカリゼーションとは何ですか?ユーザーの3番目の選択肢がフランス語(2つのサポートされていない言語の後)である場合、このソリューションはアプリをフランス語にフォールバックします。これは適切なローカリゼーションであるです。ユーザーの5番目の選択肢であるドイツ語を手動で設定するよりも適切です。

アプリの起動時に何が起こるかは簡単です。OSは、環境設定で設定されているように、一致するローカリゼーションが見つかるまでユーザーの言語リストを下降し、この言語を使用します。多くのアプリがドイツ語ではなく英語にデフォルト設定されている理由は、英語がドイツ語より上のほとんどのユーザー言語リストに表示されるためです。システムに固有の言語設定はありません。英語の翻訳を削除すると、サポートしたい言語のみが存在し、これらの言語のうちユーザーのリストで1つ上の言語が選択されます。

44
Pascal

against Apples Human Interface Guidelinesが実行されるため、この回答を投稿するのは好きではありません。ローカリゼーションはユーザーが設定する必要があるものであり、管理者が決定するものではないため、特定のデフォルト言語を必要とするマネージャーは何も理解せず、ビジネスを変える必要があります。

そうは言っても、特定の言語を特定の順序で使用するようにiOSを強制する方法があります。私はこれを主にローカリゼーションのデバッグに使用します。デバイス言語を別のものに設定する必要はありません。これを使用して、この質問で存在しない問題を解決できるかどうかはわかりません。

ユーザーのデフォルトには、使用する言語の順序を示すキーAppleLanguagesがあり、通常はiOSの設定でユーザーが設定した順序に設定されています。この順序を変更すると、アプリは最初にその順序でローカライズを検索しようとします。あなたができることは、現在の言語設定を読んで、以下のようにデフォルトをドイツ語に決定することです:

NSArray *langOrder = [NSArray arrayWithObjects:@"de", nil];
[[NSUserDefaults standardUserDefaults] setObject:langOrder forKey:@"AppleLanguages"];

UIApplicationMainの前にmain.mでこれを行う必要があることに注意してください。そうでない場合、この変更を有効にするにはアプリを再起動する必要があります。

あなたが最後まで行って、ユーザーが手動で言語を変更できるようにする設定を実装しない限り、実際のアプリでは誰もこれを行うべきではないことを十分に述べることはできません。デフォルトで特定の言語に設定した場合、ユーザーはyourの選択を変更するオプションがありません。

14
Pascal

デフォルト言語を特定の言語にするために、この次のコードは、このページですでに説明されているチャームのように機能します。 Swiftバージョン:(Swift 4.2)

let arr = NSArray(objects: "ja")
UserDefaults.standard.set(arr, forKey: "AppleLanguages")