From d6c6fcdb52f67dae3028b069e1b3fd51eac766e1 Mon Sep 17 00:00:00 2001 From: lltcggie Date: Sun, 27 Dec 2015 02:46:42 +0900 Subject: [PATCH] =?UTF-8?q?GUI=E3=81=A7UI=E3=81=AE=E8=A8=80=E8=AA=9E?= =?UTF-8?q?=E5=88=87=E6=9B=BF=E3=81=AB=E5=AF=BE=E5=BF=9C=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/lang/english.json | 33 +++ bin/lang/{ja.json => japanese.json} | 2 +- waifu2x-caffe-gui/Source.cpp | 261 ++++++------------ waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj | 2 + .../waifu2x-caffe-gui.vcxproj.filters | 6 + 5 files changed, 134 insertions(+), 170 deletions(-) create mode 100644 bin/lang/english.json rename bin/lang/{ja.json => japanese.json} (98%) diff --git a/bin/lang/english.json b/bin/lang/english.json new file mode 100644 index 0000000..91fdd85 --- /dev/null +++ b/bin/lang/english.json @@ -0,0 +1,33 @@ +{ +"IDC_STATIC_IO_SETTING":"Input/Output Settings", +"IDC_STATIC_INPUT_PATH":"Input Path\r\n(file or folder)", +"IDC_BUTTON_INPUT_REF":"Browse", +"IDC_STATIC_OUTPUT_PATH":"Output path", +"IDC_STATIC_TANS_EXT_LIST":"Input file extensions", +"IDC_STATIC_OUTPUT_EXT":"Output extension", +"IDC_STATIC_OUTPUT_QUALITY":"Output quality (1~100)", +"IDC_STATIC_QUALITY_PROCESS_SETTING":"Image Quality & Process Settings", +"IDC_STATIC_TRANS_MODE":"Conversion Mode", +"IDC_RADIO_MODE_NOISE_SCALE":"Denoise & Magnify", +"IDC_RADIO_MODE_SCALE":"Magnify only", +"IDC_RADIO_MODE_NOISE":"Denoise only", +"IDC_RADIO_AUTO_SCALE":"Magnify & Auto Denoise", +"IDC_STATIC_JPEG_NOISE_LEVEL":"JPEG denoise level", +"IDC_RADIONOISE_LEVEL1":"Level 1", +"IDC_RADIONOISE_LEVEL2":"Level 2", +"IDC_STATIC_SCALE_RATE":"Magnification rate", +"IDC_STATIC_MODEL":"Model", +"IDC_RADIO_MODEL_RGB":"2-D Illust (RGB Model)", +"IDC_RADIO_MODEL_PHOTO":"Photography, Anime", +"IDC_RADIO_MODEL_Y":"2-D Illust (Y Model)", +"IDC_CHECK_TTA":"Use TTA Mode", +"IDC_STATIC_PROCESS_SPEED_SETTING":"Process speed Settings", +"IDC_STATIC_PROCESSOR":"Processor", +"IDC_RADIO_MODE_GPU":"CUDA (Uses cuDNN)", +"IDC_RADIO_MODE_CPU":"CPU", +"IDC_STATIC_CROP_SIZE":"Split size", +"IDC_BUTTON_CHECK_CUDNN":"Check cuDNN", +"IDC_BUTTON_CANCEL":"Cancel", +"IDC_BUTTON_EXEC":"Start", +"IDC_STATIC_LANG_UI":"UI language" +} diff --git a/bin/lang/ja.json b/bin/lang/japanese.json similarity index 98% rename from bin/lang/ja.json rename to bin/lang/japanese.json index e4b7a2a..e8a273d 100644 --- a/bin/lang/ja.json +++ b/bin/lang/japanese.json @@ -28,6 +28,6 @@ "IDC_STATIC_CROP_SIZE":"分割サイズ", "IDC_BUTTON_CHECK_CUDNN":"cuDNNチェック", "IDC_BUTTON_CANCEL":"キャンセル", -"IDC_BUTTON_EXEC":"実行" +"IDC_BUTTON_EXEC":"実行", "IDC_STATIC_LANG_UI":"UIの言語" } diff --git a/waifu2x-caffe-gui/Source.cpp b/waifu2x-caffe-gui/Source.cpp index feeab2f..66766cf 100644 --- a/waifu2x-caffe-gui/Source.cpp +++ b/waifu2x-caffe-gui/Source.cpp @@ -20,6 +20,8 @@ #include #include #include "resource.h" +#include "tstring.h" +#include "LangStringList.h" #include "../common/waifu2x.h" #include "CDialog.h" @@ -39,23 +41,10 @@ const std::pair DefaultCommonDivisorRange = {90, 140}; const TCHAR * const CropSizeListName = TEXT("crop_size_list.txt"); const TCHAR * const SettingFileName = TEXT("setting.ini"); +const TCHAR * const LangDir = TEXT("lang"); const TCHAR * const LangListFileName = TEXT("lang/LangList.txt"); -#ifdef UNICODE -typedef std::wstring tstring; -inline tstring getTString(const boost::filesystem::path& p) -{ - return p.wstring(); -} -#else -typedef std::string tstring; -inline tstring getTString(const boost::filesystem::path& p) -{ - return p.string(); -} -#endif - // http://stackoverflow.com/questions/10167382/boostfilesystem-get-relative-path boost::filesystem::path relativePath(const boost::filesystem::path &path, const boost::filesystem::path &relative_to) { @@ -116,160 +105,6 @@ std::vector CommonDivisorList(const int N) return list; } -class LangStringList -{ -public: - struct stLangSetting - { - std::wstring LangName; - WORD LangID; - WORD SubLangID; - std::wstring FileName; - - stLangSetting() : LangID(0), SubLangID(0) - {} - }; - -private: - tstring LangBaseDir; - std::vector LangList; - stLangSetting NowLang; - LANGID NowLangID = GetUserDefaultUILanguage(); - -private: - static std::wstring Utf8ToUtf16(const char *src, int src_size = -1) - { - int ret; - - ret = MultiByteToWideChar(CP_UTF8, 0, src, src_size, NULL, 0); - if (ret == 0) - return std::wstring(); - - std::vector buf(ret); - - ret = MultiByteToWideChar(CP_UTF8, 0, src, src_size, buf.data(), ret); - if (ret == 0) - return std::wstring(); - - if (buf.back() != L'\0') - buf.push_back(L'\0'); - - return std::wstring(buf.data()); - } - - static int getNum(const std::string &str) - { - if (str.length() >= 3 && str.substr(0, 2) == "0x") - return strtol(str.c_str(), NULL, 16); - else - return strtol(str.c_str(), NULL, 10); - } - - const stLangSetting& GetLang(const LANGID id) const - { - const auto Primarylang = PRIMARYLANGID(id); - const auto Sublang = SUBLANGID(id); - - int FindPrimary = -1; - int FindSub = -1; - - for (size_t i = 0; i < LangList.size(); i++) - { - const auto &l = LangList[i]; - - if (Primarylang == l.LangID) - { - FindPrimary = (int)i; - if (Primarylang == l.SubLangID) - { - FindSub = (int)i; - break; - } - } - } - - if (FindPrimary >= 0 && FindSub >= 0) // ݂̌Ƀsb^‚‚ - return LangList[FindSub]; - else if (FindPrimary >= 0) // ݂̌ɑ̂‚ - return LangList[FindPrimary]; - - // ‚ȂԍŏɏÂɂ - if (LangList.size() > 0) - return LangList[0]; - - return stLangSetting(); - } - - void ReadLangFile(const stLangSetting &lang) - { - } - -public: - void SetLangBaseDir(const tstring &LangBaseDir) - { - this->LangBaseDir = LangBaseDir; - } - - bool ReadLangList(const tstring &LangListPath) - { - std::ifstream ifs(LangListPath); - if (ifs.fail()) - return false; - - LangList.clear(); - - std::string str; - while (getline(ifs, str)) - { - if (str.length() > 0 && str.front() == ';') - continue; - - boost::char_separator sep("\t"); - boost::tokenizer> tokens(str, sep); - - std::vector list; - for (const auto& t : tokens) - list.emplace_back(t); - - if (list.size() != 4) - continue; - - stLangSetting ls; - ls.LangName = Utf8ToUtf16(list[0].c_str(), list[0].length()); - ls.LangID = getNum(list[1]); - ls.SubLangID = getNum(list[2]); - ls.FileName = Utf8ToUtf16(list[1].c_str(), list[1].length()); - - LangList.push_back(ls); - } - - if (NowLangID != 0) - SetLang(NowLangID); - - return true; - } - - void SetLang(const LANGID id) - { - NowLang = GetLang(id); - NowLangID = id; - } - - void SetLang() - { - SetLang(GetUserDefaultUILanguage()); - } - - const stLangSetting& GetLang() const - { - return NowLang; - } - - std::wstring GetString(const wchar_t *key) const - { - } -}; - // _CAOp class DialogEvent { @@ -1109,6 +944,45 @@ public: } } + void SetWindowTextLang() + { +#define SET_WINDOW_TEXT(id) SetWindowTextW(GetDlgItem(dh, id), langStringList.GetString(L#id).c_str()); + + SET_WINDOW_TEXT(IDC_STATIC_IO_SETTING); + SET_WINDOW_TEXT(IDC_STATIC_INPUT_PATH); + SET_WINDOW_TEXT(IDC_BUTTON_INPUT_REF); + SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_PATH); + SET_WINDOW_TEXT(IDC_STATIC_TANS_EXT_LIST); + SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_EXT); + SET_WINDOW_TEXT(IDC_STATIC_OUTPUT_QUALITY); + SET_WINDOW_TEXT(IDC_STATIC_QUALITY_PROCESS_SETTING); + SET_WINDOW_TEXT(IDC_STATIC_TRANS_MODE); + SET_WINDOW_TEXT(IDC_RADIO_MODE_NOISE_SCALE); + SET_WINDOW_TEXT(IDC_RADIO_MODE_SCALE); + SET_WINDOW_TEXT(IDC_RADIO_MODE_NOISE); + SET_WINDOW_TEXT(IDC_RADIO_AUTO_SCALE); + SET_WINDOW_TEXT(IDC_STATIC_JPEG_NOISE_LEVEL); + SET_WINDOW_TEXT(IDC_RADIONOISE_LEVEL1); + SET_WINDOW_TEXT(IDC_RADIONOISE_LEVEL2); + SET_WINDOW_TEXT(IDC_STATIC_SCALE_RATE); + SET_WINDOW_TEXT(IDC_STATIC_MODEL); + SET_WINDOW_TEXT(IDC_RADIO_MODEL_RGB); + SET_WINDOW_TEXT(IDC_RADIO_MODEL_PHOTO); + SET_WINDOW_TEXT(IDC_RADIO_MODEL_Y); + SET_WINDOW_TEXT(IDC_CHECK_TTA); + SET_WINDOW_TEXT(IDC_STATIC_PROCESS_SPEED_SETTING); + SET_WINDOW_TEXT(IDC_STATIC_PROCESSOR); + SET_WINDOW_TEXT(IDC_RADIO_MODE_GPU); + SET_WINDOW_TEXT(IDC_RADIO_MODE_CPU); + SET_WINDOW_TEXT(IDC_STATIC_CROP_SIZE); + SET_WINDOW_TEXT(IDC_BUTTON_CHECK_CUDNN); + SET_WINDOW_TEXT(IDC_BUTTON_CANCEL); + SET_WINDOW_TEXT(IDC_BUTTON_EXEC); + SET_WINDOW_TEXT(IDC_STATIC_LANG_UI); + +#undef SET_WINDOW_TEXT + } + void Create(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) { dh = hWnd; @@ -1123,11 +997,39 @@ public: } { + const boost::filesystem::path LangDirPath(exeDir / LangDir); const boost::filesystem::path LangListPath(exeDir / LangListFileName); - langStringList.SetLangBaseDir(getTString(exeDir)); + langStringList.SetLangBaseDir(getTString(LangDirPath)); langStringList.ReadLangList(getTString(LangListPath)); } + SetWindowTextLang(); + + { + HWND hlang = GetDlgItem(dh, IDC_COMBO_LANG); + + const auto &list = langStringList.GetLangList(); + for (const auto &lang : list) + { + const int index = SendMessageW(hlang, CB_ADDSTRING, 0, (LPARAM)lang.LangName.c_str()); + } + + int defaultListIndex = 0; + const auto &DefaultLang = langStringList.GetLang(); + for (size_t i = 0; i < list.size(); i++) + { + const auto &lang = list[i]; + if (lang.LangName == DefaultLang.LangName && lang.LangID == DefaultLang.LangID + && lang.SubLangID == DefaultLang.SubLangID && lang.FileName == DefaultLang.FileName) + { + (int)defaultListIndex = i; + break; + } + } + + SendMessage(hlang, CB_SETCURSEL, defaultListIndex, 0); + } + const boost::filesystem::path CropSizeListPath(exeDir / CropSizeListName); std::ifstream ifs(CropSizeListPath.wstring()); if (ifs) @@ -1514,6 +1416,25 @@ public: OnSetInputFilePath(szFile); } } + + void LangChange(HWND hWnd, WPARAM wParam, LPARAM lParam, LPVOID lpData) + { + if (HIWORD(wParam) != CBN_SELCHANGE) + return; + + HWND hlang = GetDlgItem(dh, IDC_COMBO_LANG); + + const int cur = SendMessage(hlang, CB_GETCURSEL, 0, 0); + + const auto &list = langStringList.GetLangList(); + + if (list.size() <= cur) + return; + + langStringList.SetLang(list[cur]); + + SetWindowTextLang(); + } }; int WINAPI WinMain(HINSTANCE hInstance, @@ -1584,6 +1505,8 @@ int WINAPI WinMain(HINSTANCE hInstance, cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::CheckCUDNN, &cDialogEvent), NULL, IDC_BUTTON_CHECK_CUDNN); + cDialog.SetCommandCallBack(SetClassFunc(DialogEvent::LangChange, &cDialogEvent), NULL, IDC_COMBO_LANG); + // _CAÕCxgŎs֐̓o^ cDialog.SetEventCallBack(SetClassFunc(DialogEvent::Create, &cDialogEvent), NULL, WM_INITDIALOG); cDialog.SetEventCallBack(SetClassFunc(DialogEvent::OnDialogEnd, &cDialogEvent), NULL, WM_CLOSE); diff --git a/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj b/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj index 42d31c7..80addd6 100644 --- a/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj +++ b/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj @@ -109,7 +109,9 @@ + + diff --git a/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj.filters b/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj.filters index 4282ea2..e46cd64 100644 --- a/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj.filters +++ b/waifu2x-caffe-gui/waifu2x-caffe-gui.vcxproj.filters @@ -56,6 +56,12 @@ ヘッダー ファイル + + ヘッダー ファイル + + + ヘッダー ファイル +