こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

iPhoneのアプリケーションのローカライズについて

iPhoneのアプリケーションのローカライズについて

iPhoneのアプリケーション開発の勉強をしています。

開発環境はXcode 3.2.4で、シュミレータ4.1で動作確認を行っています。

ローカライズに対応しようと以下のサイトを参考にしてみました。
http://akisute.com/2008/12/iphone_21.html

Localizable.strings ファイルを追加し、NSLocalizedStringメソッドで値を取得するまではできました。
例)
"hoge" = "hoge";
NSString* string = NSLocalizedString(@"hoge", nil);
→string に "hoge" が格納される。


ところが、ファイルの設定で「ファイルをローカライズ可能にする」を選択して「English」が追加された後、
ローカライズの値を変更しても反映されません。
例)
 "hoge" = "hoge hoge";
NSString* string = NSLocalizedString(@"hoge", nil);
→string に "hoge" が格納される。
※"hoge hoge"にならない。

XCode で クリーニングを行ったり、build フォルダを削除しましたが状況は変わりません。
Finder でパッケージの中を確認しましたが、Localizable.stringsは English.lproj にのみ存在し、
内容も編集後の状態になっているようです。
※そもそも"hoge" のリソースがない状態になっているのに、何故情報が残っているのか不明です。

原因がわからず途方に暮れている状態です。
皆様のお知恵を拝借できればと思いますので、何卒よろしくお願いいたします。

投稿日時 - 2010-09-22 21:21:44

QNo.6200766

困ってます

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

> すべての構成のベースSDKを「iOS デバイス 4.1」から「iOS デバイス 3.2」に変更して試したところ、
> ローカライズされて表示される(hoge が hoge hogehoge になった)ことが確認できました。

こちらのiPhoneシミュレータは、3.2でした。4.1に変更したところ、そちらとおなじ問題が起きることが、確認できました。
私のほうの、情報の見落としでしたね、すみません。
さて、であれば再現性のある不具合が確実なので、iPhone 4.1シミュレータのバグと断定していいでしょう。

質問文> ※そもそも"hoge" のリソースがない状態になっているのに、何故情報が残っているのか不明です。

プロジェクトにリソースがないのなら、どこにリソースが存在しているのか、かんたんな話です。iPhoneシミュレータ内に残っていると考えられます。ビルド時にiPhoneシミュレータ内のアプリが上書きされない、それもローカライズ関係の箇所だけ上書きされないようです。
~/Library/Application Support/iPhone Simulatorの中をご覧ください。具体的にイメージがわくと思います。
ADCにバグ報告して、バグ修正を待つのが本筋でしょうが、とうめんの回避策は、ビルド前に、iPhoneシミュレータからアプリを削除しておくということになるでしょう。アプリ削除の方法は、リアルiPhoneとおなじです。
あるいは、iPhone 4.0シミュレータを使用するのがいいと思います。ちゃんとは確認できてませんが、このバージョンでは不具合が起きないようです。

投稿日時 - 2010-09-23 20:02:31

ANo.2

> ローカライズのテスト専用にプロジェクトを作成していまして、
> 追加ステップは100もありませんので・・。

ローカライズのテストだけを行うのに、どうして100ステップ近い追加が必要なのでしょう?極端な話、コードを1行、新規プロジェクトに書き加えるだけで、テストは行えますし、ほかの要素を排除する目的としても、可能な限り単純化すべきです。
次のプロジェクトを作ってください。

View Based Applicationを新規作成します。プロジェクト名を仮に「LocalizeTest」とします。
「LocalizeTestViewController.m」を開きます。
初期化メソッド「- (void)viewDidLoad」が、「/*~*/」でコメント化され、無効になっているので、これを有効にします。
次の1行を、「[super viewDidLoad];」の次に書き加えます。

NSLog(NSLocalizedString(@"copy01", nil), nil);

保存します。
次に、空のファイル(Strings File)を作成し、ファイル名を「Localizable.strings」とします。サイドバーの「Resources」フォルダ内に置きます。
「"copy01" = "Hoge Hoge";」と記述し、保存します。
「実行」メニューから「コンソール」を開きます。
コンソールのツールバーから、「ビルドと実行」を実行します。
正常なら、コンソールに、実行日時とともに「Hoge Hoge」が表示されます。

おそらくこれが、最小最短のテストプロジェクトです。

質問文で提示なさったプログラムを読み直すと、ひとつ気にかかる点がありました。
Localizable.stringsに「"hoge" = "hoge";」と記述したとありますが、これでは関数NSLocalizedString()が、Localizable.stringsを読みに行けているのか、読みに行けていないのか、判別できません。私のテストプロジェクトで、「"copy01" = "Hoge Hoge";」としたのは、それを判別するのが目的です。

> 他のサイトに同様(?)の現象に悩まれている方がいまして、

