読者です 読者をやめる 読者になる 読者になる

cocos2d-x 多言語対応

いぬでもわかる様のページでそのラベル表示するごとに言語ファイルから読み込む方法で公開されていたので、起動時に言語ファイルを読み込んでその後、保持して使うようにした

メモリ的にどうなのか、今後の課題

 

\Classes\AppDelegate.cpp

#include "LocalizedString.h"

#define GLOBAL_INSTANCE
#include "Common.h"

bool AppDelegate::applicationDidFinishLaunching() {
    Director * director = Director::getInstance();

(中略)

    LanguageType lang = Application::getInstance()->getCurrentLanguage();
    if (lang == LanguageType::JAPANESE) {
        loadLocalizedText("ja");
    }
    else {
        loadLocalizedText("en");
    }

    Scene* scene = TitleScene::createScene();
    director->runWithScene(scene);

    return true;
}

\Classes\Common.h

#ifndef __COMMON_H__
#define __COMMON_H__

#ifdef GLOBAL_INSTANCE
#define GLOBAL
#else
#define GLOBAL extern
#endif

#include "cocos2d.h"
enum class MSGID
{
    HELLOWORLD,
    HELLO,
};
GLOBAL std::map<MSGID, std::string> LocalizedText;

#endif /* __COMMON_H__ */

 \Classes\LocalizedString.h

#ifndef __LOCALIZED_STRING_H__
#define __LOCALIZED_STRING_H__

#include "cocos2d.h"

void loadLocalizedText(std::string);

#endif /* __LOCALIZED_STRING_H__ */

\Classes\LocalizedString.cpp

#include "LocalizedString.h"
#include "Common.h"

USING_NS_CC;
using namespace std;

string trim(const string& str, const char* trimCharacterList = " \t\v\r\n\"\'")
{
    string result;
    std::string::size_type left = str.find_first_not_of(trimCharacterList);
    if (left != std::string::npos)
    {
        std::string::size_type right = str.find_last_not_of(trimCharacterList);
        result = str.substr(left, right - left + 1);
    }
    return result;
}

list<string> split(string str, string delim)
{
    list<string> result;
    int cutAt;
    while ( ( cutAt = str.find_first_of ( delim ) )!= str.npos)
    {
        if (cutAt > 0)
        {
            result.push_back(trim(str.substr(0, cutAt)));
        }
        str = str.substr(cutAt + 1);
    }
    if (str.length() > 0)
    {
        result.push_back(trim(str));
    }
    return result;
}
std::string Replace(std::string String1, std::string String2, std::string String3)
{
    std::string::size_type  Pos(String1.find(String2));

    while (Pos != std::string::npos)
    {
        String1.replace(Pos, String2.length(), String3);
        Pos = String1.find(String2, Pos + String3.length());
    }

    return String1;
}

void loadLocalizedText(std::string lang) {
    LocalizedText.clear();
    FileUtils* fileUtil = FileUtils::getInstance();
    string fullpath = fileUtil->fullPathForFilename("lang/" + lang + ".ini");
    string strings = fileUtil->getStringFromFile(fullpath);
    if (strings == "") {
        return;
    }
    list<string> stringLines = split(strings, "\r\n");
    int i = 0;
    for (list<string>::iterator begin = stringLines.begin(), end = stringLines.end(); begin != end; ++begin , i++) {
        string text = Replace(*begin, "\\n", "\n");
        LocalizedText.insert(pair<MSGID, string>(static_cast<MSGID>(i), text));
    }
}

使う時は、Resources\lang\にen.iniとja.iniを設置して1行ごとに文章を書いていく

文字を改行したい場合は\nと書く

en.ini

Hello World
Welcome

ja.ini

ハローワールド
ようこそ\nヨウコソ

保存する時、文字コードUTF-8  BOM無し  改行コードCR+LFで保存すること

 

メッセージを表示したいシーンで、

#include "Common.h"

    TTFConfig pm10r24Config(フォント名, 24, GlyphCollection::DYNAMIC);
    auto visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();
    Label* label = Label::createWithTTF(pm10r24Config, LocalizedText[MSGID::HELLOWORLD]);
    label->setPosition(Vec2(origin.x + visibleSize.width / 2,
        origin.y + visibleSize.height - label->getContentSize().height));

 この用に使う、

メッセージを増減したい場合は Common.hのMSGIDを変更する

 

 

 

このページを作成するにあたり参考にしたURLはこちらの2サイトです

temptation-dog.hatenablog.com

#ifdef GLOBAL_INSTANCEについて • C言語交流フォーラム ~ mixC++ ~