3

現在、ローカリゼーションの標準的な動作では、iOS は現在設定されている iPhone の言語を判断し、Localizable.strings ファイルを使用して適切なテキストを設定します。

ただし、私のクライアントは、ネイティブの iOS 優先言語とは無関係にアプリケーション内で言語が設定される多言語 iOS アプリケーションを必要とします。つまり、アプリケーションの言語は、現在 iPhone で iOS が設定されている言語とは異なる場合があります。

このシナリオを実装する方法について何か考えがある人はいますか?

私の考え:

  • NSLocalizeString に似たカスタム静的クラスを作成し、その中にハードコード文字列を作成して、アプリ内で設定された適切な言語文字列 wrt 言語を返すことができます。それが可能な解決策である場合、そのクラスを構造化する方法についての提案)
4

4 に答える 4

4

あなたは出来る:

  1. 翻訳文字列を言語ごとに .plist ファイル (string_key/translation) に保存します。

  2. NSDictionary で適切な plist (現在設定されている言語に応じて) を読み取ります。

  3. 表示したい各文字列の辞書にアクセスします (NSLocalizeString で行うのと同じように)。

于 2012-06-19T11:03:43.693 に答える
2

私はかつてフラッシュカードアプリを作成しなければならず、クライアントは言語を自由に変更する必要がありました。現在、ボックスにソースコードはありませんが、このチュートリアルを使用したことを覚えています。彼らが使用するサンプルコードもチェックしてください。

補足 - クライアントを公に非難することは、本当にプロフェッショナルではありません。

于 2012-06-19T13:01:41.003 に答える
1

必要な言語で plist ファイルを作成します。すべてのローカライズされた文字列のデフォルトとして {LANG}_{CLASS NAME} と {CLASS NAME} を使用します。その後、適切なファイルが存在するかどうかをチェックするメソッドを作成し、欠落している場合はそれを取得し、デバイス言語に応じて NSDictionary オブジェクトを返し、クラス init で呼び出します。nib 名を文字列ファイルに追加してローカライズされた nib を実装する場合、この考え方も使用できます。

+ (NSDictionary *) getLocalized: (NSString *) contollerName andLang:(NSString *) lang {
    NSString *fullPath = nil;
    // You can use device lang if needed
    NSString * curLang=[[NSLocale preferredLanguages] objectAtIndex:0];
    fullPath = [[NSBundle mainBundle] pathForResource: [NSString stringWithFormat:@"%@_%@",contollerName,lang]  ofType: @"plist"];
    if (!fullPath) {
        fullPath = [[NSBundle mainBundle] pathForResource:contollerName ofType:@"plist"];
    }
    return [NSDictionary dictionaryWithContentsOfFile:fullPath];
}

したがって、次のような方法で呼び出すことができます。

[tools getLocalized:[Controller.class description] andLang:@"XX"];
于 2013-04-06T15:46:55.567 に答える
0

標準のローカライズ (.strings ファイルとローカライズされた .xibs) を使用して、iOS 言語設定以外の言語をアプリに強制的に使用させることができます。これを実現する方法の詳細については、次の投稿を参照してください: iOS アプリケーションの言語を変更する

あなた (またはあなたのクライアント!) がアプリの使用中にオンザフライで言語を切り替えたい場合は、より複雑になることに注意してください。何らかの更新機能を実装し、xibs がリロードされるようにする必要があります。

于 2012-06-19T11:27:06.177 に答える