8

ユーザーがアプリ内からアラビア語と英語を切り替えるオプションを追加しようとしています(iPhone全体の言語をリセットする必要はありません)。AppDelegateでこのメソッドを使用することで、正しく行うことができました。 .mファイル:

 -(void)switchTolanguage:(NSString *)lang{

    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:lang] forKey:@"AppleLanguages"];
     NSBundle *bnd = [NSBundle bundleWithPath:[[NSBundle mainBundle]pathForResource:lang ofType:@"lproj" ]];
     UIStoryboard *storyBoard;
     storyBoard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:bnd];
     UIViewController *initViewController = [storyBoard instantiateInitialViewController];
     self.window.rootViewController = initViewController;
}

メソッドをテストするためにアプリのビューコントローラーの1つに2つ配置UIButtonsしましたが、うまく機能UILabelsしました。新しくロードされた(ローカライズされた)ストーリーボードのすべて、文字列などが正しい選択言語で表示されますが、1つの例外があります:新しいロードされたストーリーボードは、ローカライズされた画像を取得(ロード)しません。古いストーリーボード(古いバンドル)の画像を取得します。つまり、アプリが現在英語のバンドルで実行されており、ユーザーが言語をアラビア語に切り替えるボタンをタップした場合、アプリ正しいアラビア語のコントロールと文字列で表示されますが、英語の画像では、英語に戻すとすべて問題ありません(英語の文字列、ラベル、画像...)

ストーリーボードのローカライズ方法は次のとおりです。

ここに画像の説明を入力してください

各画像のローカライズ方法は次のとおりです。

ここに画像の説明を入力してください

ユーザーがアプリの言語を切り替えたときに正しいバンドル画像を読み込むにはどうすればよいですか?

更新:これが私が言っていることのサンプルプロジェクトへ
のリンクです、サンプルを実行すると、アプリ内から言語を変更すると、画像が変更できないことに気付くでしょう...そしてまた、ローカライズされたストーリーボードは、デザインエディタに適切な画像をロードしません...

PSは、顧客の要件であるため、このようなシナリオを使用して言語を切り替える理由についてコメントを追加しません。

4

3 に答える 3

2

私は同じ問題を抱えていました:(..そして私にとって何がうまくいったか(そのようなシナリオで言語を切り替える場合)..

あなたには2つの可能性があります..

1) ストーリーボードを変更する場合 (ホット チェンジ)、各ストーリーボードのすべてのアウトレットを変更する必要があります。ストーリーボードで目的の画像 (名前が異なる)、ラベルなどを選択します。特定の画像を「呼び出す」..特定のlprojフォルダー(languageBundle)から..しかし、AppDelegateからストーリーボードを変更すると機能しませんでした..

2)ストーリーボードは1つしか持てず、ラベル、画像などのみを変更できます...(Localizable.stringsに従って)、これをリンクする何か... https://stackoverflow.com/a/12149553/1702413 また、画像には別のファイル名を付ける必要があります(「ホットチェンジ」用)

バグなのか、それとも何なのかわかりません...

UPD

両方の小さなプロジェクトhttps://dl.dropbox.com/u/19438780/test5%20copy2.zipがあります..

ストーリーボードを変更する場合 (あなたのように)、アプリケーションを再起動するまで、languageBundle のパスは同じになります。だから..ストーリーボードで変更を正しく行う必要があります..

2 つ目は、特定の languageBundle (lproj フォルダ) からアウトレットを変更/呼び出すことができます。

1) の場合 .. 再起動するまで languageBundle を上書きする「トリック」を見つけました。

-(id) initWithCoder:(NSCoder *)aDecoder{
    self = [super initWithCoder:aDecoder];
    if (self) {
        NSArray* languages = [[NSUserDefaults standardUserDefaults]      objectForKey:@"AppleLanguages"];
        Lang2 = [languages objectAtIndex:0]; //NSString
    }
    return self;
}

アウトレットを初期化します。

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];

      NSString *path;
   if([Lang2 isEqualToString: @"ro"])
    {
        path = [[NSBundle mainBundle] pathForResource:@"ro" ofType:@"lproj"];
        NSLog(@"enc ro");
   }
    else{
        path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
        NSLog(@"enc en");
    }

    NSBundle* languageBundle = [NSBundle bundleWithPath:path];
    //find and return the desired string
    self.label.text=[languageBundle localizedStringForKey:@"kLabelText" value:@"" table:nil];
    self.img.image = [UIImage imageNamed:[languageBundle localizedStringForKey:@"myImage" value:@"" table:nil]];
}
于 2013-02-07T01:46:32.747 に答える
1

ビューがコントローラー内のオブジェクトを参照しているかのように実行できない多言語テキストを含むすべてのビューをリロードする必要があり、結果は不明であり、おそらくクラッシュします。

正しく効率的なアプローチは、選択した言語に基づいて切り替えることができる各言語の辞書を用意することです。この方法ですべての静的テキストを描画すると、言語が変更されたときに簡単に元に戻すことができます。言語の変更時に、コントローラーに通知を投稿して、ビューを再描画します。画像の場合は、同様の描画を行うか、変更できる画像への参照を作成できます。

画像に対してできることの 1 つは、言語の変更通知も監視し、適切な画像を自動的に読み込むカスタム画像ビュー クラスを用意することです。ラベルについても同じことができます。

例が必要な場合は、何かをコーディングできます。

于 2013-02-14T19:41:30.947 に答える
-1
NSBundle *bundle = [LocalizationSystem sharedBundle];  //this get your current bundle

NSString *imgPath = [bundle pathForResource:@"btn-Image" ofType:@"png" inDirectory:nil];
[self.btnTest setImage:[UIImage imageWithContentsOfFile:imgPath] forState:UIControlStateNormal];
于 2013-04-03T20:33:26.807 に答える