ローカライズ関数を用意した理由
理由も何もないんですが、cocos2d-xで気軽にObjective-cで利用できるようなローカライズ関数が欲しいなと思い、作成しました。今回はそんなローカライズ関数です。
実際の関数
はじめに。この関数は以下の記事の関数を利用しています。
cocos2d-xで文字列を置換する【Replace】
cocos2dでトリミング関数を作る【trim】
cocos2d-xで文字列をデリミタで分解しリスト化する関数を作る【split】
次にこの関数を利用するには、[ja.lproj]や[en.lproj]などのLanguageごとのフォルダを用意し、それぞれにローカライズファイル[Localizable.strings]を用意する必要があります。
【ja.lproj/Localizable.strings】
test=テスト【en.lproj/Localizable.strings】
hogehoge=ほげほげ
test=Test
hogehoge=HogeHoge
ローカライズファイル[Localizable.strings]の[File Type]は、[Localizable Strings]から[Plain Text]に変更して進める必要があります。
これをしておかないと、コンパイル時にファイルが最適化され、getStringFromFile()によるロードがうまくいきません。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//[cocos2d-x] | |
//ローカライズ文字の取得関数 | |
//searchKey 対象キー | |
//comment コメント(覚書などに利用) | |
//Return ローカライズ文字列 | |
std::string LocalizedString(const char* searchKey, const char* comment){ | |
std::string ret = comment; | |
static map<std::string, std::string> localizable; | |
if(localizable.empty()){ | |
FileUtils* fileUtil = FileUtils::getInstance(); | |
LanguageType language = Application::getInstance()->getCurrentLanguage(); | |
if (language == LanguageType::JAPANESE) { | |
fileUtil->addSearchPath("ja.lproj"); | |
if (language == LanguageType::★★★★) { //ローカライズしたいLanguageTypeを指定 | |
fileUtil->addSearchPath("★★★★"); //LanguageTypeごとのフォルダを指定 | |
} else { | |
fileUtil->addSearchPath("en.lproj"); | |
} | |
//ファイル名を読み込み | |
std::string fullpath = fileUtil->fullPathForFilename("Localizable.strings"); | |
std::string strings = fileUtil->getStringFromFile(fullpath); | |
if (strings == "") return ret; | |
//行ごとに処理 | |
list<std::string> stringLines = split(strings, "\n"); | |
for(list<std::string>::iterator begin = stringLines.begin(), end = stringLines.end(); begin != end; ++begin){ | |
list<std::string> stringKeyValue = split(*begin, "="); | |
if(stringKeyValue.size() >= 2){ | |
list<std::string>::iterator keyv = stringKeyValue.begin(); | |
localizable.insert(pair<std::string, std::string>(*keyv, *(++keyv))); | |
} | |
} | |
} | |
map<std::string, std::string>::iterator iterator = localizable.find(searchKey); | |
if(iterator != localizable.end()){ | |
ret = iterator->second.c_str(); | |
} | |
//改行に対応(//nで改行として認識できる) | |
std::string result = stringReplace(ret, "\\n", "\n"); | |
return result; | |
} |
使い方
こんな感じで使います。
このプログラムが皆様のお役に立てば幸いです。std::string result = LocalizedString("hogehoge", "ほげほげの取得");
//result は日本語環境では "ほげほげ" となります
//result は英語環境では "Hogehoge" となります
簡単な説明
static map<std::string, std::string> localizable;ローカライズ文字列のマップデータは、静的変数にセットすることで、無駄なファイル解析を避けます。
if(localizable.empty()){ローカライズ文字列のマップデータがない場合に、1度だけローカライズファイルを解析します。
FileUtils* fileUtil = FileUtils::getInstance();ローカライズファイルのあるディレクトリを検索対象パスに追加します。
LanguageType language = Application::getInstance()->getCurrentLanguage();
if (language == LanguageType::JAPANESE) {
fileUtil->addSearchPath("ja.lproj");
if (language == LanguageType::★★★★) { //ローカライズしたいLanguageTypeを指定
fileUtil->addSearchPath("★★★★"); //LanguageTypeごとのフォルダを指定
} else {
fileUtil->addSearchPath("en.lproj");
}
std::string fullpath = fileUtil->fullPathForFilename("Localizable.strings");ローカライズファイル(Localizable.strings)を読み込みます。
std::string strings = fileUtil->getStringFromFile(fullpath);
if (strings == "") return ret;
list<std::string> stringLines = split(strings, "\n");行ごとに分解して、以降の処理を実施します。
for(list<std::string>::iterator begin = stringLines.begin(), end = stringLines.end(); begin != end; ++begin){1行ごととり出し、"="でkeyとvalueに切り出し、ローカライズ文字列のマップデータに設定します。
list<std::string> stringKeyValue = split(*begin, "=");
if(stringKeyValue.size() >= 2){
list<std::string>::iterator keyv = stringKeyValue.begin();
localizable.insert(pair<std::string, std::string>(*keyv, *(++keyv)));
}
}
map<std::string, std::string>::iterator iterator = localizable.find(searchKey);ローカライズ文字列のマップデータから、対象のデータを取り出し返却します。
if(iterator != localizable.end()){
ret = iterator->second.c_str();
}
std::string result = stringReplace(ret, "\\n", "\n");最後に対象データの改行をケアしています。
ではまた。