strings ファイルを使って文字列をローカライズする : Objective-C プログラミング
PROGRAM
strings ファイルを使って文字列をローカライズする
Xcode では、標準で "Localizable.strings" というファイルを作成することで、NSLocalizedString マクロを使って文字列をローカライズすることができるようになっています。
それと同じことを、別に作成した strings ファイルを使っても、行うことができるようになっています。
Strings ファイルを準備する
たとえば、まず、"libA.string" という名前の strings ファイルを作成します。
Xcode 4で "New File" を選択したら、"Resource" カテゴリにある "Strings File" を選択して、ファイル名を指定します。
Strings ファイルが作成されたら、まずはそれを "UTF-16" エンコードに変換します。
作成した Strings ファイルを選択して、File Inspector を確認すると、"Text Settings" カテゴリのところに "Text Encoding" という項目があります。
ローカライズで使用するためには、エンコードが "UTF-16" になっていないといけないらしいので、ここを "Unicode (UTF-16)" に変更します。
すると、ファイル形式を UTF-16 形式に変換するかを尋ねられるので、ここで [Convert] ボタンを押して、Strings ファイルを UTF-16 形式のデータに変更します。
これで Strings ファイルを UTF-16 形式に変換することができました。
Strings ファイルを作成したら、それをローカライズします。
ローカライズしたい Strings ファイルを選択したら、File Inspector で "Localization" カテゴリの [ + ] ボタンをクリックします。
そのファイルがまだローカライズされていなかった場合には、ここでいったんファイルが閉じられるので、改めて今、ローカライズしたファイルを選択し直します。
そうすると、先ほどまでは何も表示されていなかった "Localization" カテゴリの中に "English" と表示されるようになりました。
ここでもう一度 [ + ] ボタンをクリックして、"Japanese" を選択すると、日本語のローカライズファイルも出来上がります。
このようにして、必要な言語を "Localization" カテゴリに登録してあげれば、これで Strings ファイルの準備は整いました。
Strings ファイルに内容を記載する
Strings ファイルには、次の書式で文字列を記載して行きます。
"プログラム内で使用する文字列" = "ローカライズされた文字列";
このとき、Objective-C でお馴染みの @"" による文字列ではなく、単純に文字列を二重引用符で括るだけにするところに注意します。
これで、プログラム内に記載された "プログラム内で使用する文字列" は、このローカライズでは実際には "ローカライズされた文字列" として処理をおこないますよ、という意味合いになります。
行末のセミコロンも忘れないようにします。
これを必要な数だけ、行毎に定義してあげます。
また、原則的には、それぞれの言語用のファイルで、全ての "プログラム内で使用する文字列" に対するローカライズ文字列を定義することになると思います。
たとえば、次のような感じになるでしょうか。
libA.strings (English)
"サーバー名" = "Server";
"アカウント" = "Account";
"パスワード" = "Password";
"内線番号" = "Extension";
libA.strings (Japanese)
"サーバー名" = "サーバー名";
"アカウント" = "アカウント";
"パスワード" = "パスワード";
"内線番号" = "内線番号";
このように、Strings ファイルには、それぞれのローカライズ文字列を定義しておきます。
ローカライズ文字列を取得する
用意したローカライズファイルの名前が "Localizable.strings" であれば、次のようにして文字列を取得することができるようになっています。
NSString* text = NSLocalizedString(@"アカウント", nil);
ここでは、Strings ファイルのような二重引用符だけではなく、Objective-C でお馴染みの @"" による文字列を指定しなければいけないところに注意します。
ともあれ、このようにすることで、"Localizable.strings" ファイル内に定義された、現在のローカライズに合った文字列を取得できました。
それ以外の名前の Strings ファイルから文字列を取得したい場合には、NSBundle クラスを使って、次のように取得します。
NSString* test = [[NSBundle mainBundle] localizedStringForKey:@"アカウント" value:nil table:@"libA"];
このようにすることで、ファイル名 "libA.strings" の Strings ファイルから "アカウント" という名前に該当する、現在のローカライズに合った文字列を取得することができます。
このとき、最初の引数には、Strings ファイル内の各行左側に指定した文字列を指定します。
また、その次の "value:" では、最初に指定した文字列が Strings ファイル内に存在しなかった場合に使用する文字列を指定します。ここで nil を指定すると、見つからなかった場合には、最初に指定した文字列と同じものが返されます。
そして、最後の "table:" のところには、どの Strings ファイルを使用するかを指定します。
ここで注意したいのは、Strings ファイルの拡張子 ".strings" を含めない、純粋なファイル名で指定する必要があるところでしょうか。ここで ".strings" も含めてしまうと、該当するローカライズ文字列が見つけ出されてこないので注意が必要です。
[ もどる ]