From 8e228512d534082392de968d0a428c15b3c69e02 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Wed, 2 Nov 2016 21:50:52 +0800 Subject: [PATCH 1/2] fix some i18n errors --- include/nana/internationalization.hpp | 49 +++++++++++++++++--- source/internationalization.cpp | 66 +++++++++++++++++++++------ 2 files changed, 94 insertions(+), 21 deletions(-) diff --git a/include/nana/internationalization.hpp b/include/nana/internationalization.hpp index 7aec20a8..250e3978 100644 --- a/include/nana/internationalization.hpp +++ b/include/nana/internationalization.hpp @@ -32,9 +32,8 @@ namespace nana std::vector arg_strs; _m_fetch_args(arg_strs, std::forward(args)...); - ::std::string msgstr; - if (_m_get(msgid_utf8, msgstr)) - _m_replace_args(msgstr, &arg_strs); + auto msgstr = _m_get(std::move(msgid_utf8)); + _m_replace_args(msgstr, &arg_strs); return msgstr; } @@ -47,16 +46,24 @@ namespace nana return get(msgid_utf8, std::forward(args)...); } private: - bool _m_get(std::string& msgid, ::std::string& msgstr) const; + std::string _m_get(std::string&& msgid) const; void _m_replace_args(::std::string& str, std::vector<::std::string> * arg_strs) const; - void _m_fetch_args(std::vector&) const //Termination of _m_fetch_args - {} + void _m_fetch_args(std::vector&) const; //Termination of _m_fetch_args + + void _m_fetch_args(std::vector& v, const char* arg) const; + void _m_fetch_args(std::vector& v, const std::string& arg) const; + void _m_fetch_args(std::vector& v, std::string& arg) const; + void _m_fetch_args(std::vector& v, std::string&& arg) const; + void _m_fetch_args(std::vector& v, const wchar_t* arg) const; + void _m_fetch_args(std::vector& v, const std::wstring& arg) const; + void _m_fetch_args(std::vector& v, std::wstring& arg) const; + void _m_fetch_args(std::vector& v, std::wstring&& arg) const; template void _m_fetch_args(std::vector& v, Arg&& arg) const { - std::wstringstream ss; + std::stringstream ss; ss << arg; v.emplace_back(ss.str()); } @@ -89,6 +96,34 @@ namespace nana _m_fetch_args(v, std::forward(args)...); } + template + void _m_fetch_args(std::vector& v, const wchar_t* arg, Args&&... args) const + { + v.emplace_back(to_utf8(arg)); + _m_fetch_args(v, std::forward(args)...); + } + + template + void _m_fetch_args(std::vector& v, const std::wstring& arg, Args&&... args) const + { + v.emplace_back(to_utf8(arg)); + _m_fetch_args(v, std::forward(args)...); + } + + template + void _m_fetch_args(std::vector& v, std::wstring& arg, Args&&... args) const + { + v.emplace_back(to_utf8(arg)); + _m_fetch_args(v, std::forward(args)...); + } + + template + void _m_fetch_args(std::vector& v, std::wstring&& arg, Args&&... args) const + { + v.emplace_back(to_utf8(arg)); + _m_fetch_args(v, std::forward(args)...); + } + template void _m_fetch_args(std::vector& v, Arg&& arg, Args&&... args) const { diff --git a/source/internationalization.cpp b/source/internationalization.cpp index 345ae62c..10098ab1 100644 --- a/source/internationalization.cpp +++ b/source/internationalization.cpp @@ -306,9 +306,8 @@ namespace nana std::string internationalization::get(std::string msgid) const { - std::string str; - if(_m_get(msgid, str)) - _m_replace_args(str, nullptr); + std::string str = _m_get(std::move(msgid)); + _m_replace_args(str, nullptr); return str; } @@ -318,18 +317,14 @@ namespace nana ptr->table[msgid].swap(msgstr); } - bool internationalization::_m_get(std::string& msgid, std::string& msgstr) const + std::string internationalization::_m_get(std::string&& msgid) const { auto & impl = internationalization_parts::get_data_ptr(); auto i = impl->table.find(msgid); if (i != impl->table.end()) - { - msgstr = i->second; - return true; - } + return i->second; - msgstr = nana::charset(std::move(msgid), nana::unicode::utf8); - return false; + return std::move(msgid); } void internationalization::_m_replace_args(std::string& str, std::vector * arg_strs) const @@ -368,6 +363,50 @@ namespace nana offset += 4; } } + + void internationalization::_m_fetch_args(std::vector&) const + {} + + void internationalization::_m_fetch_args(std::vector& v, const char* arg) const + { + v.emplace_back(arg); + } + + void internationalization::_m_fetch_args(std::vector& v, const std::string& arg) const + { + v.emplace_back(arg); + } + + void internationalization::_m_fetch_args(std::vector& v, std::string& arg) const + { + v.emplace_back(arg); + } + + void internationalization::_m_fetch_args(std::vector& v, std::string&& arg) const + { + v.emplace_back(std::move(arg)); + } + + void internationalization::_m_fetch_args(std::vector& v, const wchar_t* arg) const + { + v.emplace_back(to_utf8(arg)); + } + + void internationalization::_m_fetch_args(std::vector& v, const std::wstring& arg) const + { + v.emplace_back(to_utf8(arg)); + } + + void internationalization::_m_fetch_args(std::vector& v, std::wstring& arg) const + { + v.emplace_back(to_utf8(arg)); + } + + void internationalization::_m_fetch_args(std::vector& v, std::wstring&& arg) const + { + v.emplace_back(to_utf8(arg)); + } + //end class internationalization @@ -462,10 +501,9 @@ namespace nana arg_strs.emplace_back(arg->eval()); internationalization i18n; - std::string msgid = msgid_; //msgid is required to be movable by i18n._m_get - std::string msgstr; - if (i18n._m_get(msgid, msgstr)) - i18n._m_replace_args(msgstr, &arg_strs); + + std::string msgstr = i18n._m_get(std::string{msgid_}); + i18n._m_replace_args(msgstr, &arg_strs); return msgstr; } From a1eeeee948f2788c7ca1b1c429b35818c4c86250 Mon Sep 17 00:00:00 2001 From: Jinhao Date: Wed, 2 Nov 2016 21:55:19 +0800 Subject: [PATCH 2/2] fix a widget::i18n compiler error --- include/nana/gui/widgets/widget.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/nana/gui/widgets/widget.hpp b/include/nana/gui/widgets/widget.hpp index b46125b1..2aed3a8e 100644 --- a/include/nana/gui/widgets/widget.hpp +++ b/include/nana/gui/widgets/widget.hpp @@ -64,7 +64,7 @@ namespace nana template void i18n(std::string msgid, Args&&... args) { - _m_caption(nana::internationalization().get(msgid, std::forward(args)...)); + _m_caption(::nana::to_nstring(::nana::internationalization().get(msgid, std::forward(args)...))); } void i18n(i18n_eval);