「Parlez vous Francais?!」またはアプリケーションを多言語に対応させる方法

みなさん、こんにちは



Objective-Cの学習を開始してからあまり時間が経っていませんが、本格的なアプリケーションの開発を始めました。 そして、私の目の前には、さまざまなタスク(問題)、これまたはそれを実装する方法がありました。 ソリューションの1つ、私のタスクの1つを皆さんと共有したいと思います。



それでは始めましょう。 私の仕事は、イスラエルのある携帯電話会社の請求アプリケーションを作成することでした。このアプリケーションでは、アカウントのステータスを確認し、携帯電話回線の設定を行うことができます。








アプリケーションをナビゲートするために必要なオプションを決定するまで、プロジェクトは数回対応しました。 ECSlideViewControllerを選択しました 。 決定は非常に適切でした。 このオペレーターのWebサイトは6言語をサポートしていますが、アプリケーションを作成する場合は、エンドユーザーに可能な限り最高の実装を行い、機能によって元のWebサイトに到達するように、アプリケーションも作成する必要があると考えました。 この短い記事では、多くの言語のアプリケーションのローカライズに焦点を当てます。







さあ始めましょう




順番に始めましょう。何かを手動で行う必要があり、コードを使用して何かをする必要があります。 上で言ったように、私のアプリケーションには現在5つの言語(英語、ヘブライ語、ロシア語、フランス語、アラビア語)があります。 アプリケーションは開発中であるため、まだ翻訳していません。 始めに、どこから始めればいいのかを説明しますが、自分で続けます。



これに来る前に、私は多くの記事、例、および理論を読みました。 それは私が思っていたよりも桁違いに簡単であることが判明しました。 ソリューションに向かう途中で、コードファイルを2回消去しましたが、バックアップを行ってからすべてを正常に復元できたのは良いことです。 一度私は最初に多くのコードを書き直さなければならなかったけれども。 しかし、間違いからあなたを守るために、私はこの記事を書くことにしました。



そのため、最初にペンを行う必要があります。 Objective-Cには、厳密な言語分離システムがあります。 各言語は、独自のディレクトリにあり、独自の言語名の下にあります。 たとえば、英語はen.lprojディレクトリにあります。 プロジェクトのルートディレクトリに言語ディレクトリの作成を始めましょう。

そのような言語をいくつか作成します(初心者向けに2〜3)。その後、必要に応じて他の多数の言語を追加できます。 しかし、そのようなアプリケーションでは通常のように、1〜3の言語はそれ以上ではありません。 まれに4になります。 最近、言語はゲームアプリにのみ含まれています。 また、多くのゲームはObjective-Cで書かれていないため、これらのローカライズは間違った場所で行われることはありません。







英語、ヘブライ語、ロシア語を作成しました。 独自の言語を作成できます。 言語ディレクトリは厳密な形式であり、Objective-Cが知っているのとまったく同じ文字で示す必要があることに注意してください。 英語は「en」、ロシア語は「ru」、アラビア語は「ar」などになります。



ここで、ローカライズに適した形式を見つけることができます



次に、図に示す方法でLozalizable.stringsという1つのファイルを作成します。











その後、ルートディレクトリに上記のファイルがあります。



それを開いて、英語からロシア語に翻訳したい最初の行を書きます。正確に図に示す構文を使用してください







左側は翻訳する元のテキストで、右側はその翻訳です。 したがって、アプリケーションのソース言語は左側で変更されずに残り、それに基づいて他の言語に翻訳されます。



ファイルをru.lprojディレクトリにコピーします。 単純な理由で、貼り付けではなくコピーする理由。 同じファイルですが、翻訳が異なるため、すべての言語で使用されるため、ソースファイルをテンプレートとして使用して、ソース言語の単語のリストをコンパイルします。 3回コピーします。 そして、各インスタンスを言語で作成された各ディレクトリに配置します。 ファイル名は同じであることに注意してください。



ポール作業完了




すでに独自のプロジェクトがある場合、新しいプロジェクトは作成せず、ラインのあるクラスの1つ(NSString)に作成します。 たとえば、Labelオブジェクトを取り上げます。



  1. myLabel.text = @ "Account" ;




どうやって強制的にローカライズできますか。 このために5つのボタンがある言語バーがあります。 各ボタンは、独自の言語を設定します。 NSUserDefaultsで選択した言語のラベルを、言語の最初の文字(en、ar、ru、he)からの文字列として保存します。







ボタンをクリックすると、意図したとおりになり、言語をインストールしてNSUserDefaultsに書き込みます。



サンプルコードは次のようになります。



  1. - IBAction switchLanguages id sender {
  2. NSUserDefaults * userDefaults = [ [ NSUserDefaults alloc ] init ] ;
  3. switch [ sender tag ] {
  4. ケース 10
  5. [ userDefaults setObject @ "en" forKey @ "Language" ] ;
  6. [ userDefaults同期] ;
  7. 休憩 ;
  8. ケース 11
  9. [ userDefaults setObject @ "he" forKey @ "Language" ] ;
  10. [ userDefaults同期] ;
  11. 休憩 ;
  12. ケース 12
  13. [ userDefaults setObject @ "en" forKey @ "Language" ] ;
  14. [ userDefaults同期] ;
  15. 休憩 ;
  16. ケース 13
  17. [ userDefaults setObject @ "fr" forKey @ "Language" ] ;
  18. [ userDefaults同期] ;
  19. 休憩 ;
  20. ケース 14
  21. [ userDefaults setObject @ "ar" forKey @ "Language" ] ;
  22. [ userDefaults同期] ;
  23. 休憩 ;
  24. デフォルト
  25. [ userDefaults setObject @ "he" forKey @ "Language" ] ;
  26. [ userDefaults同期] ;
  27. 休憩 ;
  28. }
  29. }




