前作の「BOOK QUEST- action RPG -iPhone/iPod touch」を出した際に、ローカライズしていないにもかかわらず「海外の方から英語版はないのか」と問い合わせを数件いただいていたので、今作成しているアプリではローカライズさせようと考えていました。 今回は、cocos2dxでローカライズをさせる方法を紹介したいと思います。
ローカライズの基本
日本語の部分を英語などの別の言語に置き換えることを「ローカライズ」といいます。 作業の手間を考えると、ゲームをデザインする段階で、日本語を極力減らせば、このローカライズをする手間も省けます。 これは、どのようなゲームになるかで変わってきます。
例えばRPGなどは、会話の部分が多くなるので、ローカライズをする手間がかかります。
Cocos2dxでローカライズをする
まずは、ローカライズの際に取り出す言葉を書いておくファイルを作成します。 ファイル名は「Localizable.strings」にします。
[File Type]を[Plain Text]にします。
[Localization]にあるボタンを押して、ローカライズさせる言語を選択します。
言語を選択したら、Japaneseを含めてチェックをいれると完成です。
ここに、日本語と英語で表示をする言語を書いていきます。
実際に利用する
今回のコードがこちらから参考にしています。 詳しくは本を買って見て下さい。
Cocos2d‐x開発のレシピ―iOS/Android対応 松浦 晃洋,齊藤 建二,古木 映治 秀和システム 売り上げランキング : 96672 Amazonで詳しく見る |
[c]
const char LocalizeController::LocalizedString(const char searchKey, const char comment) { using namespace std; const char ret = comment;
static map<string, string> localizable;
if(localizable.empty()){
// 言語ディレクトリを検索対象にする
CCFileUtils* fileUtils = CCFileUtils::sharedFileUtils();
ccLanguageType lang = CCApplication::sharedApplication()->getCurrentLanguage();
if (lang == kLanguageEnglish)
{
fileUtils->addSearchPath("en.lproj");
}
else if (lang == kLanguageJapanese)
{
fileUtils->addSearchPath("ja.lproj");
}
// 言語ファイルを開く
unsigned long size;
string fullpath = fileUtils->fullPathForFilename("Localizable.strings");
unsigned char* data = fileUtils->getFileData(fullpath.c_str(), "rb", &size);
if (data == NULL)
{
return ret;
}
// Localizable.string のパース
istringstream is((char*)data);
delete [] data;
string line;
while (std::getline(is, line))
{
string::size_type sep = line.find('=');
if (sep != string::npos)
{
string key = line.substr(0,sep-1);
string val = line.substr(sep+1);
// スペース、セミコロンなどをトリミングする
key.erase(0, key.find_first_not_of(" \""));
key.erase(key.find_last_not_of(" \"")+1);
val.erase(0, val.find_first_not_of(" \""));
val.erase(val.find_last_not_of(" \";")+1);
localizable.insert(pair<string, string>(key,val));
}
}
}
// キー値の検索
map<string,string>::iterator ite = localizable.find(searchKey);
if (ite != localizable.end())
{
ret = CCString::create((ite->second).c_str())->getCString();
}
return ret;
}
[/c]
実際に利用する際には以下のコードを呼び出します。 私は、上記コードを[LocalizeController]クラスに設置して、クラスメソッドとして呼び出しています。
[c]
//引数1は、ローカライズされた言語を呼び出すキーワード。
//引数2は、キーワードに対しての何も設定されていない場合に呼び出す文字。
const char*textHellow = LocalizeController::LocalizedString("hello_label", "Hello World");
[/c]
あらかじめ先ほど作成した「Localizable.strings」にキーワードに対しても文字を、JapaneseとEnglishに設定をしておきます。
[c]
//Localizable.strings(Japanese)
/日本語テスト/
"hello_label" = "こんにちは これは日本語バージョンです";
//Localizable.strings(English) /English test /
"hello_label" = "Hello World. this is English version!!";
[/c]
最後に
このローカライズを使えば、文字だけではなく画像ファイル名を指定して、画像も各言語ごとに変えることができます。 ただ、文字だけではなく、画像を変えるとなると容量が大きくなってしまう恐れがあるので、よく考えてゲームデザインをする必要がありますね。