リンク先を読んでみましたが、「同様」ではないですね。Localizabel.stringsのローカライズは、ちゃんとできているが、Nibファイル(.xib)のローカライズがうまくいかないという内容ではありませんか?

> 最終手段として再インストールを試してみようと思っていますが、

最終手段ではありませんよ。まだあなたの人的ミスであるという線は、まったく消えていませんし、あそらくその線で間違いないでしょう。
「おれはゼッタイ間違っていない。それなのにプログラムがうまくいかないのは、Xcode、コンパイラ、Apple……つまりおれ以外に原因があるのだ」
そういう憤りを経験することなく、プログラムを行えたプログラマは、ひとりもいないと思います。そして、だれしもが、数時間ときには数日の苦闘の末に、なんど見直したか覚えていない場所に、ミスを見つけるものなのです。
だれもが通ってきた道です。がんばってください。

投稿日時 - 2010-09-23 15:58:32

補足

>hoge が hoge hogehoge になった
「hoge が hoge hoge になった」の記述ミスです。

投稿日時 - 2010-09-23 17:47:16

お礼

回答&テストコードのご提供ありがとうございます。

試した結果ですが、コンソールに、実行日時とともに「Hoge Hoge」が表示されました。
ただ、ここまでは予想通りというか、最初の質問で記述した内容と再確認となります。

質問の状況説明が良くなく、伝わり辛かったようで恐縮です。
つきましては、説明の補足させていただきます。

(1)Localizable.stringsファイルを追加して、NSLocalizedString関数で文字列の取得ができた。
(2)Localizable.stringsファイルの情報を表示。一般タブの「ファイルをローカライズ可能にする」をクリックし、
   English.lproj フォルダが作成され、且つ、Localizable.stringsファイルがXCode上で階層化され、
   English が追加されていることが確認できた。
(3)1で設定した文字列のみ編集(hoge から hoge hoge)して実行。
   結果は hoge のままであった。
(4)build フォルダの削除やクリーニングを行ったが結果は変わらなかった。

また、最初の質問で割愛してしまいましたが、
Nibファイル(.xib)のローカライズも同様の現象を確認しています。

以上のことにより、コーディングミスというより、設定不足やインストールの失敗を考えていました。
ただ、再インストールを行いましたが、残念ながら状況は変わらずとなっています。

ちなみに現在確認できている点を追記しますと、「プロジェクトの情報>一般」タブで
すべての構成のベースSDKを「iOS デバイス 4.1」から「iOS デバイス 3.2」に変更して試したところ、
ローカライズされて表示される(hoge が hoge hogehoge になった)ことが確認できました。

ちなみに開発環境(コンパイラなど)の問題のみを疑うつもりはなく、
先に記述した通り、設定不足(おっしゃるところの人的ミス)もあると認識していますので、
その点についてはご安心(?)ください(^^;)
※仮に開発環境の問題であっても憤りは感じません。。
 本業で某.Netフレームワークやら、Oraxxx Developer など
 香ばしい環境で開発していますので、なれっこです(^^;)

それでは引き続き情報のご提供をお待ちしておりますm(_ _)m

投稿日時 - 2010-09-23 17:44:22

ANo.1

ご呈示のプログラムを、じっさいに記述して、ビルドしてみましたが、正常に「hoge hoge」という結果になりました。

おそらく誤字・脱字系の、単純なミスが原因と思われます。考えるだけでも気が滅入ることと思いますが、いまいちど書き込んだソースを、見直ししてみましょう。天才的なプログラマであろうが、だれであろうが、皆経験したことです。あなただけが遭遇しているトラブルではありませんので、がんばってください。

> Localizable.strings ファイルを追加し、NSLocalizedStringメソッドで値を取得するまではできました。

本題と関係ありませんが、NSLocalizedStringは、Objective-Cのメソッドではありません。Cの関数です。

投稿日時 - 2010-09-23 00:44:40

お礼

ご回答&テストありがとうございます。

ソースコードを再度見直しましたが、単純ミスはなさそうです。

ローカライズのテスト専用にプロジェクトを作成していまして、
追加ステップは100もありませんので・・。

更にプロジェクトを1から作り直しましたが同じ現象が起きております。

他のサイトに同様(?)の現象に悩まれている方がいまして、
その方は再インストールで解決されたようです。

http://akamatsu.org/aka/?page_id=2260

最終手段として再インストールを試してみようと思っていますが、
仮に解決したとしても消化不良の感がありますので、
引き続き情報のご提供をお待ちしておりますm(_ _)m

また、ご指摘ありがとうございます。
確かに関数をメソッドと記述するのはよろしくないですね(^^;)

それでは引き続き宜しくお願いします。

投稿日時 - 2010-09-23 02:01:08

あなたにオススメの質問