ここでは、便宜上、各ボタンに独自のタグ(タグ)を設定します。このタグはスイッチループに渡され、ラベルに基づいて、NSUserDefaultsに必要な行を "Language"カテゴリに書き込みます。 ここで、言語を変更するか、言語が別の言語に変更されることをユーザーに警告する別のポップアップメッセージをさらに実験して追加できます。 幻想に制限はありません。



さらにコードでは、アプリケーションの起動時にNSUserDefaultsを検索し、現在インストールされているものを確認するメソッドを追加し、ラベルに基づいて、目的の言語ディレクトリから必要なLocalizable.stringsファイルを読み込みます。



実際、メソッド自体は次のようになります。



  1. - NSString * languageSelectedStringForKey NSString * キー{
  2. NSString * language = [ [ NSUserDefaults standardUserDefaults ] stringForKey @ "Language" ] ;
  3. NSString *パス;
  4. if [ language isEqual @ "en" ] {
  5. path = [ [ NSBundle mainBundle ] pathForResource @ "en" ofType @ "lproj" ] ;
  6. }
  7. else if [ language isEqual @ "he" ] {
  8. path = [ [ NSBundle mainBundle ] pathForResource @ "he" ofType @ "lproj" ] ;
  9. }
  10. else if [ language isEqual @ "ru" ] {
  11. path = [ [ NSBundle mainBundle ] pathForResource @ "ru" ofType @ "lproj" ] ;
  12. }
  13. else if [ language isEqual @ "fr" ] {
  14. path = [ [ NSBundle mainBundle ] pathForResource @ "fr" ofType @ "lproj" ] ;
  15. }
  16. else if [ language isEqual @ "ar" ] {
  17. path = [ [ NSBundle mainBundle ] pathForResource @ "ar" ofType @ "lproj" ] ;
  18. }
  19. その他 {
  20. path = [ [ NSBundle mainBundle ] pathForResource @ "he" ofType @ "lproj" ] ;
  21. }
  22. NSBundle * languageBundle = [ NSBundle bundleWithPath path ] ;
  23. NSString * str = [ languageBundlelocalizedStringForKey key value @ "" table nil ] ;
  24. return str;
  25. }




メソッド名languageSelectedStringForKey 、必要に応じて変更できます。 最も重要なことは、このメソッドが実行することの本質を反映することです。



これで、目的のローカライズを設定するボタンができました。 NSUserDefaultsの現在の設定をチェックし、必要な言語をロードするメソッドがあります。 言語を変更するには、アプリケーションを閉じて再度開く必要があります。最小化しないでください。つまり、完全に閉じてください。 記事の編集中に、自分でその方法を見つけました。 あなたの場合、異なる場合があります。 switchLanguagesメソッドで、NSUserDefaultsに追加した後、メソッドを呼び出す必要があります
[ self viewDidLoad ] ;
。 ここでは、誰もが個人を持つことができますが、アプリケーションで追加のアクションを実行する必要があるのはそこです。 それは私のために働いた。



さて、 辛抱強いmyLabelに戻りましょう



行を次の行に置き換えます。



  1. myLabel.text = [ self languageSelectedStringForKey @ "Account" ] ;




実行して、 myLabelのテキストがボタンをクリックしたときに指定したテキストにどのように変化するかを確認してください。



しかし、たとえば、電話にインストールされている言語に従ってアプリケーションをローカライズする場合、ユーザーがインターフェース構成をロシア語に変更した場合、ここにそのような標準的な行を書くことができます



  1. myLabel.text = NSLocalizedString @ "Account"nil ;




その後、言語はどこでも電話で指定した言語に変更され、すべての行がこの形式になります。 この場合、ユーザーが自分の電話のインターフェイスを別のインターフェイスに変更するまで、アプリケーションは静的にローカライズされます。

このアプローチでは、ほとんど何も処方する必要はありません。 メソッドとコードはありませんが、上記で説明した必要なファイルを使用して、カスタムlanguageSelectedStringForKeyメソッドの代わりにこれらの言語ディレクトリを作成するには、このNSLocalizedStringのみを使用します。 好みのアプローチを選択できます。



ローカリゼーションは1行だけではないことも知っておくことが重要です。 ローカライズは日付と時刻であり、写真と音声ファイルもローカライズすることができます。 アプリケーションのローカリゼーションの詳細については、昨年のWWDC2012セッション#224のビデオを見ることができます。 彼らはすべてを詳細に説明します。



この記事に興味がある人は、ローカリゼーションデータベースを見つけるでしょう。 これにより、適切なソリューションを見つけるのに数時間、場合によっては数日節約できます。 1つの言語に限定しないでください。アプリケーションが別の国でサポートされる可能性があります。 また、同じアイデアを実装するための独自の方法がある場合は、チュートリアルmlmを作成して、ソリューションに関するコメントを残すことができます。 他の人は必ず読んでください。 そして、はい、 http://habrahabr.ru/post/178747/はすべての被害者に捧げられています



それは非常に簡単な方法であることが判明しました。 忍耐と仕事、すべてが粉砕されます。



ハッピーコーディング!



All Articles