Commit fe70771e authored by nanahira's avatar nanahira

multi_language

parent c13ed7b6
...@@ -1880,6 +1880,16 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) { ...@@ -1880,6 +1880,16 @@ bool ClientField::OnCommonEvent(const irr::SEvent& event) {
} }
break; break;
} }
case irr::gui::EGET_COMBO_BOX_CHANGED: {
switch(id) {
case COMBOBOX_LOCALE: {
myswprintf(mainGame->gameConf.locale, L"%ls", mainGame->cbLocale->getItem(mainGame->cbLocale->getSelected()));
mainGame->SaveConfig();
break;
}
}
break;
}
case irr::gui::EGET_EDITBOX_ENTER: { case irr::gui::EGET_EDITBOX_ENTER: {
switch(id) { switch(id) {
case EDITBOX_CHAT: { case EDITBOX_CHAT: {
......
...@@ -57,10 +57,12 @@ bool Game::Initialize() { ...@@ -57,10 +57,12 @@ bool Game::Initialize() {
return false; return false;
} }
LoadExpansionDB(); LoadExpansionDB();
if(dataManager.LoadDB(GetLocaleDir("cards.cdb"))) {} else
if(!dataManager.LoadDB("cards.cdb")) { if(!dataManager.LoadDB("cards.cdb")) {
ErrorLog("Failed to load card database (cards.cdb)!"); ErrorLog("Failed to load card database (cards.cdb)!");
return false; return false;
} }
if(dataManager.LoadStrings(GetLocaleDir("strings.conf"))) {} else
if(!dataManager.LoadStrings("strings.conf")) { if(!dataManager.LoadStrings("strings.conf")) {
ErrorLog("Failed to load strings!"); ErrorLog("Failed to load strings!");
return false; return false;
...@@ -320,6 +322,9 @@ bool Game::Initialize() { ...@@ -320,6 +322,9 @@ bool Game::Initialize() {
posY += 30; posY += 30;
chkMusicMode = env->addCheckBox(false, rect<s32>(posX, posY, posX + 260, posY + 25), tabSystem, -1, dataManager.GetSysString(1281)); chkMusicMode = env->addCheckBox(false, rect<s32>(posX, posY, posX + 260, posY + 25), tabSystem, -1, dataManager.GetSysString(1281));
chkMusicMode->setChecked(gameConf.music_mode != 0); chkMusicMode->setChecked(gameConf.music_mode != 0);
env->addStaticText(dataManager.GetSysString(1288), rect<s32>(posX + 23, posY + 3, posX + 160, posY + 28), false, false, tabSystem);
cbLocale = env->addComboBox(rect<s32>(posX + 150, posY + 4, posX + 250, posY + 21), tabSystem, COMBOBOX_LOCALE);
RefreshLocales();
// //
wHand = env->addWindow(rect<s32>(500, 450, 825, 605), false, L""); wHand = env->addWindow(rect<s32>(500, 450, 825, 605), false, L"");
wHand->getCloseButton()->setVisible(false); wHand->getCloseButton()->setVisible(false);
...@@ -906,11 +911,27 @@ void Game::RefreshSingleplay() { ...@@ -906,11 +911,27 @@ void Game::RefreshSingleplay() {
lstSinglePlayList->addItem(name); lstSinglePlayList->addItem(name);
}); });
} }
void Game::RefreshLocales() {
cbLocale->clear();
cbLocale->addItem(L"default");
FileSystem::TraversalDir(L"./locales", [this](const wchar_t* name, bool isdir) {
if(isdir && wcscmp(name, L".") && wcscmp(name, L".."))
cbLocale->addItem(name);
});
for(size_t i = 0; i < cbLocale->getItemCount(); ++i) {
if(!wcscmp(cbLocale->getItem(i), gameConf.locale)) {
cbLocale->setSelected(i);
break;
}
}
}
void Game::RefreshBot() { void Game::RefreshBot() {
if(!gameConf.enable_bot_mode) if(!gameConf.enable_bot_mode)
return; return;
botInfo.clear(); botInfo.clear();
FILE* fp = fopen("bot.conf", "r"); FILE* fp = fopen(GetLocaleDir("bot.conf"), "r");
if(!fp)
fp = fopen("bot.conf", "r");
char linebuf[256]; char linebuf[256];
char strbuf[256]; char strbuf[256];
if(fp) { if(fp) {
...@@ -1084,10 +1105,40 @@ void Game::LoadConfig() { ...@@ -1084,10 +1105,40 @@ void Game::LoadConfig() {
} else if (!strcmp(strbuf, "lastdeck")) { } else if (!strcmp(strbuf, "lastdeck")) {
BufferIO::DecodeUTF8(valbuf, wstr); BufferIO::DecodeUTF8(valbuf, wstr);
BufferIO::CopyWStr(wstr, gameConf.lastdeck, 64); BufferIO::CopyWStr(wstr, gameConf.lastdeck, 64);
} else if (!strcmp(strbuf, "locale")) {
BufferIO::DecodeUTF8(valbuf, wstr);
BufferIO::CopyWStr(wstr, gameConf.locale, 64);
} }
} }
} }
fclose(fp); fclose(fp);
#ifdef _WIN32
if(!gameConf.locale) {
unsigned int lcid = ((unsigned int)GetSystemDefaultLangID()) & 0xff;
switch(lcid) {
case 0x04: {
myswprintf(mainGame->gameConf.locale, L"%ls", L"zh-CN");
break;
}
case 0x09: {
myswprintf(mainGame->gameConf.locale, L"%ls", L"en-US");
break;
}
case 0x0a: {
myswprintf(mainGame->gameConf.locale, L"%ls", L"es-ES");
break;
}
case 0x11: {
myswprintf(mainGame->gameConf.locale, L"%ls", L"ja-JP");
break;
}
case 0x12: {
myswprintf(mainGame->gameConf.locale, L"%ls", L"ko-KR");
break;
}
}
}
#endif
} }
void Game::SaveConfig() { void Game::SaveConfig() {
FILE* fp = fopen("system.conf", "w"); FILE* fp = fopen("system.conf", "w");
...@@ -1136,6 +1187,8 @@ void Game::SaveConfig() { ...@@ -1136,6 +1187,8 @@ void Game::SaveConfig() {
fprintf(fp, "enable_bot_mode = %d\n", gameConf.enable_bot_mode); fprintf(fp, "enable_bot_mode = %d\n", gameConf.enable_bot_mode);
fprintf(fp, "quick_animation = %d\n", gameConf.quick_animation); fprintf(fp, "quick_animation = %d\n", gameConf.quick_animation);
fprintf(fp, "auto_save_replay = %d\n", (chkAutoSaveReplay->isChecked() ? 1 : 0)); fprintf(fp, "auto_save_replay = %d\n", (chkAutoSaveReplay->isChecked() ? 1 : 0));
BufferIO::EncodeUTF8(gameConf.locale, linebuf);
fprintf(fp, "locale = %s\n", linebuf);
#ifdef YGOPRO_USE_IRRKLANG #ifdef YGOPRO_USE_IRRKLANG
fprintf(fp, "enable_sound = %d\n", (chkEnableSound->isChecked() ? 1 : 0)); fprintf(fp, "enable_sound = %d\n", (chkEnableSound->isChecked() ? 1 : 0));
fprintf(fp, "enable_music = %d\n", (chkEnableMusic->isChecked() ? 1 : 0)); fprintf(fp, "enable_music = %d\n", (chkEnableMusic->isChecked() ? 1 : 0));
...@@ -1390,6 +1443,16 @@ void Game::FlashWindow() { ...@@ -1390,6 +1443,16 @@ void Game::FlashWindow() {
FlashWindowEx(&fi); FlashWindowEx(&fi);
#endif #endif
} }
const char* Game::GetLocaleDir(const char* dir) {
if(!gameConf.locale || !wcscmp(gameConf.locale, L"default"))
return dir;
wchar_t locale_buf[256];
wchar_t orig_dir[64];
BufferIO::DecodeUTF8(dir, orig_dir);
myswprintf(locale_buf, L"locales/%ls/%ls", gameConf.locale, orig_dir);
BufferIO::EncodeUTF8(locale_buf, locale_buf_utf8);
return locale_buf_utf8;
}
void Game::SetCursor(ECURSOR_ICON icon) { void Game::SetCursor(ECURSOR_ICON icon) {
ICursorControl* cursor = mainGame->device->getCursorControl(); ICursorControl* cursor = mainGame->device->getCursorControl();
if(cursor->getActiveIcon() != icon) { if(cursor->getActiveIcon() != icon) {
......
...@@ -25,6 +25,7 @@ struct Config { ...@@ -25,6 +25,7 @@ struct Config {
wchar_t textfont[256]; wchar_t textfont[256];
wchar_t numfont[256]; wchar_t numfont[256];
wchar_t roompass[20]; wchar_t roompass[20];
wchar_t locale[64];
//settings //settings
int chkMAutoPos; int chkMAutoPos;
int chkSTAutoPos; int chkSTAutoPos;
...@@ -112,6 +113,7 @@ public: ...@@ -112,6 +113,7 @@ public:
void RefreshReplay(); void RefreshReplay();
void RefreshSingleplay(); void RefreshSingleplay();
void RefreshBot(); void RefreshBot();
void RefreshLocales();
void DrawSelectionLine(irr::video::S3DVertex* vec, bool strip, int width, float* cv); void DrawSelectionLine(irr::video::S3DVertex* vec, bool strip, int width, float* cv);
void DrawSelectionLine(irr::gui::IGUIElement* element, int width, irr::video::SColor color); void DrawSelectionLine(irr::gui::IGUIElement* element, int width, irr::video::SColor color);
void DrawBackGround(); void DrawBackGround();
...@@ -143,6 +145,7 @@ public: ...@@ -143,6 +145,7 @@ public:
int LocalPlayer(int player); int LocalPlayer(int player);
const wchar_t* LocalName(int local_player); const wchar_t* LocalName(int local_player);
const char* GetLocaleDir(const char* dir);
bool HasFocus(EGUI_ELEMENT_TYPE type) const { bool HasFocus(EGUI_ELEMENT_TYPE type) const {
irr::gui::IGUIElement* focus = env->getFocus(); irr::gui::IGUIElement* focus = env->getFocus();
...@@ -200,6 +203,8 @@ public: ...@@ -200,6 +203,8 @@ public:
bool is_building; bool is_building;
bool is_siding; bool is_siding;
char locale_buf_utf8[256];
ClientField dField; ClientField dField;
DeckBuilder deckBuilder; DeckBuilder deckBuilder;
MenuHandler menuHandler; MenuHandler menuHandler;
...@@ -255,6 +260,7 @@ public: ...@@ -255,6 +260,7 @@ public:
irr::gui::IGUIScrollBar* scrSoundVolume; irr::gui::IGUIScrollBar* scrSoundVolume;
irr::gui::IGUIScrollBar* scrMusicVolume; irr::gui::IGUIScrollBar* scrMusicVolume;
irr::gui::IGUICheckBox* chkMusicMode; irr::gui::IGUICheckBox* chkMusicMode;
irr::gui::IGUIComboBox* cbLocale;
//main menu //main menu
irr::gui::IGUIWindow* wMainMenu; irr::gui::IGUIWindow* wMainMenu;
irr::gui::IGUIButton* btnLanMode; irr::gui::IGUIButton* btnLanMode;
...@@ -636,6 +642,7 @@ extern Game* mainGame; ...@@ -636,6 +642,7 @@ extern Game* mainGame;
#define COMBOBOX_SORTTYPE 370 #define COMBOBOX_SORTTYPE 370
#define COMBOBOX_LIMIT 371 #define COMBOBOX_LIMIT 371
#define COMBOBOX_LOCALE 372
#define BUTTON_MARKS_FILTER 380 #define BUTTON_MARKS_FILTER 380
#define BUTTON_MARKERS_OK 381 #define BUTTON_MARKERS_OK 381
......
...@@ -166,6 +166,10 @@ irr::video::ITexture* ImageManager::GetTexture(int code) { ...@@ -166,6 +166,10 @@ irr::video::ITexture* ImageManager::GetTexture(int code) {
char file[256]; char file[256];
sprintf(file, "expansions/pics/%d.jpg", code); sprintf(file, "expansions/pics/%d.jpg", code);
irr::video::ITexture* img = GetTextureFromFile(file, CARD_IMG_WIDTH, CARD_IMG_HEIGHT); irr::video::ITexture* img = GetTextureFromFile(file, CARD_IMG_WIDTH, CARD_IMG_HEIGHT);
if(img == NULL) {
sprintf(file, mainGame->GetLocaleDir("pics/%d.jpg"), code);
img = GetTextureFromFile(file, CARD_IMG_WIDTH, CARD_IMG_HEIGHT);
}
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/%d.jpg", code); sprintf(file, "pics/%d.jpg", code);
img = GetTextureFromFile(file, CARD_IMG_WIDTH, CARD_IMG_HEIGHT); img = GetTextureFromFile(file, CARD_IMG_WIDTH, CARD_IMG_HEIGHT);
...@@ -194,6 +198,10 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) { ...@@ -194,6 +198,10 @@ irr::video::ITexture* ImageManager::GetTextureThumb(int code) {
sprintf(file, "pics/thumbnail/%d.jpg", code); sprintf(file, "pics/thumbnail/%d.jpg", code);
img = GetTextureFromFile(file, CARD_THUMB_WIDTH, CARD_THUMB_HEIGHT); img = GetTextureFromFile(file, CARD_THUMB_WIDTH, CARD_THUMB_HEIGHT);
} }
if(img == NULL) {
sprintf(file, mainGame->GetLocaleDir("pics/thumbnail/%d.jpg"), code);
img = GetTextureFromFile(file, CARD_THUMB_WIDTH, CARD_THUMB_HEIGHT);
}
if(img == NULL && mainGame->gameConf.use_image_scale) { if(img == NULL && mainGame->gameConf.use_image_scale) {
sprintf(file, "expansions/pics/%d.jpg", code); sprintf(file, "expansions/pics/%d.jpg", code);
img = GetTextureFromFile(file, CARD_THUMB_WIDTH, CARD_THUMB_HEIGHT); img = GetTextureFromFile(file, CARD_THUMB_WIDTH, CARD_THUMB_HEIGHT);
...@@ -222,6 +230,14 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) { ...@@ -222,6 +230,14 @@ irr::video::ITexture* ImageManager::GetTextureField(int code) {
sprintf(file, "expansions/pics/field/%d.jpg", code); sprintf(file, "expansions/pics/field/%d.jpg", code);
img = GetTextureFromFile(file, 512, 512); img = GetTextureFromFile(file, 512, 512);
} }
if(img == NULL) {
sprintf(file, mainGame->GetLocaleDir("pics/field/%d.png"), code);
img = GetTextureFromFile(file, 512, 512);
}
if(img == NULL) {
sprintf(file, mainGame->GetLocaleDir("pics/field/%d.jpg"), code);
img = GetTextureFromFile(file, 512, 512);
}
if(img == NULL) { if(img == NULL) {
sprintf(file, "pics/field/%d.png", code); sprintf(file, "pics/field/%d.png", code);
img = GetTextureFromFile(file, 512, 512); img = GetTextureFromFile(file, 512, 512);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment