diff --git a/include/nana/internationalization.hpp b/include/nana/internationalization.hpp index 1b434169..4b3e3918 100644 --- a/include/nana/internationalization.hpp +++ b/include/nana/internationalization.hpp @@ -24,6 +24,9 @@ namespace nana { friend class i18n_eval; public: + /// Sets a handler to handle a msgid which hasn't been translated. + static void set_missing(std::function handler); + void load(const std::string& file); void load_utf8(const std::string& file); diff --git a/source/gui/filebox.cpp b/source/gui/filebox.cpp index 07752e41..ec6c08a5 100644 --- a/source/gui/filebox.cpp +++ b/source/gui/filebox.cpp @@ -50,7 +50,7 @@ namespace nana { std::wstring type; ires>>m.name>>type>>type; - m.directory = (type == L"Directory"); + m.directory = (to_utf8(type) == internationalization()("NANA_FILEBOX_DIRECTORY")); return ires; } @@ -65,6 +65,8 @@ namespace nana _m_add(tm, item.modified_time.tm_min)<<':'; _m_add(tm, item.modified_time.tm_sec); + internationalization i18n; + ores<&) @@ -157,7 +161,7 @@ namespace nana filter_.create(*this); filter_.multi_lines(false); - filter_.tip_string("Filter"); + filter_.tip_string(i18n("NANA_FILEBOX_FILTER")); filter_.events().key_release.connect_unignorable([this](const arg_keyboard&) { @@ -165,23 +169,23 @@ namespace nana }); btn_folder_.create(*this); - btn_folder_.caption("&New Folder"); + btn_folder_.i18n(i18n_eval("NANA_FILEBOX_NEW_FOLDER_SHORTKEY")); btn_folder_.events().click.connect_unignorable([this](const arg_click&) { form fm(this->handle(), API::make_center(*this, 300, 35)); - fm.caption("Name the new folder"); + fm.i18n(i18n_eval("NANA_FILEBOX_NEW_FOLDER_CAPTION")); textbox folder(fm, nana::rectangle(5, 5, 160, 25)); folder.multi_lines(false); button btn(fm, nana::rectangle(170, 5, 60, 25)); - btn.caption("Create"); + btn.i18n(i18n_eval("NANA_BUTTON_CREATE")); btn.events().click.connect_unignorable(folder_creator(*this, fm, folder)); button btn_cancel(fm, nana::rectangle(235, 5, 60, 25)); - btn_cancel.caption("Cancel"); + btn_cancel.i18n(i18n_eval("NANA_BUTTON_CANCEL")); btn_cancel.events().click.connect_unignorable([&fm](const arg_click&) { @@ -193,10 +197,10 @@ namespace nana tree_.create(*this); ls_file_.create(*this); - ls_file_.append_header("Name", 190); - ls_file_.append_header("Modified", 145); - ls_file_.append_header("Type", 80); - ls_file_.append_header("Size", 70); + ls_file_.append_header(i18n("NANA_FILEBOX_HEADER_NAME"), 190); + ls_file_.append_header(i18n("NANA_FILEBOX_HEADER_MODIFIED"), 145); + ls_file_.append_header(i18n("NANA_FILEBOX_HEADER_TYPE"), 80); + ls_file_.append_header(i18n("NANA_FILEBOX_HEADER_SIZE"), 70); auto fn_sel_file = [this](const arg_mouse& arg){ _m_sel_file(arg); @@ -274,7 +278,7 @@ namespace nana }); lb_file_.create(*this); - lb_file_.caption("File:"); + lb_file_.i18n(i18n_eval("NANA_FILEBOX_FILE_COLON")); tb_file_.create(*this); tb_file_.multi_lines(false); @@ -290,14 +294,15 @@ namespace nana cb_types_.events().selected.connect_unignorable([this](const arg_combox&){ _m_list_fs(); }); btn_ok_.create(*this); - btn_ok_.caption("&OK"); + btn_ok_.i18n(i18n_eval("NANA_BUTTON_OK_SHORTKEY")); + btn_ok_.events().click.connect_unignorable([this](const arg_click&) { _m_ok(); }); btn_cancel_.create(*this); - btn_cancel_.caption("&Cancel"); + btn_cancel_.i18n(i18n_eval("NANA_BUTTON_CANCEL_SHORTKEY")); btn_cancel_.events().click.connect_unignorable([this](const arg_click&) { @@ -309,7 +314,7 @@ namespace nana _m_init_tree(); if(0 == title.size()) - caption(io_read ? "Open" : "Save As"); + this->i18n(i18n_eval(io_read ? "NANA_FILEBOX_OPEN" : "NANA_FILEBOX_SAVE_AS")); else caption(title); } @@ -640,11 +645,12 @@ namespace nana { auto path = tx_path_.caption(); - msgbox mb(fm_, "Create Folder"); + internationalization i18n; + msgbox mb(fm_, i18n("NANA_FILEBOX_NEW_FOLDER")); mb.icon(msgbox::icon_warning); if(0 == path.size() || path[0] == '.' || path[0] == '/') { - mb<path_edit.multi_lines(false); impl->browse.create(impl->dock); - impl->browse.i18n(i18n_eval("Browse")); + impl->browse.i18n(i18n_eval("NANA_BUTTON_BROWSE")); impl->browse.events().click.connect_unignorable([wd, impl](const arg_click&) { impl->fbox.owner(wd); diff --git a/source/internationalization.cpp b/source/internationalization.cpp index 10098ab1..375b7434 100644 --- a/source/internationalization.cpp +++ b/source/internationalization.cpp @@ -151,7 +151,44 @@ namespace nana struct data { + std::function on_missing; std::unordered_map table; + + data() + { + //initializes nana's translation + table["NANA_BUTTON_OK"] = "OK"; + table["NANA_BUTTON_OK_SHORTKEY"] = "&OK"; + table["NANA_BUTTON_YES"] = "Yes"; + table["NANA_BUTTON_NO"] = "No"; + table["NANA_BUTTON_BROWSE"] = "Browse"; + table["NANA_BUTTON_CANCEL"] = "Cancel"; + table["NANA_BUTTON_CANCEL_SHORTKEY"] = "&Cancel"; + table["NANA_BUTTON_CREATE"] = "Create"; + + table["NANA_FILEBOX_BYTES"] = "Bytes"; + table["NANA_FILEBOX_FILESYSTEM"] = "FILESYSTEM"; + table["NANA_FILEBOX_FILTER"] = "Filter"; + table["NANA_FILEBOX_NEW_FOLDER"] = "New Folder"; + table["NANA_FILEBOX_NEW_FOLDER_SHORTKEY"] = "&New Folder"; + table["NANA_FILEBOX_HEADER_NAME"] = "Name"; + table["NANA_FILEBOX_HEADER_MODIFIED"] = "Modified"; + table["NANA_FILEBOX_HEADER_TYPE"] = "Type"; + table["NANA_FILEBOX_HEADER_SIZE"] = "Size"; + table["NANA_FILEBOX_NEW_FOLDER_CAPTION"] = "Name the new folder"; + + table["NANA_FILEBOX_SAVE_AS"] = "Save As"; + table["NANA_FILEBOX_OPEN"] = "Open"; + table["NANA_FILEBOX_DIRECTORY"] = "Directory"; + table["NANA_FILEBOX_FILE"] = "File"; + table["NANA_FILEBOX_FILE_COLON"] = "File:"; + table["NANA_FILEBOX_ERROR_INVALID_FOLDER_NAME"] = "Please input a valid name for the new folder."; + table["NANA_FILEBOX_ERROR_RENAME_FOLDER_BECAUSE_OF_EXISTING"] = "The folder is existing, please rename it."; + table["NANA_FILEBOX_ERROR_RENAME_FOLDER_BECAUSE_OF_FAILED_CREATION"] = "Failed to create the folder, please rename it."; + table["NANA_FILEBOX_ERROR_INVALID_FILENAME"] = "The filename is invalid."; + table["NANA_FILEBOX_ERROR_NOT_EXISTING_AND_RETRY"] = "The file \"%arg0\"\n is not existing. Please check and retry."; + table["NANA_FILEBOX_ERROR_QUERY_REWRITE_BECAUSE_OF_EXISTING"] = "The input file is existing, do you want to overwrite it?"; + } }; static std::shared_ptr& get_data_ptr() @@ -293,6 +330,10 @@ namespace nana } }//end namespace internationalization_parts + void internationalization::set_missing(std::function handler) + { + internationalization_parts::get_data_ptr()->on_missing = std::move(handler); + } void internationalization::load(const std::string& file) { @@ -324,6 +365,9 @@ namespace nana if (i != impl->table.end()) return i->second; + if (impl->on_missing) + impl->on_missing(msgid); + return std::move(msgid); }