cocos2d-x CCFileUtils::addSearchPath の罠

先日のローカライズのコードで、設定言語によって"Localizable.strings"ファイルを納めたディレクトリを切り替えるための処理として

// 言語ディレクトリをしていする
CCFileUtils* fileUtils = CCFileUtils::sharedFileUtils();
ccLanguageType lang = CCApplication::sharedApplication()->getCurrentLanguage();
switch (lang) {
    case kLanguageJapanese:
        fileUtils->addSearchPath("ja.lproj");
        break;
    default:
        fileUtils->addSearchPath("en.lproj");
        break;
}
    
// ファイルパス
string fullPath = fileUtils->fullPathForFilename("Localizable.strings");


と記述した。

ここで、開発途中の動作確認として日本語設定の端末で英語用のテキストを表示させたいと思い、case kLanguageJapanese:の部分をコメントアウトしたところ、英語用のテキストに切り替わらずに日本語用のテキストが表示された。
addSearchPath("en.lproj");はきちんと通っているにも関わらず、だ。

調べてみたところ、CCFileUtils内にaddSearchPathで追加されたパスを格納する配列があるのだが、その配列の先頭要素にResourcesのルートディレクトリのパスが納められていることが分かった。
このため、addSearchPath で追加した"en.lproj"よりも先にルートディレクトリを起点にファイルが検索され、"en.lproj"よりも先に"ja.lproj"にある"Localizable.strings"がヒットしたのではないかと思われる。

この挙動は気持ち悪いので、修正する。
CCFileUtils::addSearchPathで追加するパスを配列の先頭に持ってくれば良いので
m_searchPathArray.push_back(path);

m_searchPathArray.insert(m_searchPathArray.begin(), path);
に変更した。
これで、addSearchPathで追加したパスのほうがルートディレクトリよりも先にチェックされる。

それはそれとして、このコードで言語ディレクトリをSearchPathに追加する必要性もさほど無い気がするので、

// 言語ディレクトリを検索対象にする
string file;
ccLanguageType lang = CCApplication::sharedApplication()->getCurrentLanguage();
switch (lang) {
    case kLanguageJapanese:
        file = "ja.lproj";
        break;
    default:
        file = "en.lproj";
        break;
}
file += "/Localizable.strings";

// ファイルパス
string fullPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(file.c_str());

と、直接パスを記述する方法に変更した。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です