さまざまな言語に翻訳しているアプリがあります。問題は、オーストラリアとニュージーランドではアプリの値が異なることです。どちらも英語圏の国です。
en_AU と en_NZ 言語ファイルを作成しましたが、どちらも標準の英語ファイルを使用しています。英語のファイルを削除しましたが、引き続き発生します...
これを機能させる方法についてのアイデアはありますか?
ありがとうございました、
--d
さまざまな言語に翻訳しているアプリがあります。問題は、オーストラリアとニュージーランドではアプリの値が異なることです。どちらも英語圏の国です。
en_AU と en_NZ 言語ファイルを作成しましたが、どちらも標準の英語ファイルを使用しています。英語のファイルを削除しましたが、引き続き発生します...
これを機能させる方法についてのアイデアはありますか?
ありがとうございました、
--d
iPhone のローカリゼーション (またはそのローカリゼーションですか?) は、ユーザーが設定した地域 (つまり、英国、オーストラリア、ニュージーランド) を考慮しません。デフォルトで使用できる「英語」言語の翻訳は 1 つだけです。ただし、別の翻訳設定を強制的に使用するようにハッキングすることはできます。「英語」(米国) と「en_GB」(英国英語) のどちらかを選択するためにこれを行いました。
main.m ファイルで、以下のように変更します (NZ または AU 用に独自のテストを挿入します)。
int main(int argc, char *argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// Set up the locale jiggery pokery
NSString *language = [[NSLocale preferredLanguages] objectAtIndex:0];
NSString *locale = [[NSLocale currentLocale] objectForKey: NSLocaleCountryCode];
if ([language isEqualToString:@"en"] && [locale isEqualToString:@"GB"]) {
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"en_GB", @"en", nil] forKey:@"AppleLanguages"];
}
int retVal = UIApplicationMain(argc, argv, nil, nil);
[pool release];
return retVal;
}
これにより、ユーザーの言語 ("en" など) が言語 NSString にポップされ、ユーザーのロケール (NZ、GB、AU など) がロケール NSString にポップされます。(私の場合) en と GB が一致する場合、ユーザーの既定の言語設定を「en_GB」、次に「en」に設定します。
次に、アプリケーションデリゲート application:didFinishLaunchingWithOptions メソッドで、コードで設定した NSUserDefaults 設定を削除します
[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"];
すべてのバンドルの初期化が完了しているため、この時点で安全に削除できます。アプリは、en_GB.lproj ディレクトリ内の Localization.strings ファイルを使用する必要があります。
これはちょっと恐ろしく、ハッキーな解決策ですが、私にとってはうまくいきます。
リッカーブの受け入れられた答えのわずかに改善されたバージョンだと思うものを思いつきました。最初に認識すべきことは、ユーザーの既定値はドメインに編成されており、@"AppleLanguages"
キーはアプリのドメインからではなく、ドメインの階層の上位にあるドメインから取得されるということです。これは、ユーザーのデフォルトから完全に安全に削除できることを意味します。
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"AppleLanguages"];
[defaults objectForKey:@"AppleLanguages"]
このコードを呼び出した後でも、呼び出しによって値が返されることに気付くでしょう。@"AppleLanguages"
したがって、アプリの複雑さによっては問題になる可能性がある後である時点で削除するのではなく、反対のことを行う必要があります。つまり、すぐに削除@"AppleLanguages"
します。基本的に、これによりデフォルト値にリセットされ、たとえばユーザーが優先言語を変更した場合など、システムが行った変更がすべてキャプチャされます。
これが私がすることです:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults removeObjectForKey:@"AppleLanguages"];
NSMutableArray *appleLanguages = [[defaults objectForKey:@"AppleLanguages"] mutableCopy];
NSString *region = [[NSLocale currentLocale] objectForKey:NSLocaleCountryCode];
NSArray *languages = [appleLanguages filteredArrayUsingPredicateFormat:@"not (self contains '-')"];
for (NSString *language in languages) {
NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region];
[appleLanguages removeObject:languageAndRegion];
}
for (NSString *language in languages) {
NSString *languageAndRegion = [NSString stringWithFormat:@"%@-%@", language, region];
NSInteger index = [appleLanguages indexOfObject:language];
[appleLanguages insertObject:languageAndRegion atIndex:index];
}
[defaults setObject:appleLanguages forKey:@"AppleLanguages"];
(filteredArrayUsingPredicateFormat:
これは私が書いた拡張メソッドであることに注意してください。それが何をするか、またはどのように機能するかを理解するのはロケット科学ではありません。)
これにより、ユーザーの地域と組み合わされたリスト内のすべての言語のローカリゼーションが作成されます。たとえば、元のリストがes en en-GB
で、ユーザーの地域が AU の場合、 が得られますes-AU es en-AU en en-GB
。es-AU
存在しないことに注意してください。ただし、違いはありません。アプリは関連するローカリゼーションまたはリソースを検出しないため、単に無視します。
Appleは、この欠落しているiOS機能をここに文書化しています。
重要: iOSでは、バンドルインターフェイスは、ローカライズされたリソースを探すときに方言やスクリプトの情報を考慮しません。言語指定コードのみが考慮されます。したがって、プロジェクトに言語と地域の両方の指定子を持つ言語固有のプロジェクトディレクトリが含まれている場合、それらのディレクトリは無視されます。Mac OS Xのバンドルインターフェイスは、言語固有のプロジェクトディレクトリのリージョン指定子をサポートしています。
ドイツ語でも同じ問題があり、「正しい」解決策を見つけたと思います。間違いは、もともと私のベース言語が「ドイツ語 (de)」のみだったことです。「ドイツ語/オーストリア (de_AT)」のローカライズを追加すると、ファイルが無視されました。ベース言語を「ドイツ語/ドイツ語 (de_DE)」に変更すると、オーストリア語の翻訳が無視されませんでした。