【cocos2dx】アプリをローカライズさせて海外にも売り込もう!

前作の「BOOK QUEST- action RPG -iPhone/iPod touch」を出した際に、ローカライズしていないにもかかわらず「海外の方から英語版はないのか」と問い合わせを数件いただいていたので、今作成しているアプリではローカライズさせようと考えていました。 今回は、cocos2dxでローカライズをさせる方法を紹介したいと思います。

ローカライズの基本

日本語の部分を英語などの別の言語に置き換えることを「ローカライズ」といいます。 作業の手間を考えると、ゲームをデザインする段階で、日本語を極力減らせば、このローカライズをする手間も省けます。 これは、どのようなゲームになるかで変わってきます。

例えばRPGなどは、会話の部分が多くなるので、ローカライズをする手間がかかります。

Cocos2dxでローカライズをする

まずは、ローカライズの際に取り出す言葉を書いておくファイルを作成します。 ファイル名は「Localizable.strings」にします。

2013-9-25-fdsds

[File Type]を[Plain Text]にします。

Localizable.strings2013-9-25

[Localization]にあるボタンを押して、ローカライズさせる言語を選択します。

2013-9-25-fdsds

言語を選択したら、Japaneseを含めてチェックをいれると完成です。

2013-9-25-ffsds

ここに、日本語と英語で表示をする言語を書いていきます。

実際に利用する

今回のコードがこちらから参考にしています。 詳しくは本を買って見て下さい。

Cocos2d‐x開発のレシピ―iOS/Android対応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", &amp;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]

最後に

このローカライズを使えば、文字だけではなく画像ファイル名を指定して、画像も各言語ごとに変えることができます。 ただ、文字だけではなく、画像を変えるとなると容量が大きくなってしまう恐れがあるので、よく考えてゲームデザインをする必要がありますね。