Page 1 of 1
如何修改wxWizard中的按钮为中文
Posted: Sun Mar 15, 2009 2:09 pm
by exploder
近日程序中使用到wxWizard时,发现按钮都是E文,因此想通过其内部变量“m_btnPrev”、“m_btnNext”进行修改,前者可以实现。后者因在父类的showpange()事件中进行了设置,所以修改不成功;而且,对于“Cancel”,内部没有提供该变量,也就无法修改。在不修改源码的前提下,不知还有什么招没有啊?
建议,为了更好的国际化,应当把wxWizard的这些内容独立出来,可实现设置。
Posted: Mon Mar 16, 2009 2:40 am
by Utensil
wxWidgets有自己的国际化机制,不用像你这样hack的,呵呵。
请参见wxLocale的文档(
http://docs.wxwidgets.org/trunk/classwx_locale.html)、例子samples/internat(
http://docs.wxwidgets.org/trunk/page_sa ... s_internat)。也可参见《wxWidgets跨平台GUI开发》的第十六章。
-Utensil
Posted: Wed Mar 18, 2009 1:25 pm
by Satervalley
wxWidgets 的本地化基于 gettext,简单地说,在 wxWidgets 的安装目录下,有一个 locale 目录,里面有很多种语言的 po 源文件,本地化了wxWidgets 内部的字符串,其中 zh_CN.po 对应简体中文,你把它编译成mo文件,放在你的应用的适当目录,并在程序启动时载入这个mo文件即可。
Posted: Tue Mar 24, 2009 6:56 am
by liuyug
首先我编写的程序已经通过wxLocale实现了国际化,已经有了一个.po文件,但wxWidget库自带的对话框还是英文,如何实现wxWidget的国际化?
将2个.po文件合并在一起吗?
如何将.po文件集成到.exe文件中?
Posted: Wed Mar 25, 2009 4:35 am
by Satervalley
liuyug wrote:首先我编写的程序已经通过wxLocale实现了国际化,已经有了一个.po文件,但wxWidget库自带的对话框还是英文,如何实现wxWidget的国际化?
将2个.po文件合并在一起吗?
如何将.po文件集成到.exe文件中?
首先,po 文件是不行的,需要编译成mo文件。
其次,wxLocale支持载入多个mo文件,若多个mo文件中都有同一字符串的翻译,似乎以后载入的优先。
第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
第四,若要mo放到exe里,可以把它以资源方式嵌入,然后再编程读取即可,但我个人认为没必要。
Posted: Wed Mar 25, 2009 4:26 pm
by Utensil
Satervalley wrote:
第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
wxWidgets尚不支持context,这是3.0的计划。
-Utensil
Posted: Thu Mar 26, 2009 1:48 am
by Satervalley
Utensil wrote:Satervalley wrote:
第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
wxWidgets尚不支持context,这是3.0的计划。
-Utensil
嗯。应该支持的,现在用的时候感觉不方便,同样的字符串在不同的上下文中翻译并不一样。
Posted: Fri Mar 27, 2009 4:09 am
by liuyug
Satervalley wrote:liuyug wrote:首先我编写的程序已经通过wxLocale实现了国际化,已经有了一个.po文件,但wxWidget库自带的对话框还是英文,如何实现wxWidget的国际化?
将2个.po文件合并在一起吗?
如何将.po文件集成到.exe文件中?
首先,po 文件是不行的,需要编译成mo文件。
其次,wxLocale支持载入多个mo文件,若多个mo文件中都有同一字符串的翻译,似乎以后载入的优先。
第三,gettext支持context概念,但我没有研究wxwidgets是如何应用context的,
第四,若要mo放到exe里,可以把它以资源方式嵌入,然后再编程读取即可,但我个人认为没必要。
载入多个mo文件?
如何嵌入?
哪有介绍的文档
Posted: Fri Apr 10, 2009 1:51 am
by kingkamg
Code: Select all
void myFrm::InitLanguages()
{
wxString dir = wxPathOnly(wxStandardPaths::Get().GetExecutablePath()) + wxFILE_SEP_PATH + wxT("Languages");
if ( wxFileName::DirExists( dir ) )
{
for ( int i = wxLANGUAGE_ABKHAZIAN; i < wxLANGUAGE_USER_DEFINED; i++ )
{
const wxLanguageInfo* aLanguageInfo = wxLocale::GetLanguageInfo( i );
if ( aLanguageInfo )
{
wxString path = dir + wxFILE_SEP_PATH + aLanguageInfo->CanonicalName + _T(".mo");
if ( wxFileName::FileExists( dir + wxFILE_SEP_PATH + aLanguageInfo->CanonicalName + _T(".mo") ) )
{
m_LanguageHashMap[aLanguageInfo->Description] = i;
}
}
}
}
}
void myFrm::OnChangeLanguage(wxCommandEvent& event)
{
size_t id=event.GetId();
wxString languageName = m_pMenuBar->GetLabel(id);
SelectedLanguage( languageName );
LanguageSubInstance::Get()->Notify();
m_pSashSplitter->UpdateSize();
}
bool myFrm::SelectedLanguage( wxString languageName )
{
pwLanguageHashMap::iterator item = m_LanguageHashMap.find( languageName );
if ( item == m_LanguageHashMap.end() )
return false;
if ( !wxLocale::IsAvailable( m_LanguageHashMap[languageName] ) )
{
wxLogError(wxT("This language is not supported by the system."));
return false;
}
if ( m_pLocale ){
delete m_pLocale;
m_pLocale = NULL;
}
m_pLocale = new wxLocale( m_LanguageHashMap[languageName], wxLOCALE_CONV_ENCODING );
if ( !m_pLocale )
return false;
m_pLocale->AddCatalogLookupPathPrefix( ConfigInstance::Get()->m_AppPath + wxFILE_SEP_PATH + wxT("Languages") );
const wxLanguageInfo* aLanguageInfo = wxLocale::GetLanguageInfo( m_LanguageHashMap[languageName] );
if ( !aLanguageInfo )
return false;
if ( !m_pLocale->AddCatalog( aLanguageInfo->CanonicalName ) )
{
wxLogError(wxT("This language file error!"));
return false;
}
ConfigInstance::Get()->m_Language = languageName;
return true;
}